3D

来源:互联网 发布:北大有没有迪博数据库 编辑:程序博客网 时间:2024/04/24 13:42

VERSION 5.00
Begin VB.UserControl DEX3D
   BackColor       =   &H00000000&
   ClientHeight    =   3600
   ClientLeft      =   0
   ClientTop       =   0
   ClientWidth     =   4800
   ScaleHeight     =   3600
   ScaleWidth      =   4800
   Begin VB.PictureBox Picture3
      Height          =   495
      Left            =   2880
      ScaleHeight     =   435
      ScaleWidth      =   1155
      TabIndex        =   2
      Top             =   120
      Width           =   1215
   End
   Begin VB.PictureBox Picture2
      Height          =   495
      Left            =   1440
      ScaleHeight     =   435
      ScaleWidth      =   1155
      TabIndex        =   1
      Top             =   120
      Width           =   1215
   End
   Begin VB.PictureBox Picture1
      Height          =   495
      Left            =   120
      ScaleHeight     =   435
      ScaleWidth      =   1155
      TabIndex        =   0
      Top             =   120
      Width           =   1215
   End
   Begin VB.Menu mnuFile
      Caption         =   "File"
      Begin VB.Menu mnuNew
         Caption         =   "New"
      End
      Begin VB.Menu mnuBar1
         Caption         =   "-"
      End
      Begin VB.Menu mnuLoad
         Caption         =   "Load"
      End
      Begin VB.Menu mnuSave
         Caption         =   "Save"
      End
      Begin VB.Menu mnuBar2
         Caption         =   "-"
      End
      Begin VB.Menu mnuExit
         Caption         =   "Exit"
      End
   End
   Begin VB.Menu mnuEdit
      Caption         =   "Edit"
      Begin VB.Menu mnuRename
         Caption         =   "Rename"
      End
      Begin VB.Menu mnuBar3
         Caption         =   "-"
      End
      Begin VB.Menu mnuColorOption
         Caption         =   "Color White"
         Index           =   0
      End
      Begin VB.Menu mnuColorOption
         Caption         =   "Color Random"
         Index           =   1
      End
      Begin VB.Menu mnuColorOption
         Caption         =   "Color Gradient"
         Index           =   2
      End
      Begin VB.Menu mnuBar4
         Caption         =   "-"
      End
      Begin VB.Menu mnuTessellationOption
         Caption         =   "Tessellate By Face"
         Index           =   0
      End
      Begin VB.Menu mnuTessellationOption
         Caption         =   "Tessellate By Edge"
         Index           =   1
      End
   End
   Begin VB.Menu mnuView
      Caption         =   "View"
      Begin VB.Menu mnuLight
         Caption         =   "Light"
         Shortcut        =   ^L
      End
      Begin VB.Menu mnuOrthographic
         Caption         =   "Orthographic"
         Shortcut        =   ^O
      End
      Begin VB.Menu mnuBar5
         Caption         =   "-"
      End
      Begin VB.Menu mnuDrawStyleOption
         Caption         =   "Wireframe"
         Index           =   0
         Shortcut        =   {F1}
      End
      Begin VB.Menu mnuDrawStyleOption
         Caption         =   "Solid"
         Index           =   1
         Shortcut        =   {F2}
      End
      Begin VB.Menu mnuDrawStyleOption
         Caption         =   "Shaded"
         Index           =   2
         Shortcut        =   {F3}
      End
      Begin VB.Menu mnuDrawStyleOption
         Caption         =   "Transparent"
         Index           =   3
         Shortcut        =   {F4}
      End
      Begin VB.Menu mnuDrawStyleOption
         Caption         =   "Outlined"
         Index           =   4
         Shortcut        =   {F5}
      End
      Begin VB.Menu mnuDrawStyleOption
         Caption         =   "Gradient"
         Index           =   5
         Shortcut        =   {F6}
      End
      Begin VB.Menu mnuBar6
         Caption         =   "-"
      End
      Begin VB.Menu mnuDrawModeOption
         Caption         =   "Double-Sided"
         Index           =   0
         Shortcut        =   ^D
      End
      Begin VB.Menu mnuDrawModeOption
         Caption         =   "Metallic"
         Index           =   1
         Shortcut        =   ^M
      End
      Begin VB.Menu mnuDrawModeOption
         Caption         =   "Atmosphere"
         Index           =   2
         Shortcut        =   ^A
      End
      Begin VB.Menu mnuDrawModeOption
         Caption         =   "Color-Correct"
         Index           =   3
         Shortcut        =   ^C
      End
   End
   Begin VB.Menu mnuObject
      Caption         =   "Object"
      Begin VB.Menu mnuBasicOption
         Caption         =   "Box"
         Index           =   0
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Grid"
         Index           =   1
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Sphere"
         Index           =   2
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Hemisphere"
         Index           =   3
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Cone"
         Index           =   4
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Cylinder"
         Index           =   5
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Pie"
         Index           =   6
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Tetrahedron"
         Index           =   7
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Octahedron"
         Index           =   8
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Geo-Sphere"
         Index           =   9
      End
      Begin VB.Menu mnuBasicOption
         Caption         =   "Torus"
         Index           =   10
      End
      Begin VB.Menu mnuBar7
         Caption         =   "-"
      End
      Begin VB.Menu mnuSpecialOption
         Caption         =   "Pixel"
         Index           =   0
      End
      Begin VB.Menu mnuSpecialOption
         Caption         =   "Line"
         Index           =   1
      End
      Begin VB.Menu mnuSpecialOption
         Caption         =   "Text"
         Index           =   2
      End
      Begin VB.Menu mnuSpecialOption
         Caption         =   "Curve"
         Index           =   3
      End
      Begin VB.Menu mnuBar8
         Caption         =   "-"
      End
      Begin VB.Menu mnuComboOption
         Caption         =   "Bar Graph"
         Index           =   0
      End
      Begin VB.Menu mnuComboOption
         Caption         =   "Grid Graph"
         Index           =   1
      End
      Begin VB.Menu mnuComboOption
         Caption         =   "Pie Graph"
         Index           =   2
      End
      Begin VB.Menu mnuBar9
         Caption         =   "-"
      End
      Begin VB.Menu mnuOtherOption
         Caption         =   "Ripple"
      End
   End
   Begin VB.Menu mnuHelp
      Caption         =   "Help"
      Begin VB.Menu mnuAbout
         Caption         =   "About"
      End
   End
End
Attribute VB_Name = "DEx3D"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Public Enum Color
    White = 0
    Random = 1
    Gradient = 2
End Enum
Public Enum Obj3D
    Box = 0
    Grid = 1
    CircleSphare = 2
    Hemisphere = 3
    Cone = 4
    Cylinder = 5
    Pie = 6
    Tetrahedron = 7
    Sphere = 8
    GeoSphere = 9
    Torus = 10
End Enum
Public Enum Combo
    Bar = 0
    Grid = 1
    OPie = 2
End Enum
Public Enum DrawStyle
    Wireframe = 0
    Solid = 1
    Shaded = 2
    Transparent = 3
    Outlined = 4
    Super = 5
End Enum
Public Enum DrawMode
    DoubleSided = 0
    Metallic = 1
    Atmosphere = 2
    ColorCorrect = 3
End Enum
Public Enum Tessellation
    Face = 0
    Edge = 1
End Enum
Public Enum Special
Pixel = 0
Line = 1
Text = 2
Curve = 3
End Enum
Dim Info As String
Public MH, MW
Dim exits
Public Sub Activate()

    Dim FrameRate As Single
   
    If BeginRenderLoop = True Then
        BeginRenderLoop = False
        Do
            If RefreshScene = True Then
                RefreshScene = False
                If TickCount < 10 Then
                    TickCount = TickCount + 1
                Else
                    FinishTime = Timer
                    If FinishTime <> BeginTime Then
                        FrameRate = TickCount / (FinishTime - BeginTime)
                        'UserControl1.Caption = App.Title & " - " & Format(FrameRate, "0.00") & " fps"
                        TickCount = 0
                        BeginTime = Timer
                    End If
                End If
                LastFaceOver = 0
                If LockCamera = True Then
                    VLight(MyLight).Origin = _
                        VectorAdd( _
                            VectorNull, _
                            VectorScale( _
                                OrientationToVector(OrientationInput(0, OrbitLatitude, -OrbitLongitude)), _
                                -OrbitRadius _
                            ) _
                        )
                    If CameraModel <> 0 Then
                        VMesh(CameraModel).Origin = VLight(MyLight).Origin
                        VMesh(CameraModel).Angles.Pitch = OrbitLatitude
                        VMesh(CameraModel).Angles.Yaw = -OrbitLongitude
                        VMesh(CameraModel).UpdateTransformation = True
                    End If
                Else
                    Call OrbitCamera(MyCamera, VectorNull, OrbitRadius, OrbitLongitude, OrbitLatitude)
                    VLight(MyLight).Origin = VCamera(MyCamera).Origin
                End If
                Picture1.Cls
                Call RenderImage(Picture1, MyCamera)
                Picture1.ForeColor = vbWhite
                Picture1.Print "Longitude: " & Int(RadianToDegree(OrbitLongitude))
                Picture1.Print "Latitude: " & Int(RadianToDegree(OrbitLatitude))
                Picture1.Print "Radius: " & Int(OrbitRadius)
                Picture1.Print
                Picture1.Print "Name: " & VMesh(MyMesh).Tag
                Picture1.Print "Vertices: " & VMesh(MyMesh).Vertices.Length
                Picture1.Print "Faces: " & VMesh(MyMesh).Faces.Length
                Info = "Longitude: " & Int(RadianToDegree(OrbitLongitude)) & vbCrLf & _
"Latitude: " & Int(RadianToDegree(OrbitLatitude)) & vbCrLf & _
"Radius: " & Int(OrbitRadius) & vbCrLf & vbCrLf & _
"Name: " & VMesh(MyMesh).Tag & vbCrLf & _
"Vertices: " & VMesh(MyMesh).Vertices.Length & vbCrLf & _
"Faces: " & VMesh(MyMesh).Faces.Length
            End If
            If exits = True Then Exit Do Else DoEvents
        Loop
    End If
   
End Sub
Public Sub Load()
exits = False
    Dim Extension As String
   
   ' CommonDialog1.CancelError = True
   
    Call InitializeScene(Picture1)
    Call InitializeCanvas(Picture2)
    Call InitializeCanvas(Picture3)
    Picture1.BorderStyle = 0
    Picture2.BorderStyle = 0
    Picture3.BorderStyle = 0
    Picture1.BackColor = vbBlack
    Picture2.BackColor = vbBlack
    Picture3.BackColor = vbBlack
   
    TickCount = 10
   
    MyCamera = AddCamera
    VCamera(MyCamera).Zoom = 1
    VCamera(MyCamera).DrawStyle = 2
    mnuDrawStyleOption(2).Checked = True
   
    MyLight = AddLight
    mnuLight.Checked = True
   
    OrbitRadius = 200
    OrbitSpeed = 0.01
    DollySpeed = 1
   
    If Command <> "" Then
        Extension = LCase(Right(Command, 3))
        If Extension = "dex" Then MyMesh = LoadDexMesh(Command)
        If Extension = "3ds" Then
            MyMesh = 0
            Call Load3dsFile(Command)
            Call SetSceneColor(ColorLongToRGB(vbWhite), 0.5)
        End If
        Call CenterMesh(MyMesh)
        RefreshScene = True
    End If
   
    BeginRenderLoop = True
   
End Sub

Public Sub Resize()

    Dim PaletteWidth As Integer
   
    PaletteWidth = MH / 20
   
    Picture1.Move 0, 0, MW - PaletteWidth, MH - PaletteWidth
    Picture2.Move MW - PaletteWidth, 0, PaletteWidth, MH - PaletteWidth
    Picture3.Move 0, MH - PaletteWidth, MW, PaletteWidth
   
    RefreshScene = True
   
End Sub


'===================================================================

Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer)

    If KeyCode = CShift Then
        LockCamera = True
        If CameraModel = 0 Then
            CameraModel = AddMeshCone(10, 20, 4)
            Call CenterMesh(CameraModel)
            Call TransformMesh(CameraModel, TransformationTranslate(VectorInput(0, 20, 0)))
            Call TransformMesh(CameraModel, TransformationRotate(1, -Pi / 2))
            Call TransformMesh(CameraModel, TransformationRotate(3, Pi / 4))
            Call SetMeshColor(CameraModel, ColorLongToRGB(vbRed), 0.5)
            UserControl1.mnuFile.Enabled = False
            UserControl1.mnuEdit.Enabled = False
            UserControl1.mnuView.Enabled = False
            UserControl1.mnuObject.Enabled = False
            UserControl1.mnuHelp.Enabled = False
        End If
    End If
   
End Sub
Private Sub Picture1_KeyUp(KeyCode As Integer, Shift As Integer)

    If KeyCode = CShift Then
        LockCamera = False
        If CameraModel <> 0 Then
            Call RemoveMesh(CameraModel)
            CameraModel = 0
            UserControl1.mnuFile.Enabled = True
            UserControl1.mnuEdit.Enabled = True
            UserControl1.mnuView.Enabled = True
            UserControl1.mnuObject.Enabled = True
            UserControl1.mnuHelp.Enabled = True
        End If
        RefreshScene = True
    End If
   
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If FaceOver <> 0 Then
        If CameraModel = 0 Then
            Select Case Button
                Case 1
                    VFace(FaceOver).Color = ColorLongToRGB(BrushColor)
                    VFace(FaceOver).Alpha = BrushAlpha
                    RefreshScene = True
                Case 2
                    BrushColor = ColorRGBToLong(VFace(FaceOver).Color)
                    BrushAlpha = VFace(FaceOver).Alpha
                    Call Picture3_Resize
            End Select
        End If
    End If
   
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If Button <> 0 Then
        Select Case Button
            Case 1 'orbit
                Picture1.MousePointer = 15
                OrbitLongitude = OrbitLongitude - (X - LastMousePosition.X) * OrbitSpeed
                OrbitLatitude = OrbitLatitude + (Y - LastMousePosition.Y) * OrbitSpeed
                If OrbitLongitude > Pi Then OrbitLongitude = OrbitLongitude - (2 * Pi)
                If OrbitLongitude < -Pi Then OrbitLongitude = OrbitLongitude + (2 * Pi)
                If OrbitLatitude > (Pi / 2) Then OrbitLatitude = (Pi / 2)
                If OrbitLatitude < -(Pi / 2) Then OrbitLatitude = -(Pi / 2)
            Case 2 'dolly
                Picture1.MousePointer = 7
                OrbitRadius = OrbitRadius + (Y - LastMousePosition.Y) * DollySpeed
                If OrbitRadius < 0 Then OrbitRadius = 0
        End Select
        RefreshScene = True
    Else
        If CameraModel = 0 Then
            FaceOver = FaceByPoint(POINTAPIInput(Int(X), Int(Y)))
            If FaceOver <> 0 Then
                Picture1.MousePointer = 2
            Else
                Picture1.MousePointer = 0
            End If
            If FaceOver <> LastFaceOver Then
                Picture1.DrawMode = 6
                Picture1.DrawStyle = 0
                Picture1.FillStyle = 1
                If LastFaceOver <> 0 Then Call DrawFace(Picture1, LastFaceOver, ColorNull)
                LastFaceOver = FaceOver
                Call DrawFace(Picture1, FaceOver, ColorNull)
                Picture1.Refresh
            End If
        Else
            Picture1.MousePointer = 0
        End If
    End If
    LastMousePosition.X = X
    LastMousePosition.Y = Y
   
End Sub
Private Sub Picture2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Call Picture2_MouseMove(Button, Shift, X, Y)
   
End Sub
Private Sub Picture2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Picture2.MousePointer = 2
    If Button <> 0 Then
        PaletteColor = GetPixel(Picture2.hdc, X, Y)
        If PaletteColor <> -1 Then BrushColor = PaletteColor
        Call Picture3_Resize
    End If
   
End Sub
Private Sub Picture2_Resize()

    Picture2.Cls
    Call DrawColorSpectrum(Picture2, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, 2)
   
End Sub
Private Sub Picture3_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Call Picture3_MouseMove(Button, Shift, X, Y)
   
End Sub
Private Sub Picture3_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Picture3.MousePointer = 9
    If Button <> 0 Then
        BrushAlpha = Abs(X - Picture3.ScaleWidth / 2) / (Picture3.ScaleWidth / 2)
        If BrushAlpha > 1 Then BrushAlpha = 1
        Call Picture3_Resize
    End If
   
End Sub
Private Sub Picture3_Resize()

    Picture3.Cls
    Call DrawColorShades(Picture3, 0, 0, Picture3.ScaleWidth, Picture3.ScaleHeight, 1, BrushColor)
    Call _
        DrawArrow( _
            Picture3, _
            Picture3.ScaleWidth / 2 + BrushAlpha * Picture3.ScaleWidth / 2, _
            0, _
            1, _
            Picture3.Height, _
            vbWhite, _
            5 _
        )
    Call _
        DrawArrow( _
            Picture3, _
            Picture3.ScaleWidth / 2 - BrushAlpha * Picture3.ScaleWidth / 2, _
            0, _
            1, _
            Picture3.Height, _
            vbWhite, _
            5 _
        )
       
End Sub

Public Function LoadDEX3D(Filename As String) As Boolean
    Dim Extension As String
    On Error GoTo ErrorErr
        Call ResetScene(0, MyCamera, MyLight)
        Extension = LCase(Right(Filename, 3))
        If Extension = "dex" Then MyMesh = LoadDexMesh(Filename)
        If Extension = "3ds" Then
            MyMesh = 1
            Call Load3dsFile(Filename)
            Call SetSceneColor(ColorLongToRGB(vbWhite), 0.5)
        End If
        RefreshScene = True
        LoadDEX3D = True
        Exit Function
ErrorErr:
        LoadDEX3D = False
End Function
Public Function SaveDEX3D(Filename As String) As Boolean
    On Error GoTo ErrorErr
    Call SaveDexMesh(MyMesh, Filename)
    SaveDEX3D = True
    Exit Function
ErrorErr:
    SaveDEX3D = False
End Function
Public Sub Rename(Tag)
On Error GoTo exx
    VMesh(MyMesh).Tag = Tag
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub

Public Sub New3D()
On Error GoTo exx
    Call ResetScene(0, MyCamera, MyLight)
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub

Public Sub About()
On Error GoTo exx
    Call ShowAbout
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub ColorOption(Optional ColorMode As Color = Gradient)
    On Error GoTo exx
    Select Case ColorMode
        Case 0
            Call SetMeshColor(MyMesh, ColorLongToRGB(vbWhite), 0.5)
        Case 1
            Call SetMeshColorRandom(MyMesh)
        Case 2
            Call SetMeshColorGradient(MyMesh, 2, ColorLongToRGB(vbRed), ColorLongToRGB(vbBlue), 0.5)
    End Select
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub

Public Sub ObjectOption(Optional Obj As Obj3D = Box, Optional length1 As Single = 40, Optional length2 As Single = 40, Optional length3 As Single = 40, Optional length4 As Single = 4)
    On Error GoTo exx
    Randomize
    Call ResetScene(0, MyCamera, MyLight)
    Select Case Obj
        Case 0
            MyMesh = AddMeshBox(VectorInput(length1, length2, length3))
        Case 1
            MyMesh = AddMeshGrid(length1, length2, Int(length3), Int(length4), False)
        Case 2
            MyMesh = AddMeshSphere(length1, Int(length2), Int(length3))
        Case 3
            MyMesh = AddMeshHemisphere(length1, Int(length2), Int(length3))
        Case 4
            MyMesh = AddMeshCone(length1, length2, Int(length3))
        Case 5
            MyMesh = AddMeshCylinder(length1, length2, Int(length3))
        Case 6
            MyMesh = AddMeshPie(length1, length2, 0, length3, Int(length4))
        Case 7
            MyMesh = AddMeshTetrahedron(length1)
        Case 8
            MyMesh = AddMeshSphere(length1, Int(length2), Int(length3))
        Case 9
            MyMesh = AddMeshGeoSphere(length1, Int(length2))
        Case 10
            MyMesh = AddMeshTorus(length1, length2, Int(length3), Int(length4))
    End Select
    Call CenterMesh(MyMesh)
    Call SetMeshColor(MyMesh, ColorRandom, 0.5)
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub ComboOption(Optional MyCombo As Combo = OPie, Optional Length As Single = 40)
On Error GoTo exx
    Dim A As Integer
    Dim B As Integer
    Dim C As Integer
    Dim D() As Single
    Dim E() As Long
    Randomize
    Call ResetScene(0, MyCamera, MyLight)
    Select Case MyCombo
        Case 0
            ReDim D(1 To 18)
            ReDim E(1 To 18)
            C = 1
            For A = 1 To 3
                For B = 1 To 6
                    D(C) = Rnd
                    E(C) = RGB(255 * Rnd, 255 * Rnd, 255 * Rnd)
                    C = C + 1
                Next B
            Next A
            MyMesh = AddMeshBarGraph(6, 3, VectorInput(Length * 2, Length, Length), 5, D(), E())
        Case 1
            ReDim D(1 To 25)
            ReDim E(1 To 25)
            C = 1
            For A = 1 To 5
                For B = 1 To 5
                    D(C) = Rnd
                    E(C) = RGB(255 * Rnd, 255 * Rnd, 255 * Rnd)
                    C = C + 1
                Next B
            Next A
            MyMesh = AddMeshGridGraph(5, 5, VectorInput(Length * 2, Length, Length * 2), D(), vbBlue, vbRed, False)
        Case 2
            ReDim D(1 To 4)
            ReDim E(1 To 4)
            For A = 1 To 4
                D(A) = Rnd
                E(A) = RGB(255 * Rnd, 255 * Rnd, 255 * Rnd)
            Next A
            MyMesh = AddMeshPieGraph(Length, 10, 16, D(), E())
    End Select
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub

Public Function GetInfo() As String
On Error GoTo exx
    GetInfo = Info
Exit Function
exx:   MsgBox "Error" & Err.Number & ":" & Err.Description
End Function

Public Sub DrawModeOption(Optional Mode As DrawMode = DoubleSided)
On Error GoTo exx
    mnuDrawModeOption(Mode).Checked = Not mnuDrawModeOption(Mode).Checked
    Select Case Index
        Case 0
            VCamera(MyCamera).DoubleSided = mnuDrawModeOption(Mode).Checked
        Case 1
            VCamera(MyCamera).Metallic = mnuDrawModeOption(Mode).Checked
        Case 2
            VCamera(MyCamera).Atmosphere = mnuDrawModeOption(Mode).Checked
        Case 3
            VCamera(MyCamera).ColorCorrect = mnuDrawModeOption(Mode).Checked
    End Select
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub DrawStyleOption(Optional Style As DrawStyle = Super)
On Error GoTo exx
    mnuDrawStyleOption(VCamera(MyCamera).DrawStyle).Checked = False
    mnuDrawStyleOption(Style).Checked = True
    VCamera(MyCamera).DrawStyle = Style
    RefreshScene = True
Exit Sub

exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub Light3D()
On Error GoTo exx
    mnuLight.Checked = Not mnuLight.Checked
    VLight(MyLight).Enabled = mnuLight.Checked
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub Orthographic()
On Error GoTo exx
    mnuOrthographic.Checked = Not mnuOrthographic.Checked
    VCamera(MyCamera).Orthographic = mnuOrthographic.Checked
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub OtherOption(Optional Length As Single = 40)
On Error GoTo exx
    Call ResetScene(0, MyCamera, MyLight)
    MyMesh = AddMeshGrid(Length * 2, Length * 2, 10, 10, False)
    Call CenterMesh(MyMesh)
    Call RippleMesh(MyMesh, Length, 20, 0)
    Call SetMeshColorGradient(MyMesh, 2, ColorLongToRGB(vbBlue), ColorLongToRGB(vbRed), 0.5)
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub SpecialOption(Optional Index As Special = Text, Optional Length As Single = 100, Optional Text As String = "DEX3D")
    On Error GoTo exx
    Dim A As Integer
    Randomize
    Call ResetScene(0, MyCamera, MyLight)
    Select Case Index
        Case 0
            For A = 1 To 40
                MyMesh = AddMeshPoint(VectorScale(VectorRandom, Length))
                Call SetMeshColorRandom(MyMesh)
            Next A
        Case 1
            For A = 1 To 10
                MyMesh = _
                    AddMeshLine( _
                        VectorScale(VectorRandom, Length), _
                        VectorScale(VectorRandom, Length) _
                    )
                Call SetMeshColorRandom(MyMesh)
            Next A
        Case 2
            For A = 1 To 20
                MyMesh = AddMeshText(Text, VectorScale(VectorRandom, Length))
                Call SetMeshColorRandom(MyMesh)
            Next A
        Case 3
            For A = 1 To 10
                MyMesh = _
                    AddMeshCurve( _
                        VectorScale(VectorRandom, Length), _
                        VectorScale(VectorRandom, Length), _
                        VectorScale(VectorRandom, Length), _
                        VectorScale(VectorRandom, Length) _
                    )
                Call SetMeshColorRandom(MyMesh)
            Next A
    End Select
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub
Public Sub TessellationOption(Optional Index As Tessellation = Edge)
On Error GoTo exx
    Select Case Index
        Case 0
            Call TessellateMeshByFace(MyMesh, 1)
        Case 1
            Call TessellateMeshByEdge(MyMesh, 1)
    End Select
    Call SetMeshColor(MyMesh, ColorLongToRGB(vbWhite), 0.5)
    RefreshScene = True
Exit Sub
exx: MsgBox "Error" & Err.Number & ":" & Err.Description
End Sub

Public Sub Bit2(X As Single)
Picture3_MouseDown 1, 0, X, 0
End Sub
Public Sub Bit1(Y As Single)
Picture2_MouseDown 1, 0, 2, Y
End Sub
Public Sub Quit()
exits = True
End Sub
Private Sub UserControl_Resize()

    Dim PaletteWidth As Integer

    PaletteWidth = MH / 20

    Picture1.Move 0, 0, MW - PaletteWidth, MH - PaletteWidth
    Picture2.Move MW - PaletteWidth, 0, PaletteWidth, MH - PaletteWidth
    Picture3.Move 0, MH - PaletteWidth, MW, PaletteWidth

    RefreshScene = True
End Sub