/*------------------------------------------------------------------------- * 街名と上陸地点名のバッファ作成 * ---------------------------------------------------------------------------*/ private void create_city_buffer() { m_icons1_vb = create_buffer(m_world.NoSeas.Count); m_icons2_vb = create_buffer(m_world.NoSeas.Count); m_city_names1_vb = create_buffer(m_world.NoSeas.Count); m_city_names2_vb = create_buffer(m_world.NoSeas.Count); sprite_vertex[] icons1_vbo = new sprite_vertex[m_world.NoSeas.Count * 4]; sprite_vertex[] icons2_vbo = new sprite_vertex[m_world.NoSeas.Count * 4]; sprite_vertex[] city_names1_vbo = new sprite_vertex[m_world.NoSeas.Count * 4]; sprite_vertex[] city_names2_vbo = new sprite_vertex[m_world.NoSeas.Count * 4]; int index = 0; foreach (GvoWorldInfo.Info i in m_world.NoSeas) { // アイコン set_vbo(ref icons1_vbo, index, i.position, new Point(0, 0), i.IconRect, -1); set_vbo(ref icons2_vbo, index, i.position, new Point(0, 0), i.SmallIconRect, -1); // 文字 set_vbo(ref city_names1_vbo, index, i.position, i.StringOffset1, i.NameRect, -1); set_vbo(ref city_names2_vbo, index, i.position, i.StringOffset2, i.NameRect, -1); index++; } // 頂点を転送 m_icons1_vb.SetData <sprite_vertex>(icons1_vbo); m_icons2_vb.SetData <sprite_vertex>(icons2_vbo); m_city_names1_vb.SetData <sprite_vertex>(city_names1_vbo); m_city_names2_vb.SetData <sprite_vertex>(city_names2_vbo); }
/*------------------------------------------------------------------------- * 1つのバッファを描画 * パラメータは設定してあること * ---------------------------------------------------------------------------*/ private void draw_buffer(d3d_writable_vb_with_index vb, int sprite_count) { m_lib.device.device.SetStreamSource(0, vb.vb, 0, sprite_vertex.SizeInBytes); m_lib.device.device.Indices = vb.ib; m_lib.device.device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, sprite_count * 4, 0, sprite_count * 2); }
private d3d_writable_vb_with_index m_sea_names_vb; // 여름용 해역명 /*------------------------------------------------------------------------- * * ---------------------------------------------------------------------------*/ public draw_infonames(gvt_lib lib, GvoWorldInfo world) { m_lib = lib; m_world = world; m_device = lib.device.device; // 쉐이더사용時 m_is_create_buffers = false; m_is_error = false; m_icons1_vb = null; m_icons2_vb = null; m_icons3_vb = null; m_city_names1_vb = null; m_city_names2_vb = null; m_city_names3_vb = null; m_shore_names_vb = null; m_land_names_vb = null; m_sea_icons1_vb = null; m_sea_icons2_vb = null; m_sea_names_vb = null; }
private d3d_writable_vb_with_index m_sea_names2_vb; // 冬用海域名 /*------------------------------------------------------------------------- * * ---------------------------------------------------------------------------*/ public draw_infonames(gvt_lib lib, GvoWorldInfo world) { m_lib = lib; m_world = world; // シェーダ使用時 m_is_create_buffers = false; m_is_error = false; m_icons1_vb = null; m_city_names1_vb = null; m_icons2_vb = null; m_city_names2_vb = null; m_sea_names1_vb = null; m_sea_names2_vb = null; }
/*------------------------------------------------------------------------- * 해역명と풍향のバッファ작성 * ---------------------------------------------------------------------------*/ private void create_sea_buffer() { m_sea_icons1_vb = create_buffer(m_world.Seas.Count * 3); m_sea_icons2_vb = create_buffer(m_world.Seas.Count * 3); m_sea_names_vb = create_buffer(m_world.Seas.Count * 3); sprite_vertex[] vbo1 = new sprite_vertex[(m_world.Seas.Count * 3) * 4]; sprite_vertex[] vbo2 = new sprite_vertex[(m_world.Seas.Count * 3) * 4]; sprite_vertex[] vbo3 = new sprite_vertex[(m_world.Seas.Count * 3) * 4]; int index = 0; float scale = this.GetDpiScaleRatio(); int diff = (int)(3 * scale); foreach (GvoWorldInfo.Info i in m_world.Seas) { // 문자 위치 var pos = new Point(i.position.X, i.position.Y); set_vbo(ref vbo3, index, pos, new Point(diff, -diff), m_lib.nameTexture.getRect(i.Name), i.angle, -1); index++; } d3d_sprite_rects.rect windRect = m_lib.icons.GetIcon(icons.icon_index.wind_arrow); foreach (GvoWorldInfo.Info i in m_world.Seas) { // 풍향 if (i.SeaInfo != null) { Point pos = new Point(i.position.X - 1, i.position.Y + 1); // 夏 set_vbo(ref vbo1, index, pos, new Point(-diff, diff), windRect, i.SeaInfo.SummerAngle, -1); index++; // 冬 set_vbo(ref vbo2, index, pos, new Point(-diff, diff), windRect, i.SeaInfo.WinterAngle, -1); index++; } } // 頂点を전送 m_sea_icons1_vb.SetData <sprite_vertex>(vbo1); m_sea_icons2_vb.SetData <sprite_vertex>(vbo2); m_sea_names_vb.SetData <sprite_vertex>(vbo3); }
/*------------------------------------------------------------------------- * 海域名と風向きのバッファ作成 * ---------------------------------------------------------------------------*/ private void create_sea_buffer() { m_sea_names1_vb = create_buffer(m_world.Seas.Count * 3); m_sea_names2_vb = create_buffer(m_world.Seas.Count * 3); sprite_vertex[] vbo1 = new sprite_vertex[(m_world.Seas.Count * 3) * 4]; sprite_vertex[] vbo2 = new sprite_vertex[(m_world.Seas.Count * 3) * 4]; int index = 0; float scale = this.GetDpiScaleRatio(); int offset = (int)(6 * scale); foreach (GvoWorldInfo.Info i in m_world.Seas) { // 文字 var pos = new Point(i.position.X, i.position.Y); pos.Y += (int)((pos.Y - i.SeaInfo.WindPos.Y) * scale * 0.2f); // 文字表示位置をちょっとだけ調整するの set_vbo(ref vbo1, index, pos, new Point(-offset, 0), m_lib.seainfonameimage.GetRect(index), -1); set_vbo(ref vbo2, index, pos, new Point(-offset, 0), m_lib.seainfonameimage.GetRect(index), -1); index++; } foreach (GvoWorldInfo.Info i in m_world.Seas) { // 風向き if (i.SeaInfo != null) { Point pos = new Point(i.SeaInfo.WindPos.X - i.position.X, i.SeaInfo.WindPos.Y - i.position.Y); // 夏 set_vbo(ref vbo1, index, i.position, new Point(pos.X - offset, pos.Y), m_lib.seainfonameimage.GetWindArrowIcon(), i.SeaInfo.SummerAngle, -1); set_vbo(ref vbo2, index, i.position, new Point(pos.X - offset, pos.Y), m_lib.seainfonameimage.GetWindArrowIcon(), i.SeaInfo.SummerAngle, WIND_ANGLE_COLOR2); index++; // 冬 set_vbo(ref vbo1, index, i.position, new Point(pos.X + offset, pos.Y), m_lib.seainfonameimage.GetWindArrowIcon(), i.SeaInfo.WinterAngle, WIND_ANGLE_COLOR2); set_vbo(ref vbo2, index, i.position, new Point(pos.X + offset, pos.Y), m_lib.seainfonameimage.GetWindArrowIcon(), i.SeaInfo.WinterAngle, -1); index++; } } // 頂点を転送 m_sea_names1_vb.SetData <sprite_vertex>(vbo1); m_sea_names2_vb.SetData <sprite_vertex>(vbo2); }
/*------------------------------------------------------------------------- * * ---------------------------------------------------------------------------*/ public void Dispose() { if (m_decl != null) { m_decl.Dispose(); } if (m_icons1_vb != null) { m_icons1_vb.Dispose(); } if (m_city_names1_vb != null) { m_city_names1_vb.Dispose(); } if (m_icons2_vb != null) { m_icons2_vb.Dispose(); } if (m_city_names2_vb != null) { m_city_names2_vb.Dispose(); } if (m_sea_names1_vb != null) { m_sea_names1_vb.Dispose(); } if (m_sea_names2_vb != null) { m_sea_names2_vb.Dispose(); } m_decl = null; m_icons1_vb = null; m_city_names1_vb = null; m_icons2_vb = null; m_city_names2_vb = null; m_sea_names1_vb = null; m_sea_names2_vb = null; }
/*------------------------------------------------------------------------- * バッファを구축する * 구축されていればなにもしない * ---------------------------------------------------------------------------*/ private void create_buffers() { m_lib.nameTexture.init(m_world); if (!m_lib.device.is_use_ve1_1_ps1_1) { return; // 쉐이더を使わない } if (m_is_create_buffers) { return; // 작성されている } if (m_is_error) { return; // 오류 } try { m_decl = new VertexDeclaration(m_lib.device.device, sprite_vertex.VertexElements); // 도시명と상륙지점명のバッファ작성 create_city_buffer(); create_sea_buffer(); m_is_create_buffers = true; m_is_error = false; } catch { // 실패 m_is_create_buffers = false; m_icons1_vb = null; m_city_names1_vb = null; m_icons2_vb = null; m_city_names2_vb = null; m_sea_icons1_vb = null; m_sea_icons2_vb = null; m_sea_names_vb = null; m_is_error = true; } }
/*------------------------------------------------------------------------- * バッファを構築する * 構築されていればなにもしない * ---------------------------------------------------------------------------*/ private void create_buffers() { if (!m_lib.device.is_use_ve1_1_ps1_1) { return; // シェーダを使わない } if (m_is_create_buffers) { return; // 作成されている } if (m_is_error) { return; // エラー } try{ m_decl = new VertexDeclaration(m_lib.device.device, sprite_vertex.VertexElements); // 街名と上陸地点名のバッファ作成 create_city_buffer(); create_sea_buffer(); m_is_create_buffers = true; m_is_error = false; }catch { // 失敗 m_is_create_buffers = false; m_icons1_vb = null; m_city_names1_vb = null; m_icons2_vb = null; m_city_names2_vb = null; m_sea_names1_vb = null; m_sea_names2_vb = null; m_is_error = true; } }
/*------------------------------------------------------------------------- * 도시명と상륙지점명のバッファ작성 * ---------------------------------------------------------------------------*/ private void create_city_buffer() { m_icons1_vb = create_buffer(m_world.Cities.Count + m_world.Shores.Count + m_world.NoSeas.Count); m_icons2_vb = create_buffer(m_world.Cities.Count + m_world.Shores.Count + m_world.NoSeas.Count); m_icons3_vb = create_buffer(m_world.Cities.Count); m_city_names1_vb = create_buffer(m_world.Cities.Count); m_city_names2_vb = create_buffer(m_world.Cities.Count); m_city_names3_vb = create_buffer(m_world.Cities.Count); m_shore_names_vb = create_buffer(m_world.Shores.Count); m_land_names_vb = create_buffer(m_world.NoSeas.Count); sprite_vertex[] icons1_vbo = new sprite_vertex[(m_world.Cities.Count + m_world.Shores.Count + m_world.NoSeas.Count) * 4]; sprite_vertex[] icons2_vbo = new sprite_vertex[(m_world.Cities.Count + m_world.Shores.Count + m_world.NoSeas.Count) * 4]; sprite_vertex[] icons3_vbo = new sprite_vertex[(m_world.Cities.Count) * 4]; sprite_vertex[] city_names1_vbo = new sprite_vertex[m_world.Cities.Count * 4]; sprite_vertex[] city_names2_vbo = new sprite_vertex[m_world.Cities.Count * 4]; sprite_vertex[] city_names3_vbo = new sprite_vertex[m_world.Cities.Count * 4]; sprite_vertex[] shore_names_vbo = new sprite_vertex[m_world.Shores.Count * 4]; sprite_vertex[] land_names_vbo = new sprite_vertex[m_world.NoSeas.Count * 4]; int index = 0; foreach (GvoWorldInfo.Info i in m_world.Cities) { // 아이콘 set_vbo(ref icons1_vbo, index, i.position, new Point(0, 0), i.IconRect, 0, -1); set_vbo(ref icons2_vbo, index, i.position, new Point(0, 0), i.SmallIconRect, 0, -1); // 문자 (도시이름) set_vbo(ref city_names1_vbo, index, i.position, i.StringOffset1, i.NameRect, i.angle, -1); set_vbo(ref city_names2_vbo, index, i.position, i.StringOffset2, i.NameRect, i.angle, -1); // 조합(2)이나 주점아가씨(1)가 존재할 경우, 카리브 영지가 아닌 경우 if (((i.Sakaba & 2) == 2 || (i.Sakaba & 1) == 1) && (i.AllianceType != GvoWorldInfo.AllianceType.Territory || (i.CulturalSphere != GvoWorldInfo.CulturalSphere.Caribbean && i.CulturalSphere != GvoWorldInfo.CulturalSphere.EastLatinAmerica))) { set_vbo(ref icons3_vbo, index, i.position, new Point(0, 0), i.SmallIconRect, 0, -1); set_vbo(ref city_names3_vbo, index, i.position, i.StringOffset2, i.NameRect, i.angle, -1); } index++; } int index2 = 0; foreach (GvoWorldInfo.Info i in m_world.Shores) { // 아이콘 set_vbo(ref icons1_vbo, index, i.position, new Point(0, 0), i.IconRect, 0, -1); set_vbo(ref icons2_vbo, index, i.position, new Point(0, 0), i.SmallIconRect, 0, -1); // 문자 (도시이름) set_vbo(ref shore_names_vbo, index2, i.position, i.StringOffset2, i.NameRect, i.angle, -1); index++; index2++; } int index3 = 0; foreach (GvoWorldInfo.Info i in m_world.NoSeas) { // 아이콘 set_vbo(ref icons1_vbo, index, i.position, new Point(0, 0), i.IconRect, 0, -1); set_vbo(ref icons2_vbo, index, i.position, new Point(0, 0), i.SmallIconRect, 0, -1); // 문자 (도시이름) set_vbo(ref land_names_vbo, index3, i.position, i.StringOffset2, i.NameRect, i.angle, -1); index++; index3++; } // 정점들을 설정 m_icons1_vb.SetData <sprite_vertex>(icons1_vbo); m_icons2_vb.SetData <sprite_vertex>(icons2_vbo); m_icons3_vb.SetData <sprite_vertex>(icons3_vbo); m_city_names1_vb.SetData <sprite_vertex>(city_names1_vbo); m_city_names2_vb.SetData <sprite_vertex>(city_names2_vbo); m_city_names3_vb.SetData <sprite_vertex>(city_names3_vbo); m_shore_names_vb.SetData <sprite_vertex>(shore_names_vbo); m_land_names_vb.SetData <sprite_vertex>(land_names_vbo); }