home *** CD-ROM | disk | FTP | other *** search
- '3D CyberSpace viewer from...
-
- 'Ivory Tower Software
- 'Richard Wagner
- 'CIS 76427,2611
-
- 'Copyright 1992, all rights reserved.
-
- 'You may use this VB source code in your programs if you include attribution in your
- 'startup and "about" screens in the form: "Portions of this program copyright by
- 'Ivory Tower Software, used with permission."
-
-
-
- Sub BorderBoxRaised (Source1 As Control, Source2 As Form)
-
- Source2.drawwidth = 1
- Bleft% = Source1.Left - 15
- BTop% = Source1.top - 15
- BWide% = Source1.width + 15
- BHigh% = Source1.height + 15
- Source2.Line (Bleft%, BTop%)-Step(BWide%, 0), &HFFFFFF
- Source2.Line -Step(0, BHigh%), 0
- Source2.Line -Step(-BWide%, 0), 0
- Source2.Line -Step(0, -BHigh%), &HFFFFFF
-
- End Sub
-
- Sub BorderBoxRecessed (Source1 As Control, Source2 As Form)
-
- Source2.drawwidth = 1
- Bleft% = Source1.Left - 20
- BTop% = Source1.top - 20
- BWide% = Source1.width + 15
- BHigh% = Source1.height + 15
- Source2.Line (Bleft%, BTop%)-Step(BWide%, 0), 0
- Source2.Line -Step(0, BHigh%), &HFFFFFF
- Source2.Line -Step(-BWide%, 0), &HFFFFFF
- Source2.Line -Step(0, -BHigh%), 0
-
- End Sub
-
- Sub MapToWindow (ByVal PointNum As Integer, ByVal X, ByVal Y, ByVal Z)
-
- 'Transform object point in World Space to View Space.
- 'Call GEO.DLL subroutine:
- ThreeDXForm 1000, 1000, X, Y, Z, sfViewPointX, sfViewPointY, sfViewPointZ, sfWinPointX, sfWinPointY, sfWinPointZ, sfRPointX, sfRPointY, sfRPointZ, sfSPointX, sfSPointY, sfSPointZ, PxStar, PyStar, PzStar
-
- 'Transform object point in View 3Space to Window 2Space:
- If PzStar <> 0 Then
- PxStar = -PxStar * 1000 / PzStar
- PyStar = -PyStar * 1000 / PzStar
- Else
- PxStar = -PxStar * 1000 * 30000 'Can't divide by zero so
- PyStar = -PyStar * 1000 * 30000 'do the next best thing
- End If
-
- 'Convert mapped points to integers for drawing:
- If PxStar <= 30000 And PxStar >= -30000 Then
- iPx(PointNum) = CInt(PxStar)
- Else
- iPx(PointNum) = 30000 * Sgn(PxStar)
- End If
-
- If PyStar <= 30000 And PyStar >= -30000 Then
- iPy(PointNum) = CInt(PyStar)
- Else
- iPy(PointNum) = 30000 * Sgn(PyStar)
- End If
-
- If PzStar <= 30000 And PzStar >= -30000 Then
- iPz(PointNum) = CInt(PzStar)
- Else
- iPz(PointNum) = 30000 * Sgn(PzStar)
- End If
-
- End Sub
-
- Sub PicBorderBoxRecessed (Source1 As Control, Source2 As Control)
-
- Source2.drawwidth = 1
- Bleft% = Source1.Left - 15
- BTop% = Source1.top - 15
- BWide% = Source1.width + 15
- BHigh% = Source1.height + 15
- Source2.Line (Bleft%, BTop%)-Step(BWide%, 0), 0
- Source2.Line -Step(0, BHigh%), &HFFFFFF
- Source2.Line -Step(-BWide%, 0), &HFFFFFF
- Source2.Line -Step(0, -BHigh%), 0
-
- End Sub
-
- Sub PlaceAllObjects ()
-
- 'All the defined objects get placed in cyberspace, with more distant objects
- 'getting placed first.
-
- XView.mousepointer = 11
-
- For i% = 1 To iNumObjects
- 'Find distances squared of objects' centers from ViewPoint:
- 'There is no need to take the square root, because it's the distance order we want.
-
- sfDSquared(i%) = (iLocationX(i%) - sfViewPointX) ^ 2 + (iLocationY(i%) - sfViewPointY) ^ 2 + (iLocationZ(i%) - sfViewPointZ) ^ 2
-
- 'Initialize object order array:
- iObjOrder(i%) = i%
- Next i%
-
- 'Sort objects by their distances squared:
- 'Bubble sort
- For i% = 1 To iNumObjects - 1
- For j% = i% + 1 To iNumObjects
- If sfDSquared(i%) < sfDSquared(j%) Then
-
- Temp1! = sfDSquared(i%)
- sfDSquared(i%) = sfDSquared(j%)
- sfDSquared(j%) = Temp1!
-
- Temp2! = iObjOrder(i%)
- iObjOrder(i%) = iObjOrder(j%)
- iObjOrder(j%) = Temp2!
-
- End If
- Next j%
- Next i%
-
- For i% = 1 To iNumObjects
- 'See if center of object is outside view pyramid by 500 CLUs:
- 'Objects completely out of view don't get drawn.
- 'This means that the biggest object in cyberspace cannot be bigger than
- '1000 CLUs in any dimension.
- NewX! = iLocationX(i%) - sfViewPointX
- NewY! = iLocationY(i%) - sfViewPointY
- NewZ! = iLocationZ(i%) - sfViewPointZ
- CenterXstar& = (sfRPointX - sfWinPointX) * NewX! / 500 + (sfRPointY - sfWinPointY) * NewY! / 500 + (sfRPointZ - sfWinPointZ) * NewZ! / 500
- CenterYstar& = (sfSPointX - sfWinPointX) * NewX! / 500 + (sfSPointY - sfWinPointY) * NewY! / 500 + (sfSPointZ - sfWinPointZ) * NewZ! / 500
- CenterZstar& = (sfViewPointX - sfWinPointX) * NewX! / 1000 + (sfViewPointY - sfWinPointY) * NewY! / 1000 + (sfViewPointZ - sfWinPointZ) * NewZ! / 1000
- iInView(i%) = -1
- If CenterXstar& > (1000 - CenterZstar&) / 2 Then
- iInView(i%) = 0
- End If
- If CenterXstar& < (CenterZstar& - 1000) / 2 Then
- iInView(i%) = 0
- End If
- If CenterYstar& > (1000 - CenterZstar&) / 2 Then
- iInView(i%) = 0
- End If
- If CenterYstar& < (CenterZstar& - 1000) / 2 Then
- iInView(i%) = 0
- End If
-
- Next i%
-
- For i% = 1 To iNumObjects
-
- 'Erase
- 'Objects are explicitly erased for smooth drawing.
- If iInViewPrev(iObjOrder(i%)) Then PlaceObject iObjOrder(i%), -1
-
- Next i%
-
- For i% = 1 To iNumObjects
-
- 'Place
- If iInView(iObjOrder(i%)) Then PlaceObject iObjOrder(i%), 0
- iInViewPrev(i%) = iInView(i%)
-
- Next i%
- XView.mousepointer = 0
-
- End Sub
-
- Sub PlaceObject (ObjNum As Integer, iErase As Integer)
-
- 'Each object is placed separately after erasing its old placement.
- 'Cls is not used because that makes a flickering view port.
-
- On Error GoTo PlaceObjectHandler
-
- If Not iErase Then 'Placing objects, so calculate transformations:
-
- For i% = 1 To iNumPoints(iObjectType(ObjNum)) 'Do it for each point in the object:
-
- 'Point is referenced to iLocationX, Y, Z of object center relative to the viewpoint:
- NewX! = iObjectX(iObjectType(ObjNum), i%) * sfSize(ObjNum) + iLocationX(ObjNum) - sfViewPointX
- NewY! = iObjectY(iObjectType(ObjNum), i%) * sfSize(ObjNum) + iLocationY(ObjNum) - sfViewPointY
- NewZ! = iObjectZ(iObjectType(ObjNum), i%) * sfSize(ObjNum) + iLocationZ(ObjNum) - sfViewPointZ
-
- MapToWindow i%, NewX!, NewY!, NewZ!
-
- Next i%
-
- End If
-
- 'Each object is drawn depending on its type:
- Select Case iObjectType(ObjNum)
-
- Case 1, 44 'Wireframe Cube
-
- If iErase Then 'Erase previous rendering of the object:
- '(doing CLS makes a jumpy flickering picture)
-
- If PzOld(ObjNum, 1) < 0 Or PzOld(ObjNum, 2) < 0 Then
- If (Abs(PxOld(ObjNum, 1)) < 500 And Abs(PyOld(ObjNum, 1)) < 500) Or (Abs(PxOld(ObjNum, 2)) < 500 And Abs(PyOld(ObjNum, 2)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 1), PyOld(ObjNum, 1))-(PxOld(ObjNum, 2), PyOld(ObjNum, 2)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 2) < 0 Or PzOld(ObjNum, 3) < 0 Then
- If (Abs(PxOld(ObjNum, 2)) < 500 And Abs(PyOld(ObjNum, 2)) < 500) Or (Abs(PxOld(ObjNum, 3)) < 500 And Abs(PyOld(ObjNum, 3)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 2), PyOld(ObjNum, 2))-(PxOld(ObjNum, 3), PyOld(ObjNum, 3)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 3) < 0 Or PzOld(ObjNum, 4) < 0 Then
- If (Abs(PxOld(ObjNum, 3)) < 500 And Abs(PyOld(ObjNum, 3)) < 500) Or (Abs(PxOld(ObjNum, 4)) < 500 And Abs(PyOld(ObjNum, 4)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 3), PyOld(ObjNum, 3))-(PxOld(ObjNum, 4), PyOld(ObjNum, 4)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 4) < 0 Or PzOld(ObjNum, 1) < 0 Then
- If (Abs(PxOld(ObjNum, 4)) < 500 And Abs(PyOld(ObjNum, 4)) < 500) Or (Abs(PxOld(ObjNum, 1)) < 500 And Abs(PyOld(ObjNum, 1)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 4), PyOld(ObjNum, 4))-(PxOld(ObjNum, 1), PyOld(ObjNum, 1)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 5) < 0 Or PzOld(ObjNum, 6) < 0 Then
- If (Abs(PxOld(ObjNum, 5)) < 500 And Abs(PyOld(ObjNum, 5)) < 500) Or (Abs(PxOld(ObjNum, 6)) < 500 And Abs(PyOld(ObjNum, 6)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 5), PyOld(ObjNum, 5))-(PxOld(ObjNum, 6), PyOld(ObjNum, 6)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 6) < 0 Or PzOld(ObjNum, 7) < 0 Then
- If (Abs(PxOld(ObjNum, 6)) < 500 And Abs(PyOld(ObjNum, 6)) < 500) Or (Abs(PxOld(ObjNum, 7)) < 500 And Abs(PyOld(ObjNum, 7)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 6), PyOld(ObjNum, 6))-(PxOld(ObjNum, 7), PyOld(ObjNum, 7)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 7) < 0 Or PzOld(ObjNum, 8) < 0 Then
- If (Abs(PxOld(ObjNum, 7)) < 500 And Abs(PyOld(ObjNum, 7)) < 500) Or (Abs(PxOld(ObjNum, 8)) < 500 And Abs(PyOld(ObjNum, 8)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 7), PyOld(ObjNum, 7))-(PxOld(ObjNum, 8), PyOld(ObjNum, 8)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 8) < 0 Or PzOld(ObjNum, 5) < 0 Then
- If (Abs(PxOld(ObjNum, 8)) < 500 And Abs(PyOld(ObjNum, 8)) < 500) Or (Abs(PxOld(ObjNum, 5)) < 500 And Abs(PyOld(ObjNum, 5)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 8), PyOld(ObjNum, 8))-(PxOld(ObjNum, 5), PyOld(ObjNum, 5)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 1) < 0 Or PzOld(ObjNum, 5) < 0 Then
- If (Abs(PxOld(ObjNum, 1)) < 500 And Abs(PyOld(ObjNum, 1)) < 500) Or (Abs(PxOld(ObjNum, 5)) < 500 And Abs(PyOld(ObjNum, 5)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 1), PyOld(ObjNum, 1))-(PxOld(ObjNum, 5), PyOld(ObjNum, 5)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 2) < 0 Or PzOld(ObjNum, 6) < 0 Then
- If (Abs(PxOld(ObjNum, 2)) < 500 And Abs(PyOld(ObjNum, 2)) < 500) Or (Abs(PxOld(ObjNum, 6)) < 500 And Abs(PyOld(ObjNum, 6)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 2), PyOld(ObjNum, 2))-(PxOld(ObjNum, 6), PyOld(ObjNum, 6)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 3) < 0 Or PzOld(ObjNum, 7) < 0 Then
- If (Abs(PxOld(ObjNum, 3)) < 500 And Abs(PyOld(ObjNum, 3)) < 500) Or (Abs(PxOld(ObjNum, 7)) < 500 And Abs(PyOld(ObjNum, 7)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 3), PyOld(ObjNum, 3))-(PxOld(ObjNum, 7), PyOld(ObjNum, 7)), QBColor(7)
- End If
- End If
- If PzOld(ObjNum, 4) < 0 Or PzOld(ObjNum, 8) < 0 Then
- If (Abs(PxOld(ObjNum, 4)) < 500 And Abs(PyOld(ObjNum, 4)) < 500) Or (Abs(PxOld(ObjNum, 8)) < 500 And Abs(PyOld(ObjNum, 8)) < 500) Then
- XView.ViewPic.Line (PxOld(ObjNum, 4), PyOld(ObjNum, 4))-(PxOld(ObjNum, 8), PyOld(ObjNum, 8)), QBColor(7)
- End If
- End If
-
- Else
- 'Draw object:
- If iPz(1) < 0 Or iPz(2) < 0 Then
- If (Abs(iPx(1)) < 500 And Abs(iPy(1)) < 500) Or (Abs(iPx(2)) < 500 And Abs(iPy(2)) < 500) Then
- XView.ViewPic.Line (iPx(1), iPy(1))-(iPx(2), iPy(2)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(2) < 0 Or iPz(3) < 0 Then
- If (Abs(iPx(2)) < 500 And Abs(iPy(2)) < 500) Or (Abs(iPx(3)) < 500 And Abs(iPy(3)) < 500) Then
- XView.ViewPic.Line (iPx(2), iPy(2))-(iPx(3), iPy(3)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(3) < 0 Or iPz(4) < 0 Then
- If (Abs(iPx(3)) < 500 And Abs(iPy(3)) < 500) Or (Abs(iPx(4)) < 500 And Abs(iPy(4)) < 500) Then
- XView.ViewPic.Line (iPx(3), iPy(3))-(iPx(4), iPy(4)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(4) < 0 Or iPz(1) < 0 Then
- If (Abs(iPx(4)) < 500 And Abs(iPy(4)) < 500) Or (Abs(iPx(1)) < 500 And Abs(iPy(1)) < 500) Then
- XView.ViewPic.Line (iPx(4), iPy(4))-(iPx(1), iPy(1)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(5) < 0 Or iPz(6) < 0 Then
- If (Abs(iPx(5)) < 500 And Abs(iPy(5)) < 500) Or (Abs(iPx(6)) < 500 And Abs(iPy(6)) < 500) Then
- XView.ViewPic.Line (iPx(5), iPy(5))-(iPx(6), iPy(6)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(6) < 0 Or iPz(7) < 0 Then
- If (Abs(iPx(6)) < 500 And Abs(iPy(6)) < 500) Or (Abs(iPx(7)) < 500 And Abs(iPy(7)) < 500) Then
- XView.ViewPic.Line (iPx(6), iPy(6))-(iPx(7), iPy(7)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(7) < 0 Or iPz(8) < 0 Then
- If (Abs(iPx(7)) < 500 And Abs(iPy(7)) < 500) Or (Abs(iPx(8)) < 500 And Abs(iPy(8)) < 500) Then
- XView.ViewPic.Line (iPx(7), iPy(7))-(iPx(8), iPy(8)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(8) < 0 Or iPz(5) < 0 Then
- If (Abs(iPx(8)) < 500 And Abs(iPy(8)) < 500) Or (Abs(iPx(5)) < 500 And Abs(iPy(5)) < 500) Then
- XView.ViewPic.Line (iPx(8), iPy(8))-(iPx(5), iPy(5)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(1) < 0 Or iPz(5) < 0 Then
- If (Abs(iPx(1)) < 500 And Abs(iPy(1)) < 500) Or (Abs(iPx(5)) < 500 And Abs(iPy(5)) < 500) Then
- XView.ViewPic.Line (iPx(1), iPy(1))-(iPx(5), iPy(5)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(2) < 0 Or iPz(6) < 0 Then
- If (Abs(iPx(2)) < 500 And Abs(iPy(2)) < 500) Or (Abs(iPx(6)) < 500 And Abs(iPy(6)) < 500) Then
- XView.ViewPic.Line (iPx(2), iPy(2))-(iPx(6), iPy(6)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(3) < 0 Or iPz(7) < 0 Then
- If (Abs(iPx(3)) < 500 And Abs(iPy(3)) < 500) Or (Abs(iPx(7)) < 500 And Abs(iPy(7)) < 500) Then
- XView.ViewPic.Line (iPx(3), iPy(3))-(iPx(7), iPy(7)), QBColor(iColor(ObjNum))
- End If
- End If
- If iPz(4) < 0 Or iPz(8) < 0 Then
- If (Abs(iPx(4)) < 500 And Abs(iPy(4)) < 500) Or (Abs(iPx(8)) < 500 And Abs(iPy(8)) < 500) Then
- XView.ViewPic.Line (iPx(4), iPy(4))-(iPx(8), iPy(8)), QBColor(iColor(ObjNum))
- End If
- End If
-
- For i% = 1 To 8
- PxOld(ObjNum, i%) = iPx(i%)
- PyOld(ObjNum, i%) = iPy(i%)
- PzOld(ObjNum, i%) = iPz(i%)
- Next i%
-
- End If
-
- Case 13 To 21, 26 'Filled Quadrilateral
-
- If iErase Then
-
- Z1% = PzOld(ObjNum, 1)
- Z2% = PzOld(ObjNum, 2)
- Z3% = PzOld(ObjNum, 3)
- Z4% = PzOld(ObjNum, 4)
-
- If Z1% < 0 And Z2% < 0 And Z3% < 0 And Z4% < 0 Then
-
- x1% = Abs(PxOld(ObjNum, 1))
- y1% = Abs(PyOld(ObjNum, 1))
- x2% = Abs(PxOld(ObjNum, 2))
- y2% = Abs(PyOld(ObjNum, 2))
- x3% = Abs(PxOld(ObjNum, 3))
- y3% = Abs(PyOld(ObjNum, 3))
- x4% = Abs(PxOld(ObjNum, 4))
- y4% = Abs(PyOld(ObjNum, 4))
-
- If x1% < 500 Or x2% < 500 Or x3% < 500 Or x4% < 500 Or y1% < 500 Or y2% < 500 Or y3% < 500 Or y4% < 500 Then
-
- ReDim Points(4) As PointAPI
- XView.ViewPic.FillColor = QBColor(7)
- XView.ViewPic.ForeColor = QBColor(7)
-
- XView.ViewPic.currentx = PxOld(ObjNum, 1)
- XView.ViewPic.currenty = PyOld(ObjNum, 1)
- XView.ViewPic.ScaleMode = 3
- Points(1).X = XView.ViewPic.currentx
- Points(1).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = PxOld(ObjNum, 2)
- XView.ViewPic.currenty = PyOld(ObjNum, 2)
- XView.ViewPic.ScaleMode = 3
- Points(2).X = XView.ViewPic.currentx
- Points(2).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = PxOld(ObjNum, 3)
- XView.ViewPic.currenty = PyOld(ObjNum, 3)
- XView.ViewPic.ScaleMode = 3
- Points(3).X = XView.ViewPic.currentx
- Points(3).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = PxOld(ObjNum, 4)
- XView.ViewPic.currenty = PyOld(ObjNum, 4)
- XView.ViewPic.ScaleMode = 3
- Points(4).X = XView.ViewPic.currentx
- Points(4).Y = XView.ViewPic.currenty
-
- XView.ViewPic.PSet (501, 501)
- Result% = Polygon(XView.ViewPic.hDC, Points(1), 4)
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
-
- End If
-
- End If
-
- Else
-
- Z1% = iPz(1)
- Z2% = iPz(2)
- Z3% = iPz(3)
- Z4% = iPz(4)
-
- If Z1% < 0 And Z2% < 0 And Z3% < 0 And Z4% < 0 Then
-
- x1% = Abs(iPx(1))
- y1% = Abs(iPy(1))
- x2% = Abs(iPx(2))
- y2% = Abs(iPy(2))
- x3% = Abs(iPx(3))
- y3% = Abs(iPy(3))
- x4% = Abs(iPx(4))
- y4% = Abs(iPy(4))
-
- If x1% < 500 Or x2% < 500 Or x3% < 500 Or x4% < 500 Or y1% < 500 Or y2% < 500 Or y3% < 500 Or y4% < 500 Then
-
- ReDim Points(4) As PointAPI
- XView.ViewPic.FillColor = QBColor(iColor(ObjNum))
- XView.ViewPic.ForeColor = QBColor(0)
-
- XView.ViewPic.currentx = iPx(1)
- XView.ViewPic.currenty = iPy(1)
- XView.ViewPic.ScaleMode = 3
- Points(1).X = XView.ViewPic.currentx
- Points(1).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = iPx(2)
- XView.ViewPic.currenty = iPy(2)
- XView.ViewPic.ScaleMode = 3
- Points(2).X = XView.ViewPic.currentx
- Points(2).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = iPx(3)
- XView.ViewPic.currenty = iPy(3)
- XView.ViewPic.ScaleMode = 3
- Points(3).X = XView.ViewPic.currentx
- Points(3).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = iPx(4)
- XView.ViewPic.currenty = iPy(4)
- XView.ViewPic.ScaleMode = 3
- Points(4).X = XView.ViewPic.currentx
- Points(4).Y = XView.ViewPic.currenty
-
- XView.ViewPic.PSet (501, 501)
- Result% = Polygon(XView.ViewPic.hDC, Points(1), 4)
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
-
- For i% = 1 To 4
- PxOld(ObjNum, i%) = iPx(i%)
- PyOld(ObjNum, i%) = iPy(i%)
- PzOld(ObjNum, i%) = iPz(i%)
- Next i%
-
- End If
-
- End If
-
- End If
-
- Case 22 To 25 'Filled Triangle
-
- If iErase Then
-
- Z1% = PzOld(ObjNum, 1)
- Z2% = PzOld(ObjNum, 2)
- Z3% = PzOld(ObjNum, 3)
-
- If Z1% < 0 And Z2% < 0 And Z3% < 0 Then
-
- x1% = Abs(PxOld(ObjNum, 1))
- y1% = Abs(PyOld(ObjNum, 1))
- x2% = Abs(PxOld(ObjNum, 2))
- y2% = Abs(PyOld(ObjNum, 2))
- x3% = Abs(PxOld(ObjNum, 3))
- y3% = Abs(PyOld(ObjNum, 3))
-
- If x1% < 500 Or x2% < 500 Or x3% < 500 Or y1% < 500 Or y2% < 500 Or y3% < 500 Then
-
- ReDim Points(3) As PointAPI
- XView.ViewPic.FillColor = QBColor(7)
- XView.ViewPic.ForeColor = QBColor(7)
-
- XView.ViewPic.currentx = PxOld(ObjNum, 1)
- XView.ViewPic.currenty = PyOld(ObjNum, 1)
- XView.ViewPic.ScaleMode = 3
- Points(1).X = XView.ViewPic.currentx
- Points(1).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = PxOld(ObjNum, 2)
- XView.ViewPic.currenty = PyOld(ObjNum, 2)
- XView.ViewPic.ScaleMode = 3
- Points(2).X = XView.ViewPic.currentx
- Points(2).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = PxOld(ObjNum, 3)
- XView.ViewPic.currenty = PyOld(ObjNum, 3)
- XView.ViewPic.ScaleMode = 3
- Points(3).X = XView.ViewPic.currentx
- Points(3).Y = XView.ViewPic.currenty
-
- XView.ViewPic.PSet (501, 501)
- Result% = Polygon(XView.ViewPic.hDC, Points(1), 3)
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
-
- End If
-
- End If
-
- Else
-
- Z1% = iPz(1)
- Z2% = iPz(2)
- Z3% = iPz(3)
-
- If Z1% < 0 And Z2% < 0 And Z3% < 0 Then
-
- x1% = Abs(iPx(1))
- y1% = Abs(iPy(1))
- x2% = Abs(iPx(2))
- y2% = Abs(iPy(2))
- x3% = Abs(iPx(3))
- y3% = Abs(iPy(3))
-
- If x1% < 500 Or x2% < 500 Or x3% < 500 Or y1% < 500 Or y2% < 500 Or y3% < 500 Then
-
- ReDim Points(3) As PointAPI
- XView.ViewPic.FillColor = QBColor(iColor(ObjNum))
- XView.ViewPic.ForeColor = QBColor(0)
-
- XView.ViewPic.currentx = iPx(1)
- XView.ViewPic.currenty = iPy(1)
- XView.ViewPic.ScaleMode = 3
- Points(1).X = XView.ViewPic.currentx
- Points(1).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = iPx(2)
- XView.ViewPic.currenty = iPy(2)
- XView.ViewPic.ScaleMode = 3
- Points(2).X = XView.ViewPic.currentx
- Points(2).Y = XView.ViewPic.currenty
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
- XView.ViewPic.currentx = iPx(3)
- XView.ViewPic.currenty = iPy(3)
- XView.ViewPic.ScaleMode = 3
- Points(3).X = XView.ViewPic.currentx
- Points(3).Y = XView.ViewPic.currenty
-
- XView.ViewPic.PSet (501, 501)
- Result% = Polygon(XView.ViewPic.hDC, Points(1), 3)
-
- XView.ViewPic.ScaleWidth = 1000
- XView.ViewPic.ScaleHeight = -1000
- XView.ViewPic.ScaleTop = 500
- XView.ViewPic.scaleleft = -500
-
- For i% = 1 To 3
- PxOld(ObjNum, i%) = iPx(i%)
- PyOld(ObjNum, i%) = iPy(i%)
- PzOld(ObjNum, i%) = iPz(i%)
- Next i%
-
- End If
-
- End If
-
- End If
-
- Case 41, 42, 43 'Pointalist objects
-
- If iErase Then
- For i% = 1 To iNumPoints(iObjectType(ObjNum))
- If PzOld(ObjNum, i%) < 0 Then
- XView.ViewPic.PSet (PxOld(ObjNum, i%), PyOld(ObjNum, i%)), QBColor(7)
- End If
- Next i%
-
- Else
- For i% = 1 To iNumPoints(iObjectType(ObjNum))
- If iPz(i%) < 0 Then
- XView.ViewPic.PSet (iPx(i%), iPy(i%)), QBColor(iColor(ObjNum))
- End If
- PxOld(ObjNum, i%) = iPx(i%)
- PyOld(ObjNum, i%) = iPy(i%)
- PzOld(ObjNum, i%) = iPz(i%)
- Next i%
- End If
-
- End Select
-
- PlaceObjectResume:
-
- Exit Sub
-
- PlaceObjectHandler:
-
- Resume PlaceObjectResume
-
- End Sub
-
- Sub SpinCube ()
-
- 'There is a blue rotating wireframe cube orbiting in cyberspace.
- 'The cube's angle of rotation is its SpinAngle.
- 'The cube orbits around the cyberspace origin (0, 0, 0) at a radius of 3000 CLUs.
- 'The cube's position in its orbit is its OrbitAngle.
-
- Static OrbitAngle As Integer
- Static SpinAngle As Integer
-
- 'Spin and orbit the cube:
- Do While XView.SCCheck.value = 1
-
- OrbitAngle = OrbitAngle + 1
- SpinAngle = SpinAngle + 5
-
- If OrbitAngle = 360 Then OrbitAngle = 0
- If SpinAngle = 360 Then SpinAngle = 0
-
- Temp1# = (SpinAngle - 180) * sfPi / 180
- Temp2! = (OrbitAngle - 180) * sfPi / 180
-
- For i% = 1 To 8
-
- X# = iObjectX(1, i%)
- Y# = iObjectY(1, i%)
- Z# = iObjectZ(1, i%)
-
- SolidRotate 0, 0, 0, 0, 1, 0, X#, Y#, Z#, Temp1#
-
- iObjectX(44, i%) = CInt(X#)
- iObjectY(44, i%) = CInt(Y#)
- iObjectZ(44, i%) = CInt(Z#)
-
- iLocationX(iSCNum) = 3000 * Cos(Temp2!)
- iLocationZ(iSCNum) = 3000 * Sin(Temp2!)
-
- Next i%
-
- PlaceAllObjects
- np% = DoEvents()
-
- Loop
-
- End Sub
-
-