PICK3.FRM
VERSION 5.00 
Object = "{34F681D0-3640-11CF-9294-00AA00B8A733}#1.0#0"; "danim.dll" 
Begin VB.Form Picking  
   BorderStyle     =   1  'Fixed Single 
   Caption         =   "Picking" 
   ClientHeight    =   4665 
   ClientLeft      =   30 
   ClientTop       =   270 
   ClientWidth     =   5055 
   LinkTopic       =   "Form1" 
   MaxButton       =   0   'False 
   MinButton       =   0   'False 
   ScaleHeight     =   4665 
   ScaleWidth      =   5055 
   StartUpPosition =   3  'Windows Default 
   Begin DirectAnimationCtl.DAViewerControlWindowed DAViewerControlWindowed  
      Height          =   4455 
      Left            =   120 
      OleObjectBlob   =   "Pick3.frx":0000 
      TabIndex        =   0 
      Top             =   120 
      Width           =   4815 
   End 
End 
Attribute VB_Name = "Picking" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = False 
'Pick3 Visual Basic Sample 
Private Sub Form_Load() 
  pi = 3.1459 
 
  Dim size As DATransform3 
  Set size = Scale3Uniform(0.25) 
 
  Dim speed As DANumber 
  Set speed = DANumber(0.07) 
   
  ' Set up relative paths for media imports.  Does not work in VB 
  ' debug.  Create executable. 
  Dim mediaBase, geoBase, imgBase As String 
  mediaBase = CurDir + "\..\..\..\..\..\Media\" 
  geoBase = mediaBase + "geometry\" 
  imgBase = mediaBase + "image\" 
   
  'Import the geometries. 
  Dim rawCube As DAGeometry 
  Set rawCube = ImportGeometry(geoBase + "cube.x").Transform(size) 
   
  Dim rawCylinder As DAGeometry 
  Set rawCylinder = ImportGeometry(geoBase + "cylinder.x").Transform(size) 
   
  Dim rawCone As DAGeometry 
  Set rawCone = ImportGeometry(geoBase + "cone.x").Transform(size) 
   
  'Import background. 
  Dim stillSky As DAImage 
  Set stillSky = ImportImage(imgBase + "cldtile.jpg") 
   
  'Make the geometries pickable. 
  Set cone1 = activate(rawCone, Green) 
  Set cube1 = activate(rawCube, Magenta) 
  Set cube2 = activate(rawCube, ColorHslAnim(Div(LocalTime, DANumber(8)), DANumber(1), DANumber(0.5))) 
  Set cylinder = activate(rawCylinder, ColorRgb(0.8, 0.4, 0.4)) 
   
  'Construct the final geometry, scale and rotate it. 
  Set multigeo = UnionGeometry(cone1.Transform(Translate3(0, 1, 0)), _ 
    UnionGeometry(cube1.Transform(Translate3(0, 0, 1)), _ 
    UnionGeometry(cube2.Transform(Translate3(0, 0, -1)), cylinder))) 
     
  Set X = Add(DAStatics.Abs(DAStatics.Sin(Mul(LocalTime, _ 
    DANumber(0.2)))), DANumber(0.5)) 
  Set Y = Add(DAStatics.Abs(DAStatics.Sin(Mul(LocalTime, _ 
    DANumber(0.26)))), DANumber(0.5)) 
  Set Z = Add(DAStatics.Abs(DAStatics.Sin(Mul(LocalTime, _ 
    DANumber(0.14)))), DANumber(0.5)) 
      
  Set geo = multigeo.Transform(Scale3Anim(X, Y, Z)) 
 
  Set maxSky = stillSky.BoundingBox().Max() 
   
  Set tiledSky = stillSky.Tile() 
  Set movingSky = tiledSky.Transform(Translate2Anim(Mul(LocalTime, _ 
    Div(maxSky.X, DANumber(8))), Mul(LocalTime, Div(maxSky.X, DANumber(16))))) 
 
  Set movingGeoImg = geometryImage(geo.Transform(Compose3(Rotate3Anim(ZVector3, _ 
    Mul(speed, Mul(LocalTime(), DANumber(1.9)))), _ 
      Rotate3Anim(YVector3, Mul(speed, Mul(LocalTime(), DANumber(pi)))))), speed) 
   
  Set fs = DefaultFont.size(14).Color(Black) 
  Set titleIm = StringImage("Left Click on an Object", fs).Transform(Translate2(0, 0.04)) 
     
  DAViewerControlWindowed.UpdateInterval = 0.2 
   
  'Display the final image. 
  DAViewerControlWindowed.Image = Overlay(titleIm, Overlay(movingGeoImg, movingSky)) 
   
  'Start the animation. 
  DAViewerControlWindowed.Start 
End Sub 
 
Function activate(unpickedGeo As DAGeometry, col As DAColor) As DAGeometry 
  Dim pickGeo As DAPickableResult 
  Set pickGeo = unpickedGeo.Pickable() 
   
  Dim pickEvent As DAEvent 
  Set pickEvent = AndEvent(LeftButtonDown, pickGeo.pickEvent) 
   
  Dim numcyc As DANumber 
  Set numcyc = CreateObject("DirectAnimation.DANumber") 
  numcyc.Init DAStatics.Until(DANumber(0), pickEvent, DAStatics.Until(DANumber(1), pickEvent, numcyc)) 
   
  Dim colcyc As DAColor 
  Set colcyc = CreateObject("DirectAnimation.DAColor") 
  colcyc.Init DAStatics.Until(White, pickEvent, DAStatics.Until(col, pickEvent, colcyc)) 
 
  Dim xf As DATransform3 
  Set xf = Rotate3Anim(XVector3, Integral(numcyc)) 
   
  Set activate = pickGeo.Geometry.DiffuseColor(colcyc).Transform(xf) 
End Function 
Function geometryImage(geo As DAGeometry, speed As DANumber) As DAImage 
  Dim scaleFactor As DANumber 
  Set scaleFactor = DANumber(0.02) 
   
  Dim perspTransform As DATransform3 
  Set perspTransform = CreateObject("DirectAnimation.DATransform3") 
    perspTransform.Init DAStatics.Until(Compose3(Rotate3Anim(XVector3, _ 
      Mul(speed, LocalTime)), Translate3(0, 0, 0.2)), RightButtonDown, _ 
        DAStatics.Until(Rotate3Anim(XVector3, Mul(speed, LocalTime)), _ 
          RightButtonDown, perspTransform)) 
 
  Set light = UnionGeometry(DirectionalLight.Transform(perspTransform), _ 
    DirectionalLight) 
     
  Dim strcyl As DAString 
  Set strcyl = CreateObject("DirectAnimation.DAString") 
  strcyl.Init DAStatics.Until(DAString("Perspective - Right Click to Switch"), _ 
    RightButtonDown, DAStatics.Until(DAString("Parallel - Right Click to Switch"), _ 
      RightButtonDown, strcyl)) 
       
  Dim perspectiveCam As DACamera 
  Set perspectiveCam = PerspectiveCamera(1, 0).Transform(Compose3(Rotate3Anim(XVector3, _ 
    Mul(speed, LocalTime)), Translate3(0, 0, 0.2))) 
 
  Dim parallelCam As DACamera 
  Set parallelCam = ParallelCamera(1).Transform(Rotate3Anim(XVector3, _ 
    Mul(speed, LocalTime))) 
   
  Dim camera As DACamera 
  Set camera = CreateObject("DirectAnimation.DACamera") 
  camera.Init DAStatics.Until(perspectiveCam, RightButtonDown, _ 
    DAStatics.Until(parallelCam, RightButtonDown, camera)) 
   
  Dim fs As DAFontStyle 
  Set fs = DefaultFont.size(14).Color(Red) 
   
  Dim txtIm, xltTxt As DAImage 
  Set txtIm = StringImageAnim(strcyl, fs) 
  Set xltTxt = txtIm.Transform(Translate2(0, -0.045)) 
     
  Set geometryImg = UnionGeometry(geo.Transform(Scale3UniformAnim(scaleFactor)), _ 
    light).Render(camera) 
   
  Set geometryImage = Overlay(xltTxt, geometryImg) 
End Function