- Contents in this wiki are for entertainment purposes only
VB6 Dex3D.frm: Difference between revisions
Jump to navigation
Jump to search
XenoEngineer (talk | contribs) No edit summary |
XenoEngineer (talk | contribs) No edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 3: | Line 3: | ||
'''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. | '''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(), | 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=== | ===VB6 RefreshScene() method reworked from startup-form Dex3D.frm=== | ||
<pre style="background:#333; color:lime; margin:0 auto; max-width:880px; padding:20px; "> | <pre style="background:#333; color:lime; margin:0 auto; max-width:880px; padding:20px; "> | ||
Option Explicit '' Added -XE | |||
Private Sub RefreshScene() | 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 | If LockCamera = True Then | ||
VLight(MyLight).Origin = _ | VLight(MyLight).Origin = _ | ||
VectorAdd( _ | |||
VectorNull, _ | |||
VectorScale( _ | |||
OrientationToVector(OrientationInput(0, OrbitLatitude, -OrbitLongitude)), _ | |||
-OrbitRadius _ | |||
) _ | |||
) | |||
If CameraModel <> 0 Then | If CameraModel <> 0 Then | ||
VMesh(CameraModel).Origin = VLight(MyLight).Origin | VMesh(CameraModel).Origin = VLight(MyLight).Origin | ||
Line 25: | Line 41: | ||
VMesh(CameraModel).UpdateTransformation = True | VMesh(CameraModel).UpdateTransformation = True | ||
End If | End If | ||
Else | Else | ||
Call OrbitCamera(MyCamera, VectorNull, OrbitRadius, OrbitLongitude, OrbitLatitude) | Call OrbitCamera(MyCamera, VectorNull, OrbitRadius, OrbitLongitude, OrbitLatitude) | ||
VLight(MyLight).Origin = VCamera(MyCamera).Origin | 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 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 | 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 | 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 | |||
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 | 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 | Else | ||
Picture1.MousePointer = 0 | |||
End If | |||
If FaceOver <> LastFaceOver Then | |||
Picture1.DrawMode = 6 | |||
Picture1. | Picture1.DrawStyle = 0 | ||
Picture1.FillStyle = 1 | |||
Picture1. | If LastFaceOver <> 0 Then Call DrawFace(Picture1, LastFaceOver, ColorNull) | ||
Picture1. | LastFaceOver = FaceOver | ||
Call DrawFace(Picture1, FaceOver, ColorNull) | |||
Picture1.Refresh | |||
Picture1. | |||
End If | 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 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 | End Sub | ||
</pre> | </pre> |
Latest revision as of 10:00, 3 January 2024
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