Guidance
指路人
g.yi.org
software / rapidq / Examples / Game / directx & direct3d / xview / xview.bas

Register 
注册
Search 搜索
首页 
Home Home
Software
Upload

  
' Direct3D model viewer for Rapid-Q by William Yu
' Only loads mesh objects.

     $TYPECHECK ON
     $INCLUDE "RAPIDQ.INC"

'-- Light Types
     CONST D3DRMLIGHT_AMBIENT = 0
     CONST D3DRMLIGHT_POINT = 1
     CONST D3DRMLIGHT_SPOT = 2
     CONST D3DRMLIGHT_DIRECTIONAL = 3
     CONST D3DRMLIGHT_PARALLELPOINT = 4

'-- Renderer modes
     CONST D3DRMRENDERMODE_BLENDEDTRANSPARENCY = 1
     CONST D3DRMRENDERMODE_SORTEDTRANSPARENCY = 2
     CONST D3DRMRENDERMODE_LIGHTINMODELSPACE = 8
     CONST D3DRMRENDERMODE_VIEWDEPENDENTSPECULAR = 16
     CONST D3DRMRENDERMODE_DISABLESORTEDALPHAZWRITE = 32

'-- Wrap Types
     CONST D3DRMWRAP_FLAT = 0
     CONST D3DRMWRAP_CYLINDER = 1
     CONST D3DRMWRAP_SPHERE = 2
     CONST D3DRMWRAP_CHROME = 3
     CONST D3DRMWRAP_SHEET = 4
     CONST D3DRMWRAP_BOX = 5


     DECLARE SUB dxInitialize(sender AS QDXSCREEN)
     DECLARE SUB dxInitializeSurface(sender AS QDXSCREEN)
     DECLARE SUB dxTimerExpired
     DECLARE SUB exitItemClick(sender AS QMENUITEM)
     DECLARE SUB openItemClick(sender AS QMENUITEM)
     DECLARE SUB rotateButtonClick(sender AS QBUTTON)
     DECLARE SUB rotateStopButtonClick(sender AS QBUTTON)
     DECLARE SUB upButtonMouseDown(button%, x%, y%, shift%, sender AS QBUTTON)
     DECLARE SUB upButtonMouseUp(button%, x%, y%, shift%, sender AS QBUTTON)
     DECLARE SUB textureButtonClick(sender AS QBUTTON)

     DIM dxTimer AS QDXTIMER
     dxTimer.enabled = 1
     dxTimer.interval = 0
     dxTimer.activeOnly = 0
     dxTimer.onTimer = dxTimerExpired
     DIM frameView AS DOUBLE
     frameView = 10
     DIM wrapType AS LONG
     wrapType = D3DRMWRAP_SPHERE
     DIM T! AS SINGLE
     DIM meshFrame AS QD3DFRAME
     DIM meshBuilder AS QD3DMESHBUILDER
     DIM wrap AS QD3DWRAP


     CREATE form AS QFORM
      CAPTION = "Direct3D Model Viewer"
      width = 640
      height = 480
      center
      CREATE panel AS QPANEL
       width = 150
       align = alRight
       bevelOuter = bvLowered
       CREATE upButton AS QBUTTON
        CAPTION = "/\"
        hint = "up"
        width = 30
        left = 60
        top = 10
        tabOrder = 0
        onMouseDown = upButtonMouseDown
        onMouseUp = upButtonMouseUp
       END CREATE
       CREATE downButton AS QBUTTON
        CAPTION = "\/"
        hint = "down"
        left = 60
        width = 30
        top = 40
        tabOrder = 0
        onMouseDown = upButtonMouseDown
        onMouseUp = upButtonMouseUp
       END CREATE
       CREATE textureImage AS QIMAGE
        left = 25
        width = 100
        top = 70
        onClick = textureButtonClick
       END CREATE
       CREATE textureButton AS QBUTTON
        CAPTION = "Texture..."
        left = 50
        width = 60
        top = 180
        onClick = textureButtonClick
       END CREATE
       CREATE rotateLabelAngle AS QLABEL
        top = 273
        left = 15
        CAPTION = "Angle:"
       END CREATE
       CREATE rotateEditAngle AS QEDIT
        top = 270
        left = 60
        width = 40
        text = "1"
       END CREATE
       CREATE rotateLabelX AS QLABEL
        top = 303
        left = 15
        CAPTION = "X:"
       END CREATE
       CREATE rotateEditX AS QEDIT
        top = 300
        left = 60
        width = 40
        text = "1"
       END CREATE
       CREATE rotateLabelY AS QLABEL
        top = 333
        left = 15
        CAPTION = "Y:"
       END CREATE
       CREATE rotateEditY AS QEDIT
        top = 330
        left = 60
        width = 40
        text = "1"
       END CREATE
       CREATE rotateLabelZ AS QLABEL
        top = 363
        left = 15
        CAPTION = "Z:"
       END CREATE
       CREATE rotateEditZ AS QEDIT
        top = 360
        left = 60
        width = 40
        text = "1"
       END CREATE
       CREATE rotateButton AS QBUTTON
        left = 10
        top = 390
        width = 60
        CAPTION = "&Rotate"
        onClick = rotateButtonClick
       END CREATE
       CREATE rotateStopButton AS QBUTTON
        left = 80
        top = 390
        width = 60
        CAPTION = "&Stop"
        onClick = rotateStopButtonClick
       END CREATE
      END CREATE
      CREATE dxScreen AS QDXSCREEN
       align = alClient
       bitCount = 16
       use3D = 1
       useHardware = 1
       onInitialize = dxInitialize
       onInitializeSurface = dxInitializeSurface
      END CREATE
      CREATE mainMenu AS QMAINMENU
       CREATE fileMenu AS QMENUITEM
        CAPTION = "&File"
        CREATE openItem AS QMENUITEM
         CAPTION = "&Open..."
         onClick = openItemClick
        END CREATE
        CREATE breakItem1 AS QMENUITEM
         CAPTION = "-"
        END CREATE
        CREATE exitItem AS QMENUITEM
         CAPTION = "E&xit"
         onClick = exitItemClick
        END CREATE
       END CREATE
      END CREATE
      SHOWMODAL
     END CREATE



     SUB exitItemClick(sender AS QMENUITEM)
      form.CLOSE
     END SUB


     SUB openItemClick(sender AS QMENUITEM)
      DIM openDialog AS QOPENDIALOG

      openDialog.filter = "*.x (X models)|*.x"
      IF openDialog.EXECUTE THEN
       '-- Remove previous object from frame
       meshFrame.deleteVisual(meshBuilder)
       '-- Rebuilds mesh, removing the old object
       dxScreen.createMeshBuilder(meshBuilder)
       '-- Load a new object
       meshBuilder.load(openDialog.fileName)
       '-- Add this new object to the frame
       meshFrame.addVisual(meshBuilder)
      END IF
     END SUB


     SUB textureButtonClick(sender AS QBUTTON)
      DIM openDialog AS QOPENDIALOG

      openDialog.filter = "*.bmp (Bitmap files)|*.bmp"
      IF openDialog.EXECUTE THEN
       textureImage.BMP = openDialog.fileName
       meshBuilder.loadTexture(openDialog.fileName)
       dxScreen.createWrap(wrapType, 0,0,0, 0,0,1, 0,1,0, 0,0, 1,1, wrap)
       wrap.apply(meshBuilder)
      END IF
     END SUB


     SUB upButtonMouseDown(button%, x%, y%, shift%, sender AS QBUTTON)
      DEFSNG T!

      T! = TIMER
      IF button% = 0 THEN
       sender.tabOrder = 0
       DO
        IF sender.hint = "up" THEN
         INC(frameView)
        ELSE
         DEC(frameView)
        END IF
        meshFrame.setPosition(0, 0, frameView)
        DOEVENTS
        dxTimerExpired
       LOOP UNTIL sender.tabOrder = 1
      END IF
     END SUB

     SUB upButtonMouseUp(button%, x%, y%, shift%, sender AS QBUTTON)
      IF button% = 0 THEN
       sender.tabOrder = 1
      END IF
     END SUB


     SUB rotateButtonClick(sender AS QBUTTON)
      meshFrame.setRotation(VAL(rotateEditX.text), _
       VAL(rotateEditY.text), _
       VAL(rotateEditZ.text), _
       VAL(rotateEditAngle.text)/10)
     END SUB


     SUB rotateStopButtonClick(sender AS QBUTTON)
      meshFrame.setRotation(0, 0, 0, 0)
     END SUB


     SUB dxInitialize(sender AS QDXSCREEN)
      DIM light AS QD3DLIGHT, ambient AS QD3DLIGHT
      DIM lightFrame AS QD3DFRAME

      dxScreen.createFrame(lightFrame)
      dxScreen.createFrame(meshFrame)

      dxScreen.createLightRGB(D3DRMLIGHT_DIRECTIONAL, 0.9, 0.9, 0.9, light)
      lightFrame.addLight(Light)

      dxScreen.createLightRGB(D3DRMLIGHT_AMBIENT, 0.1, 0.1, 0.1, ambient)
      dxScreen.addLight(ambient)

      meshFrame.setPosition(0, 0, frameView)

      dxScreen.setCameraPosition(0, 0, 0)
     END SUB


     SUB dxInitializeSurface(sender AS QDXSCREEN)
      dxScreen.setRenderMode(D3DRMRENDERMODE_BLENDEDTRANSPARENCY OR D3DRMRENDERMODE_SORTEDTRANSPARENCY)
     END SUB


     SUB dxTimerExpired
      dxScreen.forceUpdate(0,0,50,40)    '-- Update FPS text only
      meshFrame.Move(1)                   '-- This does the animation
      dxScreen.render
      dxScreen.textOut(10,10,"FPS: "+STR$(dxTimer.frameRate), &HFFFFFF, -1)
      dxScreen.flip
     END SUB
掌柜推荐
 
 
 
 
 
 
 
 
 
 
 
 
© Sun 2024-9-8  Guidance Laboratory Inc.
Email:webmaster1g.yi.org Hits:0 Last modified:2000-07-18 23:55:08