public VFXExpression GetReduced(VFXExpression exp, VFXDeviceTarget target)
        {
            VFXExpression reduced;
            var           expressionToReduced = target == VFXDeviceTarget.GPU ? m_GPUExpressionsToReduced : m_CPUExpressionsToReduced;

            expressionToReduced.TryGetValue(exp, out reduced);
            return(reduced);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            if (target == VFXDeviceTarget.CPU)
            {
                return(VFXExpressionMapper.FromContext(this));
            }

            return(null);
        }
Пример #4
0
        public virtual VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            if (target == VFXDeviceTarget.GPU)
            {
                return(VFXExpressionMapper.FromContext(this));
            }

            return(null);
        }
Пример #5
0
 public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
 {
     if (target == VFXDeviceTarget.GPU)
     {
         var gpuMapper = VFXExpressionMapper.FromBlocks(activeChildrenWithImplicit);
         gpuMapper.AddExpressions(CollectGPUExpressions(GetExpressionsFromSlots(this)), -1);
         return(gpuMapper);
     }
     return(new VFXExpressionMapper());
 }
Пример #6
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var mapper = base.GetExpressionMapper(target);

            if (target == VFXDeviceTarget.GPU && skipZeroDeltaUpdate)
            {
                mapper.AddExpression(VFXBuiltInExpression.DeltaTime, "deltaTime", -1);
            }
            return(mapper);
        }
Пример #7
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            if (!m_Output)
            {
                throw new NullReferenceException("Unexpected call of GetExpressionMapper with a null output");
            }
            if (features == Features.None)
            {
                throw new InvalidOperationException("This additional update context has no feature set");
            }


            if (target == VFXDeviceTarget.GPU)
            {
                var expressionMapper = m_Output.GetExpressionMapper(target);

                var exp = GetExpressionsFromSlots(m_Output);

                if (HasFeature(Features.LOD))
                {
                    var lodExp   = exp.FirstOrDefault(e => e.name == VFXMultiMeshHelper.lodName);
                    var ratioExp = lodExp.exp * VFXValue.Constant(new Vector4(0.01f, 0.01f, 0.01f, 0.01f));
                    expressionMapper.AddExpression(ratioExp, VFXMultiMeshHelper.lodName, -1);
                }

                if (HasFeature(Features.LOD) || HasFeature(Features.FrustumCulling))
                {
                    var radiusScaleExp = exp.FirstOrDefault(e => e.name == "radiusScale").exp;
                    if (radiusScaleExp == null) // Not found, assume it's 1
                    {
                        radiusScaleExp = VFXValue.Constant(1.0f);
                    }
                    expressionMapper.AddExpression(radiusScaleExp, "radiusScale", -1);
                }

                if (HasFeature(Features.MotionVector))
                {
                    var currentFrameIndex = expressionMapper.FromNameAndId("currentFrameIndex", -1);
                    if (currentFrameIndex == null)
                    {
                        Debug.LogError("CurrentFrameIndex isn't reachable in encapsulatedOutput for motionVector");
                    }
                }

                //Since it's a compute shader without renderer associated, these entries aren't automatically sent
                expressionMapper.AddExpression(VFXBuiltInExpression.LocalToWorld, "unity_ObjectToWorld", -1);
                expressionMapper.AddExpression(VFXBuiltInExpression.WorldToLocal, "unity_WorldToObject", -1);

                return(expressionMapper);
            }
            else
            {
                return(new VFXExpressionMapper());
            }
        }
Пример #8
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            if (target == VFXDeviceTarget.CPU)
            {
                var mapper = VFXExpressionMapper.FromBlocks(activeFlattenedChildrenWithImplicit);

                var mapperFromContext = new VFXExpressionMapper();
                mapperFromContext.AddExpressionsFromSlotContainer(this, -1);

                if (loopDuration != LoopMode.Infinite)
                {
                    var expression = mapperFromContext.FromNameAndId("LoopDuration", -1);
                    if (loopDuration == LoopMode.Random)
                    {
                        expression = RandomFromVector2(expression);
                    }
                    mapper.AddExpression(expression, "LoopDuration", -1);
                }

                if (loopCount != LoopMode.Infinite)
                {
                    var expression = mapperFromContext.FromNameAndId("LoopCount", -1);
                    if (loopCount == LoopMode.Random)
                    {
                        expression = new VFXExpressionCastFloatToInt(RandomFromVector2(expression));
                    }
                    mapper.AddExpression(expression, "LoopCount", -1);
                }

                if (delayBeforeLoop != DelayMode.None)
                {
                    var expression = mapperFromContext.FromNameAndId("DelayBeforeLoop", -1);
                    if (delayBeforeLoop == DelayMode.Random)
                    {
                        expression = RandomFromVector2(expression);
                    }
                    mapper.AddExpression(expression, "DelayBeforeLoop", -1);
                }

                if (delayAfterLoop != DelayMode.None)
                {
                    var expression = mapperFromContext.FromNameAndId("DelayAfterLoop", -1);
                    if (delayAfterLoop == DelayMode.Random)
                    {
                        expression = RandomFromVector2(expression);
                    }
                    mapper.AddExpression(expression, "DelayAfterLoop", -1);
                }
                return(mapper);
            }

            return(null);
        }
Пример #9
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var localSpace = ((VFXDataParticle)GetData()).space == VFXCoordinateSpace.Local;

            if (localSpace && target == VFXDeviceTarget.GPU) // Needs to add locaToWorld matrix
            {
                var gpuMapper = new VFXExpressionMapper();
                gpuMapper.AddExpression(VFXBuiltInExpression.LocalToWorld, "localToWorld", -1);
                return(gpuMapper);
            }

            return(null); // cpu
        }
Пример #10
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            // GPU
            if (target == VFXDeviceTarget.GPU)
            {
                return(VFXExpressionMapper.FromBlocks(activeChildrenWithImplicit));
            }

            // CPU
            var cpuMapper = new VFXExpressionMapper();

            cpuMapper.AddExpressionFromSlotContainer(this, -1);
            return(cpuMapper);
        }
Пример #11
0
 public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
 {
     if (target == VFXDeviceTarget.GPU)
     {
         var gpuMapper = VFXExpressionMapper.FromBlocks(activeFlattenedChildrenWithImplicit);
         gpuMapper.AddExpressions(CollectGPUExpressions(GetExpressionsFromSlots(this)), -1);
         if (generateMotionVector)
         {
             gpuMapper.AddExpression(VFXBuiltInExpression.FrameIndex, "currentFrameIndex", -1);
         }
         return(gpuMapper);
     }
     return(new VFXExpressionMapper());
 }
Пример #12
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var mapper = base.GetExpressionMapper(target);

            if (target == VFXDeviceTarget.GPU && skipZeroDeltaUpdate)
            {
                mapper.AddExpression(VFXBuiltInExpression.DeltaTime, "deltaTime", -1);
            }
            var dataParticle = GetData() as VFXDataParticle;

            if (target == VFXDeviceTarget.GPU && dataParticle && dataParticle.NeedsComputeBounds() && space == VFXCoordinateSpace.World)
            {
                mapper.AddExpression(VFXBuiltInExpression.WorldToLocal, "worldToLocal", -1);
            }
            return(mapper);
        }
Пример #13
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var meshData = (VFXDataMesh)GetData();

            switch (target)
            {
            case VFXDeviceTarget.GPU:
            {
                var mapper = new VFXExpressionMapper();
                for (int i = 2; i < GetNbInputSlots(); ++i)
                {
                    VFXExpression exp  = GetInputSlot(i).GetExpression();
                    VFXProperty   prop = GetInputSlot(i).property;

                    // As there's not shader generation here, we need expressions that can be evaluated on CPU
                    if (exp.IsAny(VFXExpression.Flags.NotCompilableOnCPU))
                    {
                        throw new InvalidOperationException(string.Format("Expression for slot {0} must be evaluable on CPU: {1}", prop.name, exp));
                    }

                    // needs to convert to srgb as color are linear in vfx graph
                    // This should not be performed for colors with the attribute [HDR] and be performed for vector4 with the attribute [Gamma]
                    // But property attributes cannot seem to be accessible from C# :(
                    if (prop.type == typeof(Color))
                    {
                        exp = VFXOperatorUtility.LinearToGamma(exp);
                    }

                    mapper.AddExpression(exp, prop.name, -1);
                }
                return(mapper);
            }

            case VFXDeviceTarget.CPU:
            {
                var mapper = new VFXExpressionMapper();
                mapper.AddExpression(GetInputSlot(0).GetExpression(), "mesh", -1);
                mapper.AddExpression(GetInputSlot(1).GetExpression(), "transform", -1);
                mapper.AddExpression(GetInputSlot(2).GetExpression(), "subMeshMask", -1);

                return(mapper);
            }

            default:
                return(null);
            }
        }
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var mapper      = base.GetExpressionMapper(target);
            var shaderGraph = GetOrRefreshShaderGraphObject();

            switch (target)
            {
            case VFXDeviceTarget.CPU:
            {
            }
            break;

            case VFXDeviceTarget.GPU:
                if (shaderGraph != null)
                {
                    foreach (var tex in shaderGraph.textureInfos)
                    {
                        switch (tex.dimension)
                        {
                        default:
                        case TextureDimension.Tex2D:
                            mapper.AddExpression(new VFXTexture2DValue(tex.instanceID, VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.Tex3D:
                            mapper.AddExpression(new VFXTexture3DValue(tex.instanceID, VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.Cube:
                            mapper.AddExpression(new VFXTextureCubeValue(tex.instanceID, VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.Tex2DArray:
                            mapper.AddExpression(new VFXTexture2DArrayValue(tex.instanceID, VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.CubeArray:
                            mapper.AddExpression(new VFXTextureCubeArrayValue(tex.instanceID, VFXValue.Mode.Variable), tex.name, -1);
                            break;
                        }
                    }
                }
                break;
            }

            return(mapper);
        }
Пример #15
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var mapper = base.GetExpressionMapper(target);

            switch (target)
            {
            case VFXDeviceTarget.CPU:
                break;

            case VFXDeviceTarget.GPU:

                RefreshShaderGraphObject();
                if (shaderGraph != null)
                {
                    foreach (var tex in shaderGraph.textureInfos.Where(t => t.texture != null).OrderBy(t => t.name))
                    {
                        switch (tex.texture.dimension)
                        {
                        case TextureDimension.Tex2D:
                            mapper.AddExpression(new VFXTexture2DValue(tex.texture.GetInstanceID(), VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.Tex3D:
                            mapper.AddExpression(new VFXTexture3DValue(tex.texture.GetInstanceID(), VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.Cube:
                            mapper.AddExpression(new VFXTextureCubeValue(tex.texture.GetInstanceID(), VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.Tex2DArray:
                            mapper.AddExpression(new VFXTexture2DArrayValue(tex.texture.GetInstanceID(), VFXValue.Mode.Variable), tex.name, -1);
                            break;

                        case TextureDimension.CubeArray:
                            mapper.AddExpression(new VFXTextureCubeArrayValue(tex.texture.GetInstanceID(), VFXValue.Mode.Variable), tex.name, -1);
                            break;
                        }
                    }
                }
                break;
            }

            return(mapper);
        }
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            // GPU
            if (target == VFXDeviceTarget.GPU)
            {
                var gpuMapper = VFXExpressionMapper.FromBlocks(activeFlattenedChildrenWithImplicit);
                if (ownedType == VFXDataType.ParticleStrip)
                {
                    gpuMapper.AddExpressionsFromSlot(inputSlots[1], -1); // strip index
                }
                return(gpuMapper);
            }

            // CPU
            var cpuMapper = new VFXExpressionMapper();

            cpuMapper.AddExpressionsFromSlot(inputSlots[0], -1); // bounds
            return(cpuMapper);
        }
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var mapper = base.GetExpressionMapper(target);

            switch (target)
            {
            case VFXDeviceTarget.CPU:
            {
                mapper.AddExpression(inputSlots.First(s => s.name == "mesh").GetExpression(), "mesh", -1);
                mapper.AddExpression(inputSlots.First(s => s.name == "subMeshMask").GetExpression(), "subMeshMask", -1);
                break;
            }

            default:
            {
                break;
            }
            }

            return(mapper);
        }
Пример #18
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var mapper = base.GetExpressionMapper(target);

            switch (target)
            {
            case VFXDeviceTarget.CPU:
            {
                foreach (var name in VFXMultiMeshHelper.GetCPUExpressionNames(MeshCount))
                {
                    mapper.AddExpression(inputSlots.First(s => s.name == name).GetExpression(), name, -1);
                }
                break;
            }

            default:
                break;
            }

            return(mapper);
        }
Пример #19
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var  particleData     = GetData() as VFXDataParticle;
            bool isRecordedBounds = particleData && particleData.boundsSettingMode == BoundsSettingMode.Recorded;

            // GPU
            if (target == VFXDeviceTarget.GPU)
            {
                var gpuMapper = VFXExpressionMapper.FromBlocks(activeFlattenedChildrenWithImplicit);
                if (ownedType == VFXDataType.ParticleStrip && !hasGPUSpawner)
                {
                    gpuMapper.AddExpressionsFromSlot(inputSlots[(isRecordedBounds ? 2 : 1)], -1); // strip index
                }
                return(gpuMapper);
            }

            // CPU
            var cpuMapper = new VFXExpressionMapper();

            if (particleData)
            {
                switch (particleData.boundsSettingMode)
                {
                case BoundsSettingMode.Manual:
                    cpuMapper.AddExpressionsFromSlot(inputSlots[0], -1);     // bounds
                    break;

                case BoundsSettingMode.Recorded:
                    cpuMapper.AddExpressionsFromSlot(inputSlots[0], -1);     // bounds
                    cpuMapper.AddExpressionsFromSlot(inputSlots[1], -1);     //bounds padding
                    break;

                case BoundsSettingMode.Automatic:
                    cpuMapper.AddExpressionsFromSlot(inputSlots[0], -1);     //bounds padding
                    break;
                }
            }

            return(cpuMapper);
        }
Пример #20
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var localSpace = ((VFXDataParticle)GetData()).space == VFXCoordinateSpace.Local;

            if (localSpace && target == VFXDeviceTarget.GPU) // Needs to add locaToWorld matrix
            {
                var gpuMapper = new VFXExpressionMapper();
                if (IsPerCamera(sortCriterion))
                {
                    gpuMapper.AddExpression(VFXBuiltInExpression.LocalToWorld, "unity_ObjectToWorld", -1);
                    gpuMapper.AddExpression(VFXBuiltInExpression.WorldToLocal, "unity_WorldToObject", -1);
                }

                if (sortCriterion == SortCriteria.Custom)
                {
                    var sortKeyExp = customSortingSlot.GetExpression();
                    gpuMapper.AddExpression(sortKeyExp, "sortKey", -1);
                }
                return(gpuMapper);
            }

            return(null); // cpu
        }
Пример #21
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            if (!m_encapsulatedOutput)
            {
                throw new NullReferenceException("Unexpected call of GetExpressionMapper with a null m_encapsulatedOutput");
            }

            var expressionMapper = m_encapsulatedOutput.GetExpressionMapper(target);

            if (target == VFXDeviceTarget.GPU)
            {
                var currentFrameIndex = expressionMapper.FromNameAndId("currentFrameIndex", -1);
                if (currentFrameIndex == null)
                {
                    Debug.LogError("CurrentFrameIndex isn't reachable in encapsulatedOutput for motionVector");
                }

                //Since it's a compute shader without renderer associated, these entries aren't automatically sent
                expressionMapper.AddExpression(VFXBuiltInExpression.LocalToWorld, "unity_ObjectToWorld", -1);
                expressionMapper.AddExpression(VFXBuiltInExpression.WorldToLocal, "unity_WorldToObject", -1);
            }
            return(expressionMapper);
        }
Пример #22
0
 public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
 {
     return(target == VFXDeviceTarget.CPU ? mapper : null);
 }
Пример #23
0
        private void CompileExpressionContext(IEnumerable <VFXContext> contexts, VFXExpressionContextOption options, VFXDeviceTarget target)
        {
            HashSet <VFXExpression> expressions = new HashSet <VFXExpression>();
            var expressionContext = new VFXExpression.Context(options);

            var contextsToExpressions = target == VFXDeviceTarget.GPU ? m_ContextsToGPUExpressions : m_ContextsToCPUExpressions;
            var expressionsToReduced  = target == VFXDeviceTarget.GPU ? m_GPUExpressionsToReduced : m_CPUExpressionsToReduced;

            contextsToExpressions.Clear();
            expressionsToReduced.Clear();

            foreach (var context in contexts)
            {
                var mapper = context.GetExpressionMapper(target);
                if (mapper != null)
                {
                    foreach (var exp in mapper.expressions)
                    {
                        expressionContext.RegisterExpression(exp);
                    }
                    expressions.UnionWith(mapper.expressions);
                    contextsToExpressions.Add(context, mapper);
                }
            }

            expressionContext.Compile();

            foreach (var exp in expressionContext.RegisteredExpressions)
            {
                expressionsToReduced.Add(exp, expressionContext.GetReduced(exp));
            }

            m_Expressions.UnionWith(expressionContext.BuildAllReduced());

            foreach (var exp in expressionsToReduced.Values)
            {
                AddExpressionDataRecursively(m_ExpressionsData, exp);
            }
        }
Пример #24
0
        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);
        }
Пример #25
0
        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());
            }
        }
Пример #26
0
        public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
        {
            var meshData = (VFXDataMesh)GetData();

            switch (target)
            {
            case VFXDeviceTarget.GPU:
            {
                var mapper = new VFXExpressionMapper();
                for (int i = 2; i < GetNbInputSlots(); ++i)
                {
                    VFXExpression exp  = GetInputSlot(i).GetExpression();
                    VFXProperty   prop = GetInputSlot(i).property;

                    // As there's not shader generation here, we need expressions that can be evaluated on CPU
                    if (exp.IsAny(VFXExpression.Flags.NotCompilableOnCPU))
                    {
                        throw new InvalidOperationException(string.Format("Expression for slot {0} must be evaluable on CPU: {1}", prop.name, exp));
                    }

                    // needs to convert to srgb as color are linear in vfx graph
                    // This should not be performed for colors with the attribute [HDR] and be performed for vector4 with the attribute [Gamma]
                    // But property attributes cannot seem to be accessible from C# :(
                    if (prop.type == typeof(Color))
                    {
                        exp = VFXOperatorUtility.LinearToGamma(exp);
                    }

                    mapper.AddExpression(exp, prop.name, -1);
                }
                return(mapper);
            }

            case VFXDeviceTarget.CPU:
            {
                var mapper = new VFXExpressionMapper();
                mapper.AddExpression(GetInputSlot(0).GetExpression(), "mesh", -1);
                mapper.AddExpression(GetInputSlot(1).GetExpression(), "transform", -1);
                mapper.AddExpression(GetInputSlot(2).GetExpression(), "subMeshMask", -1);

                // TODO Remove this once material are serialized
                // Add material properties
                if (shader != null)
                {
                    var mat = meshData.GetOrCreateMaterial();
                    for (int i = 0; i < ShaderUtil.GetPropertyCount(shader); ++i)
                    {
                        if (ShaderUtil.IsShaderPropertyHidden(shader, i))
                        {
                            var name   = ShaderUtil.GetPropertyName(shader, i);
                            var nameId = Shader.PropertyToID(name);
                            if (!mat.HasProperty(nameId))
                            {
                                continue;
                            }

                            VFXExpression expr = null;
                            switch (ShaderUtil.GetPropertyType(shader, i))
                            {
                            case ShaderUtil.ShaderPropertyType.Float:
                                expr = VFXValue.Constant <float>(mat.GetFloat(nameId));
                                break;

                            default:
                                break;
                            }

                            if (expr != null)
                            {
                                mapper.AddExpression(expr, name, -1);
                            }
                        }
                    }
                }

                return(mapper);
            }

            default:
                return(null);
            }
        }
Пример #27
0
 public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
 {
     PatchInputExpressions();
     return(null);
 }
Пример #28
0
 public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
 {
     return(null);
 }