示例#1
0
 /*! NIFLIB_HIDDEN function.  For internal use only. */
 internal MaterialWrapper(NiMaterialProperty mat, NiTexturingProperty texing, NiTextureProperty tex, NiMultiTextureProperty multi, NiSpecularProperty spec, NiAlphaProperty alpha, NiStencilProperty stencil, MatTexCollection creator)
 {
     mat_prop     = mat;
     texing_prop  = texing;
     tex_prop     = tex;
     multi_prop   = multi;
     spec_prop    = spec;
     alpha_prop   = alpha;
     stencil_prop = stencil;
     _creator     = creator;
 }
示例#2
0
        /*
         * Creates a new material and adds it to the end of the array of materials
         * contained in this collection.  The type of material data that will
         * appear in the new material must be specified, and a version number can be
         * used to determine how the data will be stored in the eventual NIF file.
         * Note that the multi_tex option is only a suggestion, as later NIF versions
         * combine the texture and multi-texture data into one NIF object.
         * \param[in] color Whether or not to include color data in the new
         * material.
         * \param[in] texture Whether or not to include base texture data in the
         * new material.
         * \param[in] multi_tex Whether or not to include multi-texture data in the
         * new material.
         * \param[in] multi_tex Whether or not to include multi-texture data in the
         * new material.  This is only a suggestion as some NIF versions cannot
         * separate this from base texture information.
         * \param[in] specular Whether or not to include specular lighting data in
         * the new material.
         * \param[in] translucenty Whether or not to include alpha translucenty
         * data in the new material.
         * \param[in] version The NIF version to target when creating the underlying NIF
         * objects that store the requested types of data.
         * \return The index of the newly created material.
         */
        public uint CreateMaterial(bool color, bool texture, bool multi_tex, bool specular, bool translucency, uint version)
        {
            //Make sure at least one option is set to true
            if (!color && !texture && !multi_tex && !specular && !translucency)
            {
                throw new Exception("At least one of the types of texture/material info needs to be stored in a new material.  All the argumetns to MatTexCollection::CreateMaterial cannot be false.");
            }

            NiMaterialProperty     mat     = null;
            NiTexturingProperty    texing  = null;
            NiTextureProperty      tex     = null;
            NiMultiTextureProperty multi   = null;
            NiSpecularProperty     spec    = null;
            NiAlphaProperty        alpha   = null;
            NiStencilProperty      stencil = null;

            if (color)
            {
                mat = new NiMaterialProperty();
            }
            if (specular)
            {
                spec = new NiSpecularProperty();
            }
            if (translucency)
            {
                alpha = new NiAlphaProperty();
            }
            if (version < Nif.VER_3_3_0_13)
            {
                //Old texturing property style
                if (texture)
                {
                    tex = new NiTextureProperty();
                }
                if (multi_tex)
                {
                    multi = new NiMultiTextureProperty();
                }
            }
            //New texturing property style
            else if (texture)
            {
                texing = new NiTexturingProperty();
            }

            //Create Material and add it to the array
            materials.Add(new MaterialWrapper(mat, texing, tex, multi, spec, alpha, stencil, this));

            //Return the index of the newly created material
            return(materials.Length - 1);
        }
示例#3
0
        /*
         * Retrieves the material index of the material that matches the given list
         * of properties, if any.
         * \param[in] properties An unsorted list of properties that is thought to contain some related to materials.
         * \return The index of the material that matches the given properties,
         * or NO_MATERIAL if no match is found.
         */
        public uint GetMaterialIndex(NiProperty[] properties)
        {
            //Get Material and Texturing properties, if any
            NiMaterialProperty     mat     = null;
            NiTexturingProperty    texing  = null;
            NiTextureProperty      tex     = null;
            NiMultiTextureProperty multi   = null;
            NiSpecularProperty     spec    = null;
            NiAlphaProperty        alpha   = null;
            NiStencilProperty      stencil = null;

            for (var i = 0; i < properties.Length; ++i)
            {
                if (properties[i] == null)
                {
                    continue;
                }
                if (properties[i].IsDerivedType(NiMaterialProperty.TYPE))
                {
                    mat = (NiMaterialProperty)properties[i];
                }
                else if (properties[i].IsDerivedType(NiTexturingProperty.TYPE))
                {
                    texing = (NiTexturingProperty)properties[i];
                }
                else if (properties[i].IsDerivedType(NiTextureProperty.TYPE))
                {
                    tex = (NiTextureProperty)properties[i];
                }
                else if (properties[i].IsDerivedType(NiMultiTextureProperty.TYPE))
                {
                    multi = (NiMultiTextureProperty)properties[i];
                }
                else if (properties[i].IsDerivedType(NiSpecularProperty.TYPE))
                {
                    spec = (NiSpecularProperty)properties[i];
                }
                else if (properties[i].IsDerivedType(NiAlphaProperty.TYPE))
                {
                    alpha = (NiAlphaProperty)properties[i];
                }
                else if (properties[i].IsDerivedType(NiStencilProperty.TYPE))
                {
                    stencil = (NiStencilProperty)properties[i];
                }
            }
            //Do the search
            return(GetMaterialIndex(mat, texing, tex, multi, spec, alpha, stencil));
        }
示例#4
0
 /*
  * Retrieves the material index of the material that matches the given list
  * of properties, if any.
  * \param[in] mat The NiMaterialProperty to match.
  * \param[in] texing The NiTexturingProperty to match.
  * \param[in] tex The NiTextureProperty to match.
  * \param[in] multi The NiMultiTextureProperty to match.
  * \return The index of the material that matches the specified properties,
  * or NO_MATERIAL if no match is found.
  */
 public uint GetMaterialIndex(NiMaterialProperty mat, NiTexturingProperty texing, NiTextureProperty tex, NiMultiTextureProperty multi, NiSpecularProperty spec, NiAlphaProperty alpha, NiStencilProperty stencil)
 {
     for (var i = 0; i < materials.Length; ++i)
     {
         if (materials[i].mat_prop == mat &&
             materials[i].texing_prop == texing &&
             materials[i].tex_prop == tex &&
             materials[i].multi_prop == multi &&
             materials[i].spec_prop == spec &&
             materials[i].alpha_prop == alpha &&
             materials[i].stencil_prop == stencil)
         {
             //Match found, return its index
             return(i);
         }
     }
     //No match was found, return NO_MATERIAL
     return(NO_MATERIAL);
 }
示例#5
0
        private void printTexture(NiTexturingProperty texture)
        {
            NiSourceTexture source = texture.File.ObjectsByRef.Where(o => o.Key == texture.BaseTexture.Source.RefId).First().Value as NiSourceTexture;

            string fileName = source.FileName.ToString().ToLower();

            string offset = string.Format("-o {0} {1}", texture.BaseTexture.CenterOffset.X, texture.BaseTexture.CenterOffset.Y);

            mtlExport.Add("# original file " + fileName);
            mtlExport.Add(string.Format("map_Ka {0}.tga", Path.GetFileNameWithoutExtension(fileName), offset));
            mtlExport.Add(string.Format("map_Kd {0}.tga", Path.GetFileNameWithoutExtension(fileName), offset));
            //mtlExport.Add(string.Format("map_Ks {0}.tga", Path.GetFileNameWithoutExtension(fileName), offset));
            textures.Add(fileName);

            if (texture.BumpMapTexture != null)
            {
                NiSourceTexture bumbTexture = texture.File.ObjectsByRef.Where(o => o.Key == texture.BumpMapTexture.Source.RefId).First().Value as NiSourceTexture;
                mtlExport.Add(string.Format("map_bump {0}.tga", Path.GetFileNameWithoutExtension(bumbTexture.FileName.ToString().ToLower())));
                textures.Add(bumbTexture.FileName.ToString());
            }
        }
示例#6
0
        private string printMaterial(NiMaterialProperty material, NiTexturingProperty texture)
        {
            if (mtlExport.Count > 0) mtlExport.Add(Environment.NewLine);

            string name = material.Name.ToString();

            mtlExport.Add("newmtl " + name);

            // Ambient Color
            mtlExport.Add(string.Format("Ka {0} {1} {2}", material.AmbientColor.Red, material.AmbientColor.Green, material.AmbientColor.Blue));
            // Diffuse Color
            mtlExport.Add(string.Format("Kd {0} {1} {2}", material.DiffuseColor.Red, material.DiffuseColor.Green, material.DiffuseColor.Blue));
            // Specular Color
            mtlExport.Add(string.Format("Ks {0} {1} {2}", material.SpecularColor.Red, material.SpecularColor.Green, material.SpecularColor.Blue));
            // Transparency
            mtlExport.Add(string.Format("d {0}", material.Alpha));
            //mtlExport.Add(string.Format("Tr {0}", material.Alpha));

            printTexture(texture);

            string export = "# Material" + Environment.NewLine;
            export += "usemtl " + name + Environment.NewLine;
            return export;
        }