namespace pmd
{
- /// ヘッダ
class PmdHeader
{
public:
- /// モデル名
std::string name;
- /// モデル名(英語)
std::string name_english;
- /// コメント
std::string comment;
- /// コメント(英語)
std::string comment_english;
bool Read(std::ifstream* stream)
}
};
- /// 頂点
class PmdVertex
{
public:
- /// 位置
float position[3];
- /// 法線
float normal[3];
- /// UV座標
float uv[2];
- /// 関連ボーンインデックス
uint16_t bone_index[2];
- /// ボーンウェイト
uint8_t bone_weight;
- /// エッジ不可視
bool edge_invisible;
bool Read(std::ifstream* stream)
}
};
- /// 材質
class PmdMaterial
{
public:
- /// 減衰色
float diffuse[4];
- /// 光沢度
float power;
- /// 光沢色
float specular[3];
- /// 環境色
float ambient[3];
- /// トーンインデックス
uint8_t toon_index;
- /// エッジ
uint8_t edge_flag;
- /// インデックス数
uint32_t index_count;
- /// テクスチャファイル名
std::string texture_filename;
- /// スフィアファイル名
std::string sphere_filename;
bool Read(std::ifstream* stream)
RotationMovement
};
- /// ボーン
class PmdBone
{
public:
- /// ボーン名
std::string name;
- /// ボーン名(英語)
std::string name_english;
- /// 親ボーン番号
uint16_t parent_bone_index;
- /// 末端ボーン番号
uint16_t tail_pos_bone_index;
- /// ボーン種類
BoneType bone_type;
- /// IKボーン番号
uint16_t ik_parent_bone_index;
- /// ボーンのヘッドの位置
float bone_head_pos[3];
void Read(std::istream *stream)
}
};
- /// IK
class PmdIk
{
public:
- /// IKボーン番号
uint16_t ik_bone_index;
- /// IKターゲットボーン番号
uint16_t target_bone_index;
- /// 再帰回数
uint16_t interations;
- /// 角度制限
float angle_limit;
- /// 影響下ボーン番号
std::vector<uint16_t> ik_child_bone_index;
void Read(std::istream *stream)
}
};
- /// ボーン枠用の枠名
class PmdBoneDispName
{
public:
}
};
- /// 衝突形状
enum class RigidBodyShape : uint8_t
{
- /// 球
Sphere = 0,
- /// 直方体
Box = 1,
- /// カプセル
Cpusel = 2
};
- /// 剛体タイプ
enum class RigidBodyType : uint8_t
{
- /// ボーン追従
BoneConnected = 0,
- /// 物理演算
Physics = 1,
- /// 物理演算(Bone位置合せ)
ConnectedPhysics = 2
};
- /// 剛体
class PmdRigidBody
{
public:
- /// 名前
std::string name;
- /// 関連ボーン番号
uint16_t related_bone_index;
- /// グループ番号
uint8_t group_index;
- /// マスク
uint16_t mask;
- /// 形状
RigidBodyShape shape;
- /// 大きさ
float size[3];
- /// 位置
float position[3];
- /// 回転
float orientation[3];
- /// 質量
float weight;
- /// 移動ダンピング
float linear_damping;
- /// 回転ダンピング
float anglar_damping;
- /// 反発係数
float restitution;
- /// 摩擦係数
float friction;
- /// 演算方法
RigidBodyType rigid_type;
void Read(std::istream *stream)
}
};
- /// 剛体の拘束
class PmdConstraint
{
public:
- /// 名前
std::string name;
- /// 剛体Aのインデックス
uint32_t rigid_body_index_a;
- /// 剛体Bのインデックス
uint32_t rigid_body_index_b;
- /// 位置
float position[3];
- /// 回転
float orientation[3];
- /// 最小移動制限
float linear_lower_limit[3];
- /// 最大移動制限
float linear_upper_limit[3];
- /// 最小回転制限
float angular_lower_limit[3];
- /// 最大回転制限
float angular_upper_limit[3];
- /// 移動に対する復元力
float linear_stiffness[3];
- /// 回転に対する復元力
float angular_stiffness[3];
void Read(std::istream *stream)
}
};
- /// PMDモデル
class PmdModel
{
public:
return result;
}
- /// ファイルからPmdModelを生成する
static std::unique_ptr<PmdModel> LoadFromStream(std::ifstream *stream)
{
auto result = mmd::make_unique<PmdModel>();
namespace pmx
{
- /// インデックス設定
class PmxSetting
{
public:
, rigidbody_index_size(0)
{}
- /// エンコード方式
uint8_t encoding;
- /// 追加UV数
uint8_t uv;
- /// 頂点インデックスサイズ
uint8_t vertex_index_size;
- /// テクスチャインデックスサイズ
uint8_t texture_index_size;
- /// マテリアルインデックスサイズ
uint8_t material_index_size;
- /// ボーンインデックスサイズ
uint8_t bone_index_size;
- /// モーフインデックスサイズ
uint8_t morph_index_size;
- /// 剛体インデックスサイズ
uint8_t rigidbody_index_size;
void Read(std::istream *stream);
};
- /// 頂点スキニングタイプ
enum class PmxVertexSkinningType : uint8_t
{
BDEF1 = 0,
QDEF = 4,
};
- /// 頂点スキニング
class PmxVertexSkinning
{
public:
void Read(std::istream *stresam, PmxSetting *setting);
};
- /// 頂点
class PmxVertex
{
public:
}
}
- /// 位置
float position[3];
- /// 法線
float normal[3];
- /// テクスチャ座標
float uv[2];
- /// 追加テクスチャ座標
float uva[4][4];
- /// スキニングタイプ
PmxVertexSkinningType skinning_type;
- /// スキニング
std::unique_ptr<PmxVertexSkinning> skinning;
- /// エッジ倍率
float edge;
void Read(std::istream *stream, PmxSetting *setting);
};
- /// マテリアル
class PmxMaterial
{
public:
}
}
- /// モデル名
std::string material_name;
- /// モデル英名
std::string material_english_name;
- /// 減衰色
float diffuse[4];
- /// 光沢色
float specular[3];
- /// 光沢度
float specularlity;
- /// 環境色
float ambient[3];
- /// 描画フラグ
uint8_t flag;
- /// エッジ色
float edge_color[4];
- /// エッジサイズ
float edge_size;
- /// アルベドテクスチャインデックス
int diffuse_texture_index;
- /// スフィアテクスチャインデックス
int sphere_texture_index;
- /// スフィアテクスチャ演算モード
uint8_t sphere_op_mode;
- /// 共有トゥーンフラグ
uint8_t common_toon_flag;
- /// トゥーンテクスチャインデックス
int toon_texture_index;
- /// メモ
std::string memo;
- /// 頂点インデックス数
int index_count;
void Read(std::istream *stream, PmxSetting *setting);
};
- /// リンク
class PmxIkLink
{
public:
}
}
- /// リンクボーンインデックス
int link_target;
- /// 角度制限
uint8_t angle_lock;
- /// 最大制限角度
float max_radian[3];
- /// 最小制限角度
float min_radian[3];
void Read(std::istream *stream, PmxSetting *settingn);
};
- /// ボーン
class PmxBone
{
public:
}
}
- /// ボーン名
std::string bone_name;
- /// ボーン英名
std::string bone_english_name;
- /// 位置
float position[3];
- /// 親ボーンインデックス
int parent_index;
- /// 階層
int level;
- /// ボーンフラグ
uint16_t bone_flag;
- /// 座標オフセット(has Target)
float offset[3];
- /// 接続先ボーンインデックス(not has Target)
int target_index;
- /// 付与親ボーンインデックス
int grant_parent_index;
- /// 付与率
float grant_weight;
- /// 固定軸の方向
float lock_axis_orientation[3];
- /// ローカル軸のX軸方向
float local_axis_x_orientation[3];
- /// ローカル軸のY軸方向
float local_axis_y_orientation[3];
- /// 外部親変形のkey値
int key;
- /// IKターゲットボーン
int ik_target_bone_index;
- /// IKループ回数
int ik_loop;
- /// IKループ計算時の角度制限(ラジアン)
float ik_loop_angle_limit;
- /// IKリンク数
int ik_link_count;
- /// IKリンク
std::unique_ptr<PmxIkLink []> ik_links;
void Read(std::istream *stream, PmxSetting *setting);
};
void Read(std::istream *stream, PmxSetting *setting); //override;
};
- /// モーフ
class PmxMorph
{
public:
: offset_count(0)
{
}
- /// モーフ名
std::string morph_name;
- /// モーフ英名
std::string morph_english_name;
- /// カテゴリ
MorphCategory category;
- /// モーフタイプ
MorphType morph_type;
- /// オフセット数
int offset_count;
- /// 頂点モーフ配列
std::unique_ptr<PmxMorphVertexOffset []> vertex_offsets;
- /// UVモーフ配列
std::unique_ptr<PmxMorphUVOffset []> uv_offsets;
- /// ボーンモーフ配列
std::unique_ptr<PmxMorphBoneOffset []> bone_offsets;
- /// マテリアルモーフ配列
std::unique_ptr<PmxMorphMaterialOffset []> material_offsets;
- /// グループモーフ配列
std::unique_ptr<PmxMorphGroupOffset []> group_offsets;
- /// フリップモーフ配列
std::unique_ptr<PmxMorphFlipOffset []> flip_offsets;
- /// インパルスモーフ配列
std::unique_ptr<PmxMorphImplusOffset []> implus_offsets;
void Read(std::istream *stream, PmxSetting *setting);
};
- /// 枠内要素
class PmxFrameElement
{
public:
, index(0)
{
}
- /// 要素対象
uint8_t element_target;
- /// 要素対象インデックス
int index;
void Read(std::istream *stream, PmxSetting *setting);
};
- /// 表示枠
class PmxFrame
{
public:
, element_count(0)
{
}
- /// 枠名
std::string frame_name;
- /// 枠英名
std::string frame_english_name;
- /// 特殊枠フラグ
uint8_t frame_flag;
- /// 枠内要素数
int element_count;
- /// 枠内要素配列
std::unique_ptr<PmxFrameElement []> elements;
void Read(std::istream *stream, PmxSetting *setting);
};
orientation[i] = 0.0f;
}
}
- /// 剛体名
std::string girid_body_name;
- /// 剛体英名
std::string girid_body_english_name;
- /// 関連ボーンインデックス
int target_bone;
- /// グループ
uint8_t group;
- /// マスク
uint16_t mask;
- /// 形状
uint8_t shape;
float size[3];
float position[3];
void Read(std::istream *stream, PmxSetting *setting);
};
- /// PMXモデル
class PmxModel
{
public:
, soft_body_count(0)
{}
- /// バージョン
float version;
- /// 設定
PmxSetting setting;
- /// モデル名
std::string model_name;
- /// モデル英名
std::string model_english_name;
- /// コメント
std::string model_comment;
- /// 英語コメント
std::string model_english_comment;
- /// 頂点数
int vertex_count;
- /// 頂点配列
std::unique_ptr<PmxVertex []> vertices;
- /// インデックス数
int index_count;
- /// インデックス配列
std::unique_ptr<int []> indices;
- /// テクスチャ数
int texture_count;
- /// テクスチャ配列
std::unique_ptr< std::string []> textures;
- /// マテリアル数
int material_count;
- /// マテリアル
std::unique_ptr<PmxMaterial []> materials;
- /// ボーン数
int bone_count;
- /// ボーン配列
std::unique_ptr<PmxBone []> bones;
- /// モーフ数
int morph_count;
- /// モーフ配列
std::unique_ptr<PmxMorph []> morphs;
- /// 表示枠数
int frame_count;
- /// 表示枠配列
std::unique_ptr<PmxFrame [] > frames;
- /// 剛体数
int rigid_body_count;
- /// 剛体配列
std::unique_ptr<PmxRigidBody []> rigid_bodies;
- /// ジョイント数
int joint_count;
- /// ジョイント配列
std::unique_ptr<PmxJoint []> joints;
- /// ソフトボディ数
int soft_body_count;
- /// ソフトボディ配列
std::unique_ptr<PmxSoftBody []> soft_bodies;
- /// モデル初期化
void Init();
- /// モデル読み込み
void Read(std::istream *stream);
- ///// ファイルからモデルの読み込み
//static std::unique_ptr<PmxModel> ReadFromFile(const char *filename);
- ///// 入力ストリームからモデルの読み込み
//static std::unique_ptr<PmxModel> ReadFromStream(std::istream *stream);
};
}