This is how to use the Timer.Trigger to reduce the calls to the _Draw event.

Each time mouse seem to move it call the _MouseMove event so it can be
undreds time a second. Then this event call the .refresh method that
raiseth _draw event.

You have many call more in your code for the .refresh method.

So what i've done. I've put two timer one for the mouse event call and
one for the drawing. I think maybe only the one for the mouse event
will be sufficient.

so the mouse event call the timer.trigger thouthen time but the timer
event is raised only once by event loop. and you have not a queue that
appear with the slow down of your program. Because each call to
.refresh will be done event if the content of the _Draw take 0.1 sec
....


so now it is smooth on my machine and you can remove the fast lines.






' Gambas class file



Public $hDrawTimer As New Timer As "DrawTimer"
Public $hMoveTimer As New Timer As "MoveTimer"

Private MouseX As Integer
Private MouseY As Integer


Public cubes As New ClassCube[]
Public Struct Punto3D
    x As Float
    y As Float
    z As Float
End Struct
'globles del mouse
Public paneando As Boolean
Public rotando As Boolean

Public mouDownX As Float
Public mouDownY As Float

Public mouUpX As Float
Public mouUpY As Float

Public mouX As Float
Public mouY As Float

Public cgX As Float  'coordenadas del CG en 2D
Public cgY As Float

Public lastPos As Integer

Public mouOut As Boolean ' fuera del area de graficos
Public mouDown As Boolean ' fuera del area de graficos
Public mouUp As Boolean ' fuera del area de graficos

Public Here As Boolean

Public mouWheel As Boolean
Public mouDelta As Integer
Public debugTime As Boolean = True

Public fps As Integer


Public FaceCubeList[6] As Integer[] 'cubes in face, from 9 to 9

Public FaceRotation[6] As Float[] ' xyz triplets

Public FaceCenter[6] As Float

Public CurrentFace As Integer
Public RotationFilter As Integer[]
Public RotationAcumulator As Float
Public CenterCube As Integer


Public State As Integer
Public Const stMixing As Integer = 1
Public Const stStopping As Integer = 2
Public Const stQuiting As Integer = 3


Public Sub Form_Open()

  $hDrawTimer.Delay = 50

  rotando = True
  Paint3D.Init

  modMotor3D.ResetMatrizRotacion

  modMotor3D.escala = 0.5

   Generate
  'GenerateBigOne

End
Public Sub Form_Close()

  If State = stStopping Or state = stMixing Then

    state = stQuiting
    Stop Event

    Else
    Me.Close
   End If


End
Public Sub form_Activate()

   'graph_Draw
   $hDrawTimer.Trigger

End



Public Sub form_Resize()

   'graph_Draw
  $hDrawTimer.Trigger
End






Private Sub generate()

  Dim cube1 As New ClassCube
  Dim colores1 As New Integer[]

  Dim p As Punto3D, a As Integer, b As Integer

  ' size of one cube is 1

  'front facing, this is the front/left/low cube
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, Color.Green, 0, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, 0, 0, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, 0, Color.red, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)


  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, Color.Green, 0, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, 0, 0, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)

  FaceCenter[0] = cubes.Max  ' this cube is in the center


  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, 0, Color.red, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)



  ' High front row
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, Color.Green, 0, Color.blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, 0, 0, Color.Blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [Color.Yellow, 0, 0, Color.red, Color.Blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = 1 * cube1.Scale


  cubes.Add(cube1)




  ' BACK FACE


  'front facing, this is the front/left/low cube
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, Color.white, Color.Green, 0, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, Color.white, 0, 0, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, color.white, 0, Color.red, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)


  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, color.white, Color.Green, 0, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, color.white, 0, 0, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)



  FaceCenter[1] = cubes.Max  ' this cube is in the center




  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, color.white, 0, Color.red, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)



  ' High front row
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, Color.white, Color.Green, 0, Color.blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, Color.white, 0, 0, Color.Blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, Color.white, 0, Color.red, Color.Blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = -1 * cube1.Scale


  cubes.Add(cube1)


  FaceCubeList[0] = [0, 1, 2, 3, 4, 5, 6, 7, 8] ' front
  FaceCubeList[1] = [9, 10, 11, 12, 13, 14, 15, 16, 17] 'back
  FaceCubeList[2] = [0, 3, 6, 9, 12, 15, 18, 21, 24] 'left
  FaceCubeList[3] = [2, 5, 8, 11, 14, 17, 20, 23, 26] 'rigth
  FaceCubeList[4] = [6, 7, 8, 15, 16, 17, 24, 25, 26] 'top
  FaceCubeList[5] = [0, 1, 2, 9, 10, 11, 18, 19, 20] 'bottomh

  For a = 0 To 5
    FaceRotation[a] = [0, 0, 0]
  Next
  ' CENTER




  'front facing, this is the mid/left/low cube
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, Color.Green, 0, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, 0, 0, 0, &H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)



  FaceCenter[2] = cubes.Max  ' this cube is in the center


  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, 0, Color.red, 0, &H00FF00FF] '&H00FF00FF]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = -1 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)

  ' mid, mid, left
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, Color.Green, 0, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)


  FaceCenter[3] = cubes.Max  ' this cube is in the center



  ' this cube is in the core, not shown
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, 0, 0, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)

  CenterCube = cubes.Max

  ' mid, mid, rigth
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, 0, Color.red, 0, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = 0 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)


  FaceCenter[4] = cubes.Max  ' this cube is in the center


  ' High mid row
  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, Color.Green, 0, Color.blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = -1 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)

  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, 0, 0, Color.Blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 0 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)


  FaceCenter[5] = cubes.Max  ' this cube is in the center


  cube1 = Null
  cube1 = New ClassCube
  colores1 = [0, 0, 0, Color.red, Color.Blue, 0]
  cube1.colores = colores1
  cube1.scale = 200
  cube1.xcg = 1 * cube1.Scale
  cube1.ycg = 1 * cube1.Scale
  cube1.zcg = 0 * cube1.Scale


  cubes.Add(cube1)



  b = cubes.Max
  For a = 0 To b
    cubes[a].RoundEdge = True
    cube1 = New ClassCube
    cube1.colores = [Color.HSV(0, 0, 45), Color.HSV(0, 0, 45),
Color.HSV(0, 0, 45), Color.HSV(0, 0, 45), Color.HSV(0, 0, 45),
Color.HSV(0, 0, 45)]
    cube1.xCG = cubes[a].xCG
    cube1.yCG = cubes[a].yCG
    cube1.zCG = cubes[a].zCG
    cube1.Scale = cubes[a].Scale * 0.95
    cube1.RoundEdge = True
    cubes.Add(cube1)

  Next
    'faces
  BuildFaceList
  GetFace

End

Public Sub GenerateBigOne()

   Dim cube1 As ClassCube
  ' 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  ' test collapsing
  cube1 = Null
  cube1 = New ClassCube

  ' colores1 = [Color.Green, Color.Yellow, Color.Violet, Color.Blue,
Color.white, &H00FF00FF]
  cube1.colores = [Color.Green, Color.Yellow, Color.Violet,
Color.Blue, Color.white, &H00FF00FF]
  cube1.Scale = 150
  cube1.xcg = 0
  cube1.ycg = 0 '2 * cube1.Scale
  cube1.zcg = 0 '-1 * cube1.Scale
  cube1.RoundEdge = True
  cube1.FaceAngle = [0, 0, 0]

  cubes.Add(cube1)
  '

End


Public Sub graph_Drawer()

  Dim nCube As Integer, p As New Punto3D
  Dim x As Float, y As Float, nn As Integer


      Paint3D.Begin(graph)
      Paint3D.scale = 1
      Paint.AntiAlias = False
    'Debug " Drawer"
      For nCube = 0 To cubes.Max


        cubes[ncube].Draw

      Next


     Paint3D.End



End




Public Sub graph_MouseWheel()



     mouDelta += Mouse.Delta



     mouWheel = True


    With modMotor3D
        .escala += .escala * mouDelta * 0.1
        'ademas intento un zoom dinamico, si el mouse esta lejos del
centro, atrae los graficos hacia el
        .pan.x -= (graph.w / 2 - Mouse.X) * 0.1
        .pan.y += (graph.h / 2 - Mouse.y) * 0.1
        'Debug .pan.x, .pan.y, .escala
    End With

    'graph_Draw
    $hDrawTimer.Trigger

    mouWheel = False
    mouDelta = 0

End


Public Sub graph_MouseDown()

    Dim nFace As Integer

    If state = stMixing Then Return

    mouDownX = Mouse.X
    mouDownY = Mouse.y

    mouDown = True

    RotationAcumulator = 0

    If Mouse.Right Then



        GetFace



    Else

           CurrentFace = -1

    End If

End

 Public Sub graph_MouseMove()
  MouseX = Mouse.X
  MouseY = Mouse.y
  $hMoveTimer.Trigger
End



 Public Sub MoveTimer_Timer()


    Dim dx As Float, dy As Float, p As New Punto3d, pr As New Punto3d
    Dim EjeX As Float, ejeY As Float, ejeZ As Float, nCube As Integer,
nn As Integer, f As Integer
    Dim gorgui As Integer

    If here Then Debug "Here"
    here = True

    If mouDown Then
        If paneando Then

            With modMotor3D

                .pan.x -= (mouDownX - MouseX) * 0.25
                .pan.y = (mouDownY - MouseY) * 0.25

            End With
        Else If rotando Then

            'veo para donde mueve el mouse con respenco a la posicion 2D del CG

            dX = (mouDownX - MouseX) * 0.005 '* mouDownXCG
            dY = - (mouDownY - MouseY) * 0.005 '* mouDownYCG

            ' con esto la rotacion se hace de un eje a la vez
            If Abs(dy) > Abs(dx) Then dx = 0 Else dy = 0

            ' debo interpretar que eje pretende mover

            ' el eje que mas apunta al user, es el que no rota, si el
mouse se mueve horizontal, rota sobre
            ' el eje vertica, y si se mueve vertical, rota sobre el
eje mas horizontal

            p.x = 1
            p.y = 0
            p.z = 0

            modMotor3D.rotar3d(p, pr)

            EjeX = pr.x

            p.x = 0
            p.y = 1
            p.z = 0

            modMotor3D.rotar3d(p, pr)

            ejey = pr.x

            p.x = 0
            p.y = 0
            p.z = 1

            modMotor3D.rotar3d(p, pr)

            ejeZ = pr.x

            'Debug ejex, ejey, ejez

            If Abs(ejex) > Abs(ejey) And Abs(ejex) > Abs(ejez) Then
modMotor3D.vector3d.x = dy * Sgn(ejex)
            If Abs(ejey) > Abs(ejez) And Abs(ejey) > Abs(ejex) Then
modMotor3D.vector3d.y = dy * Sgn(ejey)
            If Abs(ejez) > Abs(ejey) And Abs(ejez) > Abs(ejex) Then
modMotor3D.vector3d.z = dy * Sgn(ejez)

            p.x = 1
            p.y = 0
            p.z = 0

            modMotor3D.rotar3d(p, pr)

            EjeX = pr.y

            p.x = 0
            p.y = 1
            p.z = 0

            modMotor3D.rotar3d(p, pr)

            ejey = pr.y

            p.x = 0
            p.y = 0
            p.z = 1

            modMotor3D.rotar3d(p, pr)

            ejeZ = pr.y

            'Debug ejex, ejey, ejez


            If Abs(ejex) > Abs(ejey) And Abs(ejex) > Abs(ejez) Then
modMotor3D.vector3d.x = dx * Sgn(ejex)
            If Abs(ejey) > Abs(ejez) And Abs(ejey) > Abs(ejex) Then
modMotor3D.vector3d.y = dx * Sgn(ejey)
            If Abs(ejez) > Abs(ejey) And Abs(ejez) > Abs(ejex) Then
modMotor3D.vector3d.z = dx * Sgn(ejez)




           If CurrentFace >= 0 Then


             modMotor3D.fVector3D[0] += (dx + dy) * RotationFilter[0] * 2
             modMotor3D.fVector3D[1] += (dx + dy) * RotationFilter[1] * 2
             modMotor3D.fVector3D[2] += (dx + dy) * RotationFilter[2] * 2



             ' ademas roto los CG
            FaceRotation[CurrentFace] = modMotor3D.fVector3D


            RotationAcumulator += FaceRotation[CurrentFace][0] +
FaceRotation[CurrentFace][1] + FaceRotation[CurrentFace][2]

            modMotor3D.PushMatrix
            modMotor3D.LoadIdentuty

            'Debug RotationAcumulator, FaceRotation[CurrentFace][0],
FaceRotation[CurrentFace][1], FaceRotation[CurrentFace][2]

            modMotor3D.fRotateVector

            For ncube = 0 To FaceCubeList[CurrentFace].max
                nn = FaceCubeList[CurrentFace][ncube]
                modMotor3D.Rotar3Df(cubes[nn].xCG, cubes[nn].yCG,
cubes[nn].zCG, ByRef cubes[nn].xCG, ByRef cubes[nn].yCG, ByRef
cubes[nn].zCG)

                modMotor3D.RotacionLocalv(cubes[nn].Points, cubes[nn].Points)

                '  For f = 0 To cubes[nn].points.Max
                '   cubes[nn].Points[f] = cubes[nn].RotPoints[f]
                ' Next
                '
                modMotor3D.RotacionLocalv(cubes[nn].Normals, cubes[nn].Normals)

            Next
            modMotor3D.PopMatrix


           Else

            modMotor3D.setvectorrotacion
          End If

        End If

        $hDrawTimer.Trigger
        ' graph_Draw

        mouDownX = MouseX
        mouDownY = MouseY

    End If
    here = False

End

Public Sub graph_MouseUp()

    Dim TotRot As Float, quarters As Integer, rest As Float, dist As
Float, MaxDist As Float
    Dim nn As Integer, nCube As Integer, turns As Integer, Turn90 As
Integer, n$ As String, f As Integer
    Dim diagonal As Float
    Dim Xc As Float, Yc As Float, Zc As Float

    If here Then Debug "Here"
    mouDown = False
    If CurrentFace = -1 Then
      ' we've been rotating everithinng

    Else  'complete the turnn

      ' in case of many turns we simplify

       turns = RotationAcumulator / (2 * Pi)

       RotationAcumulator -= turns * 2 * Pi  ' we dont need anything over 2 * pi

       quarters = Fix(RotationAcumulator / (Pi / 4))

       If quarters = 1 Then quarters = 2      '
       If quarters = 3 Then quarters = 4
       If quarters = 5 Then quarters = 6      '
       If quarters = 7 Then quarters = 8
       If quarters = -1 Then quarters = -2      '
       If quarters = -3 Then quarters = -4
       If quarters = -5 Then quarters = -6      '
       If quarters = -7 Then quarters = -8


       rest = rotationAcumulator - quarters * (Pi / 4)

       FaceRotation[CurrentFace][0] = - rest * RotationFilter[0]
       FaceRotation[CurrentFace][1] = - rest * RotationFilter[1]
       FaceRotation[CurrentFace][2] = - rest * RotationFilter[2]


        '
        modMotor3D.PushMatrix
        modMotor3D.LoadIdentuty
        modMotor3D.fVector3D = FaceRotation[CurrentFace]
        modMotor3D.fRotateVector

        For ncube = 0 To FaceCubeList[CurrentFace].Max
            nn = FaceCubeList[CurrentFace][ncube]
            modMotor3D.Rotar3Df(cubes[nn].xCG, cubes[nn].yCG,
cubes[nn].zCG, ByRef cubes[nn].xCG, ByRef cubes[nn].yCG, ByRef
cubes[nn].zCG)
            modMotor3D.RotacionLocalv(cubes[nn].Points, cubes[nn].Points)
             ' For f = 0 To cubes[nn].points.Max
             '      cubes[nn].Points[f] = cubes[nn].RotPoints[f]
             ' Next
            modMotor3D.RotacionLocalv(cubes[nn].Normals, cubes[nn].Normals)

        Next
        modMotor3D.PopMatrix

        RotationAcumulator = 0

      BuildFaceList



    Endif



    ' graph_Drawer

    $hDrawTimer.Trigger ' does no work this way

End

Public Sub graph_Draw()


  graph_Drawer
  fps += 1

End





Public Sub GetFace()


    Dim p As New Punto3d, pr As New Punto3d
    Dim EjeX As Float, ejeY As Float, ejeZ As Float, face As Integer
    Dim maxZ As Float

  For face = 0 To 5
    ejez = modMotor3D.xyzZ3D(cubes[FaceCenter[face]].cg)
    If ejez > maxZ Then maxZ = ejez
  Next

  For face = 0 To 5
    ejez = modMotor3D.xyzZ3D(cubes[FaceCenter[face]].cg)
    If ejez = maxZ Then Break
  Next

  CurrentFace = face
  RotationFilter = [Abs(Sgn(Int(cubes[FaceCenter[CurrentFace]].xCG))),
Abs(Sgn(Int(cubes[FaceCenter[CurrentFace]].yCG))),
Abs(Sgn(Int(cubes[FaceCenter[CurrentFace]].zCG)))]


End


Private Sub BuildFaceList()

   Dim TotRot As Float, quarters As Integer, rest As Float, dist As
Float, MaxDist As Float
    Dim nn As Integer, nCube As Integer, turns As Integer, Turn90 As
Integer, n$ As String


For nn = 0 To 5 ' total faces


  FaceCubeList[nn].Clear


  TotRot = 0
  For ncube = 0 To cubes.Max


      If Round(cubes[FaceCenter[nn]].xCG) <> 0 Then

        If Round(cubes[ncube].xCG) = Round(cubes[FaceCenter[nn]].xCG) Then
            FaceCubeList[nn].Add(ncube)
             TotRot += 1
        Endif
      End If

      If Round(cubes[FaceCenter[nn]].yCG) <> 0 Then

        If Round(cubes[ncube].yCG) = Round(cubes[FaceCenter[nn]].yCG) Then
            FaceCubeList[nn].Add(ncube)
             TotRot += 1
        Endif
      End If

      If Round(cubes[FaceCenter[nn]].zCG) <> 0 Then

        If Round(cubes[ncube].zCG) = Round(cubes[FaceCenter[nn]].zCG) Then
            FaceCubeList[nn].Add(ncube)
             TotRot += 1
        Endif
      End If

    Next
 'Debug TotRot

Next



End



Public Sub mix()

   Dim TotRot As Float, quarters As Integer, rest As Float, dist As
Float, MaxDist As Float, f As Integer
   Dim nn As Integer, nCube As Integer, turns As Float, Turn90 As
Integer, n$ As String, turns0 As Float

  Dim nFace As Integer, t As Float


  'nFace = 1
  t = Timer
  BuildFaceList

  btnMix.Text = "Stop"

  For turn90 = 1 To 18


      nFace = Int(Rnd(0, 5.99))

      RotationFilter = [Abs(Sgn(Int(cubes[FaceCenter[nFace]].xCG))),
Abs(Sgn(Int(cubes[FaceCenter[nFace]].yCG))),
Abs(Sgn(Int(cubes[FaceCenter[nFace]].zCG)))]
      BuildFaceList
      turns0 = 0
      For turns = 0 To Pi / 2 Step (Pi / 2 / 9)
                modMotor3D.fVector3D = [turns - turns0, turns -
turns0, turns - turns0]

        modMotor3D.fVector3D[0] *= RotationFilter[0]
        modMotor3D.fVector3D[1] *= RotationFilter[1]
        modMotor3D.fVector3D[2] *= RotationFilter[2]


        modMotor3D.PushMatrix
        modMotor3D.LoadIdentuty
        modMotor3D.fRotateVector

        For ncube = 0 To FaceCubeList[nFace].max
            nn = FaceCubeList[nFace][ncube]
            modMotor3D.Rotar3Df(cubes[nn].xCG, cubes[nn].yCG,
cubes[nn].zCG, ByRef cubes[nn].xCG, ByRef cubes[nn].yCG, ByRef
cubes[nn].zCG)

            modMotor3D.RotacionLocalv(cubes[nn].Points, cubes[nn].Points)

            modMotor3D.RotacionLocalv(cubes[nn].Normals, cubes[nn].Normals)

        Next
        modMotor3D.PopMatrix

        $hDrawTimer.Trigger
        'graph_Draw
        Wait 0.001
        turns0 = turns
        If State = stQuiting Then Quit
      Next

       If State = stStopping Then Break



Next

Me.Title = " Mixing time : " & Format$(Timer - t, "0.00") & "secs"


End


Public Sub btnMix_Click()

  If btnMix.text = "Stop" Then


    State = stStopping

  Else
    State = stMixing
    mix
    'graph_Draw
    btnMix.Text = "Mix"
    State = 0
    BuildFaceList

  End If


End

Public Sub Panel1_MouseDown()



End

Public Sub DrawTimer_Timer()

  graph.Refresh

End

2015-11-24 21:50 GMT+01:00 Jussi Lahtinen <jussi.lahti...@gmail.com>:
> Seems to be bug in gb.jit. Please report it in:
> http://gambaswiki.org/bugtracker
>
>
> Jussi
>
> On Tue, Nov 24, 2015 at 7:26 PM, martin p cristia <terco...@hotmail.com>
> wrote:
>
>> Thanks for all the critics, help improving things.
>>
>> Version 0.1.6 just uploaded to the Farm has the following changes:
>>
>> - .Refresh instead of a cached DrawingArea
>> - prevents click while mixing
>> - From starting position, mixing time (now displayed at the window's
>> title after the mix) takes : 3.95  secs with Antialias = False (@
>> Fmain.graph_drawer) and 8.00 secs when set to True, what's yours? Cube
>> actually fly here.
>>
>>
>> (to Jussi)
>>
>> -> Sub modMotor3D.fRotateVector complains about receiving a Integer[] at
>> this line when declared as Fast:
>>
>>   matrizXmatriz(MatrizRVieja, MatrizRNueva, MatrizRotacion, 3)
>>
>> all matrices are declared as Float[], as well as in the multiplication
>> routine
>>
>> -> Sub Paint3D.SortPaths makes Ubuntu pop a Unexpected Error message
>> when Fast -ened, and program stops without making Gambas crash
>>
>>
>>
>>
>>
>> -- Saludos Ing. Martin P Cristia
>>
>>
>> ------------------------------------------------------------------------------
>> Go from Idea to Many App Stores Faster with Intel(R) XDK
>> Give your users amazing mobile app experiences with Intel(R) XDK.
>> Use one codebase in this all-in-one HTML5 development environment.
>> Design, debug & build mobile apps & 2D/3D high-impact games for multiple
>> OSs.
>> http://pubads.g.doubleclick.net/gampad/clk?id=254741551&iu=/4140
>> _______________________________________________
>> Gambas-user mailing list
>> Gambas-user@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>>
> ------------------------------------------------------------------------------
> Go from Idea to Many App Stores Faster with Intel(R) XDK
> Give your users amazing mobile app experiences with Intel(R) XDK.
> Use one codebase in this all-in-one HTML5 development environment.
> Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
> http://pubads.g.doubleclick.net/gampad/clk?id=254741551&iu=/4140
> _______________________________________________
> Gambas-user mailing list
> Gambas-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user



-- 
Fabien Bodard

------------------------------------------------------------------------------
Go from Idea to Many App Stores Faster with Intel(R) XDK
Give your users amazing mobile app experiences with Intel(R) XDK.
Use one codebase in this all-in-one HTML5 development environment.
Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
http://pubads.g.doubleclick.net/gampad/clk?id=254741551&iu=/4140
_______________________________________________
Gambas-user mailing list
Gambas-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user

Reply via email to