@@ -637,7 +637,119 @@ public void CheckBuiltinExpressionListed([ValueSource("CheckAllBuiltinExpression
637
637
var operation = ( UnityEngine . VFX . VFXExpressionOperation ) Enum . Parse ( typeof ( UnityEngine . VFX . VFXExpressionOperation ) , expressionName ) ;
638
638
var referenceExpression = VFXBuiltInExpression . Find ( operation ) ;
639
639
Assert . IsTrue ( VFXDynamicBuiltInParameter . s_BuiltInInfo . Values . Any ( o => o . expression == referenceExpression ) ) ;
640
+ }
640
641
642
+ public struct ApplyAddressingModeTestCase
643
+ {
644
+ public ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode _mode , uint _count )
645
+ {
646
+ mode = _mode ;
647
+ count = _count ;
648
+ expectedSequence = new uint [ Mathf . Max ( 50 , 7 * ( int ) _count ) ] ;
649
+
650
+ //Naive implementation for reference
651
+ if ( mode == VFXOperatorUtility . SequentialAddressingMode . Clamp )
652
+ {
653
+ for ( uint i = 0 ; i < expectedSequence . Length ; ++ i )
654
+ {
655
+ expectedSequence [ i ] = i < count ? i : count - 1 ;
656
+ }
657
+ }
658
+ else if ( mode == VFXOperatorUtility . SequentialAddressingMode . Wrap )
659
+ {
660
+ uint current = 0u ;
661
+ for ( uint i = 0 ; i < expectedSequence . Length ; ++ i )
662
+ {
663
+ expectedSequence [ i ] = current ;
664
+ current ++ ;
665
+ if ( current >= count )
666
+ current = 0u ;
667
+ }
668
+ }
669
+ else if ( mode == VFXOperatorUtility . SequentialAddressingMode . Mirror )
670
+ {
671
+ uint current = 0u ;
672
+ bool increment = true ;
673
+ for ( uint i = 0 ; i < expectedSequence . Length ; ++ i )
674
+ {
675
+ expectedSequence [ i ] = current ;
676
+ if ( increment )
677
+ {
678
+ current ++ ;
679
+ if ( current >= count )
680
+ {
681
+ increment = false ;
682
+ current = count > 2u ? count - 2u : 0u ;
683
+ }
684
+ }
685
+ else
686
+ {
687
+ if ( current == 0u )
688
+ {
689
+ increment = true ;
690
+ current = count == 1u ? 0u : 1u ;
691
+ }
692
+ else
693
+ {
694
+ current -- ;
695
+ }
696
+ }
697
+ }
698
+ }
699
+ }
700
+
701
+ public VFXOperatorUtility . SequentialAddressingMode mode ;
702
+ public uint count ;
703
+ public uint [ ] expectedSequence ;
704
+
705
+ public override string ToString ( )
706
+ {
707
+ return string . Format ( "{0}_{1}_{2}" , mode . ToString ( ) , count , expectedSequence . Length ) ;
708
+ }
709
+ }
710
+
711
+
712
+ static readonly ApplyAddressingModeTestCase [ ] ApplyAddressingModeTestCase_ValueSource =
713
+ {
714
+ //The 0 case is always undefined
715
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Wrap , 1u ) ,
716
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Wrap , 4u ) ,
717
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Clamp , 1u ) ,
718
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Clamp , 4u ) ,
719
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 1u ) ,
720
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 2u ) ,
721
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 3u ) ,
722
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 4u ) ,
723
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 7u ) ,
724
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 8u ) ,
725
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 9u ) ,
726
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 13u ) ,
727
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 15u ) ,
728
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 27u ) ,
729
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 32u ) ,
730
+ new ApplyAddressingModeTestCase ( VFXOperatorUtility . SequentialAddressingMode . Mirror , 33u ) ,
731
+ } ;
732
+
733
+ [ Test ]
734
+ public void CheckExpectedSequence_ApplyAddressingMode ( [ ValueSource ( "ApplyAddressingModeTestCase_ValueSource" ) ] ApplyAddressingModeTestCase addressingMode )
735
+ {
736
+ var computedSequence = new uint [ addressingMode . expectedSequence . Length ] ;
737
+ for ( uint index = 0u ; index < computedSequence . Length ; ++ index )
738
+ {
739
+ var indexExpr = VFXValue . Constant ( index ) ;
740
+ var countExpr = VFXValue . Constant ( addressingMode . count ) ;
741
+ var computed = VFXOperatorUtility . ApplyAddressingMode ( indexExpr , countExpr , addressingMode . mode ) ;
742
+
743
+ var context = new VFXExpression . Context ( VFXExpressionContextOption . CPUEvaluation ) ;
744
+ var result = context . Compile ( computed ) ;
745
+
746
+ computedSequence [ index ] = result . Get < uint > ( ) ;
747
+ }
748
+
749
+ for ( uint index = 0u ; index < computedSequence . Length ; ++ index )
750
+ {
751
+ Assert . AreEqual ( addressingMode . expectedSequence [ index ] , computedSequence [ index ] ) ;
752
+ }
641
753
}
642
754
}
643
755
}
0 commit comments