private VFXExpressionMapper BuildMapper(VFXContext context, Dictionary <VFXContext, VFXExpressionMapper> dictionnary, VFXDeviceTarget target) { VFXExpression.Flags check = target == VFXDeviceTarget.GPU ? VFXExpression.Flags.InvalidOnGPU | VFXExpression.Flags.PerElement : VFXExpression.Flags.InvalidOnCPU; VFXExpressionMapper outMapper = new VFXExpressionMapper(); VFXExpressionMapper inMapper; dictionnary.TryGetValue(context, out inMapper); if (inMapper != null) { foreach (var exp in inMapper.expressions) { var reduced = GetReduced(exp, target); if (reduced.Is(check)) { throw new InvalidOperationException(string.Format("The expression {0} is not valid as it have the invalid flag: {1}", reduced, check)); } var mappedDataList = inMapper.GetData(exp); foreach (var mappedData in mappedDataList) { outMapper.AddExpression(reduced, mappedData); } } } return(outMapper); }
private void CompileExpressionContext(IEnumerable <VFXContext> contexts, VFXExpressionContextOption options, VFXDeviceTarget target, VFXExpression.Flags forbiddenFlags = VFXExpression.Flags.None) { var expressionContext = new VFXExpression.Context(options, m_GlobalEventAttributes); var contextsToExpressions = target == VFXDeviceTarget.GPU ? m_ContextsToGPUExpressions : m_ContextsToCPUExpressions; var expressionsToReduced = target == VFXDeviceTarget.GPU ? m_GPUExpressionsToReduced : m_CPUExpressionsToReduced; foreach (var context in contexts) { var mapper = context.GetExpressionMapper(target); if (mapper != null) { foreach (var exp in mapper.expressions) { expressionContext.RegisterExpression(exp); } contextsToExpressions.Add(context, mapper); } } expressionContext.Compile(); foreach (var exp in expressionContext.RegisteredExpressions) { var reduced = expressionContext.GetReduced(exp); if (expressionsToReduced.ContainsKey(exp)) { if (reduced != expressionsToReduced[exp]) { throw new InvalidOperationException("Unexpected diverging expression reduction"); } continue; } expressionsToReduced.Add(exp, reduced); } var allReduced = expressionContext.BuildAllReduced(); if (forbiddenFlags != VFXExpression.Flags.None) { var check = allReduced.Any(e => e.IsAny(forbiddenFlags)); if (check) { //TODO: Provide an error in GUI when feedback is possible throw new InvalidOperationException("Invalid expression usage while compiling"); } } m_Expressions.UnionWith(allReduced); foreach (var exp in expressionsToReduced.Values) { AddExpressionDataRecursively(m_ExpressionsData, exp); } }
private void CompileExpressionContext(IEnumerable <VFXContext> contexts, VFXExpressionContextOption options, VFXDeviceTarget target, VFXExpression.Flags forbiddenFlags = VFXExpression.Flags.None) { var expressionContext = new VFXExpression.Context(options, m_GlobalEventAttributes); var contextsToExpressions = target == VFXDeviceTarget.GPU ? m_ContextsToGPUExpressions : m_ContextsToCPUExpressions; var expressionsToReduced = target == VFXDeviceTarget.GPU ? m_GPUExpressionsToReduced : m_CPUExpressionsToReduced; foreach (var context in contexts) { var mapper = context.GetExpressionMapper(target); if (mapper != null) { foreach (var exp in mapper.expressions) { expressionContext.RegisterExpression(exp); } contextsToExpressions.Add(context, mapper); } } expressionContext.Compile(); foreach (var exp in expressionContext.RegisteredExpressions) { var reduced = expressionContext.GetReduced(exp); if (expressionsToReduced.ContainsKey(exp)) { if (reduced != expressionsToReduced[exp]) { throw new InvalidOperationException("Unexpected diverging expression reduction"); } continue; } expressionsToReduced.Add(exp, reduced); } var allReduced = expressionContext.BuildAllReduced(); m_Expressions.UnionWith(allReduced); foreach (var exp in expressionsToReduced.Values) { AddExpressionDataRecursively(m_ExpressionsData, exp); } var graphicsBufferUsageType = m_GraphicsBufferUsageType .Concat(expressionContext.GraphicsBufferUsageType) .GroupBy(o => o.Key).ToArray(); m_GraphicsBufferUsageType.Clear(); foreach (var expression in graphicsBufferUsageType) { var types = expression.Select(o => o.Value); if (types.Count() != 1) { throw new InvalidOperationException("Diverging type usage for GraphicsBuffer : " + types.Select(o => o.ToString()).Aggregate((a, b) => a + b)); } m_GraphicsBufferUsageType.Add(expression.Key, types.First()); } }