Пример #1
0
        internal static GraphParameterData[] InitGraphParameters(IEnumerable <MaterialParameter> parameters, Material material)
        {
            int count = parameters.Count();
            var data  = new GraphParameterData[count];
            int i     = 0;

            // Load material surface parameters meta to use it for material instance parameters editing
            SurfaceParameter[] surfaceParameters = null;
            try
            {
                Profiler.BeginEvent("Init Material Parameters UI Data");

                if (material != null && !material.WaitForLoaded())
                {
                    var surfaceData = material.LoadSurface(false);
                    if (surfaceData != null && surfaceData.Length > 0)
                    {
                        using (var memoryStream = new MemoryStream(surfaceData))
                            using (var stream = new BinaryReader(memoryStream))
                            {
                                // IMPORTANT! This must match C++ Graph format

                                // Magic Code
                                int tmp = stream.ReadInt32();
                                if (tmp != 1963542358)
                                {
                                    // Error
                                    throw new Exception("Invalid Graph format version");
                                }

                                // Version
                                var version   = stream.ReadUInt32();
                                var guidBytes = new byte[16];
                                if (version < 7000)
                                {
                                    // Time saved (not used anymore to prevent binary diffs after saving unmodified surface)
                                    stream.ReadInt64();

                                    // Nodes count
                                    int nodesCount = stream.ReadInt32();

                                    // Parameters count
                                    int parametersCount = stream.ReadInt32();

                                    // For each node
                                    for (int j = 0; j < nodesCount; j++)
                                    {
                                        // ID
                                        stream.ReadUInt32();

                                        // Type
                                        stream.ReadUInt16();
                                        stream.ReadUInt16();
                                    }

                                    // For each param
                                    surfaceParameters = new SurfaceParameter[parametersCount];
                                    for (int j = 0; j < parametersCount; j++)
                                    {
                                        // Create param
                                        var param = new SurfaceParameter();
                                        surfaceParameters[j] = param;

                                        // Properties
                                        param.Type = new ScriptType(VisjectSurfaceContext.GetGraphParameterValueType((VisjectSurfaceContext.GraphParamType_Deprecated)stream.ReadByte()));
                                        stream.Read(guidBytes, 0, 16);
                                        param.ID       = new Guid(guidBytes);
                                        param.Name     = stream.ReadStr(97);
                                        param.IsPublic = stream.ReadByte() != 0;
                                        var isStatic     = stream.ReadByte() != 0;
                                        var isUIVisible  = stream.ReadByte() != 0;
                                        var isUIEditable = stream.ReadByte() != 0;

                                        // References [Deprecated]
                                        int refsCount = stream.ReadInt32();
                                        for (int k = 0; k < refsCount; k++)
                                        {
                                            stream.ReadUInt32();
                                        }

                                        // Value
                                        stream.ReadCommonValue(ref param.Value);

                                        // Meta
                                        param.Meta.Load(stream);
                                    }
                                }
                                else if (version == 7000)
                                {
                                    // Nodes count
                                    int nodesCount = stream.ReadInt32();

                                    // Parameters count
                                    int parametersCount = stream.ReadInt32();

                                    // For each node
                                    for (int j = 0; j < nodesCount; j++)
                                    {
                                        // ID
                                        stream.ReadUInt32();

                                        // Type
                                        stream.ReadUInt16();
                                        stream.ReadUInt16();
                                    }

                                    // For each param
                                    surfaceParameters = new SurfaceParameter[parametersCount];
                                    for (int j = 0; j < parametersCount; j++)
                                    {
                                        // Create param
                                        var param = new SurfaceParameter();
                                        surfaceParameters[j] = param;

                                        // Properties
                                        param.Type = stream.ReadVariantScriptType();
                                        stream.Read(guidBytes, 0, 16);
                                        param.ID       = new Guid(guidBytes);
                                        param.Name     = stream.ReadStr(97);
                                        param.IsPublic = stream.ReadByte() != 0;

                                        // Value
                                        param.Value = stream.ReadVariant();

                                        // Meta
                                        param.Meta.Load(stream);
                                    }
                                }
                            }
                    }
                }
            }
            catch (Exception ex)
            {
                Editor.LogError("Failed to get material parameters metadata.");
                Editor.LogWarning(ex);
            }
            finally
            {
                Profiler.EndEvent();
            }

            foreach (var parameter in parameters)
            {
                var surfaceParameter = surfaceParameters?.FirstOrDefault(x => x.ID == parameter.ParameterID);
                var attributes       = surfaceParameter?.Meta.GetAttributes() ?? FlaxEngine.Utils.GetEmptyArray <Attribute>();
                data[i] = new GraphParameterData(null, parameter.Name, parameter.IsPublic, ToType(parameter.ParameterType), attributes, parameter);
                i++;
            }
            Array.Sort(data, GraphParameterData.Compare);
            return(data);
        }