@@ -637,7 +637,119 @@ public void CheckBuiltinExpressionListed([ValueSource("CheckAllBuiltinExpression
637637 var operation = ( UnityEngine . VFX . VFXExpressionOperation ) Enum . Parse ( typeof ( UnityEngine . VFX . VFXExpressionOperation ) , expressionName ) ;
638638 var referenceExpression = VFXBuiltInExpression . Find ( operation ) ;
639639 Assert . IsTrue ( VFXDynamicBuiltInParameter . s_BuiltInInfo . Values . Any ( o => o . expression == referenceExpression ) ) ;
640+ }
640641
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 = 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+ }
641753 }
642754 }
643755}
0 commit comments