2017-06-17 18:36:59 +00:00
|
|
|
/*
|
|
|
|
Open Asset Import Library (assimp)
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
|
2024-02-23 21:30:05 +00:00
|
|
|
Copyright (c) 2006-2024, assimp team
|
2018-01-28 18:42:05 +00:00
|
|
|
|
2017-06-17 18:36:59 +00:00
|
|
|
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
Redistribution and use of this software in source and binary forms,
|
|
|
|
with or without modification, are permitted provided that the
|
|
|
|
following conditions are met:
|
|
|
|
|
|
|
|
* Redistributions of source code must retain the above
|
|
|
|
copyright notice, this list of conditions and the
|
|
|
|
following disclaimer.
|
|
|
|
|
|
|
|
* Redistributions in binary form must reproduce the above
|
|
|
|
copyright notice, this list of conditions and the
|
|
|
|
following disclaimer in the documentation and/or other
|
|
|
|
materials provided with the distribution.
|
|
|
|
|
|
|
|
* Neither the name of the assimp team, nor the names of its
|
|
|
|
contributors may be used to endorse or promote products
|
|
|
|
derived from this software without specific prior
|
|
|
|
written permission of the assimp team.
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
*/
|
2017-02-24 00:35:15 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <string>
|
|
|
|
#include <iostream>
|
|
|
|
#include <fstream>
|
|
|
|
#include <memory>
|
2023-04-01 10:35:57 +00:00
|
|
|
#include <assimp/types.h>
|
2017-02-24 00:35:15 +00:00
|
|
|
#include "MMDCpp14.h"
|
|
|
|
|
|
|
|
namespace pmx
|
|
|
|
{
|
|
|
|
class PmxSetting
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxSetting()
|
|
|
|
: encoding(0)
|
|
|
|
, uv(0)
|
|
|
|
, vertex_index_size(0)
|
|
|
|
, texture_index_size(0)
|
|
|
|
, material_index_size(0)
|
|
|
|
, bone_index_size(0)
|
|
|
|
, morph_index_size(0)
|
|
|
|
, rigidbody_index_size(0)
|
|
|
|
{}
|
|
|
|
|
|
|
|
uint8_t encoding;
|
|
|
|
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,
|
|
|
|
BDEF2 = 1,
|
|
|
|
BDEF4 = 2,
|
|
|
|
SDEF = 3,
|
|
|
|
QDEF = 4,
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxVertexSkinning
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual void Read(std::istream *stream, PmxSetting *setting) = 0;
|
2022-09-01 16:28:45 +00:00
|
|
|
virtual ~PmxVertexSkinning() = default;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxVertexSkinningBDEF1 : public PmxVertexSkinning
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxVertexSkinningBDEF1()
|
|
|
|
: bone_index(0)
|
|
|
|
{}
|
|
|
|
|
|
|
|
int bone_index;
|
|
|
|
void Read(std::istream *stresam, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxVertexSkinningBDEF2 : public PmxVertexSkinning
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxVertexSkinningBDEF2()
|
|
|
|
: bone_index1(0)
|
|
|
|
, bone_index2(0)
|
|
|
|
, bone_weight(0.0f)
|
|
|
|
{}
|
|
|
|
|
|
|
|
int bone_index1;
|
|
|
|
int bone_index2;
|
|
|
|
float bone_weight;
|
|
|
|
void Read(std::istream *stresam, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxVertexSkinningBDEF4 : public PmxVertexSkinning
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxVertexSkinningBDEF4()
|
|
|
|
: bone_index1(0)
|
|
|
|
, bone_index2(0)
|
|
|
|
, bone_index3(0)
|
|
|
|
, bone_index4(0)
|
|
|
|
, bone_weight1(0.0f)
|
|
|
|
, bone_weight2(0.0f)
|
|
|
|
, bone_weight3(0.0f)
|
|
|
|
, bone_weight4(0.0f)
|
|
|
|
{}
|
|
|
|
|
|
|
|
int bone_index1;
|
|
|
|
int bone_index2;
|
|
|
|
int bone_index3;
|
|
|
|
int bone_index4;
|
|
|
|
float bone_weight1;
|
|
|
|
float bone_weight2;
|
|
|
|
float bone_weight3;
|
|
|
|
float bone_weight4;
|
|
|
|
void Read(std::istream *stresam, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxVertexSkinningSDEF : public PmxVertexSkinning
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxVertexSkinningSDEF()
|
|
|
|
: bone_index1(0)
|
|
|
|
, bone_index2(0)
|
|
|
|
, bone_weight(0.0f)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
sdef_c[i] = 0.0f;
|
|
|
|
sdef_r0[i] = 0.0f;
|
|
|
|
sdef_r1[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int bone_index1;
|
|
|
|
int bone_index2;
|
|
|
|
float bone_weight;
|
|
|
|
float sdef_c[3];
|
|
|
|
float sdef_r0[3];
|
|
|
|
float sdef_r1[3];
|
|
|
|
void Read(std::istream *stresam, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxVertexSkinningQDEF : public PmxVertexSkinning
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxVertexSkinningQDEF()
|
|
|
|
: bone_index1(0)
|
|
|
|
, bone_index2(0)
|
|
|
|
, bone_index3(0)
|
|
|
|
, bone_index4(0)
|
|
|
|
, bone_weight1(0.0f)
|
|
|
|
, bone_weight2(0.0f)
|
|
|
|
, bone_weight3(0.0f)
|
|
|
|
, bone_weight4(0.0f)
|
|
|
|
{}
|
|
|
|
|
|
|
|
int bone_index1;
|
|
|
|
int bone_index2;
|
|
|
|
int bone_index3;
|
|
|
|
int bone_index4;
|
|
|
|
float bone_weight1;
|
|
|
|
float bone_weight2;
|
|
|
|
float bone_weight3;
|
|
|
|
float bone_weight4;
|
|
|
|
void Read(std::istream *stresam, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxVertex
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxVertex()
|
|
|
|
: edge(0.0f)
|
|
|
|
{
|
|
|
|
uv[0] = uv[1] = 0.0f;
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
2017-02-27 13:02:58 +00:00
|
|
|
position[i] = 0.0f;
|
2017-02-24 00:35:15 +00:00
|
|
|
normal[i] = 0.0f;
|
|
|
|
}
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
for (int k = 0; k < 4; ++k) {
|
|
|
|
uva[i][k] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-27 13:02:58 +00:00
|
|
|
float position[3];
|
2017-02-24 00:35:15 +00:00
|
|
|
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:
|
|
|
|
PmxMaterial()
|
|
|
|
: specularlity(0.0f)
|
|
|
|
, flag(0)
|
|
|
|
, edge_size(0.0f)
|
|
|
|
, diffuse_texture_index(0)
|
|
|
|
, sphere_texture_index(0)
|
|
|
|
, sphere_op_mode(0)
|
|
|
|
, common_toon_flag(0)
|
|
|
|
, toon_texture_index(0)
|
|
|
|
, index_count(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
specular[i] = 0.0f;
|
|
|
|
ambient[i] = 0.0f;
|
|
|
|
edge_color[i] = 0.0f;
|
|
|
|
}
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
diffuse[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string material_name;
|
|
|
|
std::string material_english_name;
|
2017-02-24 00:35:15 +00:00
|
|
|
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;
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string memo;
|
2017-02-24 00:35:15 +00:00
|
|
|
int index_count;
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxIkLink
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxIkLink()
|
|
|
|
: link_target(0)
|
|
|
|
, angle_lock(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
max_radian[i] = 0.0f;
|
|
|
|
min_radian[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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:
|
|
|
|
PmxBone()
|
|
|
|
: parent_index(0)
|
|
|
|
, level(0)
|
|
|
|
, bone_flag(0)
|
|
|
|
, target_index(0)
|
|
|
|
, grant_parent_index(0)
|
|
|
|
, grant_weight(0.0f)
|
|
|
|
, key(0)
|
|
|
|
, ik_target_bone_index(0)
|
|
|
|
, ik_loop(0)
|
|
|
|
, ik_loop_angle_limit(0.0f)
|
|
|
|
, ik_link_count(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
position[i] = 0.0f;
|
|
|
|
offset[i] = 0.0f;
|
|
|
|
lock_axis_orientation[i] = 0.0f;
|
|
|
|
local_axis_x_orientation[i] = 0.0f;
|
|
|
|
local_axis_y_orientation[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string bone_name;
|
|
|
|
std::string bone_english_name;
|
2017-02-24 00:35:15 +00:00
|
|
|
float position[3];
|
|
|
|
int parent_index;
|
|
|
|
int level;
|
|
|
|
uint16_t bone_flag;
|
|
|
|
float offset[3];
|
|
|
|
int target_index;
|
|
|
|
int grant_parent_index;
|
|
|
|
float grant_weight;
|
|
|
|
float lock_axis_orientation[3];
|
|
|
|
float local_axis_x_orientation[3];
|
|
|
|
float local_axis_y_orientation[3];
|
|
|
|
int key;
|
|
|
|
int ik_target_bone_index;
|
|
|
|
int ik_loop;
|
|
|
|
float ik_loop_angle_limit;
|
|
|
|
int ik_link_count;
|
|
|
|
std::unique_ptr<PmxIkLink []> ik_links;
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class MorphType : uint8_t
|
|
|
|
{
|
|
|
|
Group = 0,
|
|
|
|
Vertex = 1,
|
|
|
|
Bone = 2,
|
|
|
|
UV = 3,
|
|
|
|
AdditionalUV1 = 4,
|
|
|
|
AdditionalUV2 = 5,
|
|
|
|
AdditionalUV3 = 6,
|
|
|
|
AdditionalUV4 = 7,
|
|
|
|
Matrial = 8,
|
|
|
|
Flip = 9,
|
|
|
|
Implus = 10,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class MorphCategory : uint8_t
|
|
|
|
{
|
|
|
|
ReservedCategory = 0,
|
|
|
|
Eyebrow = 1,
|
|
|
|
Eye = 2,
|
|
|
|
Mouth = 3,
|
|
|
|
Other = 4,
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
void virtual Read(std::istream *stream, PmxSetting *setting) = 0;
|
2022-07-08 16:13:25 +00:00
|
|
|
|
2022-07-09 15:23:40 +00:00
|
|
|
virtual ~PmxMorphOffset() = default;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphVertexOffset : public PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorphVertexOffset()
|
|
|
|
: vertex_index(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
position_offset[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int vertex_index;
|
|
|
|
float position_offset[3];
|
2017-03-27 14:49:58 +00:00
|
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphUVOffset : public PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorphUVOffset()
|
|
|
|
: vertex_index(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
uv_offset[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int vertex_index;
|
|
|
|
float uv_offset[4];
|
2017-03-27 14:49:58 +00:00
|
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphBoneOffset : public PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorphBoneOffset()
|
|
|
|
: bone_index(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
translation[i] = 0.0f;
|
|
|
|
}
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
rotation[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int bone_index;
|
|
|
|
float translation[3];
|
|
|
|
float rotation[4];
|
2017-03-27 14:49:58 +00:00
|
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphMaterialOffset : public PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorphMaterialOffset()
|
|
|
|
: specularity(0.0f)
|
|
|
|
, edge_size(0.0f)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
specular[i] = 0.0f;
|
|
|
|
ambient[i] = 0.0f;
|
|
|
|
}
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
diffuse[i] = 0.0f;
|
|
|
|
edge_color[i] = 0.0f;
|
|
|
|
texture_argb[i] = 0.0f;
|
|
|
|
sphere_texture_argb[i] = 0.0f;
|
|
|
|
toon_texture_argb[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int material_index;
|
|
|
|
uint8_t offset_operation;
|
|
|
|
float diffuse[4];
|
|
|
|
float specular[3];
|
|
|
|
float specularity;
|
|
|
|
float ambient[3];
|
|
|
|
float edge_color[4];
|
|
|
|
float edge_size;
|
|
|
|
float texture_argb[4];
|
|
|
|
float sphere_texture_argb[4];
|
|
|
|
float toon_texture_argb[4];
|
2017-03-27 14:49:58 +00:00
|
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphGroupOffset : public PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorphGroupOffset()
|
|
|
|
: morph_index(0)
|
|
|
|
, morph_weight(0.0f)
|
|
|
|
{}
|
|
|
|
int morph_index;
|
|
|
|
float morph_weight;
|
2017-03-27 14:49:58 +00:00
|
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphFlipOffset : public PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorphFlipOffset()
|
|
|
|
: morph_index(0)
|
|
|
|
, morph_value(0.0f)
|
|
|
|
{}
|
|
|
|
int morph_index;
|
|
|
|
float morph_value;
|
2017-03-27 14:49:58 +00:00
|
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorphImplusOffset : public PmxMorphOffset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorphImplusOffset()
|
|
|
|
: rigid_body_index(0)
|
|
|
|
, is_local(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
velocity[i] = 0.0f;
|
|
|
|
angular_torque[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int rigid_body_index;
|
|
|
|
uint8_t is_local;
|
|
|
|
float velocity[3];
|
|
|
|
float angular_torque[3];
|
2017-03-27 14:49:58 +00:00
|
|
|
void Read(std::istream *stream, PmxSetting *setting); //override;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxMorph
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxMorph()
|
|
|
|
: offset_count(0)
|
|
|
|
{
|
|
|
|
}
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string morph_name;
|
|
|
|
std::string morph_english_name;
|
2017-02-24 00:35:15 +00:00
|
|
|
MorphCategory category;
|
|
|
|
MorphType morph_type;
|
|
|
|
int offset_count;
|
|
|
|
std::unique_ptr<PmxMorphVertexOffset []> vertex_offsets;
|
|
|
|
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:
|
|
|
|
PmxFrameElement()
|
|
|
|
: element_target(0)
|
|
|
|
, index(0)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
uint8_t element_target;
|
|
|
|
int index;
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxFrame
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxFrame()
|
|
|
|
: frame_flag(0)
|
|
|
|
, element_count(0)
|
|
|
|
{
|
|
|
|
}
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string frame_name;
|
|
|
|
std::string frame_english_name;
|
2017-02-24 00:35:15 +00:00
|
|
|
uint8_t frame_flag;
|
|
|
|
int element_count;
|
|
|
|
std::unique_ptr<PmxFrameElement []> elements;
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxRigidBody
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxRigidBody()
|
|
|
|
: target_bone(0)
|
|
|
|
, group(0)
|
|
|
|
, mask(0)
|
|
|
|
, shape(0)
|
|
|
|
, mass(0.0f)
|
|
|
|
, move_attenuation(0.0f)
|
|
|
|
, rotation_attenuation(0.0f)
|
|
|
|
, repulsion(0.0f)
|
|
|
|
, friction(0.0f)
|
|
|
|
, physics_calc_type(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
size[i] = 0.0f;
|
|
|
|
position[i] = 0.0f;
|
|
|
|
orientation[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string girid_body_name;
|
|
|
|
std::string girid_body_english_name;
|
2017-02-24 00:35:15 +00:00
|
|
|
int target_bone;
|
|
|
|
uint8_t group;
|
|
|
|
uint16_t mask;
|
|
|
|
uint8_t shape;
|
|
|
|
float size[3];
|
|
|
|
float position[3];
|
|
|
|
float orientation[3];
|
|
|
|
float mass;
|
|
|
|
float move_attenuation;
|
|
|
|
float rotation_attenuation;
|
|
|
|
float repulsion;
|
|
|
|
float friction;
|
|
|
|
uint8_t physics_calc_type;
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class PmxJointType : uint8_t
|
|
|
|
{
|
|
|
|
Generic6DofSpring = 0,
|
|
|
|
Generic6Dof = 1,
|
|
|
|
Point2Point = 2,
|
|
|
|
ConeTwist = 3,
|
|
|
|
Slider = 5,
|
|
|
|
Hinge = 6
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxJointParam
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxJointParam()
|
|
|
|
: rigid_body1(0)
|
|
|
|
, rigid_body2(0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
position[i] = 0.0f;
|
|
|
|
orientaiton[i] = 0.0f;
|
|
|
|
move_limitation_min[i] = 0.0f;
|
|
|
|
move_limitation_max[i] = 0.0f;
|
|
|
|
rotation_limitation_min[i] = 0.0f;
|
|
|
|
rotation_limitation_max[i] = 0.0f;
|
|
|
|
spring_move_coefficient[i] = 0.0f;
|
|
|
|
spring_rotation_coefficient[i] = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int rigid_body1;
|
|
|
|
int rigid_body2;
|
|
|
|
float position[3];
|
|
|
|
float orientaiton[3];
|
|
|
|
float move_limitation_min[3];
|
|
|
|
float move_limitation_max[3];
|
|
|
|
float rotation_limitation_min[3];
|
|
|
|
float rotation_limitation_max[3];
|
|
|
|
float spring_move_coefficient[3];
|
|
|
|
float spring_rotation_coefficient[3];
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxJoint
|
|
|
|
{
|
|
|
|
public:
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string joint_name;
|
|
|
|
std::string joint_english_name;
|
2017-02-24 00:35:15 +00:00
|
|
|
PmxJointType joint_type;
|
|
|
|
PmxJointParam param;
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
enum PmxSoftBodyFlag : uint8_t
|
|
|
|
{
|
|
|
|
BLink = 0x01,
|
|
|
|
Cluster = 0x02,
|
|
|
|
Link = 0x04
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxAncherRigidBody
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxAncherRigidBody()
|
|
|
|
: related_rigid_body(0)
|
|
|
|
, related_vertex(0)
|
|
|
|
, is_near(false)
|
|
|
|
{}
|
|
|
|
int related_rigid_body;
|
|
|
|
int related_vertex;
|
|
|
|
bool is_near;
|
|
|
|
void Read(std::istream *stream, PmxSetting *setting);
|
|
|
|
};
|
|
|
|
|
|
|
|
class PmxSoftBody
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxSoftBody()
|
|
|
|
: shape(0)
|
|
|
|
, target_material(0)
|
|
|
|
, group(0)
|
|
|
|
, mask(0)
|
|
|
|
, blink_distance(0)
|
|
|
|
, cluster_count(0)
|
|
|
|
, mass(0.0)
|
|
|
|
, collisioni_margin(0.0)
|
|
|
|
, aero_model(0)
|
|
|
|
, VCF(0.0f)
|
|
|
|
, DP(0.0f)
|
|
|
|
, DG(0.0f)
|
|
|
|
, LF(0.0f)
|
|
|
|
, PR(0.0f)
|
|
|
|
, VC(0.0f)
|
|
|
|
, DF(0.0f)
|
|
|
|
, MT(0.0f)
|
|
|
|
, CHR(0.0f)
|
|
|
|
, KHR(0.0f)
|
|
|
|
, SHR(0.0f)
|
|
|
|
, AHR(0.0f)
|
|
|
|
, SRHR_CL(0.0f)
|
|
|
|
, SKHR_CL(0.0f)
|
|
|
|
, SSHR_CL(0.0f)
|
|
|
|
, SR_SPLT_CL(0.0f)
|
|
|
|
, SK_SPLT_CL(0.0f)
|
|
|
|
, SS_SPLT_CL(0.0f)
|
|
|
|
, V_IT(0)
|
|
|
|
, P_IT(0)
|
|
|
|
, D_IT(0)
|
|
|
|
, C_IT(0)
|
|
|
|
, LST(0.0f)
|
|
|
|
, AST(0.0f)
|
|
|
|
, VST(0.0f)
|
|
|
|
, anchor_count(0)
|
|
|
|
, pin_vertex_count(0)
|
|
|
|
{}
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string soft_body_name;
|
|
|
|
std::string soft_body_english_name;
|
2017-02-24 00:35:15 +00:00
|
|
|
uint8_t shape;
|
|
|
|
int target_material;
|
|
|
|
uint8_t group;
|
|
|
|
uint16_t mask;
|
|
|
|
PmxSoftBodyFlag flag;
|
|
|
|
int blink_distance;
|
|
|
|
int cluster_count;
|
|
|
|
float mass;
|
|
|
|
float collisioni_margin;
|
|
|
|
int aero_model;
|
|
|
|
float VCF;
|
|
|
|
float DP;
|
|
|
|
float DG;
|
|
|
|
float LF;
|
|
|
|
float PR;
|
|
|
|
float VC;
|
|
|
|
float DF;
|
|
|
|
float MT;
|
|
|
|
float CHR;
|
|
|
|
float KHR;
|
|
|
|
float SHR;
|
|
|
|
float AHR;
|
|
|
|
float SRHR_CL;
|
|
|
|
float SKHR_CL;
|
|
|
|
float SSHR_CL;
|
|
|
|
float SR_SPLT_CL;
|
|
|
|
float SK_SPLT_CL;
|
|
|
|
float SS_SPLT_CL;
|
|
|
|
int V_IT;
|
|
|
|
int P_IT;
|
|
|
|
int D_IT;
|
|
|
|
int C_IT;
|
|
|
|
float LST;
|
|
|
|
float AST;
|
|
|
|
float VST;
|
|
|
|
int anchor_count;
|
|
|
|
std::unique_ptr<PmxAncherRigidBody []> anchers;
|
|
|
|
int pin_vertex_count;
|
|
|
|
std::unique_ptr<int []> pin_vertices;
|
2023-04-01 10:35:57 +00:00
|
|
|
AI_WONT_RETURN void Read(std::istream *stream, PmxSetting *setting) AI_WONT_RETURN_SUFFIX;
|
2017-02-24 00:35:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class PmxModel
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PmxModel()
|
|
|
|
: version(0.0f)
|
|
|
|
, vertex_count(0)
|
|
|
|
, index_count(0)
|
|
|
|
, texture_count(0)
|
|
|
|
, material_count(0)
|
|
|
|
, bone_count(0)
|
|
|
|
, morph_count(0)
|
|
|
|
, frame_count(0)
|
|
|
|
, rigid_body_count(0)
|
|
|
|
, joint_count(0)
|
|
|
|
, soft_body_count(0)
|
|
|
|
{}
|
|
|
|
|
|
|
|
float version;
|
|
|
|
PmxSetting setting;
|
2017-03-05 14:59:53 +00:00
|
|
|
std::string model_name;
|
|
|
|
std::string model_english_name;
|
|
|
|
std::string model_comment;
|
|
|
|
std::string model_english_comment;
|
2017-02-24 00:35:15 +00:00
|
|
|
int vertex_count;
|
|
|
|
std::unique_ptr<PmxVertex []> vertices;
|
|
|
|
int index_count;
|
|
|
|
std::unique_ptr<int []> indices;
|
|
|
|
int texture_count;
|
2017-03-05 14:59:53 +00:00
|
|
|
std::unique_ptr< std::string []> textures;
|
2017-02-24 00:35:15 +00:00
|
|
|
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);
|
|
|
|
};
|
|
|
|
}
|