USING: adsoda
kernel
math
accessors
sequences
    adsoda.solution2
    fry
    tools.test 
    arrays ;

IN: adsoda.tests



: s1 ( -- solid )
    <solid> 
    2 >>dimension
    "s1" >>name
    { 1 1 1 } >>color
    { 1 -1 -5 } cut-solid 
    { -1 -1 -21 } cut-solid 
    { -1 0 -12 } cut-solid 
    { 1 2 16 } cut-solid
;
: solid1 ( -- solid )
    <solid> 
    2 >>dimension
    "solid1" >>name
    { 1 -1 -5 } cut-solid 
    { -1 -1 -21 } cut-solid 
    { -1 0 -12 } cut-solid 
    { 1 2 16 } cut-solid
    ensure-adjacencies
    
;
: solid2 ( -- solid )
    <solid> 
    2 >>dimension
    "solid2" >>name
    { -1 1 -10 } cut-solid 
    { -1 -1 -28 } cut-solid 
    { 1 0 13 } cut-solid 
 !   { 1 2 16 } cut-solid
    ensure-adjacencies
    
;

: solid3 ( -- solid )
      <solid> 
    2 >>dimension
    "solid3" >>name
    { 1 1 1 } >>color
    { 1 0 16 } cut-solid 
    { -1 0 -36 } cut-solid 
    { 0 1 1 } cut-solid 
    { 0 -1  -17 } cut-solid 
 !   { 1 2 16 } cut-solid
    ensure-adjacencies
    

;

: solid4 ( -- solid )
      <solid> 
    2 >>dimension
    "solid4" >>name
    { 1 1 1 } >>color
    { 1 0 21 } cut-solid 
    { -1 0 -36 } cut-solid 
    { 0 1 1 } cut-solid 
    { 0 -1  -17 } cut-solid 
    ensure-adjacencies
    
;

: solid5 ( -- solid )
      <solid> 
    2 >>dimension
    "solid5" >>name
    { 1 1 1 } >>color
    { 1 0 6 } cut-solid 
    { -1 0 -17 } cut-solid 
    { 0 1 17 } cut-solid 
    { 0 -1  -19 } cut-solid 
    ensure-adjacencies
    
;

: solid7 ( -- solid )
      <solid> 
    2 >>dimension
    "solid7" >>name
    { 1 1 1 } >>color
    { 1 0 38 } cut-solid 
    { 1 -5 -66 } cut-solid 
    { -2 1 -75 } cut-solid
    ensure-adjacencies
    
;

: solid6s ( -- seq )
  solid3 clone solid2 clone subtract
;

: space1 ( -- space )
    <space>
        2 >>dimension
     !    solid3 suffix-solids
        solid1 suffix-solids
        solid2 suffix-solids
    !   solid6s [ suffix-solids ] each 
        solid4 suffix-solids
     !   solid5 suffix-solids
        solid7 suffix-solids
        { 1 1 1 } >>ambient-color
            <light>
        { -100 -100 } >>position
        { 0.2 0.7 0.1 } >>color
        suffix-lights
;

: space2 ( -- space )
    <space>
        4 >>dimension
       ! 4cube suffix-solids
        { 1 1 1 } >>ambient-color
            <light>
        { -100 -100 } >>position
        { 0.2 0.7 0.1 } >>color
        suffix-lights

       ;



! {
!        { 1 0 0 0 }
!        { 0 1 0 0 }
!        { 0 0 0.984807753012208 -0.1736481776669303 }
!        { 0 0 0.1736481776669303 0.984807753012208 }
!    }

! ------------------------------------------------------------
! constant+
[ { 1 2 5 } ] [ { 1 2 3 } 2 constant+ ] unit-test

! ------------------------------------------------------------
! translate
[ { 1 -1 0 } ] [ { 1 -1 -5 } { 3 -2 } translate ] unit-test

! ------------------------------------------------------------
! transform
[ { -1 -1 -5 21.0 } ] [ { -1 -1 -5 21 }
  { { 1 0 0 }
    { 0 1 0 }
    { 0 0 1 }
    } transform  
] unit-test

! ------------------------------------------------------------
! compare-nleft-to-identity-matrix
[ t ] [ 
    { 
        { 1 0 0 1232 } 
        { 0 1 0 0 321 } 
        { 0 0 1 0 } } 
        3 compare-nleft-to-identity-matrix 
]  unit-test

[ f ] [ 
    { { 1 0 0 } { 0 1 0 } { 0 0 0 } } 
    3 compare-nleft-to-identity-matrix 
] unit-test

[ f ] [ 
    { { 2 0 0 } { 0 1 0 } { 0 0 1 } } 
    3 compare-nleft-to-identity-matrix 
] unit-test
! ------------------------------------------------------------
[ t ] [ 
  { { 1 0 0 }
    { 0 1 0 }
    { 0 0 1 } } 3 valid-solution? 
] unit-test

[ f ] [ 
  { { 1 0 0 1 }
    { 0 0 0 1 }
    { 0 0 1 0 } } 3 valid-solution? 
] unit-test

[ f ] [ 
  { { 1 0 0 1 }
    { 0 0 0 1 } } 3 valid-solution? 
] unit-test

[ f ] [ 
  { { 1 0 0 1 }
    { 0 0 0 1 }
    { 0 0 1 0 } } 2 valid-solution? 
] unit-test

! ------------------------------------------------------------
[ 3 ] [ { 1 2 3 } last ] unit-test 

[ { 1 2 5 } ] [ { 1 2 3 } dup [ 2 + ] change-last ] unit-test 

! ------------------------------------------------------------
! position-point 
[ 0 ] [ 
    { 1 -1 -5 } { 2 7 } position-point 
] unit-test

! ------------------------------------------------------------

! transform
! TODO construire un exemple


! ------------------------------------------------------------
! slice-solid 

! ------------------------------------------------------------
! solve-equation 
! deux cas de tests, avec solution et sans solution

[ { 2 7 } ] 
[ { { 1 -1 -5 } { 1 2 16 } } intersect-hyperplanes ] 
unit-test

[ f ] 
[ { { 1 -1 -5 } { 1 2 16 } { -1 -1 -21 } } intersect-hyperplanes  ]
unit-test

[ f ] 
[ { { 1 0 -5 } { 1 0 16 }  } intersect-hyperplanes  ]
unit-test

! ------------------------------------------------------------
! point-inside-halfspace
[ t ] [ { 1 -1 -5 } { 0 0 }  point-inside-halfspace? ] 
unit-test
[ f ] [ { 1 -1 -5 } { 8 13 }  point-inside-halfspace? ] 
unit-test
[ t ] [ { 1 -1 -5 } { 8 13 }  point-inside-or-on-halfspace? ] 
unit-test


! ------------------------------
! order solid

[  1 ] [ 0 >pv solid1 solid2 order-solid ] unit-test
[ -1 ] [ 0 >pv solid2 solid1 order-solid ] unit-test
[  f ] [ 1 >pv solid1 solid2 order-solid ] unit-test
[  f ] [ 1 >pv solid2 solid1 order-solid ] unit-test


! clip-solid
[ { { 13 15 } { 15 13 } { 13 13 } } ]
    [ 0 >pv solid2 solid1 clip-solid first corners>> ] unit-test

solid1 corners>> '[ _ ]
    [ 0 >pv solid1 solid1 clip-solid first corners>> ] unit-test

solid1 corners>> '[ _ ]
    [ 0 >pv solid1 solid2 clip-solid first corners>> ] unit-test

solid1 corners>> '[ _ ]
    [ 1 >pv solid1 solid2 clip-solid first corners>> ] unit-test
solid2 corners>> '[ _ ]
    [ 1 >pv solid2 solid1 clip-solid first corners>> ] unit-test

!
[
    {
        { { 13 15 } { 15 13 } { 13 13 } }
        { { 16 17 } { 16 13 } { 36 17 } { 36 13 } }
        { { 16 1 } { 16 2 } { 36 1 } { 36 2 } }
    }
] [     0 >pv solid2 solid3  2array 
        solid1 (solids-silhouette-subtract) 
        [ corners>> ] map
  ] unit-test


[
{
    { { 8 13 } { 2 7 } { 12 9 } { 12 2 } }
    { { 13 15 } { 15 13 } { 13 13 } }
    { { 16 17 } { 16 15 } { 36 17 } { 36 15 } }
    { { 16 1 } { 16 2 } { 36 1 } { 36 2 } }
}
] [ 
    0 >pv  <space> solid1 suffix-solids 
        solid2 suffix-solids 
        solid3 suffix-solids
     remove-hidden-solids
    solids>> [ corners>> ] map
] unit-test

! { }
! { }
! <light> { 0.2 0.3 0.4 } >>color { 1 -1 1 } >>direction     suffix
! <light> { 0.4 0.3 0.1 } >>color { -1 -1 -1 } >>direction   suffix
! suffix 
! { 0.1 0.1 0.1 } suffix ! ambient color
! { 0.23 0.32 0.17 } suffix ! solid color
! solid3 faces>> first 

! enlight-projection