home *** CD-ROM | disk | FTP | other *** search
/ Microsoft DirectX SDK 7.0 / Dx7.bin / DXF / samples / multimedia / vbsamples / d3dim / src / xfile / xfile.frm (.txt) < prev    next >
Encoding:
Visual Basic Form  |  1999-08-17  |  13.1 KB  |  430 lines

  1. VERSION 5.00
  2. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
  3. Object = "{D0B8DDCE-E796-11D2-A21E-00C04F68AD33}#1.1#0"; "IMControl.ocx"
  4. Begin VB.Form XFileLoader 
  5.    Caption         =   "Direct X File Loader"
  6.    ClientHeight    =   3210
  7.    ClientLeft      =   165
  8.    ClientTop       =   735
  9.    ClientWidth     =   4680
  10.    Icon            =   "XFile.frx":0000
  11.    LinkTopic       =   "Form1"
  12.    ScaleHeight     =   214
  13.    ScaleMode       =   3  'Pixel
  14.    ScaleWidth      =   312
  15.    StartUpPosition =   3  'Windows Default
  16.    Begin DirectXIMControl.IMCanvas IMCanvas1 
  17.       Height          =   1935
  18.       Left            =   0
  19.       TabIndex        =   0
  20.       Top             =   0
  21.       Width           =   2295
  22.       _ExtentX        =   4048
  23.       _ExtentY        =   3413
  24.    End
  25.    Begin MSComDlg.CommonDialog CDiag 
  26.       Left            =   4080
  27.       Top             =   2640
  28.       _ExtentX        =   847
  29.       _ExtentY        =   847
  30.       _Version        =   393216
  31.    End
  32.    Begin VB.Menu File 
  33.       Caption         =   "&File"
  34.       Begin VB.Menu OpenNewXFile 
  35.          Caption         =   "&Open .X File"
  36.       End
  37.       Begin VB.Menu Exit 
  38.          Caption         =   "E&xit"
  39.       End
  40.    End
  41.    Begin VB.Menu FillOptions 
  42.       Caption         =   "&Fill Options"
  43.       Begin VB.Menu OptionsSolid 
  44.          Caption         =   "&Solid"
  45.          Checked         =   -1  'True
  46.       End
  47.       Begin VB.Menu OptionWireframe 
  48.          Caption         =   "&Wireframe"
  49.       End
  50.       Begin VB.Menu OptionPoint 
  51.          Caption         =   "&Point"
  52.       End
  53.    End
  54.    Begin VB.Menu ShadeOptions 
  55.       Caption         =   "&Shade Options"
  56.       Begin VB.Menu OptionGauraud 
  57.          Caption         =   "&Gauraud"
  58.          Checked         =   -1  'True
  59.       End
  60.       Begin VB.Menu OptionFlat 
  61.          Caption         =   "&Flat"
  62.       End
  63.    End
  64.    Begin VB.Menu HelpInfo 
  65.       Caption         =   "&Help!"
  66.    End
  67. Attribute VB_Name = "XFileLoader"
  68. Attribute VB_GlobalNameSpace = False
  69. Attribute VB_Creatable = False
  70. Attribute VB_PredeclaredId = True
  71. Attribute VB_Exposed = False
  72. Option Explicit
  73. 'D3DDeviceObject
  74. Private d3ddev As Direct3DDevice7
  75. 'D3D Matrix Info
  76. Private matWorld1 As D3DMATRIX
  77. Private matView1 As D3DMATRIX
  78. Private matProj1 As D3DMATRIX
  79. 'position information
  80. Private MustExit As Boolean
  81. Private MouseIsDown As Boolean
  82. Private MouseX As Long, MouseY As Long
  83. Private OldMouseX As Long, OldMouseY As Long
  84. Private MouseButton As Integer
  85. Private UseRGB As Boolean
  86. 'other
  87. Private z As Single
  88. 'Xfile loader class
  89. Private XClass As New XFileClass
  90. '---------------------------------------
  91. ' Form_Load Entry Point
  92. '---------------------------------------
  93. Private Sub Form_Load()
  94.     'make sure we are not re-enterd
  95.     Static b As Boolean
  96.     If b Then Exit Sub
  97.     b = True
  98.            
  99.     InitDX
  100.     ResetDevice
  101.     'begin screen updates
  102.     DoLoop
  103.     IM7Terminate
  104. End Sub
  105. '---------------------------------------
  106. ' DoLoop
  107. '---------------------------------------
  108. Sub DoLoop()
  109.     Dim fRestore As Boolean
  110.     ' main loop
  111.     Do Until MustExit ' must exit can be set to true in the XFileLoader form.
  112.         With IMCanvas1
  113.                         
  114.             fRestore = False
  115.             While .DirectDraw.TestCooperativeLevel <> DD_OK
  116.                 fRestore = True
  117.                 DoEvents
  118.             Wend
  119.             If fRestore Then
  120.                 .DirectDraw.RestoreAllSurfaces
  121.             End If
  122.             'setup our matrix state
  123.             With .Direct3DDevice
  124.                     Call .SetTransform(D3DTRANSFORMSTATE_WORLD, matWorld1)
  125.                     Call .SetTransform(D3DTRANSFORMSTATE_PROJECTION, matProj1)
  126.                     Call .SetTransform(D3DTRANSFORMSTATE_VIEW, matView1)
  127.             End With
  128.         
  129.             'clear the background
  130.             .ClearBackSurface
  131.                 
  132.             'begin scene
  133.             .Direct3DDevice.BeginScene
  134.         
  135.             'render to backbuffer
  136.             XClass.Render .Direct3DDevice
  137.         
  138.             'begin scene
  139.             .Direct3DDevice.EndScene
  140.                     
  141.             'Display the newly rendered scene on the screen
  142.             .Update
  143.         
  144.         End With
  145.         
  146.         ' allow for events to get processed now
  147.         DoEvents
  148.         
  149.     Loop
  150. End Sub
  151. '---------------------------------------
  152. ' Key Events
  153. '---------------------------------------
  154. Private Sub IMCanvas1_KeyDown(KeyCode As Integer, Shift As Integer)
  155.     Select Case KeyCode
  156.         Case vbKeyEscape
  157.             MustExit = True
  158.         Case vbKeyLeft
  159.             XClass.Rotate 0, -0.1
  160.         Case vbKeyRight
  161.             XClass.Rotate 0, 0.1
  162.         Case vbKeyUp
  163.             XClass.Rotate -0.1, 0
  164.         Case vbKeyDown
  165.             XClass.Rotate 0.1, 0
  166.         Case vbKeyAdd
  167.             z = z - 0.2
  168.             XClass.SetPosition 0, 0, CDbl(z)
  169.         Case vbKeySubtract
  170.             z = z + 0.2
  171.             XClass.SetPosition 0, 0, CDbl(z)
  172.     End Select
  173. End Sub
  174. '---------------------------------------
  175. ' Key Events
  176. '---------------------------------------
  177. Private Sub Form_Resize()
  178.     IMCanvas1.Width = Me.ScaleWidth
  179.     IMCanvas1.Height = Me.ScaleHeight
  180.     ' We must clean up all references to DX objects to
  181.     ' free video memory
  182.     CleanUp
  183.     ' StartWindowed will see if we can still be hardware
  184.     ' excellerated at new size otherwise it will fall back
  185.     ' to software rendering
  186.     If UseRGB Then
  187.         IMCanvas1.InitWindowed "", "IID_IDirect3DRGBDevice"
  188.     Else
  189.         IMCanvas1.StartWindowed
  190.     End If
  191.         
  192.     ' since we got rid of the d3d object we need to resetup our lights
  193.     ResetDevice
  194.     XClass.ReloadTextures IMCanvas1.DirectDraw, IMCanvas1.Direct3DDevice
  195. End Sub
  196. '---------------------------------------
  197. ' Mouse Events
  198. '---------------------------------------
  199. Private Sub IMCanvas1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  200.     If MouseIsDown And MouseButton = 1 Then
  201.         XClass.Rotate 0, (x - MouseX) / 128
  202.         XClass.Rotate (y - MouseY) / 128, 0
  203.         
  204.         OldMouseX = MouseX
  205.         OldMouseY = MouseY
  206.         MouseX = x
  207.         MouseY = y
  208.     ElseIf MouseIsDown And MouseButton = 2 Then
  209.         If y < MouseY - 10 Then
  210.             z = z + 0.1
  211.             XClass.SetPosition 0, 0, CDbl(z)
  212.         ElseIf y > MouseY + 10 Then
  213.             z = z - 0.1
  214.             XClass.SetPosition 0, 0, CDbl(z)
  215.         End If
  216.     End If
  217. End Sub
  218. Private Sub IMCanvas1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  219.     MouseIsDown = True
  220.     MouseButton = Button
  221.     If MouseIsDown And Button = 1 Then
  222.         XClass.Rotate 0, (x - MouseX) / 128
  223.         XClass.Rotate (y - MouseY) / 128, 0
  224.     End If
  225.     MouseX = x
  226.     MouseY = y
  227. End Sub
  228. Private Sub IMCanvas1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
  229.     MouseIsDown = False
  230.     If Button = 1 Then
  231.         XClass.YawSpin = (x - OldMouseX) / 1280
  232.         XClass.PitchSpin = (y - OldMouseY) / 1280
  233.         MouseX = x
  234.         MouseY = y
  235.     End If
  236. End Sub
  237. '---------------------------------------
  238. ' Click Events
  239. '---------------------------------------
  240. Private Sub Exit_Click()
  241.     MustExit = True
  242. End Sub
  243. Private Sub HelpInfo_Click()
  244.     MsgBox "Arrows/Mouse : Spin the Object" & vbCrLf _
  245.         & "(+/-) : Move the Object"
  246. End Sub
  247. '---------------------------------------
  248. ' Menu Events
  249. '---------------------------------------
  250. Private Sub OpenNewXFile_Click()
  251.     With CDiag
  252.         .Filter = ".X File|*.X"
  253.         .FileName = "*.x"
  254.         .ShowOpen
  255.         If Trim$(.FileName <> vbNullString) Then
  256.             If Trim$(.FileName) = "*.x" Then Exit Sub 'They immediately hit cancel
  257.             XClass.Load IMCanvas1.DirectDraw, IMCanvas1.Direct3DDevice, .FileName
  258.         Else
  259.             Exit Sub
  260.         End If
  261.     End With
  262.     Dim X1 As Single, Y1 As Single, z1 As Single
  263.     Dim X2 As Single, Y2 As Single, z2 As Single
  264.     Dim dx As Single, dy As Single, dz As Single
  265.     Dim m As Single
  266.     z = 2
  267.     XClass.SetPosition 0, 0, CDbl(z)
  268.     XClass.GetMinExtent X1, Y1, z1
  269.     XClass.GetMaxExtent X2, Y2, z2
  270.     dx = X2 - X1
  271.     dy = Y2 - Y1
  272.     dz = z2 - z1
  273.     If dx > m Then m = dx
  274.     If dy > m Then m = dy
  275.     If dz > m Then m = dz
  276.     If m = 0 Then Exit Sub
  277.     m = 1.5 / m
  278.     XClass.AdjustScale m, m, m
  279. End Sub
  280. '---------------------------------------
  281. ' InitDX
  282. '---------------------------------------
  283. Private Sub InitDX()
  284.     Dim lProp As D3DLIGHT7
  285.     Dim Index As Long
  286.     Dim b As Boolean
  287.     XFileLoader.Show
  288.     DoEvents
  289.         
  290.     With IMCanvas1
  291.         
  292.         .EnableF5ResChange = False
  293.         
  294.         'Make sure we support 16bpp
  295.         If .dx.SystemBpp <= 8 Then
  296.             MsgBox "This sample was designed to run in High Color (16 bit) displays"
  297.             End
  298.         End If
  299.         
  300.         'Let the imcanvas pick a device
  301.         b = .StartWindowed()
  302.         If b = False Then End
  303.         
  304.         'Make sure we support texturing if we are a haldevice
  305.         'if not fall back to RGB
  306.         If IMCanvas1.Direct3DDevice.GetDeviceGuid() = "IID_IDirect3DHALDevice" Then
  307.             Dim caps As D3DDEVICEDESC7
  308.             IMCanvas1.Direct3DDevice.GetCaps caps
  309.             If (caps.lDevCaps And D3DDEVCAPS_TEXTUREVIDEOMEMORY) = 0 Then
  310.                 b = .InitWindowed("", "IID_IDirect3DRGBDevice")
  311.                 If b = False Then End
  312.             End If
  313.             UseRGB = True
  314.         End If
  315.         
  316.         'Setup World View and Projection Matrix
  317.         With IMCanvas1.dx
  318.             .IdentityMatrix matWorld1
  319.             .IdentityMatrix matView1
  320.             .IdentityMatrix matProj1
  321.             .ViewMatrix matView1, RVector(0, 0, 0), RVector(0, 0, 100), RVector(0, 1, 0), 0
  322.             .ProjectionMatrix matProj1, 0.1, 300, 1.57
  323.         End With
  324.         
  325.     End With
  326. End Sub
  327. Private Sub ResetDevice()
  328.         Set d3ddev = IMCanvas1.Direct3DDevice
  329.         d3ddev.SetTransform D3DTRANSFORMSTATE_WORLD, matWorld1
  330.         d3ddev.SetTransform D3DTRANSFORMSTATE_VIEW, matView1
  331.         d3ddev.SetTransform D3DTRANSFORMSTATE_PROJECTION, matProj1
  332.          Dim c As D3DCOLORVALUE
  333.         With c
  334.             .a = 1
  335.             .r = 1
  336.             .g = 1
  337.             .b = 1
  338.         End With
  339.         
  340.         Dim Material1 As D3DMATERIAL7
  341.         Material1.diffuse = c
  342.         Material1.power = 1
  343.         Material1.Ambient = c
  344.         d3ddev.SetMaterial Material1
  345.     Dim m_light As D3DLIGHT7
  346.     m_light.dltType = D3DLIGHT_POINT
  347.     With c
  348.         .a = 1
  349.         .r = 0.5
  350.         .g = 0.5
  351.         .b = 0.5
  352.     End With
  353.     With m_light
  354.         .dltType = D3DLIGHT_DIRECTIONAL
  355.         .Ambient = c
  356.         .diffuse = c
  357.         .specular = c
  358.     End With
  359.     ' position light behind viewer
  360.     m_light.position.x = 0#
  361.     m_light.position.y = 1000#
  362.     m_light.position.z = -100#
  363.     m_light.direction.x = -1
  364.     m_light.direction.y = -1
  365.     m_light.direction.z = 1
  366.     d3ddev.SetLight 0, m_light
  367.     d3ddev.LightEnable 0, True
  368.     IMCanvas1.BackBufferClearValue = &H4040FF
  369.         
  370. End Sub
  371. '---------------------------------------
  372. ' Exiting and Cleanup
  373. '---------------------------------------
  374. Private Sub Form_Unload(Cancel As Integer)
  375.     ' MustExist in a true state will cause the main loop to stop.
  376.     MustExit = True
  377. End Sub
  378. Private Sub CleanUp()
  379.     Set d3ddev = Nothing
  380. End Sub
  381. Sub IM7Terminate()
  382.     On Local Error Resume Next
  383.     With IMCanvas1.DirectDraw
  384.         .RestoreDisplayMode
  385.         .SetCooperativeLevel Me.hWnd, DDSCL_NORMAL
  386.     End With
  387.     CleanUp
  388.     End
  389. End Sub
  390. Private Function TLVertex(sx As Single, sy As Single, sz As Single, w As Single, c As Long, s As Single, u As Single, v As Single) As D3DTLVERTEX
  391.     Dim vert As D3DTLVERTEX
  392.     vert.sx = sx
  393.     vert.sy = sy
  394.     vert.sz = sz
  395.     vert.rhw = w
  396.     vert.color = c
  397.     vert.specular = s
  398.     vert.tu = u
  399.     vert.tv = v
  400.     TLVertex = vert
  401. End Function
  402. Private Sub OptionFlat_Click()
  403.     OptionGauraud.Checked = False
  404.     OptionFlat.Checked = True
  405.     XClass.ShadeMode = Flat
  406. End Sub
  407. Private Sub OptionGauraud_Click()
  408.     OptionGauraud.Checked = True
  409.     OptionFlat.Checked = False
  410.     XClass.ShadeMode = Gouraud
  411. End Sub
  412. Private Sub OptionPoint_Click()
  413.     OptionsSolid.Checked = False
  414.     OptionWireframe.Checked = False
  415.     OptionPoint.Checked = True
  416.     XClass.FillMode = Points
  417. End Sub
  418. Private Sub OptionsSolid_Click()
  419.     OptionsSolid.Checked = True
  420.     OptionWireframe.Checked = False
  421.     OptionPoint.Checked = False
  422.     XClass.FillMode = Solid
  423. End Sub
  424. Private Sub OptionWireframe_Click()
  425.     OptionsSolid.Checked = False
  426.     OptionWireframe.Checked = True
  427.     OptionPoint.Checked = False
  428.     XClass.FillMode = Wireframe
  429. End Sub
  430.