/// <summary> /// Creates a DatumIndex list of the bitmaps used in a shader /// </summary> /// <param name="shader_datum"></param> /// <returns></returns> protected override List <DatumIndex> GetShaderBitmaps(DatumIndex shader_datum) { List <DatumIndex> bitmap_datums = new List <DatumIndex>(); if (!IsDatumValid(shader_datum)) { return(bitmap_datums); } Managers.TagManager shader_man = tagIndex[shader_datum]; H2.Tags.shader_group shader = shader_man.TagDefinition as H2.Tags.shader_group; H2.Tags.global_shader_parameter_block block; if ((block = FindParameter(shader, "base_map")) != null && IsDatumValid(block.Bitmap.Datum)) { bitmap_datums.Add(block.Bitmap.Datum); } if ((block = FindParameter(shader, "alpha_test_map")) != null && IsDatumValid(block.Bitmap.Datum)) { bitmap_datums.Add(block.Bitmap.Datum); } return(bitmap_datums); }
/// <summary> /// Searches a shader for a specific parameter by name /// </summary> /// <param name="shader">The shader to search in</param> /// <param name="parameter_name">The name of the parameter to find</param> /// <returns></returns> H2.Tags.global_shader_parameter_block FindParameter(H2.Tags.shader_group shader, string parameter_name) { foreach (var block in shader.Parameters) { if (block.Name.ToString().Equals(parameter_name)) { return(block); } } return(null); }
/// <summary> /// Creates a phong definition using values from a shader tag /// </summary> /// <param name="shader_datum">DatumIndex of the shader to create a phong definition from</param> /// <returns></returns> protected override Fx.ColladaPhong CreatePhong(DatumIndex shader_datum) { Managers.TagManager shader_man = tagIndex[shader_datum]; // get the shader tag definition H2.Tags.shader_group shader = GetTagDefinition <H2.Tags.shader_group>( shader_datum, shader_man.GroupTag, Blam.Halo1.TagGroups.shdr); Fx.ColladaPhong phong = CreateDefaultPhong(); H2.Tags.global_shader_parameter_block block; phong.Diffuse.Color.SetColor(1, 1, 1, 1); phong.Shininess.Float.Value = 30.0f; // set up the effects variables with those from the shader if ((block = FindParameter(shader, "emissive_color")) != null) { phong.Emission = new Fx.ColladaCommonColorOrTextureType(); phong.Emission.Color = new Core.ColladaColor(block.ConstColor, 1.0f); } if ((block = FindParameter(shader, "base_map")) != null && IsDatumValid(block.Bitmap.Datum)) { phong.Diffuse.Color = null; phong.Diffuse.Texture = CreateTexture(block.Bitmap.Datum, 0); } else if ((block = FindParameter(shader, "diffuse_color")) != null) { phong.Diffuse.Color.SetColor(block.ConstColor, 1.0f); } if ((block = FindParameter(shader, "specular_color")) != null) { phong.Specular.Color.SetColor(block.ConstColor, 1.0f); } if ((block = FindParameter(shader, "alpha_test_map")) != null && IsDatumValid(block.Bitmap.Datum)) { phong.Transparent.Color = null; phong.Transparent.Texture = CreateTexture(block.Bitmap.Datum, 0); phong.Transparent.Opaque = Enums.ColladaFXOpaqueEnum.A_ONE; } return(phong); }