VERSION 2.00
Begin Form Form1 
   BackColor       =   &H00C0C0C0&
   ClientHeight    =   7260
   ClientLeft      =   855
   ClientTop       =   840
   ClientWidth     =   9300
   Height          =   7665
   Icon            =   FORM7.FRX:0000
   Left            =   795
   LinkTopic       =   "Form1"
   ScaleHeight     =   484
   ScaleMode       =   3  'Pixel
   ScaleWidth      =   620
   Top             =   495
   Width           =   9420
   Begin CommandButton Command3 
      Caption         =   "Brisi"
      Height          =   330
      Left            =   4320
      TabIndex        =   63
      Top             =   6480
      Width           =   1275
   End
   Begin SSFrame Frame3D8 
      Caption         =   "Gama korekcija"
      Font3D          =   0  'None
      ForeColor       =   &H00000000&
      Height          =   735
      Left            =   5715
      TabIndex        =   60
      Top             =   6435
      Width           =   3480
      Begin TextBox Text12 
         Height          =   285
         Left            =   2745
         TabIndex        =   62
         Top             =   270
         Width           =   375
      End
      Begin HScrollBar HScroll1 
         Height          =   240
         LargeChange     =   10
         Left            =   270
         Max             =   50
         Min             =   1
         TabIndex        =   61
         Top             =   315
         Value           =   10
         Width           =   2130
      End
   End
   Begin PictureBox p1 
      Height          =   5505
      Left            =   90
      ScaleHeight     =   365
      ScaleLeft       =   -182
      ScaleMode       =   0  'User
      ScaleTop        =   -182
      ScaleWidth      =   365
      TabIndex        =   0
      Top             =   135
      Width           =   5505
   End
   Begin CommandButton Command2 
      Caption         =   "Konec"
      Height          =   330
      Left            =   4320
      TabIndex        =   47
      Top             =   6840
      Width           =   1275
   End
   Begin SSFrame Frame3D6 
      Font3D          =   0  'None
      ForeColor       =   &H00000000&
      Height          =   465
      Left            =   90
      TabIndex        =   35
      Top             =   5625
      Width           =   5505
      Begin SSPanel Panel3D2 
         Alignment       =   1  'Left Justify - MIDDLE
         BackColor       =   &H00C0C0C0&
         BevelOuter      =   1  'Inset
         Caption         =   " status :"
         Font3D          =   0  'None
         Height          =   285
         Left            =   3510
         TabIndex        =   57
         Top             =   135
         Width           =   1950
         Begin Label Label23 
            BackColor       =   &H00C0C0C0&
            Caption         =   "pripravljen..."
            Height          =   195
            Left            =   765
            TabIndex        =   58
            Top             =   45
            Width           =   1140
         End
      End
      Begin SSPanel Panel3D3 
         Alignment       =   1  'Left Justify - MIDDLE
         BackColor       =   &H00C0C0C0&
         BevelOuter      =   1  'Inset
         Caption         =   " barva :"
         Font3D          =   0  'None
         Height          =   285
         Left            =   1800
         TabIndex        =   37
         Top             =   135
         Width           =   1680
         Begin Label Label19 
            BackColor       =   &H00C0C0C0&
            Height          =   195
            Left            =   765
            TabIndex        =   32
            Top             =   45
            Width           =   870
         End
      End
      Begin SSPanel Panel3D1 
         Alignment       =   1  'Left Justify - MIDDLE
         BackColor       =   &H00C0C0C0&
         BevelOuter      =   1  'Inset
         Caption         =   " x =          y ="
         Font3D          =   0  'None
         Height          =   285
         Left            =   45
         TabIndex        =   36
         Top             =   135
         Width           =   1725
         Begin Label Label17 
            BackColor       =   &H00C0C0C0&
            Height          =   195
            Left            =   405
            TabIndex        =   33
            Top             =   45
            Width           =   420
         End
         Begin Label Label18 
            BackColor       =   &H00C0C0C0&
            Height          =   195
            Left            =   1260
            TabIndex        =   34
            Top             =   45
            Width           =   420
         End
      End
   End
   Begin SSFrame Frame3D1 
      Caption         =   "Nacin prikaza"
      Font3D          =   0  'None
      ForeColor       =   &H00000000&
      Height          =   1005
      Left            =   90
      TabIndex        =   28
      Top             =   6165
      Width           =   4065
      Begin SSCheck Check3D2 
         Caption         =   "odboj"
         Font3D          =   0  'None
         Height          =   240
         Left            =   1575
         TabIndex        =   49
         Top             =   630
         Value           =   -1  'True
         Width           =   825
      End
      Begin SSCheck Check3D1 
         Caption         =   "senca"
         Font3D          =   0  'None
         Height          =   240
         Left            =   1575
         TabIndex        =   48
         Top             =   360
         Value           =   -1  'True
         Width           =   870
      End
      Begin SSOption Option3D3 
         Caption         =   "Ray casting"
         Font3D          =   0  'None
         Height          =   225
         Left            =   2610
         TabIndex        =   30
         TabStop         =   0   'False
         Top             =   360
         Width           =   1320
      End
      Begin SSOption Option3D1 
         Caption         =   "Ray tracing"
         Font3D          =   0  'None
         Height          =   225
         Left            =   180
         TabIndex        =   29
         Top             =   360
         Value           =   -1  'True
         Width           =   1335
      End
   End
   Begin CommandButton Command1 
      Caption         =   "Risi"
      Height          =   330
      Left            =   4320
      TabIndex        =   1
      Top             =   6120
      Width           =   1275
   End
   Begin SSFrame Frame3D3 
      Caption         =   "Podatki"
      Font3D          =   0  'None
      ForeColor       =   &H00000000&
      Height          =   6360
      Left            =   5715
      TabIndex        =   2
      Top             =   45
      Width           =   3480
      Begin SSFrame Frame3D7 
         Caption         =   "Pozicija svetila"
         Font3D          =   0  'None
         ForeColor       =   &H00000000&
         Height          =   870
         Left            =   135
         TabIndex        =   56
         Top             =   5355
         Width           =   3210
         Begin TextBox Text11 
            Height          =   285
            Left            =   2520
            TabIndex        =   50
            Top             =   405
            Width           =   465
         End
         Begin TextBox Text10 
            Height          =   285
            Left            =   1530
            TabIndex        =   51
            Top             =   405
            Width           =   465
         End
         Begin TextBox Text9 
            Height          =   285
            Left            =   495
            TabIndex        =   52
            Top             =   405
            Width           =   465
         End
         Begin Label Label22 
            BackColor       =   &H00C0C0C0&
            Caption         =   "y :"
            Height          =   195
            Left            =   1260
            TabIndex        =   53
            Top             =   450
            Width           =   240
         End
         Begin Label Label21 
            BackColor       =   &H00C0C0C0&
            Caption         =   "z :"
            Height          =   195
            Left            =   2250
            TabIndex        =   54
            Top             =   450
            Width           =   240
         End
         Begin Label Label20 
            BackColor       =   &H00C0C0C0&
            Caption         =   "x :"
            Height          =   195
            Left            =   225
            TabIndex        =   55
            Top             =   450
            Width           =   240
         End
      End
      Begin SSFrame Frame3D5 
         Caption         =   "Presecna ravnina"
         Font3D          =   0  'None
         ForeColor       =   &H00000000&
         Height          =   1770
         Left            =   135
         TabIndex        =   19
         Top             =   3555
         Width           =   3210
         Begin TextBox Text4 
            Height          =   285
            Left            =   2295
            TabIndex        =   59
            Top             =   1305
            Width           =   465
         End
         Begin TextBox Text2 
            Height          =   285
            Left            =   1665
            TabIndex        =   23
            Top             =   720
            Width           =   435
         End
         Begin TextBox Text3 
            Height          =   285
            Left            =   2295
            TabIndex        =   22
            Top             =   720
            Width           =   435
         End
         Begin TextBox Text1 
            Height          =   285
            Left            =   1035
            TabIndex        =   21
            Top             =   720
            Width           =   435
         End
         Begin Label Label16 
            BackColor       =   &H00C0C0C0&
            Caption         =   "- oddaljenost ravnine     od koord. izhodisca :"
            Height          =   375
            Left            =   315
            TabIndex        =   31
            Top             =   1170
            Width           =   1950
         End
         Begin Label Label15 
            BackColor       =   &H00C0C0C0&
            Caption         =   ")"
            Height          =   195
            Left            =   2790
            TabIndex        =   27
            Top             =   765
            Width           =   105
         End
         Begin Label Label14 
            BackColor       =   &H00C0C0C0&
            Caption         =   ","
            Height          =   195
            Left            =   2160
            TabIndex        =   26
            Top             =   810
            Width           =   105
         End
         Begin Label Label13 
            BackColor       =   &H00C0C0C0&
            Caption         =   ","
            Height          =   195
            Left            =   1530
            TabIndex        =   25
            Top             =   810
            Width           =   105
         End
         Begin Label Label12 
            BackColor       =   &H00C0C0C0&
            Caption         =   "N = ("
            Height          =   195
            Left            =   540
            TabIndex        =   24
            Top             =   765
            Width           =   465
         End
         Begin Label Label11 
            BackColor       =   &H00C0C0C0&
            Caption         =   "- normalni vektor na ravnino :"
            Height          =   195
            Left            =   315
            TabIndex        =   20
            Top             =   405
            Width           =   2535
         End
      End
      Begin SSFrame Frame3D2 
         Caption         =   "Rotacija okoli osi"
         Font3D          =   0  'None
         ForeColor       =   &H00000000&
         Height          =   870
         Left            =   135
         TabIndex        =   15
         Top             =   2655
         Width           =   3210
         Begin TextBox Text5 
            Height          =   285
            Left            =   495
            TabIndex        =   18
            Top             =   405
            Width           =   465
         End
         Begin TextBox Text6 
            Height          =   285
            Left            =   1530
            TabIndex        =   17
            Top             =   405
            Width           =   465
         End
         Begin TextBox Text7 
            Height          =   285
            Left            =   2520
            TabIndex        =   16
            Top             =   405
            Width           =   465
         End
         Begin Label Label3 
            BackColor       =   &H00C0C0C0&
            Caption         =   "x :"
            Height          =   195
            Left            =   225
            TabIndex        =   12
            Top             =   450
            Width           =   240
         End
         Begin Label Label4 
            BackColor       =   &H00C0C0C0&
            Caption         =   "z :"
            Height          =   195
            Left            =   2250
            TabIndex        =   13
            Top             =   450
            Width           =   240
         End
         Begin Label Label5 
            BackColor       =   &H00C0C0C0&
            Caption         =   "y :"
            Height          =   195
            Left            =   1260
            TabIndex        =   14
            Top             =   450
            Width           =   240
         End
      End
      Begin SSFrame Frame3D4 
         Font3D          =   0  'None
         ForeColor       =   &H00000000&
         Height          =   2310
         Left            =   135
         TabIndex        =   3
         Top             =   315
         Width           =   3210
         Begin TextBox Text13 
            Enabled         =   0   'False
            Height          =   285
            Index           =   4
            Left            =   2250
            TabIndex        =   46
            Top             =   1845
            Width           =   465
         End
         Begin TextBox Text13 
            Enabled         =   0   'False
            Height          =   285
            Index           =   3
            Left            =   2250
            TabIndex        =   45
            Top             =   1530
            Width           =   465
         End
         Begin TextBox Text13 
            Enabled         =   0   'False
            Height          =   285
            Index           =   2
            Left            =   2250
            TabIndex        =   44
            Top             =   1215
            Width           =   465
         End
         Begin TextBox Text13 
            Enabled         =   0   'False
            Height          =   285
            Index           =   1
            Left            =   2250
            TabIndex        =   43
            Top             =   900
            Width           =   465
         End
         Begin TextBox Text8 
            Height          =   285
            Index           =   4
            Left            =   1170
            TabIndex        =   42
            Top             =   1845
            Width           =   465
         End
         Begin TextBox Text8 
            Height          =   285
            Index           =   3
            Left            =   1170
            TabIndex        =   41
            Top             =   1530
            Width           =   465
         End
         Begin TextBox Text8 
            Height          =   285
            Index           =   2
            Left            =   1170
            TabIndex        =   40
            Top             =   1215
            Width           =   465
         End
         Begin TextBox Text8 
            Height          =   285
            Index           =   1
            Left            =   1170
            TabIndex        =   39
            Top             =   900
            Width           =   465
         End
         Begin TextBox Text8 
            Height          =   285
            Index           =   0
            Left            =   1170
            TabIndex        =   38
            Top             =   585
            Width           =   465
         End
         Begin TextBox Text13 
            Enabled         =   0   'False
            Height          =   285
            Index           =   0
            Left            =   2250
            TabIndex        =   4
            Top             =   585
            Width           =   465
         End
         Begin Label Label2 
            BackColor       =   &H00C0C0C0&
            Caption         =   "Neprozornost"
            Height          =   195
            Left            =   1935
            TabIndex        =   5
            Top             =   225
            Width           =   1140
         End
         Begin Label Label1 
            BackColor       =   &H00C0C0C0&
            Caption         =   "Barva"
            Height          =   195
            Left            =   1125
            TabIndex        =   6
            Top             =   225
            Width           =   510
         End
         Begin Label Label10 
            BackColor       =   &H00C0C0C0&
            Caption         =   "Telo 1 :"
            Height          =   240
            Left            =   180
            TabIndex        =   7
            Top             =   630
            Width           =   750
         End
         Begin Label Label9 
            BackColor       =   &H00C0C0C0&
            Caption         =   "Telo 3 :"
            Height          =   240
            Left            =   180
            TabIndex        =   8
            Top             =   1260
            Width           =   750
         End
         Begin Label Label8 
            BackColor       =   &H00C0C0C0&
            Caption         =   "Telo 2 :"
            Height          =   240
            Left            =   180
            TabIndex        =   9
            Top             =   945
            Width           =   750
         End
         Begin Label Label7 
            BackColor       =   &H00C0C0C0&
            Caption         =   "Telo 4 :"
            Height          =   240
            Left            =   180
            TabIndex        =   10
            Top             =   1575
            Width           =   750
         End
         Begin Label Label6 
            BackColor       =   &H00C0C0C0&
            Caption         =   "Telo 5 :"
            Height          =   240
            Left            =   180
            TabIndex        =   11
            Top             =   1890
            Width           =   750
         End
      End
   End
End
    Dim refkr, reftl
    Dim Ks As Single
    Dim diskr As Single
    Dim xf As Single, yf As Single, zf As Single
    Dim x0, y0, z0
    Dim t1 As Single, t2 As Single
    Dim xr As Single, yr As Single, zr As Single
    Dim xrot As Single, yrot As Single, zrot As Single
    Dim pi As Single
    Dim Lx As Single, Ly As Single, Lz As Single
    Dim px(4), py(4), pz(4), r(4), alfa(4)
    Dim dx As Single, dy As Single, dz As Single
    Dim nrx As Single, nry As Single, nrz As Single, d
    Dim Nx As Single, Ny As Single, Nz As Single
    Dim Hx As Single, Hy As Single, Hz As Single
    Dim Vx As Single, Vy As Single, Vz As Single
    Dim barva, ozadje, oz, w
    Dim sx, sy, sz
    Dim bk(4, 3)
    Dim imen0 As Single, imen1 As Single, imen2 As Single
    Dim imen4  As Single, imen5 As Single
    Dim red As Single, green As Single, blue As Single

Sub Command1_Click ()
    Dim IRL As Single, IGL As Single, IBL As Single
    Dim IRLOC As Single, IGLOC As Single, IBLOC As Single
    ReDim kba(5, 3)
    
    'izvor svetlobe
    sx = Val(text9)
    sy = Val(text10)
    sz = Val(text11)
    
    'oko
    x0 = 0: y0 = 0: z0 = 999
    
    'barva ozadja
    ozadje = RGB(0, 0, 0)

    'enotski normalni vektor na presecno ravnino
    nrx = Val(text1)
    nry = Val(text2)
    nrz = Val(text3)
    d = Val(text4)
    
    rotacija nrx, nry, nrz
    nrx = xrot
    nry = yrot
    nrz = zrot
    
    imen0 = Sqr(nrx ^ 2 + nry ^ 2 + nrz ^ 2)
    nrx = nrx / imen0
    nry = nry / imen0
    nrz = nrz / imen0
    
    'krogle podatki
    px(0) = 0
    py(0) = 0
    pz(0) = 0
    
    px(1) = 78
    py(1) = -38
    pz(1) = 50
      
    px(2) = 18
    py(2) = 50
    pz(2) = 98
    
    px(3) = -10
    py(3) = -50
    pz(3) = 0
    
    px(4) = -70
    py(4) = 10
    pz(4) = -10
    
    For i = 0 To 4
      rotacija px(i), py(i), pz(i)
      px(i) = xrot
      py(i) = yrot
      pz(i) = zrot
    Next i

    For i = 0 To 4
      alfa(i) = Val(text13(i))
    Next i
    
    'barve krogel
    'bela
    kba(1, 1) = 1: kba(1, 2) = 1: kba(1, 3) = 1
    
    'rdeca
    kba(2, 1) = 1: kba(2, 2) = 0: kba(2, 3) = 0
    
    'zelena
    kba(3, 1) = 0: kba(3, 2) = 1: kba(3, 3) = 0
    
    'modra
    kba(4, 1) = 0: kba(4, 2) = 0: kba(4, 3) = 1
    
    'magenta
    kba(5, 1) = 1: kba(5, 2) = 0: kba(5, 3) = 1
    
    For i = 0 To 4
      For j = 1 To 3
        bk(i, j) = kba(Val(text8(i)), j)
      Next j
    Next i
    
    'zaslon
    z1 = 0
    
    If Option3D1.Value = True Then
      For x1 = p1.ScaleLeft To p1.ScaleLeft + p1.Width - 3
        nar = nar + 1
        label23.Caption = "delam..." + Format((nar / (p1.Width - 3)) * 100, "##") + "%"
        label23.Refresh
        
        For y1 = p1.ScaleTop To p1.ScaleTop + p1.Height - 3
          imen1 = Sqr((x1 - x0) ^ 2 + (y1 - y0) ^ 2 + (z1 - z0) ^ 2)
          dx = (x1 - x0) / imen1
          dy = (y1 - y0) / imen1
          dz = (z1 - z0) / imen1
      
          preskrog dx, dy, dz, px(0), py(0), pz(0), r(0), x0, y0, z0
      
          barva = ozadje
      
          If diskr >= 0 Then
            preseci dx, dy, dz, t2, x0, y0, z0
            lokalna
            IRLOC = red
            IGLOC = green
            IBLOC = blue
        
            red = 0
            green = 0
            blue = 0
        
            If oz = True Then GoTo 11
            
            If Check3D2.Value = True Then
              If refkr = True Or reftl = True Then
                reftl = False
                reflection
                refkr = False
          
                IRL = red
                IGL = green
                IBL = blue
            
                red = 0
                green = 0
                blue = 0
              End If
            End If

            'RGB
            IR = 255 * (IRLOC + IRL) ^ (1 / (HScroll1.Value / 10))
            IG = 255 * (IGLOC + IGL) ^ (1 / (HScroll1.Value / 10))
            IB = 255 * (IBLOC + IBL) ^ (1 / (HScroll1.Value / 10))
        
            barva = RGB(IR, IG, IB)
          End If
      
11        p1.PSet (x1, y1), barva
          oz = False
       
          IRL = 0
          IGL = 0
          IBL = 0

        Next y1
      Next x1
     Else
      volren
    End If
    label23.Caption = "pripravljen..."
End Sub

Sub Command2_Click ()
    End
End Sub

Sub Command3_Click ()
    p1.Cls
End Sub

Sub Form_Load ()
    pi = 22 / 7
    
    r(0) = 150
    r(1) = 42
    r(2) = 26
    r(3) = 86
    r(4) = 62

    text1 = 0
    text2 = -1
    text3 = 1
    text4 = 15
        
    text5 = 14
    text6 = -9
    text7 = 11

    For i = 0 To 4
      text8(i) = i + 1
      text13(i) = ".5"
    Next i

    text9 = 193
    text10 = -59
    text11 = 263

    text12 = Format(HScroll1.Value / 10, "0.0")
End Sub

Sub HScroll1_Change ()
    text12 = Format(HScroll1.Value / 10, "0.0")
End Sub

Sub lokalna ()
    ReDim bt(4)
    Dim tr2  As Single, t2min As Single
    Dim ambientterm As Single, Kd As Single
    Dim razd As Single, distfactor As Single
    Dim diffuseterm As Single, specularterm As Single
      
    sen = 1
    sp = 0

    If nrx * xf + nry * yf + nrz * zf + d >= 0 Then
    
      tr2 = (nrx * dx + nry * dy + nrz * dz)
      If tr2 <> 0 Then
        tr2 = -(nrx * x0 + nry * y0 + nrz * z0 + d) / tr2
      End If
          
      preseci dx, dy, dz, tr2, x0, y0, z0
      'N-enotski normalni vektor na ravnino
      Nx = nrx
      Ny = nry
      Nz = nrz
      
      For i = 1 To 4
        preskrog dx, dy, dz, px(i), py(i), pz(i), r(i), x0, y0, z0
        If diskr >= 0 Then
          If t2 < t2min Or seka = False Then
            t2min = t2
            seka = True
            w = i
          End If
        End If
      Next i
          
      If seka = True Then
        seka = False
        If t2min < tr2 Or tr2 = 0 Or Sqr((xf - px(0)) ^ 2 + (yf - py(0)) ^ 2 + (zf - pz(0)) ^ 2) > r(0) Then
          refkr = True

          '..... + senca na kroglo
          preseci dx, dy, dz, t2min, x0, y0, z0
          presizv sx, sy, sz
          imen2 = Sqr((xf - px(w)) ^ 2 + (yf - py(w)) ^ 2 + (zf - pz(w)) ^ 2)
          Nx = (xf - px(w)) / imen2
          Ny = (yf - py(w)) / imen2
          Nz = (zf - pz(w)) / imen2
          
          If Check3D1.Value = True Then
            LN = Lx * Nx + Ly * Ny + Lz * Nz
            If LN > 0 Then
              For i = 1 To 4
                preskrog Lx, Ly, Lz, px(i), py(i), pz(i), r(i), xf, yf, zf
                If diskr >= 0 And t2 > 0 Then
                  sen = 0
                  GoTo 22
                End If
              Next i
            End If
          End If
          
          GoTo 22
        End If
      End If
           
      'senca na tla
      If Check3D1.Value = True Then
        presizv sx, sy, sz
        For i = 1 To 4
          preskrog Lx, Ly, Lz, px(i), py(i), pz(i), r(i), xf, yf, zf
          If diskr >= 0 And t2 > 0 Then
            sen = 0
            GoTo 33
          End If
        Next i
      End If
              
33    If Sqr((xf - px(0)) ^ 2 + (yf - py(0)) ^ 2 + (zf - pz(0)) ^ 2) > r(0) Then
        barva = ozadje
        oz = True
        Exit Sub
      End If
      reftl = True
     Else
      'N-enotski normalni vektor na sfero v xf,yf,zf
      imen2 = Sqr((xf - px(0)) ^ 2 + (yf - py(0)) ^ 2 + (zf - pz(0)) ^ 2)
      Nx = xf / imen2
      Ny = yf / imen2
      Nz = zf / imen2
    End If
                
    w = 0

22  'L-enotski vektor od presecisca do izvora svetlobe
    presizv sx, sy, sz
        
    'V-enotski vektor od presecisca do ocesa
    Vx = x0 - xf
    Vy = y0 - yf
    Vz = z0 - zf
    imen4 = Sqr(Vx ^ 2 + Vy ^ 2 + Vz ^ 2)
    Vx = Vx / imen4
    Vy = Vy / imen4
    Vz = Vz / imen4
        
    'H-enotski normalni vektor na hipoteticno ravnino
    Hx = Lx + Vx
    Hy = Ly + Vy
    Hz = Lz + Vz
    imen5 = Sqr(Hx ^ 2 + Hy ^ 2 + Hz ^ 2)
    Hx = Hx / imen5
    Hy = Hy / imen5
    Hz = Hz / imen5
        
    'vektrorska produkta L*N in N*H
    LN = Lx * Nx + Ly * Ny + Lz * Nz
    NH = Nx * Hx + Ny * Hy + Nz * Hz
    If LN <= 0 Then LN = 0: NH = 0
        
    Ilight = 225
    K = 70
    ambientterm = .3
    Kd = .7
    Ks = 1 - Kd
    specindex = 40

    razd = Sqr((sx - xf) ^ 2 + (sy - yf) ^ 2 + (sz - zf) ^ 2)
    distfactor = Ilight / (razd + K)
    diffuseterm = distfactor * Kd * LN * sen
    specularterm = distfactor * Ks * NH ^ specindex * sen
    
    If sp = 0 Then sp = 1

    For i = 1 To sp
      If nad = True Then w = bt(i)
      red = red + ambientterm * bk(w, 1) + diffuseterm * bk(w, 1)
      green = green + ambientterm * bk(w, 2) + diffuseterm * bk(w, 2)
      blue = blue + ambientterm * bk(w, 3) + diffuseterm * bk(w, 3)
    Next i
                
    nad = False
       
    red = red + specularterm
    green = green + specularterm
    blue = blue + specularterm
End Sub

Sub Option3D1_Click (Value As Integer)
    For i = 0 To 4
      text13(i).Enabled = False
    Next i
    Check3D1.Enabled = True
    Check3D2.Enabled = True
End Sub

Sub Option3D3_Click (Value As Integer)
    For i = 0 To 4
      text13(i).Enabled = True
    Next i
    Check3D1.Enabled = False
    Check3D2.Enabled = False
End Sub

Sub p1_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single)
    label17.Caption = X
    label18.Caption = Y
    label19.Caption = p1.Point(X, Y)
End Sub

Sub preseci (dx, dy, dz, t2, xg, yg, zg)
    xf = xg + dx * t2
    yf = yg + dy * t2
    zf = zg + dz * t2
End Sub

Sub presizv (sx, sy, sz)
          Dim imen3 As Single
          'L-enotski vektor od presecisca do izvora svetlobe
          Lx = sx - xf
          Ly = sy - yf
          Lz = sz - zf
          imen3 = Sqr(Lx ^ 2 + Ly ^ 2 + Lz ^ 2)
          Lx = Lx / imen3
          Ly = Ly / imen3
          Lz = Lz / imen3
End Sub

Sub preskrog (dx, dy, dz, px, py, pz, r, xg, yg, zg)
    Dim b As Single, c As Single
    a = 1
    b = 2 * (dx * (xg - px) + dy * (yg - py) + dz * (zg - pz))
    c = (xg - px) ^ 2 + (yg - py) ^ 2 + (zg - pz) ^ 2 - r ^ 2
    diskr = b ^ 2 - 4 * a * c
    If diskr >= 0 Then
      t1 = (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)
      t2 = (-b - Sqr(b ^ 2 - 4 * a * c)) / (2 * a)
    End If
End Sub

Sub reflection ()
    Dim tr2  As Single, t2min As Single
    Dim ambientterm As Single, Kd As Single
    Dim razd As Single, distfactor As Single
    Dim diffuseterm As Single, specularterm As Single
    Dim theta As Single, imen6 As Single
    Dim RLx As Single, RLy As Single, RLz As Single
    Dim xfnew As Single, yfnew As Single, zfnew As Single
        
    'theta-kot med N in RL
    theta = -Nx * dx - Ny * dy - Nz * dz
    If Abs(theta) > 1 Then theta = Sgn(theta)
    If Abs(theta) <> 1 Then
      theta = Atn(-theta / Sqr(-theta * theta + 1)) + 1.5708
      theta = theta * 180 / pi
     Else
      theta = (1 - Sgn(theta)) / 2 * 180
    End If
    
    RLx = dx + 2 * Nx * Cos(theta * pi / 180)
    RLy = dy + 2 * Ny * Cos(theta * pi / 180)
    RLz = dz + 2 * Nz * Cos(theta * pi / 180)
    imen6 = Sqr(RLx ^ 2 + RLy ^ 2 + RLz ^ 2)
    RLx = RLx / imen6
    RLy = RLy / imen6
    RLz = RLz / imen6
        
    dx = RLx
    dy = RLy
    dz = RLz
    
    xfnew = xf
    yfnew = yf
    zfnew = zf

    sen = 1

    For i = 1 To 4
      preskrog dx, dy, dz, px(i), py(i), pz(i), r(i), xf, yf, zf
      If diskr >= 0 And t2 > 0 Then
        If t2 < t2min Or seka = False Then
          t2min = t2
          seka = True
          w = i
        End If
      End If
    Next i
          
    If refkr = True Then
      tr2 = (nrx * dx + nry * dy + nrz * dz)
      If tr2 <> 0 Then
        tr2 = -(nrx * xf + nry * yf + nrz * zf + d) / tr2
      End If
      
      If tr2 > 0 Then
        If tr2 < t2min Or seka = False Then
          preseci dx, dy, dz, tr2, xfnew, yfnew, zfnew
          If Sqr((xf - px(0)) ^ 2 + (yf - py(0)) ^ 2 + (zf - pz(0)) ^ 2) > r(0) Then GoTo 5
          Nx = nrx
          Ny = nry
          Nz = nrz
          w = 0
            
          'senca na tla
          If Check3D1.Value = True Then
            presizv sx, sy, sz
            For i = 1 To 4
              preskrog Lx, Ly, Lz, px(i), py(i), pz(i), r(i), xf, yf, zf
              If diskr >= 0 And t2 > 0 Then
                sen = 0
                GoTo 222
              End If
            Next i
          End If

          GoTo 222
        End If
      End If
    End If
          
    If seka = True Then
      seka = False
      '..... + senca na kroglo
      preseci dx, dy, dz, t2min, xfnew, yfnew, zfnew
          
      If nrx * xf + nry * yf + nrz * zf + d < 0 Then GoTo 5
        presizv sx, sy, sz
        imen2 = Sqr((xf - px(w)) ^ 2 + (yf - py(w)) ^ 2 + (zf - pz(w)) ^ 2)
        Nx = (xf - px(w)) / imen2
        Ny = (yf - py(w)) / imen2
        Nz = (zf - pz(w)) / imen2
          
        If Check3D1.Value = True Then
          LN = Lx * Nx + Ly * Ny + Lz * Nz
          If LN > 0 Then
            For i = 1 To 4
              preskrog Lx, Ly, Lz, px(i), py(i), pz(i), r(i), xf, yf, zf
              If diskr >= 0 And t2 > 0 Then
                sen = 0
                GoTo 222
              End If
            Next i
          End If
        End If

        GoTo 222
    End If
    
5   Exit Sub
        
222 'L-enotski vektor od presecisca do izvora svetlobe
    presizv sx, sy, sz
        
    'V-enotski vektor od presecisca do ocesa
    Vx = x0 - xf
    Vy = y0 - yf
    Vz = z0 - zf
    imen4 = Sqr(Vx ^ 2 + Vy ^ 2 + Vz ^ 2)
    Vx = Vx / imen4
    Vy = Vy / imen4
    Vz = Vz / imen4
        
    'H-enotski normalni vektor na hipoteticno ravnino
    Hx = Lx + Vx
    Hy = Ly + Vy
    Hz = Lz + Vz
    imen5 = Sqr(Hx ^ 2 + Hy ^ 2 + Hz ^ 2)
    Hx = Hx / imen5
    Hy = Hy / imen5
    Hz = Hz / imen5
        
    'vektrorska produkta L*N in N*H
    LN = Lx * Nx + Ly * Ny + Lz * Nz
    NH = Nx * Hx + Ny * Hy + Nz * Hz
    If LN <= 0 Then LN = 0: NH = 0
        
    Ilight = 225
    K = 70
    ambientterm = .3  ' = Ia*Ka
    Kd = .3
    Ks = 1 - Kd
    specindex = 40

    razd = Sqr((sx - xf) ^ 2 + (sy - yf) ^ 2 + (sz - zf) ^ 2)
    distfactor = Ilight / (razd + K)
    diffuseterm = distfactor * Kd * LN * sen
    specularterm = distfactor * Ks * NH ^ specindex * sen
    
    red = ambientterm * bk(w, 1) + diffuseterm * bk(w, 1) + specularterm
    green = ambientterm * bk(w, 2) + diffuseterm * bk(w, 2) + specularterm
    blue = ambientterm * bk(w, 3) + diffuseterm * bk(w, 3) + specularterm
End Sub

Sub rotacija (xr, yr, zr)
    Dim iks As Single, ipsilon As Single
    alfa1 = Val(text5)
    alfa2 = Val(text6)
    alfa3 = Val(text7)

    'okoli x osi
    ipsilon = yr
    yr = yr * Cos(alfa1 * pi / 180) - zr * Sin(alfa1 * pi / 180)
    zr = ipsilon * Sin(alfa1 * pi / 180) + zr * Cos(alfa1 * pi / 180)
         
    'okoli y osi
    iks = xr
    xr = xr * Cos(alfa2 * pi / 180) + zr * Sin(alfa2 * pi / 180)
    zr = -iks * Sin(alfa2 * pi / 180) + zr * Cos(alfa2 * pi / 180)
      
    'okoli z osi
    iks = xr
    xr = xr * Cos(alfa3 * pi / 180) - yr * Sin(alfa3 * pi / 180)
    yr = iks * Sin(alfa3 * pi / 180) + yr * Cos(alfa3 * pi / 180)
    
    xrot = xr
    yrot = yr
    zrot = zr
End Sub

Sub volren ()
    Dim t As Single
    Dim alfN As Single, opa As Single
    Dim redN As Single, greenN As Single, blueN As Single
    ReDim bt(4)
    Dim tr2 As Single, t2min As Single
    Dim ambientterm As Single, Kd As Single
    Dim razd As Single, distfactor As Single
    Dim diffuseterm As Single, specularterm As Single
    Dim xg  As Single, yg As Single, zg As Single

    dx = 0
    dy = 0
    dz = -1
    z1 = 999
   
    For x1 = p1.ScaleLeft To p1.ScaleLeft + p1.Width - 3
      nar = nar + 1
      label23.Caption = "delam..." + Format((nar / (p1.Width - 3)) * 100, "##") + "%"
      label23.Refresh
      For y1 = p1.ScaleTop To p1.ScaleTop + p1.Height - 3
        xg = x1
        yg = y1
        zg = z1
       
        Do
          sp = 0
        
          For i = 0 To 4
            preskrog dx, dy, dz, px(i), py(i), pz(i), r(i), xg, yg, zg
            If diskr >= 0 Then
              If t1 < 0 And t2 < 0 Then GoTo 7
              If t2 < 0 And t1 > 0 Then
                t = t1
               Else
                t = t2
              End If

              If t < t2min Or seka = False Then
                t2min = t
                seka = True
                w = i
              End If
            End If
7         Next i
        
          If seka = True Then
            seka = False
            preseci dx, dy, dz, t2min, xg, yg, zg
            If nrx * xf + nry * yf + nrz * zf + d >= 0 Then
              tr2 = (nrx * dx + nry * dy + nrz * dz)
              If tr2 <> 0 Then
                tr2 = -(nrx * xg + nry * yg + nrz * zg + d) / tr2
              End If
          
            preseci dx, dy, dz, tr2, xg, yg, zg
          
            If Sqr((xf - px(0)) ^ 2 + (yf - py(0)) ^ 2 + (zf - pz(0)) ^ 2) > r(0) Then
              barva = ozadje
              GoTo 111
            End If
          
            For i = 1 To 4
              If Sqr((xf - px(i)) ^ 2 + (yf - py(i)) ^ 2 + (zf - pz(i)) ^ 2) <= r(i) Then
                If alfa(i) > 0 Then
                  nad = True
                  sp = sp + 1
                  bt(sp) = i
                End If
              End If
            Next i
          
            Nx = nrx
            Ny = nry
            Nz = nrz
          
            GoTo 9
          End If
          
          imen2 = Sqr((xf - px(w)) ^ 2 + (yf - py(w)) ^ 2 + (zf - pz(w)) ^ 2)
          Nx = (xf - px(w)) / imen2
          Ny = (yf - py(w)) / imen2
          Nz = (zf - pz(w)) / imen2
        
              
9         presizv sx, sy, sz
          'V-enotski vektor od presecisca do ocesa
          Vx = x0 - xf
          Vy = y0 - yf
          Vz = z0 - zf
          imen4 = Sqr(Vx ^ 2 + Vy ^ 2 + Vz ^ 2)
          Vx = Vx / imen4
          Vy = Vy / imen4
          Vz = Vz / imen4
        
          'H-enotski normalni vektor na hipoteticno ravnino
          Hx = Lx + Vx
          Hy = Ly + Vy
          Hz = Lz + Vz
          imen5 = Sqr(Hx ^ 2 + Hy ^ 2 + Hz ^ 2)
          Hx = Hx / imen5
          Hy = Hy / imen5
          Hz = Hz / imen5
        
          'vektrorska produkta L*N in N*H
          LN = Lx * Nx + Ly * Ny + Lz * Nz
          NH = Nx * Hx + Ny * Hy + Nz * Hz
          If LN <= 0 Then LN = 0: NH = 0
        
          Ilight = 225
          K = 70
          ambientterm = .3  ' = Ia*Ka
          Kd = .7
          Ks = 1 - Kd
          specindex = 40

          razd = Sqr((sx - xf) ^ 2 + (sy - yf) ^ 2 + (sz - zf) ^ 2)
          distfactor = Ilight / (razd + K)
          diffuseterm = distfactor * Kd * LN
          specularterm = distfactor * Ks * NH ^ specindex
    
          If sp = 0 Then sp = 1
              
          For i = 1 To sp
            If nad = True Then
              w = bt(i)
              opa = alfa(w)
              opa1 = opa1 + opa
             Else
              If alfa(w) > 0 Then
                opa = alfa(w)
                opa1 = opa
               Else
                GoTo 54
              End If
            End If

            red = ambientterm * bk(w, 1) + diffuseterm * bk(w, 1)
            green = ambientterm * bk(w, 2) + diffuseterm * bk(w, 2)
            blue = ambientterm * bk(w, 3) + diffuseterm * bk(w, 3)

            If i = 1 Then
              red = red + specularterm
              green = green + specularterm
              blue = blue + specularterm
            End If
              
            redN = redN + red * opa * (1 - alfN)
            greenN = greenN + green * opa * (1 - alfN)
            blueN = blueN + blue * opa * (1 - alfN)
              
54        Next i
              
          If opa1 > 1 Then opa1 = 1
            alfN = alfN + opa1 * (1 - alfN)
            
            nad = False
            opa = 0
            opa1 = 0
              
            xg = xf
            yg = yf
            zg = zf - .001
            If alfN > .95 Then Exit Do
           Else
            konec = True
          End If
        Loop Until konec = True
      
        IR = 255 * redN ^ (1 / (HScroll1.Value / 10))
        IG = 255 * greenN ^ (1 / (HScroll1.Value / 10))
        IB = 255 * blueN ^ (1 / (HScroll1.Value / 10))
             
        red = 0
        green = 0
        blue = 0
             
        redN = 0
        greenN = 0
        blueN = 0
        alfN = 0
             
        barva = RGB(IR, IG, IB)
      
111     p1.PSet (x1, y1), barva
        
        konec = False
      
      Next y1
    Next x1
End Sub

