Example #1
0
        private void ConvertShaderCortana(ShaderCortana shaderCortana, Stream cacheStream, Dictionary <ResourceLocation, Stream> resourceStreams)
        {
            var render_method_option_indices = shaderCortana.RenderMethodDefinitionOptionIndices.Select(c => (int)c.OptionIndex).ToList();

            //CachedTagInstance newCortanaShaderInstance = CacheContext.TagCache.AllocateTag(TagGroup.Instances[groupTag]);
            //var ho_cortana_shader = (ShaderCortana)Activator.CreateInstance(typeof(ShaderCortana));

            var rmdf_instance = shaderCortana.BaseRenderMethod;
            var rmdf          = CacheContext.Deserialize <RenderMethodDefinition>(new TagSerializationContext(cacheStream, CacheContext, rmdf_instance));

            //var shader_instance = CacheContext.GetTag<Shader>(@"shaders\invalid");
            //var shader = CacheContext.Deserialize<Shader>(new TagSerializationContext(cacheStream, CacheContext, shader_instance));

            //ho_cortana_shader.ImportData = shader.ImportData;
            //ho_cortana_shader.ShaderProperties = shader.ShaderProperties;

            var shader_properties = shaderCortana.ShaderProperties[0];

            shader_properties.ShaderMaps          = new List <RenderMethod.ShaderProperty.ShaderMap>();
            shader_properties.Arguments           = new List <RenderMethod.ShaderProperty.Argument>();
            shader_properties.Unknown             = new List <RenderMethod.ShaderProperty.UnknownBlock1>();
            shader_properties.DrawModes           = new List <RenderMethodTemplate.DrawMode>();
            shader_properties.Unknown3            = new List <RenderMethod.ShaderProperty.UnknownBlock3>();
            shader_properties.ArgumentMappings    = new List <RenderMethod.ShaderProperty.ArgumentMapping>();
            shader_properties.AnimationProperties = new List <RenderMethod.AnimationPropertiesBlock>();

            List <RenderMethodOption.OptionBlock> templateOptions = new List <RenderMethodOption.OptionBlock>();

            for (int i = 0; i < rmdf.Methods.Count; i++)
            {
                var method = rmdf.Methods[i];
                int selected_option_index = render_method_option_indices.Count > i ? render_method_option_indices[i] : 0;
                var selected_option       = method.ShaderOptions[selected_option_index];

                var rmop_instance = selected_option.Option;
                if (rmop_instance != null)
                {
                    var rmop = CacheContext.Deserialize <RenderMethodOption>(new TagSerializationContext(cacheStream, CacheContext, rmop_instance));

                    templateOptions.AddRange(rmop.Options);
                }
            }

            RenderMethodTemplate rmt2 = null;

            if (shader_properties.Template == null)
            {
                GenerateCortanaRMT2Tag(
                    render_method_option_indices,
                    cacheStream,
                    resourceStreams,
                    out CachedTagInstance rmt2Instance,
                    out RenderMethodTemplate newRMT2);

                shader_properties.Template = rmt2Instance;
                rmt2 = newRMT2;
            }
            else
            {
                rmt2 = CacheContext.Deserialize <RenderMethodTemplate>(new TagSerializationContext(cacheStream, CacheContext, shader_properties.Template));
            }
            //shader_properties.DrawModes = rmt2.DrawModes;

            var shaderFunctions       = new List <RenderMethod.AnimationPropertiesBlock>();
            var shaderVectorArguments = new RenderMethod.ShaderProperty.Argument[rmt2.VectorArguments.Count];

            var shaderSamplerArguments = new RenderMethod.ShaderProperty.ShaderMap[rmt2.SamplerArguments.Count];

            for (int rmt2SamplerIndex = 0; rmt2SamplerIndex < rmt2.SamplerArguments.Count; rmt2SamplerIndex++)
            {
                var rmt2SamplerArgument = rmt2.SamplerArguments[rmt2SamplerIndex];
                var name     = rmt2SamplerArgument.Name;
                var name_str = CacheContext.GetString(name);
                var shaderSamplerArgument = new RenderMethod.ShaderProperty.ShaderMap();
                {
                    foreach (var importData in shaderCortana.ImportData)
                    {
                        if (importData.Type != RenderMethodOption.OptionBlock.OptionDataType.Sampler)
                        {
                            continue;
                        }
                        if (importData.Name.Index != name.Index)
                        {
                            continue;
                        }

                        if (importData.Bitmap != null)
                        {
                            shaderSamplerArgument.Bitmap = importData.Bitmap;
                            goto datafound;
                        }
                    }

                    foreach (var deafult_option in templateOptions)
                    {
                        if (deafult_option.Type != RenderMethodOption.OptionBlock.OptionDataType.Sampler)
                        {
                            continue;
                        }
                        if (deafult_option.Name.Index != name.Index)
                        {
                            continue;
                        }

                        shaderSamplerArgument.Bitmap = deafult_option.Bitmap;

                        goto datafound;
                    }

                    shaderSamplerArguments[rmt2SamplerIndex] = shaderSamplerArgument;

datafound:
                    if (shaderSamplerArgument.Bitmap == null)
                    {
                        Console.WriteLine($"WARNING: RMCT Conversion couldn't find a shader map for {name_str}");
                        shaderSamplerArgument.Bitmap = CacheContext.GetTag <Bitmap>(@"shaders\default_bitmaps\bitmaps\gray_50_percent");
                    }
                    shaderSamplerArguments[rmt2SamplerIndex] = shaderSamplerArgument;
                }

                {
                    int xform_index = GetExistingXFormArgumentIndex(name, rmt2.VectorArguments);
                    if (xform_index == -1)
                    {
                        Console.WriteLine($"WARNING: RMCT Conversion couldn't find a shader xform argument for {name_str}. Defaulting to 0");
                        xform_index = 0;
                    }
                    else
                    {
                        var shaderVectorArgument = ProcessArgument(rmt2SamplerArgument, shaderFunctions, templateOptions, shaderCortana);
                        shaderVectorArguments[xform_index] = shaderVectorArgument;
                    }
                    shaderSamplerArgument.XFormArgumentIndex = (sbyte)xform_index;
                }
            }
            shader_properties.ShaderMaps = shaderSamplerArguments.ToList();

            for (int rmt2ArgumentIndex = 0; rmt2ArgumentIndex < rmt2.VectorArguments.Count; rmt2ArgumentIndex++)
            {
                if (shaderVectorArguments[rmt2ArgumentIndex] != null)
                {
                    continue;
                }
                var vectorArgument = rmt2.VectorArguments[rmt2ArgumentIndex];

                var shaderArgument = ProcessArgument(vectorArgument, shaderFunctions, templateOptions, shaderCortana);
                shaderVectorArguments[rmt2ArgumentIndex] = shaderArgument;
            }
            shader_properties.Arguments           = shaderVectorArguments.ToList();
            shader_properties.AnimationProperties = shaderFunctions;

            if (shaderCortana.Material.Index == 0)
            {
                if (CacheContext.StringIdCache.Contains("default_material"))
                {
                    shaderCortana.Material = CacheContext.StringIdCache.GetStringId("default_material");
                }
            }

            //shader_cortana.Material = shader.Material;

            //ho_cortana_shader.BaseRenderMethod = shader.BaseRenderMethod;
            //newCortanaShaderInstance.Name = blamTag.Name;
            //CacheContext.Serialize(new TagSerializationContext(cacheStream, CacheContext, newCortanaShaderInstance), ho_cortana_shader);
            //CacheContext.SaveTagNames();
        }
Example #2
0
        private RenderMethod.ShaderProperty.Argument ProcessArgument(
            RenderMethodTemplate.ShaderArgument vectorArgument,
            List <RenderMethod.AnimationPropertiesBlock> shaderFunctions,
            List <RenderMethodOption.OptionBlock> templateOptions,
            ShaderCortana shaderCortana)
        {
            RenderMethod.ShaderProperty.Argument shaderArgument = new RenderMethod.ShaderProperty.Argument();

            var name    = vectorArgument.Name;
            var nameStr = CacheContext.GetString(name);

            foreach (var importData in shaderCortana.ImportData)
            {
                if (importData.Name.Index != name.Index)
                {
                    continue;
                }

                var argument_data = importData.AnimationProperties.Count > 0 ? importData.AnimationProperties[0].Function.Data : null;
                if (argument_data != null)
                {
                    var unknown0A = BitConverter.ToUInt16(argument_data, 0);
                    var unknown0B = BitConverter.ToUInt16(argument_data, 2);

                    var unknown1 = BitConverter.ToUInt32(argument_data, 20);
                    var unknown2 = BitConverter.ToUInt32(argument_data, 24);
                    var unknown3 = BitConverter.ToUInt32(argument_data, 28);

                    switch (importData.Type)
                    {
                    case RenderMethodOption.OptionBlock.OptionDataType.Sampler:
                        shaderArgument.Arg0 = BitConverter.ToSingle(argument_data, 4);
                        shaderArgument.Arg1 = BitConverter.ToSingle(argument_data, 8);
                        shaderArgument.Arg2 = BitConverter.ToSingle(argument_data, 12);
                        shaderArgument.Arg3 = BitConverter.ToSingle(argument_data, 16);
                        break;

                    case RenderMethodOption.OptionBlock.OptionDataType.Float4:
                        shaderArgument.Arg0 = BitConverter.ToSingle(argument_data, 4);
                        shaderArgument.Arg1 = BitConverter.ToSingle(argument_data, 8);
                        shaderArgument.Arg2 = BitConverter.ToSingle(argument_data, 12);
                        shaderArgument.Arg3 = BitConverter.ToSingle(argument_data, 16);
                        break;

                    case RenderMethodOption.OptionBlock.OptionDataType.Float:
                        shaderArgument.Arg0 = BitConverter.ToSingle(argument_data, 4);
                        shaderArgument.Arg1 = BitConverter.ToSingle(argument_data, 4);
                        shaderArgument.Arg2 = BitConverter.ToSingle(argument_data, 4);
                        shaderArgument.Arg3 = BitConverter.ToSingle(argument_data, 4);
                        break;

                    case RenderMethodOption.OptionBlock.OptionDataType.IntegerColor:
                    {
                        var iblue        = argument_data[4];
                        var igreen       = argument_data[5];
                        var ired         = argument_data[6];
                        var iunusedAlpha = argument_data[7];

                        var blue        = (float)iblue / 255.0f;
                        var green       = (float)igreen / 255.0f;
                        var red         = (float)ired / 255.0f;
                        var unusedAlpha = (float)iunusedAlpha / 255.0f;

                        var ialpha = argument_data[16];
                        var alpha  = (float)ialpha / 255.0f;

                        shaderArgument.Arg0 = red;
                        shaderArgument.Arg1 = green;
                        shaderArgument.Arg2 = blue;
                        shaderArgument.Arg3 = alpha;
                    }
                    break;

                    default:
                        throw new NotImplementedException();
                    }
                }
                else
                {
                    // default arguments
                    switch (importData.Type)
                    {
                    case RenderMethodOption.OptionBlock.OptionDataType.Sampler:
                        shaderArgument.Arg0 = 1.0f;
                        shaderArgument.Arg1 = 1.0f;
                        shaderArgument.Arg2 = 0.0f;
                        shaderArgument.Arg3 = 0.0f;
                        break;
                    }
                }

                for (int functionIndex = 1; functionIndex < importData.AnimationProperties.Count; functionIndex++)
                {
                    shaderFunctions.Add(importData.AnimationProperties[functionIndex]);
                }

                goto datafound;
            }

            foreach (var deafult_option in templateOptions)
            {
                if (deafult_option.Name.Index != name.Index)
                {
                    continue;
                }

                //TODO: Figure these bad boys out, I think its all just defaults but we should just
                // throw a warning if they're not part of the RMDF
                // (Don't throw warnings if we're using a custom shader RMDF

                goto datafound;
            }

            //TODO: Maybe we can do better than this, ie. custom shaders
            Console.WriteLine($"WARNING: RMCT Conversion couldn't find a argument for {nameStr}");
datafound:

            return(shaderArgument);
        }
Example #3
0
        public RenderMethod.ShaderProperty.Argument DefaultArgumentsValues(string arg)
        {
            var res = new RenderMethod.ShaderProperty.Argument();
            var val = new float[4];

            switch (arg)
            {
            // Default argument values based on how frequently they appear in shaders, so I assumed it as an average argument value.
            case "transparence_normal_bias": val = new float[] { -1f, -1f, -1f, -1f }; break;

            case "warp_amount": val = new float[] { 0.005f, 0.005f, 0.005f, 0.005f }; break;

            case "area_specular_coefficient": val = new float[] { 0.01f, 0.01f, 0.01f, 0.01f }; break;

            case "sunspot_cut": val = new float[] { 0.01f, 0.01f, 0.01f, 0.01f }; break;

            case "antialias_tweak": val = new float[] { 0.025f, 0.025f, 0.025f, 0.025f }; break;

            case "height_scale": val = new float[] { 0.02f, 0.02f, 0.02f, 0.02f }; break;

            case "water_color_pure": val = new float[] { 0.03529412f, 0.1333333f, 0.1294118f, 1f }; break;

            case "analytical_specular_coefficient": val = new float[] { 0.03f, 0.03f, 0.03f, 0.03f }; break;

            case "animation_amplitude_horizontal": val = new float[] { 0.04f, 0.04f, 0.04f, 0.04f }; break;

            case "water_diffuse": val = new float[] { 0.05490196f, 0.08627451f, 0.09803922f, 1f }; break;

            case "displacement_range_y": val = new float[] { 0.07f, 0.07f, 0.07f, 0.07f }; break;

            case "refraction_texcoord_shift": val = new float[] { 0.12f, 0.12f, 0.12f, 0.12f }; break;

            case "meter_color_on": val = new float[] { 0.1333333f, 1f, 0.1686275f, 1f }; break;

            case "displacement_range_x": val = new float[] { 0.14f, 0.14f, 0.14f, 0.14f }; break;

            case "displacement_range_z": val = new float[] { 0.14f, 0.14f, 0.14f, 0.14f }; break;

            case "specular_tint_m_2": val = new float[] { 0.1764706f, 0.1372549f, 0.09411766f, 1f }; break;

            case "color_sharp": val = new float[] { 0.2156863f, 0.6745098f, 1f, 1f }; break;

            case "self_illum_heat_color": val = new float[] { 0.2392157f, 0.6470588f, 1f, 1f }; break;

            case "fresnel_coefficient": val = new float[] { 0.25f, 0.25f, 0.25f, 0.25f }; break;

            case "channel_b": val = new float[] { 0.2784314f, 0.04705883f, 0.04705883f, 2.411765f }; break;

            case "bankalpha_infuence_depth": val = new float[] { 0.27f, 0.27f, 0.27f, 0.27f }; break;

            case "roughness": val = new float[] { 0.27f, 0.27f, 0.27f, 0.27f }; break;

            case "rim_tint": val = new float[] { 0.3215686f, 0.3843138f, 0.5450981f, 1f }; break;

            case "chameleon_color1": val = new float[] { 0.3254902f, 0.2745098f, 0.8431373f, 1f }; break;

            case "chameleon_color_offset1": val = new float[] { 0.3333f, 0.3333f, 0.3333f, 0.3333f }; break;

            case "watercolor_coefficient": val = new float[] { 0.35f, 0.35f, 0.35f, 0.35f }; break;

            case "detail_slope_steepness": val = new float[] { 0.3f, 0.3f, 0.3f, 0.3f }; break;

            case "layer_depth": val = new float[] { 0.3f, 0.3f, 0.3f, 0.3f }; break;

            case "transparence_coefficient": val = new float[] { 0.3f, 0.3f, 0.3f, 0.3f }; break;

            case "wave_height_aux": val = new float[] { 0.3f, 0.3f, 0.3f, 0.3f }; break;

            case "environment_specular_contribution_m_2": val = new float[] { 0.4f, 0.4f, 0.4f, 0.4f }; break;

            case "rim_start": val = new float[] { 0.4f, 0.4f, 0.4f, 0.4f }; break;

            case "fresnel_color": val = new float[] { 0.5019608f, 0.5019608f, 0.5019608f, 1f }; break;

            case "fresnel_color_environment": val = new float[] { 0.5019608f, 0.5019608f, 0.5019608f, 1f }; break;

            case "channel_c": val = new float[] { 0.5490196f, 0.8588236f, 1f, 8f }; break;

            case "chameleon_color3": val = new float[] { 0.5529412f, 0.7137255f, 0.572549f, 1f }; break;

            case "chameleon_color0": val = new float[] { 0.627451f, 0.3098039f, 0.7803922f, 1f }; break;

            case "chameleon_color_offset2": val = new float[] { 0.6666f, 0.6666f, 0.6666f, 0.6666f }; break;

            case "subsurface_propagation_bias": val = new float[] { 0.66f, 0.66f, 0.66f, 0.66f }; break;

            case "add_color": val = new float[] { 0.6f, 0.6f, 0.6f, 0f }; break;

            case "wave_slope_array": val = new float[] { 0.7773f, 1.3237f, 0f, 0f }; break;

            case "detail_map_a": val = new float[] { 0.8140022f, 1.628004f, 43.13726f, 12.31073f }; break;

            case "slope_range_y": val = new float[] { 0.84f, 0.84f, 0.84f, 0.84f }; break;

            case "transparence_tint": val = new float[] { 0.8705883f, 0.8470589f, 0.6941177f, 1f }; break;

            case "channel_a": val = new float[] { 0.9254903f, 0.4862745f, 0.01960784f, 2.147059f }; break;

            case "subsurface_coefficient": val = new float[] { 0.9f, 0.9f, 0.9f, 0.9f }; break;

            case "color_medium": val = new float[] { 0f, 0f, 0f, 1f }; break;

            case "color_wide": val = new float[] { 0f, 0f, 0f, 1f }; break;

            case "edge_fade_edge_tint": val = new float[] { 0f, 0f, 0f, 1f }; break;

            case "meter_color_off": val = new float[] { 0f, 0f, 0f, 1f }; break;

            case "slope_range_x": val = new float[] { 1.39f, 1.39f, 1.39f, 1.39f }; break;

            case "wave_displacement_array": val = new float[] { 1.7779f, 1.7779f, 0f, 0f }; break;

            case "foam_texture_detail": val = new float[] { 1.97f, 1.377f, 1f, 0f }; break;

            case "vector_sharpness": val = new float[] { 1000f, 1000f, 1000f, 1000f }; break;

            case "detail_map_m_2": val = new float[] { 100f, 100f, 0f, 0f }; break;

            case "warp_map": val = new float[] { 8f, 5f, 0f, 0f }; break;

            case "water_murkiness": val = new float[] { 12f, 12f, 12f, 12f }; break;

            case "base_map_m_3": val = new float[] { 15f, 30f, 0f, 0f }; break;

            case "thinness_medium": val = new float[] { 16f, 16f, 16f, 16f }; break;

            case "chameleon_color2": val = new float[] { 1f, 1f, 0.5843138f, 1f }; break;

            case "specular_power": val = new float[] { 25f, 25f, 25f, 25f }; break;

            case "reflection_coefficient": val = new float[] { 30f, 30f, 30f, 30f }; break;

            case "refraction_extinct_distance": val = new float[] { 30f, 30f, 30f, 30f }; break;

            case "thinness_sharp": val = new float[] { 32f, 32f, 32f, 32f }; break;

            case "detail_multiplier_a": val = new float[] { 4.59479f, 4.59479f, 4.59479f, 4.59479f }; break;

            case "detail_map3": val = new float[] { 6.05f, 6.05f, 0.6f, 0f }; break;

            case "foam_texture": val = new float[] { 5f, 4f, 1f, 1f }; break;

            case "ambient_coefficient":
            case "area_specular_contribution_m_0":
            case "area_specular_contribution_m_2":
            case "area_specular_contribution_m_3":
            case "depth_fade_range":
            case "foam_height": val = new float[] { 0.1f, 0.1f, 0.1f, 0.1f }; break;

            case "area_specular_contribution_m_1":
            case "detail_fade_a":
            case "globalshape_infuence_depth":
            case "minimal_wave_disturbance": val = new float[] { 0.2f, 0.2f, 0.2f, 0.2f }; break;

            case "analytical_specular_contribution":
            case "analytical_specular_contribution_m_0":
            case "analytical_specular_contribution_m_1":
            case "analytical_specular_contribution_m_2":
            case "analytical_specular_contribution_m_3":
            case "rim_coefficient":
            case "shadow_intensity_mark":
            case "wave_height": val = new float[] { 0.5f, 0.5f, 0.5f, 0.5f }; break;

            case "glancing_specular_power":
            case "normal_specular_power":
            case "specular_power_m_0":
            case "specular_power_m_1":
            case "specular_power_m_2":
            case "specular_power_m_3": val = new float[] { 10f, 10f, 10f, 10f }; break;

            case "choppiness_forward":
            case "distortion_scale":
            case "foam_pow":
            case "global_shape":
            case "rim_fresnel_power":
            case "choppiness_backward":
            case "choppiness_side":
            case "detail_slope_scale_z":
            case "self_illum_intensity": val = new float[] { 3f, 3f, 3f, 3f }; break;

            case "layer_contrast":
            case "layers_of_4":
            case "thinness_wide": val = new float[] { 4f, 4f, 4f, 4f }; break;

            case "fresnel_curve_steepness":
            case "fresnel_curve_steepness_m_0":
            case "fresnel_curve_steepness_m_1":
            case "fresnel_curve_steepness_m_2":
            case "fresnel_curve_steepness_m_3": val = new float[] { 5f, 5f, 5f, 5f }; break;

            case "blend_mode":
            case "detail_slope_scale_x":
            case "detail_slope_scale_y":
            case "rim_power":
            case "wave_visual_damping_distance": val = new float[] { 8f, 8f, 8f, 8f }; break;

            case "bump_map_m_0":
            case "bump_map_m_2":
            case "bump_map_m_3": val = new float[] { 50f, 50f, 0f, 0f }; break;

            case "albedo":
            case "albedo_blend":
            case "albedo_blend_with_specular_tint":
            case "albedo_specular_tint_blend":
            case "albedo_specular_tint_blend_m_0":
            case "albedo_specular_tint_blend_m_1":
            case "albedo_specular_tint_blend_m_2":
            case "albedo_specular_tint_blend_m_3":
            case "analytical_anti_shadow_control":
            case "area_specular_contribution":
            case "environment_map_coefficient":
            case "environment_specular_contribution_m_0":
            case "environment_specular_contribution_m_1":
            case "environment_specular_contribution_m_3":
            case "fog":
            case "frame_blend":
            case "fresnel_curve_bias":
            case "invert_mask":
            case "lighting":
            case "meter_value":
            case "no_dynamic_lights":
            case "order3_area_specular":
            case "primary_change_color_blend":
            case "refraction_depth_dominant_ratio":
            case "rim_fresnel_albedo_blend":
            case "rim_fresnel_coefficient":
            case "rim_maps_transition_ratio":
            case "self_illumination":
            case "specialized_rendering":
            case "subsurface_normal_detail":
            case "time_warp":
            case "time_warp_aux":
            case "use_fresnel_color_environment":
            case "warp_amount_x":
            case "warp_amount_y":
            case "waveshape": val = new float[] { 0f, 0f, 0f, 0f }; break;

            case "alpha_map":
            case "alpha_mask_map":
            case "alpha_test_map":
            case "base_map":
            case "base_map_m_0":
            case "base_map_m_1":
            case "base_map_m_2":
            case "blend_map":
            case "bump_detail_map":
            case "bump_detail_mask_map":
            case "bump_map":
            case "bump_map_m_1":
            case "chameleon_mask_map":
            case "change_color_map":
            case "color_mask_map":
            case "detail_bump_m_0":
            case "detail_bump_m_1":
            case "detail_bump_m_2":
            case "detail_bump_m_3":
            case "detail_map":
            case "detail_map2":
            case "detail_map_m_0":
            case "detail_map_m_1":
            case "detail_map_m_3":
            case "detail_map_overlay":
            case "detail_mask_a":
            case "height_map":
            case "material_texture":
            case "meter_map":
            case "multiply_map":
            case "noise_map_a":
            case "noise_map_b":
            case "overlay_detail_map":
            case "overlay_map":
            case "overlay_multiply_map":
            case "self_illum_detail_map":
            case "self_illum_map":
            case "specular_mask_texture": val = new float[] { 1f, 1f, 0f, 0f }; break;

            case "albedo_color":
            case "albedo_color2":
            case "albedo_color3":
            case "ambient_tint":
            case "bump_detail_coefficient":
            case "chameleon_fresnel_power":
            case "depth_darken":
            case "diffuse_coefficient":
            case "diffuse_coefficient_m_0":
            case "diffuse_coefficient_m_1":
            case "diffuse_coefficient_m_2":
            case "diffuse_coefficient_m_3":
            case "diffuse_tint":
            case "edge_fade_center_tint":
            case "edge_fade_power":
            case "ending_uv_scale":
            case "env_roughness_scale":
            case "env_tint_color":
            case "environment_map_specular_contribution":
            case "environment_map_tint":
            case "final_tint":
            case "fresnel_power":
            case "glancing_specular_tint":
            case "global_albedo_tint":
            case "intensity":
            case "modulation_factor":
            case "neutral_gray":
            case "normal_specular_tint":
            case "overlay_intensity":
            case "overlay_tint":
            case "rim_fresnel_color":
            case "self_illum_color":
            case "specular_tint":
            case "specular_tint_m_0":
            case "specular_tint_m_1":
            case "specular_tint_m_3":
            case "starting_uv_scale":
            case "subsurface_tint":
            case "texcoord_aspect_ratio":
            case "tint_color":
            case "transparence_normal_detail":
            case "u_tiles":
            case "v_tiles": val = new float[] { 1f, 1f, 1f, 1f }; break;

            case "specular_coefficient":
            case "specular_coefficient_m_0":
            case "specular_coefficient_m_1":
            case "specular_coefficient_m_2":
            case "specular_coefficient_m_3": val = new float[] { 0, 0, 0, 0 }; break;

            default: val = new float[] { 0, 0, 0, 0 }; break;
            }

            res.Values = val;

            return(res);
        }