/// <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);
        }