|
@@ -49,7 +49,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
namespace pmx
|
|
namespace pmx
|
|
{
|
|
{
|
|
- /// インデックス設定
|
|
|
|
class PmxSetting
|
|
class PmxSetting
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -64,26 +63,17 @@ namespace pmx
|
|
, rigidbody_index_size(0)
|
|
, rigidbody_index_size(0)
|
|
{}
|
|
{}
|
|
|
|
|
|
- /// エンコード方式
|
|
|
|
uint8_t encoding;
|
|
uint8_t encoding;
|
|
- /// 追加UV数
|
|
|
|
uint8_t uv;
|
|
uint8_t uv;
|
|
- /// 頂点インデックスサイズ
|
|
|
|
uint8_t vertex_index_size;
|
|
uint8_t vertex_index_size;
|
|
- /// テクスチャインデックスサイズ
|
|
|
|
uint8_t texture_index_size;
|
|
uint8_t texture_index_size;
|
|
- /// マテリアルインデックスサイズ
|
|
|
|
uint8_t material_index_size;
|
|
uint8_t material_index_size;
|
|
- /// ボーンインデックスサイズ
|
|
|
|
uint8_t bone_index_size;
|
|
uint8_t bone_index_size;
|
|
- /// モーフインデックスサイズ
|
|
|
|
uint8_t morph_index_size;
|
|
uint8_t morph_index_size;
|
|
- /// 剛体インデックスサイズ
|
|
|
|
uint8_t rigidbody_index_size;
|
|
uint8_t rigidbody_index_size;
|
|
void Read(std::istream *stream);
|
|
void Read(std::istream *stream);
|
|
};
|
|
};
|
|
|
|
|
|
- /// 頂点スキニングタイプ
|
|
|
|
enum class PmxVertexSkinningType : uint8_t
|
|
enum class PmxVertexSkinningType : uint8_t
|
|
{
|
|
{
|
|
BDEF1 = 0,
|
|
BDEF1 = 0,
|
|
@@ -93,7 +83,6 @@ namespace pmx
|
|
QDEF = 4,
|
|
QDEF = 4,
|
|
};
|
|
};
|
|
|
|
|
|
- /// 頂点スキニング
|
|
|
|
class PmxVertexSkinning
|
|
class PmxVertexSkinning
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -200,7 +189,6 @@ namespace pmx
|
|
void Read(std::istream *stresam, PmxSetting *setting);
|
|
void Read(std::istream *stresam, PmxSetting *setting);
|
|
};
|
|
};
|
|
|
|
|
|
- /// 頂点
|
|
|
|
class PmxVertex
|
|
class PmxVertex
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -219,24 +207,16 @@ namespace pmx
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /// 位置
|
|
|
|
float position[3];
|
|
float position[3];
|
|
- /// 法線
|
|
|
|
float normal[3];
|
|
float normal[3];
|
|
- /// テクスチャ座標
|
|
|
|
float uv[2];
|
|
float uv[2];
|
|
- /// 追加テクスチャ座標
|
|
|
|
float uva[4][4];
|
|
float uva[4][4];
|
|
- /// スキニングタイプ
|
|
|
|
PmxVertexSkinningType skinning_type;
|
|
PmxVertexSkinningType skinning_type;
|
|
- /// スキニング
|
|
|
|
std::unique_ptr<PmxVertexSkinning> skinning;
|
|
std::unique_ptr<PmxVertexSkinning> skinning;
|
|
- /// エッジ倍率
|
|
|
|
float edge;
|
|
float edge;
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
};
|
|
};
|
|
|
|
|
|
- /// マテリアル
|
|
|
|
class PmxMaterial
|
|
class PmxMaterial
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -261,42 +241,25 @@ namespace pmx
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /// モデル名
|
|
|
|
std::string material_name;
|
|
std::string material_name;
|
|
- /// モデル英名
|
|
|
|
std::string material_english_name;
|
|
std::string material_english_name;
|
|
- /// 減衰色
|
|
|
|
float diffuse[4];
|
|
float diffuse[4];
|
|
- /// 光沢色
|
|
|
|
float specular[3];
|
|
float specular[3];
|
|
- /// 光沢度
|
|
|
|
float specularlity;
|
|
float specularlity;
|
|
- /// 環境色
|
|
|
|
float ambient[3];
|
|
float ambient[3];
|
|
- /// 描画フラグ
|
|
|
|
uint8_t flag;
|
|
uint8_t flag;
|
|
- /// エッジ色
|
|
|
|
float edge_color[4];
|
|
float edge_color[4];
|
|
- /// エッジサイズ
|
|
|
|
float edge_size;
|
|
float edge_size;
|
|
- /// アルベドテクスチャインデックス
|
|
|
|
int diffuse_texture_index;
|
|
int diffuse_texture_index;
|
|
- /// スフィアテクスチャインデックス
|
|
|
|
int sphere_texture_index;
|
|
int sphere_texture_index;
|
|
- /// スフィアテクスチャ演算モード
|
|
|
|
uint8_t sphere_op_mode;
|
|
uint8_t sphere_op_mode;
|
|
- /// 共有トゥーンフラグ
|
|
|
|
uint8_t common_toon_flag;
|
|
uint8_t common_toon_flag;
|
|
- /// トゥーンテクスチャインデックス
|
|
|
|
int toon_texture_index;
|
|
int toon_texture_index;
|
|
- /// メモ
|
|
|
|
std::string memo;
|
|
std::string memo;
|
|
- /// 頂点インデックス数
|
|
|
|
int index_count;
|
|
int index_count;
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
};
|
|
};
|
|
|
|
|
|
- /// リンク
|
|
|
|
class PmxIkLink
|
|
class PmxIkLink
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -310,18 +273,13 @@ namespace pmx
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /// リンクボーンインデックス
|
|
|
|
int link_target;
|
|
int link_target;
|
|
- /// 角度制限
|
|
|
|
uint8_t angle_lock;
|
|
uint8_t angle_lock;
|
|
- /// 最大制限角度
|
|
|
|
float max_radian[3];
|
|
float max_radian[3];
|
|
- /// 最小制限角度
|
|
|
|
float min_radian[3];
|
|
float min_radian[3];
|
|
void Read(std::istream *stream, PmxSetting *settingn);
|
|
void Read(std::istream *stream, PmxSetting *settingn);
|
|
};
|
|
};
|
|
|
|
|
|
- /// ボーン
|
|
|
|
class PmxBone
|
|
class PmxBone
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -347,43 +305,24 @@ namespace pmx
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /// ボーン名
|
|
|
|
std::string bone_name;
|
|
std::string bone_name;
|
|
- /// ボーン英名
|
|
|
|
std::string bone_english_name;
|
|
std::string bone_english_name;
|
|
- /// 位置
|
|
|
|
float position[3];
|
|
float position[3];
|
|
- /// 親ボーンインデックス
|
|
|
|
int parent_index;
|
|
int parent_index;
|
|
- /// 階層
|
|
|
|
int level;
|
|
int level;
|
|
- /// ボーンフラグ
|
|
|
|
uint16_t bone_flag;
|
|
uint16_t bone_flag;
|
|
- /// 座標オフセット(has Target)
|
|
|
|
float offset[3];
|
|
float offset[3];
|
|
- /// 接続先ボーンインデックス(not has Target)
|
|
|
|
int target_index;
|
|
int target_index;
|
|
- /// 付与親ボーンインデックス
|
|
|
|
int grant_parent_index;
|
|
int grant_parent_index;
|
|
- /// 付与率
|
|
|
|
float grant_weight;
|
|
float grant_weight;
|
|
- /// 固定軸の方向
|
|
|
|
float lock_axis_orientation[3];
|
|
float lock_axis_orientation[3];
|
|
- /// ローカル軸のX軸方向
|
|
|
|
float local_axis_x_orientation[3];
|
|
float local_axis_x_orientation[3];
|
|
- /// ローカル軸のY軸方向
|
|
|
|
float local_axis_y_orientation[3];
|
|
float local_axis_y_orientation[3];
|
|
- /// 外部親変形のkey値
|
|
|
|
int key;
|
|
int key;
|
|
- /// IKターゲットボーン
|
|
|
|
int ik_target_bone_index;
|
|
int ik_target_bone_index;
|
|
- /// IKループ回数
|
|
|
|
int ik_loop;
|
|
int ik_loop;
|
|
- /// IKループ計算時の角度制限(ラジアン)
|
|
|
|
float ik_loop_angle_limit;
|
|
float ik_loop_angle_limit;
|
|
- /// IKリンク数
|
|
|
|
int ik_link_count;
|
|
int ik_link_count;
|
|
- /// IKリンク
|
|
|
|
std::unique_ptr<PmxIkLink []> ik_links;
|
|
std::unique_ptr<PmxIkLink []> ik_links;
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
};
|
|
};
|
|
@@ -543,7 +482,6 @@ namespace pmx
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
|
};
|
|
};
|
|
|
|
|
|
- /// モーフ
|
|
|
|
class PmxMorph
|
|
class PmxMorph
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -551,34 +489,21 @@ namespace pmx
|
|
: offset_count(0)
|
|
: offset_count(0)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
- /// モーフ名
|
|
|
|
std::string morph_name;
|
|
std::string morph_name;
|
|
- /// モーフ英名
|
|
|
|
std::string morph_english_name;
|
|
std::string morph_english_name;
|
|
- /// カテゴリ
|
|
|
|
MorphCategory category;
|
|
MorphCategory category;
|
|
- /// モーフタイプ
|
|
|
|
MorphType morph_type;
|
|
MorphType morph_type;
|
|
- /// オフセット数
|
|
|
|
int offset_count;
|
|
int offset_count;
|
|
- /// 頂点モーフ配列
|
|
|
|
std::unique_ptr<PmxMorphVertexOffset []> vertex_offsets;
|
|
std::unique_ptr<PmxMorphVertexOffset []> vertex_offsets;
|
|
- /// UVモーフ配列
|
|
|
|
std::unique_ptr<PmxMorphUVOffset []> uv_offsets;
|
|
std::unique_ptr<PmxMorphUVOffset []> uv_offsets;
|
|
- /// ボーンモーフ配列
|
|
|
|
std::unique_ptr<PmxMorphBoneOffset []> bone_offsets;
|
|
std::unique_ptr<PmxMorphBoneOffset []> bone_offsets;
|
|
- /// マテリアルモーフ配列
|
|
|
|
std::unique_ptr<PmxMorphMaterialOffset []> material_offsets;
|
|
std::unique_ptr<PmxMorphMaterialOffset []> material_offsets;
|
|
- /// グループモーフ配列
|
|
|
|
std::unique_ptr<PmxMorphGroupOffset []> group_offsets;
|
|
std::unique_ptr<PmxMorphGroupOffset []> group_offsets;
|
|
- /// フリップモーフ配列
|
|
|
|
std::unique_ptr<PmxMorphFlipOffset []> flip_offsets;
|
|
std::unique_ptr<PmxMorphFlipOffset []> flip_offsets;
|
|
- /// インパルスモーフ配列
|
|
|
|
std::unique_ptr<PmxMorphImplusOffset []> implus_offsets;
|
|
std::unique_ptr<PmxMorphImplusOffset []> implus_offsets;
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
};
|
|
};
|
|
|
|
|
|
- /// 枠内要素
|
|
|
|
class PmxFrameElement
|
|
class PmxFrameElement
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -587,14 +512,11 @@ namespace pmx
|
|
, index(0)
|
|
, index(0)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
- /// 要素対象
|
|
|
|
uint8_t element_target;
|
|
uint8_t element_target;
|
|
- /// 要素対象インデックス
|
|
|
|
int index;
|
|
int index;
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
};
|
|
};
|
|
|
|
|
|
- /// 表示枠
|
|
|
|
class PmxFrame
|
|
class PmxFrame
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -603,15 +525,10 @@ namespace pmx
|
|
, element_count(0)
|
|
, element_count(0)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
- /// 枠名
|
|
|
|
std::string frame_name;
|
|
std::string frame_name;
|
|
- /// 枠英名
|
|
|
|
std::string frame_english_name;
|
|
std::string frame_english_name;
|
|
- /// 特殊枠フラグ
|
|
|
|
uint8_t frame_flag;
|
|
uint8_t frame_flag;
|
|
- /// 枠内要素数
|
|
|
|
int element_count;
|
|
int element_count;
|
|
- /// 枠内要素配列
|
|
|
|
std::unique_ptr<PmxFrameElement []> elements;
|
|
std::unique_ptr<PmxFrameElement []> elements;
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
};
|
|
};
|
|
@@ -637,17 +554,11 @@ namespace pmx
|
|
orientation[i] = 0.0f;
|
|
orientation[i] = 0.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- /// 剛体名
|
|
|
|
std::string girid_body_name;
|
|
std::string girid_body_name;
|
|
- /// 剛体英名
|
|
|
|
std::string girid_body_english_name;
|
|
std::string girid_body_english_name;
|
|
- /// 関連ボーンインデックス
|
|
|
|
int target_bone;
|
|
int target_bone;
|
|
- /// グループ
|
|
|
|
uint8_t group;
|
|
uint8_t group;
|
|
- /// マスク
|
|
|
|
uint16_t mask;
|
|
uint16_t mask;
|
|
- /// 形状
|
|
|
|
uint8_t shape;
|
|
uint8_t shape;
|
|
float size[3];
|
|
float size[3];
|
|
float position[3];
|
|
float position[3];
|
|
@@ -818,7 +729,6 @@ namespace pmx
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
};
|
|
};
|
|
|
|
|
|
- /// PMXモデル
|
|
|
|
class PmxModel
|
|
class PmxModel
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
@@ -836,65 +746,35 @@ namespace pmx
|
|
, soft_body_count(0)
|
|
, soft_body_count(0)
|
|
{}
|
|
{}
|
|
|
|
|
|
- /// バージョン
|
|
|
|
float version;
|
|
float version;
|
|
- /// 設定
|
|
|
|
PmxSetting setting;
|
|
PmxSetting setting;
|
|
- /// モデル名
|
|
|
|
std::string model_name;
|
|
std::string model_name;
|
|
- /// モデル英名
|
|
|
|
std::string model_english_name;
|
|
std::string model_english_name;
|
|
- /// コメント
|
|
|
|
std::string model_comment;
|
|
std::string model_comment;
|
|
- /// 英語コメント
|
|
|
|
std::string model_english_comment;
|
|
std::string model_english_comment;
|
|
- /// 頂点数
|
|
|
|
int vertex_count;
|
|
int vertex_count;
|
|
- /// 頂点配列
|
|
|
|
std::unique_ptr<PmxVertex []> vertices;
|
|
std::unique_ptr<PmxVertex []> vertices;
|
|
- /// インデックス数
|
|
|
|
int index_count;
|
|
int index_count;
|
|
- /// インデックス配列
|
|
|
|
std::unique_ptr<int []> indices;
|
|
std::unique_ptr<int []> indices;
|
|
- /// テクスチャ数
|
|
|
|
int texture_count;
|
|
int texture_count;
|
|
- /// テクスチャ配列
|
|
|
|
std::unique_ptr< std::string []> textures;
|
|
std::unique_ptr< std::string []> textures;
|
|
- /// マテリアル数
|
|
|
|
int material_count;
|
|
int material_count;
|
|
- /// マテリアル
|
|
|
|
std::unique_ptr<PmxMaterial []> materials;
|
|
std::unique_ptr<PmxMaterial []> materials;
|
|
- /// ボーン数
|
|
|
|
int bone_count;
|
|
int bone_count;
|
|
- /// ボーン配列
|
|
|
|
std::unique_ptr<PmxBone []> bones;
|
|
std::unique_ptr<PmxBone []> bones;
|
|
- /// モーフ数
|
|
|
|
int morph_count;
|
|
int morph_count;
|
|
- /// モーフ配列
|
|
|
|
std::unique_ptr<PmxMorph []> morphs;
|
|
std::unique_ptr<PmxMorph []> morphs;
|
|
- /// 表示枠数
|
|
|
|
int frame_count;
|
|
int frame_count;
|
|
- /// 表示枠配列
|
|
|
|
std::unique_ptr<PmxFrame [] > frames;
|
|
std::unique_ptr<PmxFrame [] > frames;
|
|
- /// 剛体数
|
|
|
|
int rigid_body_count;
|
|
int rigid_body_count;
|
|
- /// 剛体配列
|
|
|
|
std::unique_ptr<PmxRigidBody []> rigid_bodies;
|
|
std::unique_ptr<PmxRigidBody []> rigid_bodies;
|
|
- /// ジョイント数
|
|
|
|
int joint_count;
|
|
int joint_count;
|
|
- /// ジョイント配列
|
|
|
|
std::unique_ptr<PmxJoint []> joints;
|
|
std::unique_ptr<PmxJoint []> joints;
|
|
- /// ソフトボディ数
|
|
|
|
int soft_body_count;
|
|
int soft_body_count;
|
|
- /// ソフトボディ配列
|
|
|
|
std::unique_ptr<PmxSoftBody []> soft_bodies;
|
|
std::unique_ptr<PmxSoftBody []> soft_bodies;
|
|
- /// モデル初期化
|
|
|
|
void Init();
|
|
void Init();
|
|
- /// モデル読み込み
|
|
|
|
void Read(std::istream *stream);
|
|
void Read(std::istream *stream);
|
|
- ///// ファイルからモデルの読み込み
|
|
|
|
//static std::unique_ptr<PmxModel> ReadFromFile(const char *filename);
|
|
//static std::unique_ptr<PmxModel> ReadFromFile(const char *filename);
|
|
- ///// 入力ストリームからモデルの読み込み
|
|
|
|
//static std::unique_ptr<PmxModel> ReadFromStream(std::istream *stream);
|
|
//static std::unique_ptr<PmxModel> ReadFromStream(std::istream *stream);
|
|
};
|
|
};
|
|
}
|
|
}
|