/// <summary> /// Sets up the provided Material to be used with this NoiseSettings instance. Some assumptions are made /// here as far as definitions and variable declarations in the Material's Shader go. /// float4 _NoiseTranslation, float4 _NoiseRotation, float4 _NoiseScale, and float4x4 _NoiseTransform are /// assumed to be declared. Sets up the Material using the NoiseType and FractalType SetupMaterial /// functions. /// </summary> /// <param name="mat"> The Material to set up for use with this NoiseSettings instance </param> public void SetupMaterial(Material mat) { INoiseType noiseType = NoiseLib.GetNoiseTypeInstance(domainSettings.noiseTypeName); IFractalType fractalType = NoiseLib.GetFractalTypeInstance(domainSettings.fractalTypeName); // set individual transform info mat.SetVector(ShaderStrings.translation, transformSettings.translation); mat.SetVector(ShaderStrings.rotation, transformSettings.rotation); mat.SetVector(ShaderStrings.scale, transformSettings.scale); // set full transform matrix mat.SetMatrix(ShaderStrings.transform, trs); noiseType?.SetupMaterial(mat, domainSettings.noiseTypeParams); fractalType?.SetupMaterial(mat, domainSettings.fractalTypeParams); }
/// <summary> /// Renders a Popup using EditorGUILayout.Popup for all loaded FractalType implementations /// </summary> /// <param name="label"> Label prefix for the Popup </param> /// <param name="selectedName"> The currently selected FractalType name </param> public static string FractalTypePopup(GUIContent label, string selectedName) { string[] names = NoiseLib.GetFractalNames(); int index = NoiseLib.GetFractalIndex(selectedName); index = index < 0 ? 0 : index; int newIndex = EditorGUILayout.Popup(label, index, names); string newName = names[newIndex]; if (newName.CompareTo(selectedName) != 0) { selectedName = newName; } return(selectedName); }
public static string NoiseTypePopup(Rect rect, GUIContent label, string selectedName) { string[] names = NoiseLib.GetNoiseNames(); int index = NoiseLib.GetNoiseIndex(selectedName); index = index < 0 ? 0 : index; int newIndex = EditorGUI.Popup(rect, label.text, index, names); string newName = names[newIndex]; if (newName.CompareTo(selectedName) != 0) { selectedName = newName; } return(selectedName); }
public GeneratedShaderInfo(IFractalType fractalType, INoiseType noiseType) { this.fractalDesc = fractalType.GetDescription(); this.noiseDesc = noiseType.GetDescription(); this.noiseIncludeStr = string.Format("#include \"{0}\"", noiseDesc.sourcePath); if (!string.IsNullOrEmpty(fractalDesc.name)) { this.variantName = string.Format("{0}{1}", fractalDesc.name, noiseDesc.name); } else { this.variantName = noiseDesc.name; } // set the path of the generated file. this will be used when writing the file // to disk and when adding the include in any generated shaders that use this // fractal and noise type variant this.generatedIncludePath = string.Format("{0}/{1}/{2}.hlsl", noiseDesc.outputDir, fractalDesc.name, noiseDesc.name); this.outputDir = string.Format("{0}/{1}", noiseDesc.outputDir, fractalDesc.name); fractalStructName = string.Format("{0}FractalInput", fractalDesc.name); noiseStructName = string.Format("{0}NoiseInput", noiseDesc.name); numFractalInputs = fractalDesc.inputStructDefinition == null ? 0 : fractalDesc.inputStructDefinition.Count; numNoiseInputs = noiseDesc.inputStructDefinition == null ? 0 : noiseDesc.inputStructDefinition.Count; fractalParamStr = null; noiseParamStr = null; functionInputStr = ""; // construct include paths string additionalIncludePaths = "\n"; for (int i = 0; i < fractalDesc.additionalIncludePaths.Count; ++i) { additionalIncludePaths += $"#include \"{ fractalDesc.additionalIncludePaths[ i ] }\"\n"; } additionalIncludePaths += "\n"; // generate the string for the fractal type structure as it would appear as a parameter // in an HLSL function declaration if (numFractalInputs > 0) { fractalParamStr = string.Format("{0} {1}", fractalStructName, "fractalInput"); } // generate the string for the noise type structure as it would appear as a parameter // in an HLSL function declaration if (numNoiseInputs > 0) { noiseParamStr = string.Format("{0} {1}", noiseStructName, "noiseInput"); } // generate the argument string for an HLSL function declaration that would be // using this combination of noise and fractal type structure definitions functionParamStr = ""; if (fractalParamStr != null) { functionParamStr += fractalParamStr; functionInputStr += "fractalInput"; } if (fractalParamStr != null && noiseParamStr != null) { functionParamStr += ", "; functionInputStr += ", "; } if (noiseParamStr != null) { functionParamStr += noiseParamStr; functionInputStr += "noiseInput"; } fractalStructDef = ""; if (numFractalInputs > 0) { fractalStructDef = NoiseLib.BuildStructString(fractalStructName, fractalDesc.inputStructDefinition); string getDefaultFuncStr = NoiseLib.GetDefaultFunctionString(fractalStructName, fractalDesc.inputStructDefinition); fractalStructDef += $"\n\n{ getDefaultFuncStr }\n\n"; } noiseStructDef = ""; if (numNoiseInputs > 0) { noiseStructDef = NoiseLib.BuildStructString(noiseStructName, noiseDesc.inputStructDefinition); } // get input str construction getInputsStr = ""; getFractalInputStr = NoiseLib.GetInputFunctionCallString(fractalStructName); getNoiseInputStr = NoiseLib.GetInputFunctionCallString(fractalStructName); if (numFractalInputs > 0) { getInputsStr += getFractalInputStr; } if (numFractalInputs > 0 && numNoiseInputs > 0) { getInputsStr += ", "; } if (numNoiseInputs > 0) { getInputsStr += getNoiseInputStr; } // get default input str construction getDefaultInputsStr = ""; getDefaultFractalInputStr = NoiseLib.GetDefaultInputFunctionCallString(fractalStructName); getDefaultNoiseInputStr = NoiseLib.GetDefaultInputFunctionCallString(noiseStructName); if (numFractalInputs > 0) { getDefaultInputsStr += getDefaultFractalInputStr; } if (numFractalInputs > 0 && numNoiseInputs > 0) { getDefaultInputsStr += ", "; } if (numNoiseInputs > 0) { getDefaultInputsStr += getDefaultNoiseInputStr; } fractalPropertyDefStr = ""; if (fractalDesc.inputStructDefinition != null && fractalDesc.inputStructDefinition.Count > 0) { fractalPropertyDefStr = NoiseLib.GetPropertyDefinitionStr(fractalDesc.name, fractalDesc.inputStructDefinition); fractalPropertyDefStr += "\n" + NoiseLib.GetPropertyFunctionStr(fractalStructName, fractalDesc.name, fractalDesc.inputStructDefinition); } }
/// <summary> /// Returns a Material reference to the default blit material for the given Type of FractalType. /// </summary> /// <remarks> Usage is: Material mat = GetDefaultBlitMaterial( typeof(FbmFractalType) ); </remarks> /// <returns> A reference to the default blit Material for the specified Type of FractalType </return> /// <param name="fractalType"> The Type for a given FractalType </param> public static Material GetDefaultBlitMaterial(Type fractalType) { return(NoiseLib.GetGeneratedMaterial(typeof(NoiseBlitShaderGenerator), fractalType)); }
/// <summary> /// Blits 2D noise defined by the given NoiseSettings instance into the destination RenderTexture /// using the provided Material. /// </summary> /// <param name = "noise"> An instance of NoiseSettings defining the type of noise to render </param> /// <param name = "dest"> The destination RenderTexture that the noise will be rendered into. </param> /// <param name = "mat"> The Material to be used for rendering the noise </param> public static void Blit2D(NoiseSettings noise, RenderTexture dest, Material mat) { int pass = NoiseLib.GetNoiseIndex(noise.domainSettings.noiseTypeName); INTERNAL_Blit2D(noise, dest, mat, pass * kNumBlitPasses + 0); }