adjust encoding to fit the new utf8 library

pull/1863/head
aoowweenn 2018-03-31 13:29:42 +08:00
parent 557466a9ac
commit 04d70dc76d
1 changed files with 14 additions and 22 deletions

View File

@ -93,16 +93,13 @@ namespace pmx
if (encoding == 0) if (encoding == 0)
{ {
// UTF16 to UTF8 // UTF16 to UTF8
std::string result; const uint16_t* sourceStart = (uint16_t*)buffer.data();
const char* sourceStart = buffer.data();
const unsigned int targetSize = size * 3; // enough to encode const unsigned int targetSize = size * 3; // enough to encode
char* targetStart = new char[targetSize](); char targetStart[targetSize] = { 0 };
const char* targetReserved = targetStart;
utf8::utf16to8( sourceStart, sourceStart + size, targetStart );
result.assign(targetReserved, targetStart - targetReserved); utf8::utf16to8( sourceStart, sourceStart + size/2, targetStart );
delete[] targetReserved;
std::string result(targetStart);
return result; return result;
} }
else else
@ -474,7 +471,6 @@ namespace pmx
void PmxSoftBody::Read(std::istream * /*stream*/, PmxSetting * /*setting*/) void PmxSoftBody::Read(std::istream * /*stream*/, PmxSetting * /*setting*/)
{ {
// 未実装
std::cerr << "Not Implemented Exception" << std::endl; std::cerr << "Not Implemented Exception" << std::endl;
throw; throw;
} }
@ -510,7 +506,6 @@ namespace pmx
void PmxModel::Read(std::istream *stream) void PmxModel::Read(std::istream *stream)
{ {
// マジック
char magic[4]; char magic[4];
stream->read((char*) magic, sizeof(char) * 4); stream->read((char*) magic, sizeof(char) * 4);
if (magic[0] != 0x50 || magic[1] != 0x4d || magic[2] != 0x58 || magic[3] != 0x20) if (magic[0] != 0x50 || magic[1] != 0x4d || magic[2] != 0x58 || magic[3] != 0x20)
@ -518,23 +513,20 @@ namespace pmx
std::cerr << "invalid magic number." << std::endl; std::cerr << "invalid magic number." << std::endl;
throw; throw;
} }
// バージョン
stream->read((char*) &version, sizeof(float)); stream->read((char*) &version, sizeof(float));
if (version != 2.0f && version != 2.1f) if (version != 2.0f && version != 2.1f)
{ {
std::cerr << "this is not ver2.0 or ver2.1 but " << version << "." << std::endl; std::cerr << "this is not ver2.0 or ver2.1 but " << version << "." << std::endl;
throw; throw;
} }
// ファイル設定
this->setting.Read(stream); this->setting.Read(stream);
// モデル情報
this->model_name = ReadString(stream, setting.encoding); this->model_name = ReadString(stream, setting.encoding);
this->model_english_name = ReadString(stream, setting.encoding); this->model_english_name = ReadString(stream, setting.encoding);
this->model_comment = ReadString(stream, setting.encoding); this->model_comment = ReadString(stream, setting.encoding);
this->model_english_comment = ReadString(stream, setting.encoding); this->model_english_comment = ReadString(stream, setting.encoding);
// 頂点 // read vertices
stream->read((char*) &vertex_count, sizeof(int)); stream->read((char*) &vertex_count, sizeof(int));
this->vertices = mmd::make_unique<PmxVertex []>(vertex_count); this->vertices = mmd::make_unique<PmxVertex []>(vertex_count);
for (int i = 0; i < vertex_count; i++) for (int i = 0; i < vertex_count; i++)
@ -542,7 +534,7 @@ namespace pmx
vertices[i].Read(stream, &setting); vertices[i].Read(stream, &setting);
} }
// // read indices
stream->read((char*) &index_count, sizeof(int)); stream->read((char*) &index_count, sizeof(int));
this->indices = mmd::make_unique<int []>(index_count); this->indices = mmd::make_unique<int []>(index_count);
for (int i = 0; i < index_count; i++) for (int i = 0; i < index_count; i++)
@ -550,7 +542,7 @@ namespace pmx
this->indices[i] = ReadIndex(stream, setting.vertex_index_size); this->indices[i] = ReadIndex(stream, setting.vertex_index_size);
} }
// テクスチャ // read texture names
stream->read((char*) &texture_count, sizeof(int)); stream->read((char*) &texture_count, sizeof(int));
this->textures = mmd::make_unique<std::string []>(texture_count); this->textures = mmd::make_unique<std::string []>(texture_count);
for (int i = 0; i < texture_count; i++) for (int i = 0; i < texture_count; i++)
@ -558,7 +550,7 @@ namespace pmx
this->textures[i] = ReadString(stream, setting.encoding); this->textures[i] = ReadString(stream, setting.encoding);
} }
// マテリアル // read materials
stream->read((char*) &material_count, sizeof(int)); stream->read((char*) &material_count, sizeof(int));
this->materials = mmd::make_unique<PmxMaterial []>(material_count); this->materials = mmd::make_unique<PmxMaterial []>(material_count);
for (int i = 0; i < material_count; i++) for (int i = 0; i < material_count; i++)
@ -566,7 +558,7 @@ namespace pmx
this->materials[i].Read(stream, &setting); this->materials[i].Read(stream, &setting);
} }
// ボーン // read bones
stream->read((char*) &this->bone_count, sizeof(int)); stream->read((char*) &this->bone_count, sizeof(int));
this->bones = mmd::make_unique<PmxBone []>(this->bone_count); this->bones = mmd::make_unique<PmxBone []>(this->bone_count);
for (int i = 0; i < this->bone_count; i++) for (int i = 0; i < this->bone_count; i++)
@ -574,7 +566,7 @@ namespace pmx
this->bones[i].Read(stream, &setting); this->bones[i].Read(stream, &setting);
} }
// モーフ // read morphs
stream->read((char*) &this->morph_count, sizeof(int)); stream->read((char*) &this->morph_count, sizeof(int));
this->morphs = mmd::make_unique<PmxMorph []>(this->morph_count); this->morphs = mmd::make_unique<PmxMorph []>(this->morph_count);
for (int i = 0; i < this->morph_count; i++) for (int i = 0; i < this->morph_count; i++)
@ -582,7 +574,7 @@ namespace pmx
this->morphs[i].Read(stream, &setting); this->morphs[i].Read(stream, &setting);
} }
// 表示枠 // read display frames
stream->read((char*) &this->frame_count, sizeof(int)); stream->read((char*) &this->frame_count, sizeof(int));
this->frames = mmd::make_unique<PmxFrame []>(this->frame_count); this->frames = mmd::make_unique<PmxFrame []>(this->frame_count);
for (int i = 0; i < this->frame_count; i++) for (int i = 0; i < this->frame_count; i++)
@ -590,7 +582,7 @@ namespace pmx
this->frames[i].Read(stream, &setting); this->frames[i].Read(stream, &setting);
} }
// 剛体 // read rigid bodies
stream->read((char*) &this->rigid_body_count, sizeof(int)); stream->read((char*) &this->rigid_body_count, sizeof(int));
this->rigid_bodies = mmd::make_unique<PmxRigidBody []>(this->rigid_body_count); this->rigid_bodies = mmd::make_unique<PmxRigidBody []>(this->rigid_body_count);
for (int i = 0; i < this->rigid_body_count; i++) for (int i = 0; i < this->rigid_body_count; i++)
@ -598,7 +590,7 @@ namespace pmx
this->rigid_bodies[i].Read(stream, &setting); this->rigid_bodies[i].Read(stream, &setting);
} }
// ジョイント // read joints
stream->read((char*) &this->joint_count, sizeof(int)); stream->read((char*) &this->joint_count, sizeof(int));
this->joints = mmd::make_unique<PmxJoint []>(this->joint_count); this->joints = mmd::make_unique<PmxJoint []>(this->joint_count);
for (int i = 0; i < this->joint_count; i++) for (int i = 0; i < this->joint_count; i++)