Map blendshape keys to accessor names
This commit is contained in:
parent
2fc254ed79
commit
becee49c34
|
@ -3,3 +3,5 @@ npm/bin/Linux/FBX2glTF
|
||||||
npm/bin/Windows_NT/FBX2glTF.exe
|
npm/bin/Windows_NT/FBX2glTF.exe
|
||||||
npm/node_modules/
|
npm/node_modules/
|
||||||
sdk/
|
sdk/
|
||||||
|
.vscode
|
||||||
|
build
|
||||||
|
|
|
@ -596,12 +596,14 @@ public:
|
||||||
const unsigned int blendShapeIx,
|
const unsigned int blendShapeIx,
|
||||||
const unsigned int channelIx,
|
const unsigned int channelIx,
|
||||||
const FbxDouble deformPercent,
|
const FbxDouble deformPercent,
|
||||||
const std::vector<TargetShape> &targetShapes
|
const std::vector<TargetShape> &targetShapes,
|
||||||
|
const std::string name
|
||||||
) : mesh(mesh),
|
) : mesh(mesh),
|
||||||
blendShapeIx(blendShapeIx),
|
blendShapeIx(blendShapeIx),
|
||||||
channelIx(channelIx),
|
channelIx(channelIx),
|
||||||
deformPercent(deformPercent),
|
deformPercent(deformPercent),
|
||||||
targetShapes(targetShapes)
|
targetShapes(targetShapes),
|
||||||
|
name(name)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FbxAnimCurve *ExtractAnimation(unsigned int animIx) const {
|
FbxAnimCurve *ExtractAnimation(unsigned int animIx) const {
|
||||||
|
@ -615,6 +617,7 @@ public:
|
||||||
const unsigned int blendShapeIx;
|
const unsigned int blendShapeIx;
|
||||||
const unsigned int channelIx;
|
const unsigned int channelIx;
|
||||||
const std::vector<TargetShape> targetShapes;
|
const std::vector<TargetShape> targetShapes;
|
||||||
|
const std::string name;
|
||||||
|
|
||||||
const FbxDouble deformPercent;
|
const FbxDouble deformPercent;
|
||||||
};
|
};
|
||||||
|
@ -649,11 +652,14 @@ private:
|
||||||
if (fbxChannel->GetTargetShapeCount() > 0) {
|
if (fbxChannel->GetTargetShapeCount() > 0) {
|
||||||
std::vector<TargetShape> targetShapes;
|
std::vector<TargetShape> targetShapes;
|
||||||
const double *fullWeights = fbxChannel->GetTargetShapeFullWeights();
|
const double *fullWeights = fbxChannel->GetTargetShapeFullWeights();
|
||||||
|
std::string name = std::string(fbxChannel->GetName());
|
||||||
|
fmt::printf("extractChannels; channel name: %s\n", name);
|
||||||
|
|
||||||
for (int targetIx = 0; targetIx < fbxChannel->GetTargetShapeCount(); targetIx ++) {
|
for (int targetIx = 0; targetIx < fbxChannel->GetTargetShapeCount(); targetIx ++) {
|
||||||
FbxShape *fbxShape = fbxChannel->GetTargetShape(targetIx);
|
FbxShape *fbxShape = fbxChannel->GetTargetShape(targetIx);
|
||||||
targetShapes.push_back(TargetShape(fbxShape, fullWeights[targetIx]));
|
targetShapes.push_back(TargetShape(fbxShape, fullWeights[targetIx]));
|
||||||
}
|
}
|
||||||
channels.push_back(BlendChannel(mesh, shapeIx, channelIx, fbxChannel->DeformPercent * 0.01, targetShapes));
|
channels.push_back(BlendChannel(mesh, shapeIx, channelIx, fbxChannel->DeformPercent * 0.01, targetShapes, name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -785,11 +791,13 @@ static void ReadMesh(RawModel &raw, FbxScene *pScene, FbxNode *pNode, const std:
|
||||||
for (size_t targetIx = 0; targetIx < blendShapes.GetTargetShapeCount(channelIx); targetIx ++) {
|
for (size_t targetIx = 0; targetIx < blendShapes.GetTargetShapeCount(channelIx); targetIx ++) {
|
||||||
const FbxBlendShapesAccess::TargetShape &shape = blendShapes.GetTargetShape(channelIx, targetIx);
|
const FbxBlendShapesAccess::TargetShape &shape = blendShapes.GetTargetShape(channelIx, targetIx);
|
||||||
targetShapes.push_back(&shape);
|
targetShapes.push_back(&shape);
|
||||||
|
auto &blendChannel = blendShapes.GetBlendChannel(channelIx);
|
||||||
|
|
||||||
rawSurface.blendChannels.push_back(RawBlendChannel {
|
rawSurface.blendChannels.push_back(RawBlendChannel {
|
||||||
static_cast<float>(blendShapes.GetBlendChannel(channelIx).deformPercent),
|
static_cast<float>(blendChannel.deformPercent),
|
||||||
shape.normals.LayerPresent(),
|
shape.normals.LayerPresent(),
|
||||||
shape.tangents.LayerPresent(),
|
shape.tangents.LayerPresent(),
|
||||||
|
blendChannel.name
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,12 +126,22 @@ struct GLTFData
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
std::shared_ptr<AccessorData> AddAccessorWithView(
|
std::shared_ptr<AccessorData> AddAccessorWithView(
|
||||||
BufferViewData &bufferView, const GLType &type, const std::vector<T> &source)
|
BufferViewData &bufferView, const GLType &type, const std::vector<T> &source)
|
||||||
{
|
{
|
||||||
auto accessor = accessors.hold(new AccessorData(bufferView, type));
|
auto accessor = accessors.hold(new AccessorData(bufferView, type, std::string("")));
|
||||||
|
accessor->appendAsBinaryArray(source, *binary);
|
||||||
|
bufferView.byteLength = accessor->byteLength();
|
||||||
|
return accessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
std::shared_ptr<AccessorData> AddAccessorWithView(
|
||||||
|
BufferViewData &bufferView, const GLType &type, const std::vector<T> &source, std::string name)
|
||||||
|
{
|
||||||
|
auto accessor = accessors.hold(new AccessorData(bufferView, type, name));
|
||||||
accessor->appendAsBinaryArray(source, *binary);
|
accessor->appendAsBinaryArray(source, *binary);
|
||||||
bufferView.byteLength = accessor->byteLength();
|
bufferView.byteLength = accessor->byteLength();
|
||||||
return accessor;
|
return accessor;
|
||||||
|
@ -922,7 +932,7 @@ ModelData *Raw2Gltf(
|
||||||
}
|
}
|
||||||
std::shared_ptr<AccessorData> pAcc = gltf->AddAccessorWithView(
|
std::shared_ptr<AccessorData> pAcc = gltf->AddAccessorWithView(
|
||||||
*gltf->GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER),
|
*gltf->GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER),
|
||||||
GLT_VEC3F, positions);
|
GLT_VEC3F, positions, channel.name);
|
||||||
pAcc->min = toStdVec(shapeBounds.min);
|
pAcc->min = toStdVec(shapeBounds.min);
|
||||||
pAcc->max = toStdVec(shapeBounds.max);
|
pAcc->max = toStdVec(shapeBounds.max);
|
||||||
|
|
||||||
|
@ -930,14 +940,14 @@ ModelData *Raw2Gltf(
|
||||||
if (!normals.empty()) {
|
if (!normals.empty()) {
|
||||||
nAcc = gltf->AddAccessorWithView(
|
nAcc = gltf->AddAccessorWithView(
|
||||||
*gltf->GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER),
|
*gltf->GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER),
|
||||||
GLT_VEC3F, normals);
|
GLT_VEC3F, normals, channel.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<AccessorData> tAcc;
|
std::shared_ptr<AccessorData> tAcc;
|
||||||
if (!tangents.empty()) {
|
if (!tangents.empty()) {
|
||||||
nAcc = gltf->AddAccessorWithView(
|
nAcc = gltf->AddAccessorWithView(
|
||||||
*gltf->GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER),
|
*gltf->GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER),
|
||||||
GLT_VEC4F, tangents);
|
GLT_VEC4F, tangents, channel.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
primitive->AddTarget(pAcc.get(), nAcc.get(), tAcc.get());
|
primitive->AddTarget(pAcc.get(), nAcc.get(), tAcc.get());
|
||||||
|
|
|
@ -330,6 +330,7 @@ struct RawBlendChannel
|
||||||
float defaultDeform;
|
float defaultDeform;
|
||||||
bool hasNormals;
|
bool hasNormals;
|
||||||
bool hasTangents;
|
bool hasTangents;
|
||||||
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RawSurface
|
struct RawSurface
|
||||||
|
|
|
@ -10,12 +10,13 @@
|
||||||
#include "AccessorData.h"
|
#include "AccessorData.h"
|
||||||
#include "BufferViewData.h"
|
#include "BufferViewData.h"
|
||||||
|
|
||||||
AccessorData::AccessorData(const BufferViewData &bufferView, GLType type)
|
AccessorData::AccessorData(const BufferViewData &bufferView, GLType type, std::string name)
|
||||||
: Holdable(),
|
: Holdable(),
|
||||||
bufferView(bufferView.ix),
|
bufferView(bufferView.ix),
|
||||||
type(std::move(type)),
|
type(std::move(type)),
|
||||||
byteOffset(0),
|
byteOffset(0),
|
||||||
count(0)
|
count(0),
|
||||||
|
name(name)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,5 +46,8 @@ json AccessorData::serialize() const
|
||||||
if (!max.empty()) {
|
if (!max.empty()) {
|
||||||
result["max"] = max;
|
result["max"] = max;
|
||||||
}
|
}
|
||||||
|
if (name.length() > 0) {
|
||||||
|
result["name"] = name;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
struct AccessorData : Holdable
|
struct AccessorData : Holdable
|
||||||
{
|
{
|
||||||
AccessorData(const BufferViewData &bufferView, GLType type);
|
AccessorData(const BufferViewData &bufferView, GLType type, std::string name);
|
||||||
explicit AccessorData(GLType type);
|
explicit AccessorData(GLType type);
|
||||||
|
|
||||||
json serialize() const override;
|
json serialize() const override;
|
||||||
|
@ -43,6 +43,7 @@ struct AccessorData : Holdable
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
std::vector<float> min;
|
std::vector<float> min;
|
||||||
std::vector<float> max;
|
std::vector<float> max;
|
||||||
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //FBX2GLTF_ACCESSORDATA_H
|
#endif //FBX2GLTF_ACCESSORDATA_H
|
||||||
|
|
Loading…
Reference in New Issue