VB6 Dex3D.frm
Jump to navigation
Jump to search
After refactoring the code found below, the following code creates rather a function for direct-calling of scene-rendering, which is called from various points in the project code, where previously a flag was set to invoked a forever-loop (now replaced) to redraw the screen once while looping forever. This direct-call approach is now working by Windows events, like mouse-movements, to invoke a screen refresh.
The new refactored method, RefreshScene(), is found in original code as a Form_Activate() code-event.
VB6 RefreshScene() method reworked from startup-form Dex3D.frm
Option Explicit '' Added -XE Private Sub RefreshScene() Dim FrameRate As Single If TickCount < 10 Then TickCount = TickCount + 1 Else FinishTime = Timer If FinishTime <> BeginTime Then FrameRate = TickCount / (FinishTime - BeginTime) Form1.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 End Sub Private Sub Form_Load() 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 End If End Sub Private Sub Form_Resize() Dim PaletteWidth As Integer PaletteWidth = Form1.ScaleHeight / 20 Picture1.Move 0, 0, Form1.ScaleWidth - PaletteWidth, Form1.ScaleHeight - PaletteWidth Picture2.Move Form1.ScaleWidth - PaletteWidth, 0, PaletteWidth, Form1.ScaleHeight - PaletteWidth Picture3.Move 0, Form1.ScaleHeight - PaletteWidth, Form1.ScaleWidth, PaletteWidth RefreshScene End Sub Private Sub Form_Unload(Cancel As Integer) End End Sub Private Sub mnuAbout_Click() Call ShowAbout End Sub Private Sub mnuBasicOption_Click(Index As Integer) Randomize Call ResetScene(0, MyCamera, MyLight) Select Case Index Case 0 MyMesh = AddMeshBox(VectorInput(40, 40, 40)) Case 1 MyMesh = AddMeshGrid(80, 80, 4, 4, False) Case 2 MyMesh = AddMeshSphere(40, 16, 8) Case 3 MyMesh = AddMeshHemisphere(40, 16, 4) Case 4 MyMesh = AddMeshCone(40, 60, 16) Case 5 MyMesh = AddMeshCylinder(40, 60, 16) Case 6 MyMesh = AddMeshPie(80, 20, 0, 60, 32) Case 7 MyMesh = AddMeshTetrahedron(40) Case 8 MyMesh = AddMeshSphere(40, 4, 2) Case 9 MyMesh = AddMeshGeoSphere(40, 2) Case 10 MyMesh = AddMeshTorus(40, 10, 16, 8) End Select Call CenterMesh(MyMesh) Call SetMeshColor(MyMesh, ColorRandom, 0.5) RefreshScene End Sub Private Sub mnuColorOption_Click(Index As Integer) Select Case Index 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 End Sub Private Sub mnuComboOption_Click(Index As Integer) 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 Index 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(80, 40, 40), 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(80, 40, 80), 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(40, 10, 16, D(), E()) End Select RefreshScene End Sub Private Sub mnuDrawModeOption_Click(Index As Integer) mnuDrawModeOption(Index).Checked = Not mnuDrawModeOption(Index).Checked Select Case Index Case 0 VCamera(MyCamera).DoubleSided = mnuDrawModeOption(Index).Checked Case 1 VCamera(MyCamera).Metallic = mnuDrawModeOption(Index).Checked Case 2 VCamera(MyCamera).Atmosphere = mnuDrawModeOption(Index).Checked Case 3 VCamera(MyCamera).ColorCorrect = mnuDrawModeOption(Index).Checked End Select RefreshScene End Sub Private Sub mnuDrawStyleOption_Click(Index As Integer) mnuDrawStyleOption(VCamera(MyCamera).DrawStyle).Checked = False mnuDrawStyleOption(Index).Checked = True VCamera(MyCamera).DrawStyle = Index RefreshScene End Sub Private Sub mnuExit_Click() End End Sub Private Sub mnuHomepage_Click() Call Explore("http://members.xoom.com/onlyuser") End Sub Private Sub mnuLight_Click() mnuLight.Checked = Not mnuLight.Checked VLight(MyLight).Enabled = mnuLight.Checked RefreshScene End Sub Private Sub mnuLoad_Click() Dim Extension As String On Error Resume Next CommonDialog1.Filter = _ "Dex3D Files (*.dex)|*.dex|3D Studio Files (*.3ds)|*.3ds|All Files (*.*)|*.*" CommonDialog1.ShowOpen If Err = 0 Then Call ResetScene(0, MyCamera, MyLight) Extension = LCase(Right(CommonDialog1.Filename, 3)) If Extension = "dex" Then MyMesh = LoadDexMesh(CommonDialog1.Filename) If Extension = "3ds" Then MyMesh = 1 Call Load3dsFile(CommonDialog1.Filename) Call SetSceneColor(ColorLongToRGB(vbWhite), 0.5) End If RefreshScene End If End Sub Private Sub mnuNew_Click() Call ResetScene(0, MyCamera, MyLight) RefreshScene End Sub Private Sub mnuOrthographic_Click() mnuOrthographic.Checked = Not mnuOrthographic.Checked VCamera(MyCamera).Orthographic = mnuOrthographic.Checked RefreshScene End Sub Private Sub mnuOtherOption_Click() Call ResetScene(0, MyCamera, MyLight) MyMesh = AddMeshGrid(80, 80, 10, 10, False) Call CenterMesh(MyMesh) Call RippleMesh(MyMesh, 40, 20, 0) Call SetMeshColorGradient(MyMesh, 2, ColorLongToRGB(vbBlue), ColorLongToRGB(vbRed), 0.5) RefreshScene End Sub Private Sub mnuRename_Click() VMesh(MyMesh).Tag = InputBox("Enter new name:", "Rename", VMesh(MyMesh).Tag) RefreshScene End Sub Private Sub mnuSave_Click() On Error Resume Next CommonDialog1.Filter = "Dex3D Files (*.dex)|*.dex|All Files (*.*)|*.*" CommonDialog1.ShowSave If Err = 0 Then Call SaveDexMesh(MyMesh, CommonDialog1.Filename) End Sub Private Sub mnuSpecialOption_Click(Index As Integer) Dim A As Integer Randomize Call ResetScene(0, MyCamera, MyLight) Select Case Index Case 0 For A = 1 To 40 MyMesh = AddMeshPoint(VectorScale(VectorRandom, 40)) Call SetMeshColorRandom(MyMesh) Next A Case 1 For A = 1 To 10 MyMesh = _ AddMeshLine( _ VectorScale(VectorRandom, 40), _ VectorScale(VectorRandom, 40) _ ) Call SetMeshColorRandom(MyMesh) Next A Case 2 For A = 1 To 20 MyMesh = AddMeshText("3D", VectorScale(VectorRandom, 40)) Call SetMeshColorRandom(MyMesh) Next A Case 3 For A = 1 To 10 MyMesh = _ AddMeshCurve( _ VectorScale(VectorRandom, 40), _ VectorScale(VectorRandom, 40), _ VectorScale(VectorRandom, 40), _ VectorScale(VectorRandom, 40) _ ) Call SetMeshColorRandom(MyMesh) Next A End Select RefreshScene End Sub Private Sub mnuTessellationOption_Click(Index As Integer) 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 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) Form1.mnuFile.Enabled = False Form1.mnuEdit.Enabled = False Form1.mnuView.Enabled = False Form1.mnuObject.Enabled = False Form1.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 Form1.mnuFile.Enabled = True Form1.mnuEdit.Enabled = True Form1.mnuView.Enabled = True Form1.mnuObject.Enabled = True Form1.mnuHelp.Enabled = True End If RefreshScene 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 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 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