private RenderMethod.ShaderProperty.RealConstant ProcessArgument( RenderMethodTemplate.ShaderArgument vectorArgument, List <RenderMethod.ShaderFunction> shaderFunctions, List <RenderMethodOption.OptionBlock> templateOptions, ShaderCortana shaderCortana) { RenderMethod.ShaderProperty.RealConstant shaderArgument = new RenderMethod.ShaderProperty.RealConstant(); var name = vectorArgument.Name; var nameStr = CacheContext.StringTable.GetString(name); foreach (var importData in shaderCortana.ImportData) { if (importData.Name != name) { continue; } var argument_data = importData.Functions.Count > 0 ? importData.Functions[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.Functions.Count; functionIndex++) { shaderFunctions.Add(importData.Functions[functionIndex]); } goto datafound; } foreach (var deafult_option in templateOptions) { if (deafult_option.Name != name) { 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); }
public RenderMethod.ShaderProperty.RealConstant DefaultArgumentsValues(string arg) { var res = new RenderMethod.ShaderProperty.RealConstant(); 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); }
private void ConvertShaderCortana(ShaderCortana shaderCortana, Stream cacheStream, Stream blamCacheStream, Dictionary <ResourceLocation, Stream> resourceStreams) { var render_method_option_indices = shaderCortana.RenderMethodDefinitionOptionIndices.Select(c => (int)c.OptionIndex).ToList(); //CachedTag 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>(cacheStream, 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.TextureConstants = new List <RenderMethod.ShaderProperty.TextureConstant>(); shader_properties.RealConstants = new List <RenderMethod.ShaderProperty.RealConstant>(); shader_properties.IntegerConstants = new List <uint>(); shader_properties.EntryPoints = new List <RenderMethodTemplate.PackedInteger_10_6>(); shader_properties.ParameterTables = new List <RenderMethod.ShaderProperty.ParameterTable>(); shader_properties.Parameters = new List <RenderMethod.ShaderProperty.ParameterMapping>(); shader_properties.Functions = new List <RenderMethod.ShaderFunction>(); 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>(cacheStream, rmop_instance); templateOptions.AddRange(rmop.Options); } } RenderMethodTemplate rmt2 = null; if (shader_properties.Template == null) { GenerateCortanaRMT2Tag( render_method_option_indices, cacheStream, resourceStreams, out CachedTag rmt2Instance, out RenderMethodTemplate newRMT2); shader_properties.Template = rmt2Instance; rmt2 = newRMT2; } else { rmt2 = CacheContext.Deserialize <RenderMethodTemplate>(cacheStream, shader_properties.Template); } //shader_properties.DrawModes = rmt2.DrawModes; var shaderFunctions = new List <RenderMethod.ShaderFunction>(); var shaderVectorArguments = new RenderMethod.ShaderProperty.RealConstant[rmt2.RealParameterNames.Count]; var shaderSamplerArguments = new RenderMethod.ShaderProperty.TextureConstant[rmt2.TextureParameterNames.Count]; for (int rmt2SamplerIndex = 0; rmt2SamplerIndex < rmt2.TextureParameterNames.Count; rmt2SamplerIndex++) { var rmt2SamplerArgument = rmt2.TextureParameterNames[rmt2SamplerIndex]; var name = rmt2SamplerArgument.Name; var name_str = CacheContext.StringTable.GetString(name); var shaderSamplerArgument = new RenderMethod.ShaderProperty.TextureConstant(); { foreach (var importData in shaderCortana.ImportData) { if (importData.Type != RenderMethodOption.OptionBlock.OptionDataType.Sampler) { continue; } if (importData.Name != name) { 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 != name) { 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.RealParameterNames); 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.TextureConstants = shaderSamplerArguments.ToList(); for (int rmt2ArgumentIndex = 0; rmt2ArgumentIndex < rmt2.RealParameterNames.Count; rmt2ArgumentIndex++) { if (shaderVectorArguments[rmt2ArgumentIndex] != null) { continue; } var vectorArgument = rmt2.RealParameterNames[rmt2ArgumentIndex]; var shaderArgument = ProcessArgument(vectorArgument, shaderFunctions, templateOptions, shaderCortana); shaderVectorArguments[rmt2ArgumentIndex] = shaderArgument; } shader_properties.RealConstants = shaderVectorArguments.ToList(); shader_properties.Functions = shaderFunctions; if (shaderCortana.Material == StringId.Invalid) { if (CacheContext.StringTable.Contains("default_material")) { shaderCortana.Material = CacheContext.StringTable.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(); }