public ApplyAddressingModeTestCase(VFXOperatorUtility.SequentialAddressingMode _mode, uint _count) { mode = _mode; count = _count; expectedSequence = new uint[Mathf.Max(50, 7 * (int)_count)]; //Naive implementation for reference if (mode == VFXOperatorUtility.SequentialAddressingMode.Clamp) { for (uint i = 0; i < expectedSequence.Length; ++i) { expectedSequence[i] = i < count ? i : count - 1; } } else if (mode == VFXOperatorUtility.SequentialAddressingMode.Wrap) { uint current = 0u; for (uint i = 0; i < expectedSequence.Length; ++i) { expectedSequence[i] = current; current++; if (current >= count) { current = 0u; } } } else if (mode == VFXOperatorUtility.SequentialAddressingMode.Mirror) { uint current = 0u; bool increment = true; for (uint i = 0; i < expectedSequence.Length; ++i) { expectedSequence[i] = current; if (increment) { current++; if (current >= count) { increment = false; current = count > 2u ? count - 2u : 0u; } } else { if (current == 0u) { increment = true; current = count == 1u ? 0u : 1u; } else { current--; } } } } }
public static IEnumerable <VFXExpression> SampleTriangleAttribute(VFXExpression source, VFXExpression triangleIndex, VFXExpression coord, VFXOperatorUtility.SequentialAddressingMode mode, SurfaceCoordinates coordMode, IEnumerable <VertexAttribute> vertexAttributes) { bool skinnedMesh = source.valueType == UnityEngine.VFX.VFXValueType.SkinnedMeshRenderer; var mesh = !skinnedMesh ? source : new VFXExpressionMeshFromSkinnedMeshRenderer(source); var UintThree = VFXOperatorUtility.ThreeExpression[UnityEngine.VFX.VFXValueType.Uint32]; var meshIndexCount = new VFXExpressionMeshIndexCount(mesh); var triangleCount = meshIndexCount / UintThree; triangleIndex = VFXOperatorUtility.ApplyAddressingMode(triangleIndex, triangleCount, mode); return(SampleTriangleAttribute(source, triangleIndex, coord, coordMode, vertexAttributes)); }
public static IEnumerable <VFXExpression> SampleEdgeAttribute(VFXExpression source, VFXExpression index, VFXExpression x, VFXOperatorUtility.SequentialAddressingMode mode, IEnumerable <VertexAttribute> vertexAttributes) { bool skinnedMesh = source.valueType == UnityEngine.VFX.VFXValueType.SkinnedMeshRenderer; var mesh = !skinnedMesh ? source : new VFXExpressionMeshFromSkinnedMeshRenderer(source); var meshIndexCount = new VFXExpressionMeshIndexCount(mesh); index = VFXOperatorUtility.ApplyAddressingMode(index, meshIndexCount, mode); return(SampleEdgeAttribute(source, index, x, vertexAttributes)); }