//! Construct the doc_border bitvector by streaming the text file void construct_doc_border(const std::string& text_file, bit_vector& doc_border) { int_vector_buffer<WIDTH> text_buf(text_file); doc_border = bit_vector(text_buf.size(), 0); for (size_type i = 0; i < text_buf.size(); ++i) { if (t_doc_delim == text_buf[i]) { doc_border[i] = 1; } } }
void construct(t_index& idx, const std::string& file, cache_config& config, uint8_t num_bytes, wt_tag) { auto event = memory_monitor::event("construct wavelet tree"); if ((t_index::alphabet_category::WIDTH==8 and num_bytes <= 1) or (t_index::alphabet_category::WIDTH==0 and num_bytes != 'd')) { int_vector_buffer<t_index::alphabet_category::WIDTH> text_buf(file, std::ios::in, 1024*1024, num_bytes*8, (bool)num_bytes); t_index tmp(text_buf, text_buf.size()); idx.swap(tmp); } else { int_vector<t_index::alphabet_category::WIDTH> text; load_vector_from_file(text, file, num_bytes); std::string tmp_key = util::to_string(util::pid())+"_"+util::to_string(util::id()); std::string tmp_file_name = cache_file_name(tmp_key, config); store_to_file(text, tmp_file_name); util::clear(text); { int_vector_buffer<t_index::alphabet_category::WIDTH> text_buf(tmp_file_name); t_index tmp(text_buf, text_buf.size()); idx.swap(tmp); } sdsl::remove(tmp_file_name); } }
static int promia_put_local(uint *mc, uint nc, FILE *fo) { uint a, i, x, p = 0x10; uchar t[N]; void *h[2] = { 0, 0 }; nc >>= 2; hashstr_alloc(h, 0x4000, 0x20000); fwrite("PJADV_TF0001\x7C\x81\x00\x00", 1, p, fo); for(;;) { if((x = text_num()) == -1) break; i = N - 2; text_buf(t, &i); a = hashstr_add(h, p, t, i); if(a == p) { t[i] = 0; t[i + 1] = 0; i += 2; fwrite(t, 1, i, fo); p += i; } if(x < nc) mc[x] = a; } blk_destroy(h[0]); return 0; }
//! Constructor csa_bitcompressed(cache_config& config) { std::string text_file = cache_file_name(key_trait<alphabet_type::int_width>::KEY_TEXT,config); int_vector_buffer<alphabet_type::int_width> text_buf(text_file); int_vector_buffer<> sa_buf(cache_file_name(conf::KEY_SA,config)); size_type n = text_buf.size(); { alphabet_type tmp_alphabet(text_buf, n); m_alphabet.swap(tmp_alphabet); } { sa_sample_type tmp_sample(config); m_sa.swap(tmp_sample); } set_isa_samples<csa_bitcompressed>(sa_buf, m_isa); if (!store_to_file(m_isa, cache_file_name(conf::KEY_ISA,config), true)) { throw std::ios_base::failure("#csa_bitcompressed: Cannot store ISA to file system!"); } else { register_cache_file(conf::KEY_ISA, config); } }
// ヘッダ処理 int mmdpiPmxLoad::get_header( GetBin* buf ) { char magic[ 8 ]; //ファイル識別 "Pmd" buf->get_bin( magic, 4 ); if( strncmp( magic, "Pmx ", 4 ) != 0 && strncmp( magic, "PMX ", 4 ) != 0 ) return -1; //ヘッダ違い エラー // バージョン buf->get_bin( &head.version, sizeof( head.version ) ); // 各種バイト情報 buf->get_bin( &head.byte_num, 1 ); head.byte = new BYTE[ head.byte_num + 1 ]; buf->get_bin( head.byte, head.byte_num ); byte_one_length = ( head.byte[ 0 ] == 1 )? 1 : 2 ; // utf8 or utf16 uint name_length, name_eng_length, comment_length, comment_eng_length; //setlocale( LC_CTYPE, "jpn" ); //setlocale( LC_CTYPE, "ja_JP.UTF-8" ); head.name = text_buf( buf, &name_length ); // モデルネーム head.name_eng = text_buf( buf, &name_eng_length ); // 英モデルネーム head.comment = text_buf( buf, &comment_length ); // コメント head.comment_eng = text_buf( buf, &comment_eng_length ); // 英コメント #ifdef _WIN32 if( head.name ) head.name = buf->convert_sjis( head.name, name_length, 1 ); // モデルネーム if( head.name_eng ) head.name_eng = buf->convert_sjis( head.name_eng, name_eng_length, 1 ); // 英モデルネーム if( head.comment ) head.comment = buf->convert_sjis( head.comment, comment_length, 1 ); // コメント if( head.comment_eng ) head.comment_eng = buf->convert_sjis( head.comment_eng, comment_eng_length, 1 ); // 英コメント #endif if( head.name ) { puts( "Model:" ); puts( head.name ); } if( head.comment ) { puts( "Comment:" ); puts( head.comment ); } if( head.name_eng ) { puts( "Model English:" ); puts( head.name_eng ); } if( head.comment_eng ) { puts( "Comment English:" ); puts( head.comment_eng ); } return 0; }
// データ整列 int mmdpiPmxLoad::reader( GetBin* buf ) { // head if( get_header( buf ) ) return -1; int vertex_index_size = head.byte[ 2 ]; // vertex buf->get_bin( &vertex_num, sizeof( vertex_num ) ); vertex = new MMDPI_PMX_VERTEX[ vertex_num ]; int bone_index_size = head.byte[ 5 ]; MMDPI_PMX_VERTEX_PTR nv; for( dword i = 0; i < vertex_num; i ++ ) { nv = &vertex[ i ]; buf->get_bin( nv->pos, sizeof( float ) * 3 ); buf->get_bin( nv->nor, sizeof( float ) * 3 ); buf->get_bin( nv->uv, sizeof( float ) * 2 ); if( head.byte[ 1 ] == 0 ) nv->add_uv = 0; else { nv->add_uv = new float[ 4 * head.byte[ 1 ] ]; buf->get_bin( nv->add_uv, sizeof( float ) * 4 * head.byte[ 1 ] ); } buf->get_bin( &nv->weight_calc, sizeof( BYTE ) ); int vi; for( vi = 0; vi < 4; vi ++ ) nv->bone_index[ vi ] = 0; for( vi = 0; vi < 4; vi ++ ) nv->bone_value[ vi ] = 0; switch( nv->weight_calc ) { case 0: // BDEF1 { //BDEF1 -> // n : ボーンIndexサイズ | ウェイト1.0の単一ボーン(参照Index) buf->get_bin2( &nv->bone_index[ 0 ], sizeof( dword ), bone_index_size ); nv->bone_value[ 0 ] = 1; } break; case 1: // BDEF2 { //BDEF2 -> // n : ボーンIndexサイズ | ボーン1の参照Index // n : ボーンIndexサイズ | ボーン2の参照Index // 4 : float | ボーン1のウェイト値(0~1.0), ボーン2のウェイト値は 1.0-ボーン1ウェイト for( vi = 0; vi < 2; vi ++ ) buf->get_bin2( &nv->bone_index[ vi ], sizeof( dword ), bone_index_size ); buf->get_bin( &nv->bone_value[ 0 ], sizeof( float ) ); nv->bone_value[ 1 ] = 1 - nv->bone_value[ 0 ]; } break; case 2: // BDEF4 { //BDEF4 -> // n : ボーンIndexサイズ | ボーン1の参照Index // n : ボーンIndexサイズ | ボーン2の参照Index // n : ボーンIndexサイズ | ボーン3の参照Index // n : ボーンIndexサイズ | ボーン4の参照Index // 4 : float | ボーン1のウェイト値 // 4 : float | ボーン2のウェイト値 // 4 : float | ボーン3のウェイト値 // 4 : float | ボーン4のウェイト値 (ウェイト計1.0の保障はない) for( vi = 0; vi < 4; vi ++ ) buf->get_bin2( &nv->bone_index[ vi ], sizeof( dword ), bone_index_size ); for( vi = 0; vi < 4; vi ++ ) buf->get_bin( &nv->bone_value[ vi ], sizeof( float ) ); } break; case 3: // SDEF { //SDEF -> // n : ボーンIndexサイズ | ボーン1の参照Index // n : ボーンIndexサイズ | ボーン2の参照Index // 4 : float | ボーン1のウェイト値(0~1.0), ボーン2のウェイト値は 1.0-ボーン1ウェイト // 12 : float3 | SDEF-C値(x,y,z) // 12 : float3 | SDEF-R0値(x,y,z) // 12 : float3 | SDEF-R1値(x,y,z) ※修正値を要計算 for( vi = 0; vi < 2; vi ++ ) buf->get_bin2( &nv->bone_index[ vi ], sizeof( dword ), bone_index_size ); buf->get_bin( &nv->bone_value[ 0 ], sizeof( float ) ); nv->bone_value[ 1 ] = 1 - nv->bone_value[ 0 ]; buf->get_bin( nv->sdef_options, sizeof( float ) * ( 3 * 3 ) ); } break; } buf->get_bin( &nv->edge_scale, sizeof( float ) ); } // face buf->get_bin( &face_num, sizeof( face_num ) ); //face = new MMDPI_PMX_FACE[ face_num ]; face = new dword[ face_num ]; for( dword i = 0; i < face_num; i ++ ) { buf->get_bin2( &face[ i ], sizeof( face[ i ] ), head.byte[ 2 ] ); } // Texture buf->get_bin( &texture_num, sizeof( dword ) ); texture = new MMDPI_PMX_TEXTURE[ texture_num ]; for( dword i = 0; i < texture_num; i ++ ) { uint buf_len; texture[ i ].name = text_buf( buf, &buf_len ); texture[ i ].sjis_name = buf->convert_sjis( texture[ i ].name, buf_len ); } // Material buf->get_bin( &material_num, sizeof( dword ) ); material = new MMDPI_PMX_MATERIAL[ material_num ]; for( dword i = 0; i < material_num; i ++ ) { // Name uint buf_len; material[ i ].name = text_buf( buf, &buf_len ); // English name material[ i ].eng_name = text_buf( buf ); // buf->get_bin( material[ i ].Diffuse, sizeof( float ) * 4 ); buf->get_bin( material[ i ].Specular, sizeof( float ) * 3 ); buf->get_bin( &material[ i ].Specular_scale, sizeof( float ) ); buf->get_bin( material[ i ].Ambient, sizeof( float ) * 3 ); buf->get_bin( &material[ i ].bitFlag, sizeof( BYTE ) ); buf->get_bin( material[ i ].edge_color, sizeof( float ) * 4 ); buf->get_bin( &material[ i ].edge_size, sizeof( float ) ); buf->get_bin2( &material[ i ].texture_index, sizeof( dword ), head.byte[ 3 ] ); buf->get_bin2( &material[ i ].sphere_texture_index, sizeof( dword ), head.byte[ 3 ] ); // スフィアモード 0:無効 1:乗算(sph) 2:加算(spa) 3:サブテクスチャ(追加UV1のx,yをUV参照して通常テクスチャ描画を行う) buf->get_bin( &material[ i ].sphere_mode, sizeof( BYTE ) ); // 共有Toonフラグ 0:継続値は個別Toon 1:継続値は共有Toon buf->get_bin( &material[ i ].toon_flag, sizeof( BYTE ) ); material[ i ].toon_name = new char[ 0xff ]; material[ i ].toon_name_sjis = new char[ 0xff ]; if( material[ i ].toon_flag ) { buf->get_bin2( &material[ i ].toon_texture_number, sizeof( dword ), sizeof( BYTE ) ); sprintf( material[ i ].toon_name, "toon%02d.bmp", ( int )material[ i ].toon_texture_number + 1 ); //material[ i ].toon_name = convert_sjis( material[ i ].toon_name, strlen( material[ i ].toon_name ) ); } else { buf->get_bin2( &material[ i ].toon_texture_number, sizeof( dword ), head.byte[ 3 ] ); if( material[ i ].toon_texture_number < texture_num ) { sprintf( material[ i ].toon_name , "%s", texture[ material[ i ].toon_texture_number ].name ); sprintf( material[ i ].toon_name_sjis, "%s", texture[ material[ i ].toon_texture_number ].sjis_name ); } else { delete[] material[ i ].toon_name; material[ i ].toon_name = NULL; } } material[ i ].comment = text_buf( buf ); // vertex num 4byte buf->get_bin( &material[ i ].fver_num, sizeof( dword ) ); material[ i ].anti_clear_rate = 1; // 非透明にする } // Bone buf->get_bin( &bone_num, sizeof( bone_num ) ); bone = new MMDPI_PMX_BONE_INFO[ bone_num ]; ushort bone_flag; MMDPI_PMX_BONE_INFO_PTR tbone; for( dword i = 0; i < bone_num; i ++ ) { tbone = &bone[ i ]; // Name uint buf_len; tbone->name = text_buf( buf, &buf_len ); tbone->sjis_name = buf->convert_sjis( tbone->name, buf_len ); // English name tbone->eng_name = text_buf( buf ); // pos buf->get_bin( tbone->pos, sizeof( float ) * 3 ); // parent buf->get_bin2( &tbone->parent_index, sizeof( dword ), head.byte[ 5 ] ); // level buf->get_bin( &tbone->level, sizeof( dword ) ); // flag buf->get_bin( &tbone->bone_flag, sizeof( ushort ) ); // switch bone_flag = tbone->bone_flag; if( bone_flag & 0x0001 ) // 接続先(PMD子ボーン指定)表示方法 -> 0:座標オフセットで指定 1:ボーンで指定 { buf->get_bin2( &tbone->child_index, sizeof( dword ), head.byte[ 5 ] ); tbone->child_flag = 1; } else { buf->get_bin( tbone->offset, sizeof( float ) * 3 ); tbone->child_flag = 0; } if( bone_flag & 0x0002 ) // 回転可能 { tbone->rotation_flag = 1; } if( bone_flag & 0x0004 ) // 移動可能 { tbone->translate_flag = 1; } if( bone_flag & 0x0008 ) // 表示 tbone->show_flag = 1; if( bone_flag & 0x0010 ) // 操作可能 tbone->user_update_flag = 1; if( bone_flag & 0x0100 ) // 回転付与 { buf->get_bin2( &tbone->tr_parent_index, sizeof( dword ), head.byte[ 5 ] ); buf->get_bin( &tbone->tr_parent_rate, sizeof( float ) ); tbone->rotation_s_flag = 1; } if( bone_flag & 0x0200 ) // 移動付与 { buf->get_bin2( &tbone->tr_parent_index, sizeof( dword ), head.byte[ 5 ] ); buf->get_bin( &tbone->tr_parent_rate, sizeof( float ) ); tbone->translate_s_flag = 1; } if( bone_flag & 0x0400 ) // 軸固定 { buf->get_bin( tbone->axis_vector, sizeof( float ) * 3 ); tbone->const_axis_flag = 1; } if( bone_flag & 0x0800 ) // ローカル軸 { buf->get_bin( tbone->local_axis_x, sizeof( float ) * 3 ); buf->get_bin( tbone->local_axis_z, sizeof( float ) * 3 ); tbone->local_axis_flag = 1; } if( bone_flag & 0x1000 ) // 物理後変形軸 { tbone->physical_update_flag = 1; } if( bone_flag & 0x2000 ) // 外部親変形 { buf->get_bin( &tbone->key_value, sizeof( dword ) ); tbone->out_parent_update_flag = 1; } if( bone_flag & 0x0020 ) // IK { buf->get_bin2( &tbone->ik_target_bone_index, sizeof( dword ), head.byte[ 5 ] ); buf->get_bin( &tbone->ik_loop_num, sizeof( dword ) ); buf->get_bin( &tbone->ik_radius_range, sizeof( float ) ); buf->get_bin( &tbone->ik_link_num, sizeof( dword ) ); tbone->ik_link = 0x00; if( tbone->ik_link_num > 0 ) tbone->ik_link = new MMDPI_PMX_IK_INFO[ tbone->ik_link_num ]; for( dword j = 0; j < tbone->ik_link_num; j ++ ) { buf->get_bin2( &tbone->ik_link[ j ].ik_bone_index, sizeof( dword ), head.byte[ 5 ] ); buf->get_bin( &tbone->ik_link[ j ].rotate_limit_flag, sizeof( BYTE ) ); if( tbone->ik_link[ j ].rotate_limit_flag ) { buf->get_bin( tbone->ik_link[ j ].bottom, sizeof( float ) * 3 ); buf->get_bin( tbone->ik_link[ j ].top, sizeof( float ) * 3 ); //tbone->ik_link[ j ].bottom[ 0 ] = -tbone->ik_link[ j ].bottom[ 0 ]; //tbone->ik_link[ j ].top[ 0 ] = -tbone->ik_link[ j ].top[ 0 ]; } } tbone->ik_flag = 1; } else bone[ i ].ik_link = NULL; } // モーフ buf->get_bin( &morph_num, sizeof( dword ) ); morph = new MMDPI_PMX_MORPH_INFO[ morph_num ]; for( dword i = 0; i < morph_num; i ++ ) { MMDPI_PMX_MORPH_INFO_PTR m = &morph[ i ]; m->name = text_buf( buf ); m->eng_name = text_buf( buf ); m->sjis_name = buf->convert_sjis( m->name, strlen( m->name ) ); buf->get_bin( &m->panel, sizeof( BYTE ) ); buf->get_bin( &m->type, sizeof( BYTE ) ); buf->get_bin( &m->offset_num, sizeof( dword ) ); uint uv_number = 0; switch( m->type ) { case 1: m->vertex = new MMDPI_PMX_MORPH_INFO_VERTEX[ m->offset_num ]; for( uint j = 0; j < m->offset_num; j ++ ) { buf->get_bin2( &m->vertex[ j ].vertex_id, sizeof( dword ), head.byte[ 2 ] ); buf->get_bin( m->vertex[ j ].vertex, sizeof( float ) * 3 ); } break; // 追加UV case 4: uv_number = 0; case 5: uv_number = 1; case 6: uv_number = 2; case 7: uv_number = 3; case 3: m->uv = new MMDPI_PMX_MORPH_INFO_UV[ m->offset_num ]; for( uint j = 0; j < m->offset_num; j ++ ) { m->uv[ j ].uv_number = uv_number; buf->get_bin2( &m->uv[ j ].uv_id, sizeof( dword ), head.byte[ 2 ] ); buf->get_bin( m->uv[ j ].uv, sizeof( float ) * 4 ); } break; case 2: m->bone = new MMDPI_PMX_MORPH_INFO_BONE[ m->offset_num ]; for( uint j = 0; j < m->offset_num; j ++ ) { buf->get_bin2( &m->bone[ j ].bone_id, sizeof( dword ), head.byte[ 5 ] ); buf->get_bin( m->bone[ j ].translate, sizeof( float ) * 3 ); buf->get_bin( m->bone[ j ].rotation, sizeof( float ) * 4 ); } break; case 8: // 材質モーフ m->material = new MMDPI_PMX_MORPH_INFO_MATERIAL[ m->offset_num ]; for( uint j = 0; j < m->offset_num; j ++ ) { buf->get_bin2( &m->material[ j ].material_id, sizeof( dword ), head.byte[ 4 ] ); buf->get_bin( &m->material[ j ].calc_format, sizeof( BYTE ) ); buf->get_bin( m->material[ j ].diffuse, sizeof( float ) * 4 ); buf->get_bin( m->material[ j ].specular, sizeof( float ) * 3 ); buf->get_bin( &m->material[ j ].specular_alpha, sizeof( float ) ); buf->get_bin( m->material[ j ].ambient, sizeof( float ) * 3 ); buf->get_bin( m->material[ j ].edge_color, sizeof( float ) * 4 ); buf->get_bin( &m->material[ j ].edge_size, sizeof( float ) ); buf->get_bin( m->material[ j ].texture_alpha, sizeof( float ) * 4 ); buf->get_bin( m->material[ j ].sphere_alpha, sizeof( float ) * 4 ); buf->get_bin( m->material[ j ].toon_texture_alpha, sizeof( float ) * 4 ); } break; case 0: m->group = new MMDPI_PMX_MORPH_INFO_GROUP[ m->offset_num ]; for( uint j = 0; j < m->offset_num; j ++ ) { buf->get_bin2( &m->group[ j ].group_id, sizeof( dword ), head.byte[ 6 ] ); buf->get_bin( &m->group[ j ].morph_rate, sizeof( float ) ); } break; } } // 表示枠 buf->get_bin( &show_num, sizeof( dword ) ); show = new MMDPI_PMX_SHOW_FRAME_INFO[ show_num ]; for( uint i = 0; i < show_num; i ++ ) { MMDPI_PMX_SHOW_FRAME_INFO_PTR s = &show[ i ]; s->name = text_buf( buf ); s->eng_name = text_buf( buf ); buf->get_bin( &s->frame_flag, sizeof( BYTE ) ); buf->get_bin2( &s->index_num, sizeof( dword ), 4 ); s->target_index = new MMDPI_PMX_SHOW_FRAME_INFO_INLINE[ s->index_num ]; for( uint j = 0; j < s->index_num; j ++ ) { buf->get_bin( &s->target_index[ j ].type, sizeof( BYTE ) ); int index_size = head.byte[ 5 ]; if( s->target_index[ j ].type ) // モーフ index_size = head.byte[ 6 ]; buf->get_bin2( &s->target_index[ j ].index, sizeof( dword ), index_size ); } } p_rigid_num = 0; if( buf->get_bin( &p_rigid_num, sizeof( dword ) ) == NULL ) { p_rigid_num = 0; return 0; } if( !( 0 < p_rigid_num && p_rigid_num < bone_num ) ) { p_rigid_num = 0; return 0; } p_rigid = new MMDPI_PHYSICAL_RIGID_INFO[ p_rigid_num ]; // 剛体情報 for( uint i = 0; i < p_rigid_num; i ++ ) { MMDPI_PHYSICAL_RIGID_INFO_PTR rigid = &p_rigid[ i ]; uint name_length; rigid->name = text_buf( buf, &name_length ); rigid->name = buf->convert_sjis( rigid->name, name_length ); rigid->eng_name = text_buf( buf ); buf->get_bin2( &rigid->bone_index, sizeof( dword ), head.byte[ 5 ] ); buf->get_bin( &rigid->group, sizeof( BYTE ) ); buf->get_bin( &rigid->not_touch_group_flag, sizeof( ushort ) ); buf->get_bin( &rigid->type, sizeof( BYTE ) ); buf->get_bin( rigid->size, sizeof( float ) * 3 ); buf->get_bin( rigid->pos, sizeof( float ) * 3 ); buf->get_bin( rigid->rot, sizeof( float ) * 3 ); buf->get_bin( &rigid->mass, sizeof( float ) ); buf->get_bin( &rigid->ac_t, sizeof( float ) ); buf->get_bin( &rigid->ac_r, sizeof( float ) ); buf->get_bin( &rigid->repulsion, sizeof( float ) ); buf->get_bin( &rigid->friction, sizeof( float ) ); buf->get_bin( &rigid->rigidbody_type, sizeof( BYTE ) ); } // ジョイント情報 buf->get_bin( &p_joint_num, sizeof( dword ) ); p_joint = new MMDPI_PHYSICAL_JOINT_INFO[ p_joint_num ]; for( uint i = 0; i < p_joint_num; i ++ ) { MMDPI_PHYSICAL_JOINT_INFO_PTR joint = &p_joint[ i ]; uint name_length; joint->name = text_buf( buf, &name_length ); joint->name = buf->convert_sjis( joint->name, name_length ); joint->eng_name = text_buf( buf ); buf->get_bin( &joint->type, sizeof( BYTE ) ); if( joint->type ) continue; buf->get_bin2( &joint->a_index, sizeof( dword ), head.byte[ 7 ] ); buf->get_bin2( &joint->b_index, sizeof( dword ), head.byte[ 7 ] ); buf->get_bin( joint->pos, sizeof( float ) * 3 ); buf->get_bin( joint->rot, sizeof( float ) * 3 ); buf->get_bin( joint->trans_limit1, sizeof( float ) * 3 ); buf->get_bin( joint->trans_limit2, sizeof( float ) * 3 ); buf->get_bin( joint->rotate_limit1, sizeof( float ) * 3 ); buf->get_bin( joint->rotate_limit2, sizeof( float ) * 3 ); buf->get_bin( joint->spring_trans, sizeof( float ) * 3 ); buf->get_bin( joint->spring_rotate, sizeof( float ) * 3 ); } return 0; }