Esempio n. 1
0
            public NyMmdMeshContainer(Device i_device, IMmdDataIo i_io, PmdMaterial[] i_pmd_materials)
            {
                this._texture_list = new D3dTextureList(i_device);
                List <Material> mats = new List <Material>();
                List <Texture>  texs = new List <Texture>();

                for (int i = 0; i < i_pmd_materials.Length; i++)
                {
                    Material m = new Material();
                    m.DiffuseColor      = new ColorValue(i_pmd_materials[i].col4Diffuse.r, i_pmd_materials[i].col4Diffuse.g, i_pmd_materials[i].col4Diffuse.b, i_pmd_materials[i].col4Diffuse.a);
                    m.AmbientColor      = new ColorValue(i_pmd_materials[i].col4Ambient.r, i_pmd_materials[i].col4Ambient.g, i_pmd_materials[i].col4Ambient.b, i_pmd_materials[i].col4Ambient.a);
                    m.SpecularColor     = new ColorValue(i_pmd_materials[i].col4Specular.r, i_pmd_materials[i].col4Specular.g, i_pmd_materials[i].col4Specular.b, i_pmd_materials[i].col4Specular.a);
                    m.SpecularSharpness = i_pmd_materials[i].fShininess;
                    mats.Add(m);
                    if (i_pmd_materials[i].texture_name != null)
                    {
                        texs.Add(this._texture_list.getTexture(i_pmd_materials[i].texture_name, i_io));
                    }
                    else
                    {
                        texs.Add(null);
                    }
                }
                this.texture  = texs.ToArray();
                this.material = mats.ToArray();
            }
Esempio n. 2
0
        public Texture getTexture(String i_filename, IMmdDataIo i_io)
        {
            D3dTextureData ret;

            int len = this.m_pTextureList.Count;

            for (int i = 0; i < len; i++)
            {
                ret = this.m_pTextureList[i];
                if (ret.file_name.Equals(i_filename, StringComparison.CurrentCultureIgnoreCase))
                {
                    // 読み込み済みのテクスチャを発見
                    return(ret.d3d_texture);
                }
            }

            // なければファイルを読み込んでテクスチャ作成
            ret = createTexture(i_filename, i_io.request(i_filename));
            if (ret != null)
            {
                this.m_pTextureList.Add(ret);
                return(ret.d3d_texture);
            }
            return(null);// テクスチャ読み込みか作成失敗
        }
Esempio n. 3
0
        /**
         * DirectX管理下にあるPMDデータを作成します。
         * このAPIは低速系です。
         **/
        public void setPmd(MmdPmdModel i_pmd, IMmdDataIo i_io)
        {
            releaseD3dResource();

            this._ref_pmd = i_pmd;
            int number_of_vertex = i_pmd.getNumberOfVertex();

            this._vertex_array = new CustomVertex.PositionNormalTextured[number_of_vertex];


            MmdTexUV[] uv_array = i_pmd.getUvArray();
            //先にセットできるものはセットしておく
            for (int i = 0; i < number_of_vertex; i++)
            {
                this._vertex_array[i].Tu = uv_array[i].u;
                this._vertex_array[i].Tv = uv_array[i].v;
            }

            //matreial
            PmdMaterial[]      m             = i_pmd.getMaterials();
            List <D3dMaterial> d3d_materials = new List <D3dMaterial>();

            for (int i = 0; i < m.Length; i++)
            {
                short[]     indics_array = i_pmd.getIndicsArray();
                D3dMaterial new_material = new D3dMaterial();
                //indics配列の分解
                short[] tmp_indics = new short[m[i].number_of_indics];
                System.Array.Copy(indics_array, m[i].start_of_indics, tmp_indics, 0, tmp_indics.Length);
                new_material.index_buf = new IndexBuffer(this._device, tmp_indics.Length * sizeof(short), Usage.WriteOnly, Pool.Managed, true);
                new_material.index_buf.SetData(tmp_indics, 0, 0);


                new_material.material.DiffuseColor      = new ColorValue(m[i].col4Diffuse.r, m[i].col4Diffuse.g, m[i].col4Diffuse.b, m[i].col4Diffuse.a);
                new_material.material.AmbientColor      = new ColorValue(m[i].col4Ambient.r, m[i].col4Ambient.g, m[i].col4Ambient.b, m[i].col4Ambient.a);
                new_material.material.SpecularColor     = new ColorValue(m[i].col4Specular.r, m[i].col4Specular.g, m[i].col4Specular.b, m[i].col4Specular.a);
                new_material.material.SpecularSharpness = m[i].fShininess;
                if (m[i].texture_name != null)
                {
                    new_material.texture = this._texture_list.getTexture(m[i].texture_name, i_io);
                }
                else
                {
                    new_material.texture = null;
                }
                new_material.unknown      = m[i].unknown;
                new_material.ulNumIndices = tmp_indics.Length;
                d3d_materials.Add(new_material);
            }
            this._materials = d3d_materials.ToArray();
            //
            this._vertex_buffer = new VertexBuffer(
                typeof(CustomVertex.PositionNormalTextured),
                number_of_vertex, this._device, 0, CustomVertex.PositionNormalTextured.Format, Pool.Managed);
            return;
        }
Esempio n. 4
0
        public void setPmd(MmdPmdModel i_pmd, IMmdDataIo i_io)
        {
            this._ref_pmd = i_pmd;

            Device dev = this._device;

            int number_of_vertex = i_pmd.getNumberOfVertex();

            this._vertex_array = new CustomVertex.PositionNormalTextured[number_of_vertex];

            MmdTexUV[] uv_array = i_pmd.getUvArray();
            //先にセットできるものはセットしておく
            for (int i = 0; i < number_of_vertex; i++)
            {
                this._vertex_array[i].Tu = uv_array[i].u;
                this._vertex_array[i].Tv = uv_array[i].v;
            }

            short[] indics_array = i_pmd.getIndicsArray();

            // メッシュを作成
            // 参考:http://msdn.microsoft.com/ja-jp/library/ms229646%28VS.80%29.aspx
            Mesh mesh = new Mesh(indics_array.Length / 3, number_of_vertex, MeshFlags.Managed, createVertexElements(), dev);

            mesh.VertexBuffer.SetData(this._vertex_array, 0, LockFlags.None);
            mesh.IndexBuffer.SetData(indics_array, 0, LockFlags.None);
            dev.VertexDeclaration = new VertexDeclaration(dev, createVertexElements());


            // DrawSubsetのインデックスを設定
            int[] attrBuf = mesh.LockAttributeBufferArray(LockFlags.None);
            makeSubsetIndex(i_pmd.getMaterials(), ref attrBuf);
            mesh.UnlockAttributeBuffer(attrBuf);

            //コンテナを一回解放
            if (this._container != null)
            {
                this._container.Dispose();
                this._container = null;
            }
            // モデルをメッシュコンテナに格納
            NyMmdMeshContainer container = new NyMmdMeshContainer(dev, i_io, i_pmd.getMaterials());

            container.mesh  = mesh;
            this._container = container;
        }