Esempio n. 1
0
        void AddRealtimeFields(MixtureNode node, MixtureGraphView owner)
        {
            doubleBuffered = new Toggle("Double Buffered")
            {
                value = node.rtSettings.doubleBuffered,
            };
            doubleBuffered.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Set Double Buffered " + e.newValue);
                node.rtSettings.doubleBuffered = e.newValue;
                onChanged?.Invoke();
            });

            Add(doubleBuffered);

            refreshMode = new EnumField("Refresh Mode", node.rtSettings.refreshMode);
            refreshMode.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Set Refresh Mode " + e.newValue);
                node.rtSettings.refreshMode = (RefreshMode)e.newValue;
                onChanged?.Invoke();
            });

            Add(refreshMode);

            period = new FloatField("Period")
            {
                value = node.rtSettings.period
            };
            period.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Set Period " + e.newValue);
                node.rtSettings.period = e.newValue;
                onChanged?.Invoke();
            });

            Add(period);
        }
Esempio n. 2
0
            public override void OnOpen()
            {
                var settingsView = new MixtureSettingsView(graphView.graph.settings, graphView, "Graph Settings", false);

                settingsView.AddToClassList("RTSettingsView");
                settingsView.style.height = new StyleLength(new Length(100, LengthUnit.Percent));
                settingsView.RegisterChangedCallback(() => graphView.ProcessGraph());

                var otherHeader = new Label("Advanced Settings");

                otherHeader.AddToClassList(MixtureSettingsView.headerStyleClass);
                settingsView.Add(otherHeader);

                var defaultInheritanceMode = new EnumField(graphView.graph.defaultNodeInheritanceMode)
                {
                    label = "Node Inheritance Mode"
                };

                defaultInheritanceMode.RegisterValueChangedCallback(e => {
                    graphView.RegisterCompleteObjectUndo("Changed node inheritance mode");
                    graphView.graph.defaultNodeInheritanceMode = (NodeInheritanceMode)e.newValue;

                    graphView.graph.UpdateNodeInheritanceMode();
                    graphView.RefreshNodeSettings();

                    graphView.ProcessGraph();
                });
                settingsView.Add(defaultInheritanceMode);

                editorWindow.rootVisualElement.Add(settingsView);
            }
Esempio n. 3
0
        void AddRealtimeFields(MixtureNode node, MixtureGraphView owner)
        {
            doubleBuffered = new Toggle("Double Buffered")
            {
                value = node.rtSettings.doubleBuffered,
            };
            doubleBuffered.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Set Double Buffered " + e.newValue);
                node.rtSettings.doubleBuffered = e.newValue;
                onChanged?.Invoke();
            });

            Add(doubleBuffered);
        }
Esempio n. 4
0
        void AddRealtimeFields(MixtureGraphView owner)
        {
            refreshMode = new EnumField("Refresh Mode", settings.refreshMode);
            refreshMode.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Set Refresh Mode " + e.newValue);
                settings.refreshMode = (RefreshMode)e.newValue;
                onChanged?.Invoke();
            });

            Add(refreshMode);

            period = new FloatField("Period")
            {
                value = settings.period
            };
            period.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Set Period " + e.newValue);
                settings.period = e.newValue;
                onChanged?.Invoke();
            });

            Add(period);
        }
Esempio n. 5
0
        public HistogramView(HistogramData data, MixtureGraphView graphView, int height = 200)
        {
            var modeField = new EnumField("Histogram Mode", data.mode);

            modeField.RegisterValueChangedCallback(e => {
                graphView.RegisterCompleteObjectUndo("Changed histogram Mode");
                data.mode = (HistogramMode)e.newValue;
            });
            Add(modeField);
            var drawHistogram = new DrawHistogram(data, height);

            Add(drawHistogram);

            var minMaxLabel = new Label();

            Add(minMaxLabel);
            schedule.Execute(() => {
                minMaxLabel.text = $"Luminance min: {data.minLuminance:F3}, max: {data.maxLuminance:F3}";
            }).Every(20);
        }
Esempio n. 6
0
        void InitializeView()
        {
            // Register callbacks
            settingsButton.clicked += () => {
                if (settingsButton.ClassListContains("ActiveButton"))
                {
                    settingsButton.RemoveFromClassList("ActiveButton");
                    portSettings.style.display  = DisplayStyle.None;
                    portNameField.style.display = DisplayStyle.None;
                }
                else
                {
                    settingsButton.AddToClassList("ActiveButton");
                    portSettings.style.display  = DisplayStyle.Flex;
                    portNameField.style.display = DisplayStyle.Flex;
                }
            };

            portNameField.RegisterValueChangedCallback(name => {
                graphView.RegisterCompleteObjectUndo("Change output name");
                var uniqueName      = ObjectNames.GetUniqueName(node.outputTextureSettings.Select(o => o.name).ToArray(), name.newValue);
                targetSettings.name = uniqueName;
                portName.text       = uniqueName;

#if UNITY_EDITOR
                if (graphView.graph.isRealtime)
                {
                    graphView.graph.UpdateRealtimeAssetsOnDisk();
                }
#endif
            });
            portNameField.value = targetSettings.name;
            portName.text       = targetSettings.name;

            enableCompression.RegisterValueChangedCallback(enabled => {
                graphView.RegisterCompleteObjectUndo($"Change {targetSettings.name} compression");
                var textureDim = node.rtSettings.GetTextureDimension(graphView.graph);

                if (textureDim == TextureDimension.Tex2D || textureDim == TextureDimension.Cube)
                {
                    targetSettings.enableCompression = enabled.newValue;
                    if (enabled.newValue)
                    {
                        compressionFields.style.display = DisplayStyle.Flex;
                    }
                    else
                    {
                        compressionFields.style.display = DisplayStyle.None;
                    }
                }
                else
                {
                    Debug.LogError("Compression is not yet supported for " + textureDim);
                    enableCompression.SetValueWithoutNotify(false);
                }
            });
            enableCompression.value = targetSettings.enableCompression;

            compressionFormat.RegisterValueChangedCallback(format => {
                targetSettings.compressionFormat = (TextureFormat)format.newValue;
            });
            compressionQuality.RegisterValueChangedCallback(quality => {
                targetSettings.compressionQuality = (MixtureCompressionQuality)quality.newValue;
            });

            compressionFormat.SetValueWithoutNotify(targetSettings.compressionFormat);
            compressionQuality.SetValueWithoutNotify(targetSettings.compressionQuality);

            createMipMapShaderButton.clicked += MixtureAssetCallbacks.CreateCustomMipMapShaderGraph;
            // TODO: assign the created shader when finished

            mipmapShaderField.objectType           = typeof(Shader);
            mipmapShaderField.value                = targetSettings.customMipMapShader;
            createMipMapShaderButton.style.display = targetSettings.customMipMapShader != null ? DisplayStyle.None : DisplayStyle.Flex;
            mipmapShaderField.RegisterValueChangedCallback(e => {
                graphView.RegisterCompleteObjectUndo("Changed Custom Mip Map Shader");
                targetSettings.customMipMapShader      = e.newValue as Shader;
                createMipMapShaderButton.style.display = e.newValue != null ? DisplayStyle.None : DisplayStyle.Flex;;
            });

            enableMipMap.RegisterValueChangedCallback(e => {
                targetSettings.hasMipMaps = e.newValue;
                if (supportCustomMipMaps)
                {
                    mipmapFields.style.display = targetSettings.hasMipMaps ? DisplayStyle.Flex : DisplayStyle.None;
                }

                // Processing the graph to update the previews with the new mipmaps
                graphView.ProcessGraph();
            });
            enableMipMap.value = targetSettings.hasMipMaps;

            removeOutputButton.clicked += () => {
                node.RemoveTextureOutput(targetSettings);
                nodeView.ForceUpdatePorts();
            };

            enableConversion.RegisterValueChangedCallback(e => {
                graphView.RegisterCompleteObjectUndo("Changed Conversion value");
                targetSettings.enableConversion = e.newValue;
                conversionFormat.style.display  = e.newValue ? DisplayStyle.Flex : DisplayStyle.None;
            });
            enableConversion.value = targetSettings.enableConversion;

            conversionFormat.RegisterValueChangedCallback(e => {
                graphView.RegisterCompleteObjectUndo("Changed Conversion Format");
                targetSettings.conversionFormat = (ConversionFormat)e.newValue;
            });
            conversionFormat.value = targetSettings.conversionFormat;

            sRGB.RegisterValueChangedCallback(e => {
                graphView.RegisterCompleteObjectUndo("Changed sRGB");
                targetSettings.sRGB = e.newValue;

                // when updating sRGB flag, we need to process the graph to update the final copy material
                graphView.ProcessGraph();
            });
            sRGB.value = targetSettings.sRGB;

            // Initial view state
            portSettings.style.display      = DisplayStyle.None;
            compressionFields.style.display = targetSettings.enableCompression ? DisplayStyle.Flex : DisplayStyle.None;
            mipmapFields.style.display      = targetSettings.hasMipMaps ? DisplayStyle.Flex : DisplayStyle.None;
            portNameField.style.display     = DisplayStyle.None;
            conversionFormat.style.display  = targetSettings.enableConversion ? DisplayStyle.Flex : DisplayStyle.None;
        }
Esempio n. 7
0
        void ReloadSettingsView()
        {
            // Remove all old fields
            Clear();

            var title     = new Label("Node Output Settings");
            var dimension = node.rtSettings.GetTextureDimension(graph);

            title.AddToClassList("PropertyEditorTitle");
            this.Add(title);

            // Wrap and Filter Modes
            smpHeader = new Label("Sampler States");
            smpHeader.AddToClassList(headerStyleClass);
            this.Add(smpHeader);

            wrapMode = new EnumField(node.rtSettings.wrapMode)
            {
                label = "Wrap Mode",
            };
            wrapMode.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Wrap Mode " + e.newValue);
                node.rtSettings.wrapMode = (TextureWrapMode)e.newValue;
                onChanged?.Invoke();
            });

            filterMode = new EnumField(node.rtSettings.filterMode)
            {
                label = "Filter Mode",
            };
            filterMode.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Filter Mode " + e.newValue);
                node.rtSettings.filterMode = (FilterMode)e.newValue;
                onChanged?.Invoke();
            });

            this.Add(wrapMode);
            this.Add(filterMode);

            // Size Modes
            sizeHeader = new Label("Size Properties");
            sizeHeader.AddToClassList(headerStyleClass);
            this.Add(sizeHeader);

            outputWidthMode = new EnumField(node.rtSettings.widthMode)
            {
                label = "Width Mode",
            };
            outputWidthMode.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                node.rtSettings.widthMode = (OutputSizeMode)e.newValue;
                onChanged?.Invoke();
                UpdateFieldVisibility(node);
            });
            this.Add(outputWidthMode);

            if (dimension != TextureDimension.Cube)
            {
                outputHeightMode = new EnumField(node.rtSettings.heightMode)
                {
                    label = "Height Mode",
                };
                outputHeightMode.RegisterValueChangedCallback(e => {
                    owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                    node.rtSettings.heightMode = (OutputSizeMode)e.newValue;
                    onChanged?.Invoke();
                    UpdateFieldVisibility(node);
                });
                this.Add(outputHeightMode);

                if (dimension == TextureDimension.Tex3D)
                {
                    outputDepthMode = new EnumField(node.rtSettings.depthMode)
                    {
                        label = "Depth Mode",
                    };
                    outputDepthMode.RegisterValueChangedCallback(e => {
                        owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                        node.rtSettings.depthMode = (OutputSizeMode)e.newValue;
                        onChanged?.Invoke();
                        UpdateFieldVisibility(node);
                    });
                    this.Add(outputDepthMode);
                }
            }

            potSize = new EnumField(node.rtSettings.potSize)
            {
                value = node.rtSettings.potSize,
                label = "Resolution",
            };
            potSize.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Size " + e.newValue);
                var size = (POTSize)e.newValue;
                node.rtSettings.potSize = size;

                if (size != POTSize.Custom)
                {
                    node.rtSettings.width      = (int)size;
                    node.rtSettings.height     = (int)size;
                    node.rtSettings.sliceCount = (int)size;
                }
                else
                {
                    node.rtSettings.width      = outputWidth.value;
                    node.rtSettings.height     = outputHeight.value;
                    node.rtSettings.sliceCount = outputDepth.value;
                }

                onChanged?.Invoke();
                UpdateFieldVisibility(node);
            });

            this.Add(potSize);

            outputWidth = new IntegerField()
            {
                value     = node.rtSettings.width,
                label     = "Width",
                isDelayed = true,
            };
            outputWidth.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Width " + e.newValue);
                node.rtSettings.width = e.newValue;
                onChanged?.Invoke();
            });
            this.Add(outputWidth);

            outputWidthPercentage = new FloatField()
            {
                value     = node.rtSettings.widthPercent,
                label     = "Width Percentage",
                isDelayed = true,
            };
            outputWidthPercentage.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Width " + e.newValue);
                node.rtSettings.widthPercent = e.newValue;
                onChanged?.Invoke();
            });
            this.Add(outputWidthPercentage);

            if (dimension != TextureDimension.Cube)
            {
                outputHeight = new IntegerField()
                {
                    value     = node.rtSettings.height,
                    label     = "Height",
                    isDelayed = true,
                };
                outputHeight.RegisterValueChangedCallback(e =>
                {
                    owner.RegisterCompleteObjectUndo("Updated Height " + e.newValue);
                    node.rtSettings.height = e.newValue;
                    onChanged?.Invoke();
                });
                this.Add(outputHeight);

                outputHeightPercentage = new FloatField()
                {
                    value     = node.rtSettings.heightPercent,
                    label     = "Height Percentage",
                    isDelayed = true,
                };
                outputHeightPercentage.RegisterValueChangedCallback(e =>
                {
                    owner.RegisterCompleteObjectUndo("Updated Height " + e.newValue);
                    node.rtSettings.heightPercent = e.newValue;
                    onChanged?.Invoke();
                });
                this.Add(outputHeightPercentage);

                if (dimension == TextureDimension.Tex3D)
                {
                    outputDepth = new IntegerField()
                    {
                        value     = node.rtSettings.sliceCount,
                        label     = "Depth",
                        isDelayed = true,
                    };
                    outputDepth.RegisterValueChangedCallback(e =>
                    {
                        owner.RegisterCompleteObjectUndo("Updated Depth " + e.newValue);
                        node.rtSettings.sliceCount = e.newValue;
                        onChanged?.Invoke();
                    });
                    this.Add(outputDepth);

                    outputDepthPercentage = new FloatField()
                    {
                        value     = node.rtSettings.depthPercent,
                        label     = "Depth Percentage",
                        isDelayed = true,
                    };
                    outputDepthPercentage.RegisterValueChangedCallback(e =>
                    {
                        owner.RegisterCompleteObjectUndo("Updated Depth " + e.newValue);
                        node.rtSettings.depthPercent = e.newValue;
                        onChanged?.Invoke();
                    });
                    this.Add(outputDepthPercentage);
                }
            }

            // Dimension and Pixel Format
            formatHeader = new Label("Format");
            formatHeader.AddToClassList(headerStyleClass);
            this.Add(formatHeader);

            outputDimension = new EnumField(node.rtSettings.dimension)
            {
                label = "Dimension",
            };
            outputDimension.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                // Check if the new texture is not too high res:
                node.rtSettings.dimension = (OutputDimension)e.newValue;
                if (node.rtSettings.dimension == OutputDimension.Texture3D)
                {
                    long pixelCount = node.rtSettings.GetWidth(graph) * node.rtSettings.GetHeight(graph) * node.rtSettings.GetDepth(graph);

                    // Above 16M pixels in a texture3D, processing can take too long and crash the GPU when a conversion happen
                    if (pixelCount > 16777216)
                    {
                        node.rtSettings.SetPOTSize(64);
                    }
                }
                onChanged?.Invoke();
            });

            outputChannels = new EnumField(node.rtSettings.outputChannels)
            {
                label = "Output Channels",
            };
            outputChannels.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Output Channels " + e.newValue);
                node.rtSettings.outputChannels = (OutputChannel)e.newValue;
                onChanged?.Invoke();
            });

            outputPrecision = new EnumField(node.rtSettings.outputPrecision)
            {
                label = "Output Precision",
            };
            outputPrecision.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Output Precision " + e.newValue);
                node.rtSettings.outputPrecision = (OutputPrecision)e.newValue;
                // outputPrecision.Init();
                onChanged?.Invoke();
            });

            this.Add(outputDimension);
            this.Add(outputChannels);
            this.Add(outputPrecision);

            UpdateFieldVisibility(node);

            if (owner.graph.isRealtime)
            {
                // Realtime fields and refresh mode
                otherHeader = new Label("Other");
                otherHeader.AddToClassList(headerStyleClass);
                this.Add(otherHeader);

                AddRealtimeFields(node, owner);
            }
        }
Esempio n. 8
0
        void ReloadSettingsView()
        {
            // Remove all old fields
            Clear();

            var title     = new Label("Node Output Settings");
            var dimension = node.rtSettings.GetTextureDimension(graph);

            title.AddToClassList("PropertyEditorTitle");
            this.Add(title);

            // Wrap and Filter Modes
            var smpHeader = new Label("Sampler States");

            smpHeader.AddToClassList("PropertyEditorHeader");
            this.Add(smpHeader);

            wrapMode = new EnumField(node.rtSettings.wrapMode)
            {
                label = "Wrap Mode",
            };
            wrapMode.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Wrap Mode " + e.newValue);
                node.rtSettings.wrapMode = (TextureWrapMode)e.newValue;
                onChanged?.Invoke();
            });

            filterMode = new EnumField(node.rtSettings.filterMode)
            {
                label = "Filter Mode",
            };
            filterMode.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Filter Mode " + e.newValue);
                node.rtSettings.filterMode = (FilterMode)e.newValue;
                onChanged?.Invoke();
            });

            this.Add(wrapMode);
            this.Add(filterMode);

            // Size Modes
            var sizeHeader = new Label("Size Properties");

            sizeHeader.AddToClassList("PropertyEditorHeader");
            this.Add(sizeHeader);

            outputWidthMode = new EnumField(node.rtSettings.widthMode)
            {
                label = "Width Mode",
            };
            outputWidthMode.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                node.rtSettings.widthMode = (OutputSizeMode)e.newValue;
                onChanged?.Invoke();
                UpdateFieldVisibility(node);
            });
            this.Add(outputWidthMode);

            if (dimension != TextureDimension.Cube)
            {
                outputHeightMode = new EnumField(node.rtSettings.heightMode)
                {
                    label = "Height Mode",
                };
                outputHeightMode.RegisterValueChangedCallback(e => {
                    owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                    node.rtSettings.heightMode = (OutputSizeMode)e.newValue;
                    onChanged?.Invoke();
                    UpdateFieldVisibility(node);
                });
                this.Add(outputHeightMode);

                if (dimension == TextureDimension.Tex3D)
                {
                    outputDepthMode = new EnumField(node.rtSettings.depthMode)
                    {
                        label = "Depth Mode",
                    };
                    outputDepthMode.RegisterValueChangedCallback(e => {
                        owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                        node.rtSettings.depthMode = (OutputSizeMode)e.newValue;
                        onChanged?.Invoke();
                        UpdateFieldVisibility(node);
                    });
                    this.Add(outputDepthMode);
                }
            }

            potSize = new EnumField(node.rtSettings.potSize)
            {
                value = node.rtSettings.potSize,
                label = "Resolution",
            };
            potSize.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Size " + e.newValue);
                var size = (POTSize)e.newValue;
                node.rtSettings.potSize = size;

                if (size != POTSize.Custom)
                {
                    node.rtSettings.width      = (int)size;
                    node.rtSettings.height     = (int)size;
                    node.rtSettings.sliceCount = (int)size;
                }
                else
                {
                    node.rtSettings.width      = outputWidth.value;
                    node.rtSettings.height     = outputHeight.value;
                    node.rtSettings.sliceCount = outputDepth.value;
                }

                onChanged?.Invoke();
                UpdateFieldVisibility(node);
            });

            this.Add(potSize);

            outputWidth = new IntegerField()
            {
                value     = node.rtSettings.width,
                label     = "Width",
                isDelayed = true,
            };
            outputWidth.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Width " + e.newValue);
                node.rtSettings.width = e.newValue;
                onChanged?.Invoke();
            });
            this.Add(outputWidth);

            outputWidthPercentage = new FloatField()
            {
                value     = node.rtSettings.widthPercent,
                label     = "Width Percentage",
                isDelayed = true,
            };
            outputWidthPercentage.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Width " + e.newValue);
                node.rtSettings.widthPercent = e.newValue;
                onChanged?.Invoke();
            });
            this.Add(outputWidthPercentage);

            if (dimension != TextureDimension.Cube)
            {
                outputHeight = new IntegerField()
                {
                    value     = node.rtSettings.height,
                    label     = "Height",
                    isDelayed = true,
                };
                outputHeight.RegisterValueChangedCallback(e =>
                {
                    owner.RegisterCompleteObjectUndo("Updated Height " + e.newValue);
                    node.rtSettings.height = e.newValue;
                    onChanged?.Invoke();
                });
                this.Add(outputHeight);

                outputHeightPercentage = new FloatField()
                {
                    value     = node.rtSettings.heightPercent,
                    label     = "Height Percentage",
                    isDelayed = true,
                };
                outputHeightPercentage.RegisterValueChangedCallback(e =>
                {
                    owner.RegisterCompleteObjectUndo("Updated Height " + e.newValue);
                    node.rtSettings.heightPercent = e.newValue;
                    onChanged?.Invoke();
                });
                this.Add(outputHeightPercentage);

                if (dimension == TextureDimension.Tex3D)
                {
                    outputDepth = new IntegerField()
                    {
                        value     = node.rtSettings.sliceCount,
                        label     = "Depth",
                        isDelayed = true,
                    };
                    outputDepth.RegisterValueChangedCallback(e =>
                    {
                        owner.RegisterCompleteObjectUndo("Updated Depth " + e.newValue);
                        node.rtSettings.sliceCount = e.newValue;
                        onChanged?.Invoke();
                    });
                    this.Add(outputDepth);

                    outputDepthPercentage = new FloatField()
                    {
                        value     = node.rtSettings.depthPercent,
                        label     = "Depth Percentage",
                        isDelayed = true,
                    };
                    outputDepthPercentage.RegisterValueChangedCallback(e =>
                    {
                        owner.RegisterCompleteObjectUndo("Updated Depth " + e.newValue);
                        node.rtSettings.depthPercent = e.newValue;
                        onChanged?.Invoke();
                    });
                    this.Add(outputDepthPercentage);
                }
            }

            // Dimension and Pixel Format
            var formatHeader = new Label("Format");

            formatHeader.AddToClassList("PropertyEditorHeader");
            this.Add(formatHeader);

            outputDimension = new EnumField(node.rtSettings.dimension)
            {
                label = "Dimension",
            };
            outputDimension.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                node.rtSettings.dimension = (OutputDimension)e.newValue;
                onChanged?.Invoke();
            });

            outputFormat = new EnumField(node.rtSettings.targetFormat)
            {
                label = "Pixel Format",
            };
            outputFormat.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Graphics Format " + e.newValue);
                node.rtSettings.targetFormat = (OutputFormat)e.newValue;
                onChanged?.Invoke();
            });

            this.Add(outputDimension);
            this.Add(outputFormat);

            UpdateFieldVisibility(node);

            if (owner.graph.isRealtime)
            {
                AddRealtimeFields(node, owner);
            }
        }
Esempio n. 9
0
        void ReloadSettingsView()
        {
            // Remove all old fields
            Clear();

            if (title != null)
            {
                var titleLabel = new Label(title);
                titleLabel.AddToClassList("PropertyEditorTitle");
                this.Add(titleLabel);
            }

            var dimension = settings.GetResolvedTextureDimension(graph);

            // Wrap and Filter Modes
            smpHeader = new Label("Sampler States");
            smpHeader.AddToClassList(headerStyleClass);
            this.Add(smpHeader);

            wrapMode       = showSettingsForNode ? new EnumField(settings.wrapMode) : new EnumField((GraphOutputWrapMode)settings.wrapMode);
            wrapMode.label = "Wrap Mode";
            wrapMode.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Wrap Mode " + e.newValue);
                settings.wrapMode = (OutputWrapMode)e.newValue;
                onChanged?.Invoke();
            });

            filterMode       = showSettingsForNode ? new EnumField(settings.filterMode) : new EnumField((GraphOutputFilterMode)settings.filterMode);
            filterMode.label = "Filter Mode";
            filterMode.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Filter Mode " + e.newValue);
                settings.filterMode = (OutputFilterMode)e.newValue;
                onChanged?.Invoke();
            });

            this.Add(wrapMode);
            this.Add(filterMode);

            // Size Modes
            sizeHeader = new Label("Size Properties");
            sizeHeader.AddToClassList(headerStyleClass);
            this.Add(sizeHeader);

            outputSizeMode       = showSettingsForNode ? new EnumField(settings.sizeMode) : new EnumField((GraphOutputSizeMode)settings.sizeMode);
            outputSizeMode.label = "Size Mode";
            outputSizeMode.RegisterValueChangedCallback((EventCallback <ChangeEvent <Enum> >)(e => {
                owner.RegisterCompleteObjectUndo("Updated Size mode " + e.newValue);
                settings.sizeMode = (OutputSizeMode)e.newValue;
                onChanged?.Invoke();
                ReloadSettingsView();
                UpdateFieldVisibility(settings);
            }));
            this.Add(outputSizeMode);

            potSize = new EnumField(settings.potSize)
            {
                value = settings.potSize,
                label = "Resolution",
            };
            potSize.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Size " + e.newValue);
                var size         = (POTSize)e.newValue;
                settings.potSize = size;

                if (size != POTSize.Custom)
                {
                    settings.width  = (int)size;
                    settings.height = (int)size;
                    settings.depth  = (int)size;
                }
                else
                {
                    settings.width  = outputWidth.value;
                    settings.height = outputHeight.value;
                    if (outputDepth != null)
                    {
                        settings.depth = outputDepth.value;
                    }
                }

                onChanged?.Invoke();
                ReloadSettingsView();
                UpdateFieldVisibility(settings);
            });

            this.Add(potSize);

            outputWidth = new IntegerField()
            {
                value     = settings.width,
                label     = "Width",
                isDelayed = true,
            };
            outputWidth.RegisterValueChangedCallback(e =>
            {
                owner.RegisterCompleteObjectUndo("Updated Width " + e.newValue);
                settings.width = e.newValue;
                onChanged?.Invoke();
            });
            this.Add(outputWidth);

            outputWidthScale = CreateSizeScaleSlider(settings.widthScale, (v) => settings.widthScale = v, "Width Scale");
            this.Add(outputWidthScale);

            if (dimension != TextureDimension.Cube)
            {
                outputHeight = new IntegerField()
                {
                    value     = settings.height,
                    label     = "Height",
                    isDelayed = true,
                };
                outputHeight.RegisterValueChangedCallback(e =>
                {
                    owner.RegisterCompleteObjectUndo("Updated Height " + e.newValue);
                    settings.height = e.newValue;
                    onChanged?.Invoke();
                });
                this.Add(outputHeight);

                outputHeightScale = CreateSizeScaleSlider(settings.heightScale, v => settings.heightScale = v, "Height Scale");
                this.Add(outputHeightScale);

                if (dimension == TextureDimension.Tex3D)
                {
                    outputDepth = new IntegerField()
                    {
                        value     = settings.depth,
                        label     = "Depth",
                        isDelayed = true,
                    };
                    outputDepth.RegisterValueChangedCallback(e =>
                    {
                        owner.RegisterCompleteObjectUndo("Updated Depth " + e.newValue);
                        settings.depth = e.newValue;
                        onChanged?.Invoke();
                    });
                    this.Add(outputDepth);

                    outputDepthScale = CreateSizeScaleSlider(settings.depthScale, v => settings.depthScale = v, "Depth Scale");
                    this.Add(outputDepthScale);
                }
            }

            SliderInt CreateSizeScaleSlider(float defaultValue, Action <float> setter, string propertyName)
            {
                var slider = new SliderInt(0, (int)(Mathf.Log(k_MaxSizeScale, 2) * 2))
                {
                    value = SizeScaleToInt(settings.heightScale),
                    label = propertyName,
                };

                slider.RegisterValueChangedCallback(e =>
                {
                    owner.RegisterCompleteObjectUndo(propertyName + " " + e.newValue);
                    setter(IntToSizeScale(e.newValue));
                    onChanged?.Invoke();
                });

                return(slider);
            }

            // Dimension and Pixel Format
            formatHeader = new Label("Format");
            formatHeader.AddToClassList(headerStyleClass);
            this.Add(formatHeader);

            outputDimension       = showSettingsForNode ? new EnumField(settings.dimension) : new EnumField((GraphOutputDimension)settings.dimension);
            outputDimension.label = "Dimension";
            outputDimension.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Texture Dimension " + e.newValue);
                // Check if the new texture is not too high res:
                settings.dimension = (OutputDimension)e.newValue;
                if (settings.dimension == OutputDimension.Texture3D)
                {
                    long pixelCount = settings.GetResolvedWidth(graph) * settings.GetResolvedHeight(graph) * settings.GetResolvedDepth(graph);

                    // Above 16M pixels in a texture3D, processing can take too long and crash the GPU when a conversion happen
                    if (pixelCount > 16777216)
                    {
                        settings.sizeMode = OutputSizeMode.Absolute;
                        settings.SetPOTSize(64);
                    }
                }
                onChanged?.Invoke();
                ReloadSettingsView();
            });

            outputChannels       = showSettingsForNode ? new EnumField(settings.outputChannels) : new EnumField((GraphOutputChannel)settings.outputChannels);
            outputChannels.label = "Output Channels";
            outputChannels.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Output Channels " + e.newValue);
                settings.outputChannels = (OutputChannel)e.newValue;
                onChanged?.Invoke();
            });

            outputPrecision       = showSettingsForNode ? new EnumField(settings.outputPrecision) : new EnumField((GraphOutputPrecision)settings.outputPrecision);
            outputPrecision.label = "Output Precision";
            outputPrecision.RegisterValueChangedCallback(e => {
                owner.RegisterCompleteObjectUndo("Updated Output Precision " + e.newValue);
                settings.outputPrecision = (OutputPrecision)e.newValue;
                // outputPrecision.Init();
                onChanged?.Invoke();
            });

            this.Add(outputDimension);
            this.Add(outputChannels);
            this.Add(outputPrecision);

            UpdateFieldVisibility(settings);

            if (showSettingsForNode)
            {
                // Realtime fields and refresh mode
                otherHeader = new Label("Other");
                otherHeader.AddToClassList(headerStyleClass);
                this.Add(otherHeader);

                doubleBuffered = new Toggle("Double Buffered")
                {
                    value = settings.doubleBuffered,
                };
                doubleBuffered.RegisterValueChangedCallback(e => {
                    owner.RegisterCompleteObjectUndo("Set Double Buffered " + e.newValue);
                    settings.doubleBuffered = e.newValue;
                    onChanged?.Invoke();
                });

                Add(doubleBuffered);
            }
            else if (graph.type == MixtureGraphType.Realtime)
            {
                otherHeader = new Label("Realtime");
                otherHeader.AddToClassList(headerStyleClass);
                this.Add(otherHeader);

                AddRealtimeFields(owner);
            }
        }