コード例 #1
0
        protected override sealed VFXExpression[] BuildExpression(VFXExpression[] inputExpression)
        {
            // UpdateSolverTexture(true);

            // KernelSize: x - h, y - h^2, z - h^3, w - unused
            // KernelFactors: x - poly6, y - spiky, z - viscosity, w - unused
            VFXExpression h         = inputExpression[0];
            var           poly6     = new Poly6Kernel(h);
            var           spiky     = new SpikyKernel(h);
            var           viscosity = new ViscosityKernel(h);

            var outputExpression = new List <VFXExpression>();

            outputExpression.AddRange(inputExpression);

            outputExpression.Add(new VFXExpressionCombine(new []
            {
                h,
                h * h,
                h * h * h,
                VFXValue.Constant(0.0f)
            }));
            outputExpression.Add(new VFXExpressionCombine(new []
            {
                poly6.GetFactor(), spiky.GetFactor(), viscosity.GetFactor(), VFXValue.Constant(0.0f)
            }));
            outputExpression.Add(new VFXTexture2DValue(Tex ? Tex : null));
            outputExpression.Add(new VFXExpressionCombine(new []
            {
                VFXValue.Constant((float)(Tex? Tex.width : 0)), VFXValue.Constant((float)(Tex ? Tex.height : 0))
            }));

            return(outputExpression.ToArray());
        }
コード例 #2
0
        protected override sealed VFXExpression[] BuildExpression(VFXExpression[] inputExpression)
        {
            // UpdateSolverTexture(true);

            // KernelSize: x - h, y - h^2, z - h^3, w - simulation scale
            // KernelFactors: x - poly6, y - spiky, z - viscosity, w - unused
            VFXExpression h = inputExpression[0];
            VFXExpression simulationScale = inputExpression[1];
            var           poly6           = new Poly6Kernel(h);
            var           spiky           = new SpikyKernel(h);
            var           viscosity       = new ViscosityKernel(h);

            return(new VFXExpression[]
            {
                new VFXExpressionCombine(new []
                {
                    h,
                    h * h,
                    h * h * h,
                    simulationScale
                }),
                new VFXExpressionCombine(new []
                {
                    poly6.GetFactor(), spiky.GetFactor(), viscosity.GetFactor(), VFXValue.Constant(0.0f)
                }),
                new VFXTexture2DValue(FluvioSolverData ? FluvioSolverData : null),
                new VFXExpressionCombine(new []
                {
                    VFXValue.Constant((float)(FluvioSolverData? FluvioSolverData.width : 0)), VFXValue.Constant((float)(FluvioSolverData ? FluvioSolverData.height : 0))
                }),
            });
        }
コード例 #3
0
        private static IEnumerable <VFXNamedExpression> GetExpressionsImpl(
            InitializeSolver initializeBlock,
            SolverDataParameters solverDataParams,
            IEnumerable <VFXNamedExpression> fluid,
            VFXExpression h,
            VFXExpression mass,
            VFXExpression density,
            VFXExpression gravity)
        {
            // Fluid
            if (fluid == null || h == null || mass == null || density == null)
            {
                var defaultFluid = Fluid.defaultValue;
                h = VFXValue.Constant(defaultFluid.SmoothingDistance);

                if (solverDataParams.HasFlag(SolverDataParameters.Fluid_ParticleMass))
                {
                    yield return(new VFXNamedExpression(
                                     GetParticleMass(
                                         initializeBlock,
                                         h,
                                         VFXValue.Constant(defaultFluid.ParticleMass),
                                         VFXValue.Constant(defaultFluid.Density)
                                         ), "solverData_Fluid_ParticleMass"));
                }
                if (solverDataParams.HasFlag(SolverDataParameters.Fluid_Density))
                {
                    yield return(new VFXNamedExpression(
                                     VFXValue.Constant(defaultFluid.Density), "solverData_Fluid_Density"));
                }
                if (solverDataParams.HasFlag(SolverDataParameters.Fluid_MinimumDensity))
                {
                    yield return(new VFXNamedExpression(
                                     VFXValue.Constant(defaultFluid.MinimumDensity), "solverData_Fluid_MinimumDensity"));
                }
                if (solverDataParams.HasFlag(SolverDataParameters.Fluid_GasConstant))
                {
                    yield return(new VFXNamedExpression(
                                     VFXValue.Constant(defaultFluid.GasConstant), "solverData_Fluid_GasConstant"));
                }
                if (solverDataParams.HasFlag(SolverDataParameters.Fluid_Viscosity))
                {
                    yield return(new VFXNamedExpression(
                                     VFXValue.Constant(defaultFluid.Viscosity), "solverData_Fluid_Viscosity"));
                }
                if (solverDataParams.HasFlag(SolverDataParameters.Fluid_SurfaceTension))
                {
                    yield return(new VFXNamedExpression(
                                     VFXValue.Constant(defaultFluid.SurfaceTension), "solverData_Fluid_SurfaceTension"));
                }
                if (solverDataParams.HasFlag(SolverDataParameters.Fluid_BuoyancyCoefficient))
                {
                    yield return(new VFXNamedExpression(
                                     VFXValue.Constant(defaultFluid.BuoyancyCoefficient), "solverData_Fluid_BuoyancyCoefficient"));
                }
            }
            else
            {
                foreach (var expression in fluid)
                {
                    if (Enum.TryParse(expression.name, out SolverDataParameters solverDataParameter) &&
                        solverDataParams.HasFlag(solverDataParameter))
                    {
                        if (solverDataParameter == SolverDataParameters.Fluid_ParticleMass)
                        {
                            yield return(new VFXNamedExpression(
                                             GetParticleMass(initializeBlock, h, mass, density), "solverData_Fluid_ParticleMass"));

                            continue;
                        }

                        yield return(new VFXNamedExpression(expression.exp, $"solverData_{expression.name}"));
                    }
                }
                ;
            }

            // KernelSize: x - h, y - h^2, z - h^3, w - h / 2
            if (solverDataParams.HasFlag(SolverDataParameters.KernelSize))
            {
                yield return(new VFXNamedExpression(new VFXExpressionCombine(new []
                {
                    h,
                    h * h,
                    h * h * h,
                    h * VFXValue.Constant(0.5f),
                }),
                                                    "solverData_KernelSize"));
            }

            // KernelFactors: x - poly6, y - spiky, z - viscosity
            if (solverDataParams.HasFlag(SolverDataParameters.KernelFactors))
            {
                var poly6     = new Poly6Kernel(h);
                var spiky     = new SpikyKernel(h);
                var viscosity = new ViscosityKernel(h);

                yield return(new VFXNamedExpression(new VFXExpressionCombine(new []
                {
                    poly6.GetFactor(), spiky.GetFactor(), viscosity.GetFactor()
                }),
                                                    "solverData_KernelFactors"));
            }

            // Gravity
            if (solverDataParams.HasFlag(SolverDataParameters.Gravity))
            {
                if (gravity == null)
                {
                    gravity = new VFXExpressionCombine(new []
                    {
                        VFXValue.Constant(0.0f), VFXValue.Constant(-9.81f), VFXValue.Constant(0.0f),
                    });
                }
                yield return(new VFXNamedExpression(gravity, "solverData_Gravity"));
            }
        }