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(); }
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);// テクスチャ読み込みか作成失敗 }
/** * 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; }
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; }