Beispiel #1
0
        // 2つのマテリアルが等しいか判定する
        public bool EqualMaterials(PMD_Material m1, PMD_Material m2)
        {
            if (m1.flags != m2.flags)
            {
                return(false);
            }

            if (m1.tex_id != m2.tex_id)
            {
                return(false);
            }

            if (m1.tex_toon_id != m2.tex_toon_id)
            {
                return(false);
            }

            if (m1.edge_color != m2.edge_color)
            {
                return(false);
            }

            if (m1.edge_width != m2.edge_width)
            {
                return(false);
            }

            return(true);
        }
Beispiel #2
0
        // 2つのマテリアルが等しいか判定する
        public int EqualMaterial(PMD_Material m1, PMD_Material m2)
        {
            // edge_flag
            if (m1.edge_flag != m2.edge_flag)
            {
                return(-1);
            }

            // colorテクスチャ
            if (m1.szTextureFileName != m2.szTextureFileName)
            {
                return(-1);
            }

            // toonテクスチャ
            if (m1.toon_index != m2.toon_index)
            {
                return(-1);
            }

            return(0);
        }
Beispiel #3
0
        // TSOSubScriptを元にPMD_Materialを生成して追加する
        // 頂点インデックス数は後で設定する
        public void Add(int tso_num, int script_num, bool use_edge, string memo)
        {
            PMD_Material pmd_m = new PMD_Material();

            pmd_m.name = categories[tso_num] + " " + tsos[tso_num].sub_scripts[script_num].Name;

            // スクリプトよりシェーダパラメータを取得
            Shader shader = new Shader();

            shader.Load(tsos[tso_num].sub_scripts[script_num].lines);

            pmd_m.diffuse  = new Vector4(1.0f, 1.0f, 1.0f, 1.0f);
            pmd_m.specular = new Vector4(0.15f, 0.15f, 0.15f, 6.0f);
            pmd_m.ambient  = new Vector3(0.5f, 0.5f, 0.5f);

/*
 *          pmd_m.UseEdge = use_edge;
 *          pmd_m.UseShadow = use_edge;
 */
            foreach (ShaderParameter pm in shader.shader_parameters)
            {
                // エッジ色があれば、materialに設定する.
                if (pm.Name == "PenColor")
                {
                    pmd_m.edge_color = pm.GetFloat4();
                }
                // 輪郭線の太さを設定する.
                if (pm.Name == "Thickness")
                {
                    pmd_m.edge_width = pm.GetFloat() * 100F;
                    // MMDとカス子で挙動が違うので補正する
                    if (pmd_m.edge_width < 0F)
                    {
                        pmd_m.edge_width = 0F;
                    }
                    if (pmd_m.edge_width > 1F)
                    {
                        pmd_m.edge_width = 1F;
                    }
                }
                // エッジが出るtechniqueのみエッジをつける.
                if (use_edge)
                {
                    if (pm.Name == "technique")
                    {
                        // dictionaryを見て該当するならエッジをつける
                        if (edgelist.hasedge(pm.GetValueString()))
                        {
                            pmd_m.UseEdge = use_edge;
                        }
                        // 影は常に落とす
                        pmd_m.UseShadow = use_edge;
                    }
                }
            }

            pmd_m.memo += " " + memo;

            // 頂点インデックス数(後で設定する)
            pmd_m.vindices_count = 0;

            // colorテクスチャ
            pmd_m.tex_id = tex_list.GetBitmapID(tso_num, shader.ColorTexName);

            // toonテクスチャ
            pmd_m.tex_toon_id = tex_list.GetBitmapID(tso_num, shader.ShadeTexName);

            // スフィアマップを使う
            if (tex_list.use_spheremap)
            {
                pmd_m.tex_sphere_id = tex_list.GetSphereID(tso_num, shader.ShadeTexName);

                if (pmd_m.tex_sphere_id != -1)
                {
                    pmd_m.sphere_mode = 1;
                }
            }

            // 要素を追加
            materials.Add(pmd_m);
        }
Beispiel #4
0
        // TSOSubScriptより、PMD_Materialを生成する
        // (ただし、頂点インデックス数は0となっているため、後に設定する必要がある)
        public void Add(int tso_num, int script_num, bool edge, bool spheremap_flag)
        {
            PMD_Material pmd_m = new PMD_Material();

            // スクリプトよりシェーダパラメータを取得
            Shader shader = new Shader();

            shader.Load(TSOList[tso_num].sub_scripts[script_num].lines);

            pmd_m.col4Diffuse  = new MmdColor4(1.0f, 1.0f, 1.0f, 1.0f);
            pmd_m.fShininess   = 6.0f;
            pmd_m.col3Specular = new MmdColor3(0.15f, 0.15f, 0.15f);
            pmd_m.col3Ambient  = new MmdColor3(0.5f, 0.5f, 0.5f);

            if (edge == true)
            {
                pmd_m.edge_flag = 1;
            }
            else
            {
                pmd_m.edge_flag = 0;
            }

            // 頂点インデックス数(0となっているため、後に設定する必要がある)
            pmd_m.ulNumIndices = 0;

            // colorテクスチャ
            pmd_m.szTextureFileName = tex_list.GetFileName(tso_num, shader.ColorTexName);

            // toonテクスチャ
            string toon_file = tex_list.GetFileName(tso_num, shader.ShadeTexName);

            if (toon_file != null) // 存在しないtoonテクスチャを参照しているパーツがあるのでこれを確認
            {
                if (toon_name_list.IndexOf(toon_file) != -1)
                {
                    // toonテクスチャファイル中でのインデックス
                    pmd_m.toon_index = toon_name_list.IndexOf(toon_file);
                }
                else
                {
                    if (toon_name_list.Count <= 9)
                    {
                        // toonテクスチャとするテクスチャ名を記憶
                        // 後にtoonテクスチャファイル名を出力するときに使用。
                        toon_name_list.Add(toon_file);

                        // toonテクスチャファイル中でのインデックス
                        pmd_m.toon_index = toon_name_list.Count - 1;
                    }
                    else
                    {
                        // toonテクスチャとするテクスチャ名を記憶
                        // 後にtoonテクスチャファイル名を出力するときに使用。
                        toon_name_list.Add("toon10.bmp"); // 10以上は無理なので、それ以上は全てtoon10.bmp

                        // toonテクスチャファイル中でのインデックス
                        pmd_m.toon_index = 9; // 10以上は無理なので、それ以上は全て9
                    }
                }

                // スフィアマップ
                if (spheremap_flag == true)
                {
                    // toonテクスチャが256×16のサイズなら、スフィアマップを指定する
                    Bitmap toon_bmp = tex_list.GetBitmap(tso_num, shader.ShadeTexName);
                    if (toon_bmp.Width == 256 && toon_bmp.Height == 16)
                    {
                        string sphere_file
                            = System.Text.RegularExpressions.Regex.Replace(toon_file, ".bmp", ".sph");
                        pmd_m.szTextureFileName
                            = pmd_m.szTextureFileName + "*" + sphere_file;
                    }
                }
            }
            else
            {
                pmd_m.toon_index = 9;
            }

            // 要素を追加
            name_list.Add(cateList[tso_num] + " "
                          + TSOList[tso_num].sub_scripts[script_num].Name);
            material_list.Add(pmd_m);
        }