Skip to content

Commit 9c54056

Browse files
Fix ApplyAddressingMode : clamp & mirror was overflowing, mirror has also a wrong pattern
1 parent fa0471d commit 9c54056

File tree

2 files changed

+123
-5
lines changed

2 files changed

+123
-5
lines changed

TestProjects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXOperatorUtilityTests.cs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

com.unity.visualeffectgraph/Editor/Models/Operators/VFXOperatorUtility.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -570,19 +570,25 @@ public enum SequentialAddressingMode
570570
static public VFXExpression ApplyAddressingMode(VFXExpression index, VFXExpression count, SequentialAddressingMode mode)
571571
{
572572
VFXExpression r = null;
573+
573574
if (mode == SequentialAddressingMode.Wrap)
574575
{
575-
r = VFXOperatorUtility.Modulo(index, count);
576+
r = Modulo(index, count);
576577
}
577578
else if (mode == SequentialAddressingMode.Clamp)
578579
{
579-
r = VFXOperatorUtility.Clamp(index, ZeroExpression[VFXValueType.Uint32], count, false);
580+
var countMinusOne = count - OneExpression[VFXValueType.Uint32];
581+
r = new VFXExpressionMin(index, countMinusOne);
580582
}
581583
else if (mode == SequentialAddressingMode.Mirror)
582584
{
583-
var direction = VFXOperatorUtility.Modulo(index / count, VFXOperatorUtility.TwoExpression[VFXValueType.Uint32]);
584-
var modulo = VFXOperatorUtility.Modulo(index, count);
585-
r = VFXOperatorUtility.Lerp(modulo, count - modulo, direction);
585+
var two = TwoExpression[VFXValueType.Uint32];
586+
var cycle = count * two - two;
587+
cycle = new VFXExpressionMax(cycle, OneExpression[VFXValueType.Uint32]);
588+
var modulo = Modulo(index, cycle);
589+
//TODO: Remove float casting for 10.x.x
590+
var compare = new VFXExpressionCondition(VFXCondition.Less, new VFXExpressionCastUintToFloat(modulo), new VFXExpressionCastUintToFloat(count));
591+
r = new VFXExpressionBranch(compare, modulo, cycle - modulo);
586592
}
587593
return r;
588594
}

0 commit comments

Comments
 (0)