added scale factor command line option
This commit is contained in:
parent
1ce5342232
commit
81db47a6b7
|
@ -4,7 +4,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <assimp/aiScene.h>
|
#include <assimp/aiScene.h>
|
||||||
|
|
||||||
void ConvertStatic(const std::string &outfile, const aiScene *scene);
|
void ConvertStatic(const std::string &outfile, const aiScene *scene, float scaleFactor);
|
||||||
void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene);
|
void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene, float scaleFactor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,14 +11,14 @@
|
||||||
#include "meshjoint.h"
|
#include "meshjoint.h"
|
||||||
|
|
||||||
void WriteMeshHeader(FILE *fp);
|
void WriteMeshHeader(FILE *fp);
|
||||||
void WriteVertices(const AssimpVertices &vertices, FILE *fp);
|
void WriteVertices(const AssimpVertices &vertices, FILE *fp, float scaleFactor);
|
||||||
void WriteNormals(const AssimpVertices &normals, FILE *fp);
|
void WriteNormals(const AssimpVertices &normals, FILE *fp);
|
||||||
void WriteTexCoords(const AssimpVertices &texCoords, FILE *fp);
|
void WriteTexCoords(const AssimpVertices &texCoords, FILE *fp);
|
||||||
void WriteMaterials(const std::vector<MeshMaterial> &materials, FILE *fp);
|
void WriteMaterials(const std::vector<MeshMaterial> &materials, FILE *fp);
|
||||||
void WriteTriangles(const std::vector<MeshTriangle> &triangles, FILE *fp);
|
void WriteTriangles(const std::vector<MeshTriangle> &triangles, FILE *fp);
|
||||||
void WriteSubMeshes(const std::vector<SubMesh> &subMeshes, FILE *fp);
|
void WriteSubMeshes(const std::vector<SubMesh> &subMeshes, FILE *fp);
|
||||||
void WriteJoints(const std::vector<MeshJoint> &joints, FILE *fp);
|
void WriteJoints(const std::vector<MeshJoint> &joints, FILE *fp, float scaleFactor);
|
||||||
void WriteJointToVertexMap(const std::vector<uint32_t> &vertexToJointMap, FILE *fp);
|
void WriteJointToVertexMap(const std::vector<uint32_t> &vertexToJointMap, FILE *fp);
|
||||||
void WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE *fp);
|
void WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE *fp, float scaleFactor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -10,7 +10,7 @@ void WriteMeshHeader(FILE *fp)
|
||||||
fwrite(&version, 1, 1, fp);
|
fwrite(&version, 1, 1, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteVertices(const AssimpVertices &vertices, FILE *fp)
|
void WriteVertices(const AssimpVertices &vertices, FILE *fp, float scaleFactor)
|
||||||
{
|
{
|
||||||
uint32_t count = vertices.size();
|
uint32_t count = vertices.size();
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
|
@ -27,9 +27,14 @@ void WriteVertices(const AssimpVertices &vertices, FILE *fp)
|
||||||
|
|
||||||
for (uint32_t i = 0; i < count; ++i)
|
for (uint32_t i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
fwrite(&vertices[i].x, sizeof(float), 1, fp);
|
aiVector3D v = vertices[i];
|
||||||
fwrite(&vertices[i].y, sizeof(float), 1, fp);
|
v.x *= scaleFactor;
|
||||||
fwrite(&vertices[i].z, sizeof(float), 1, fp);
|
v.y *= scaleFactor;
|
||||||
|
v.z *= scaleFactor;
|
||||||
|
|
||||||
|
fwrite(&v.x, sizeof(float), 1, fp);
|
||||||
|
fwrite(&v.y, sizeof(float), 1, fp);
|
||||||
|
fwrite(&v.z, sizeof(float), 1, fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +204,7 @@ void WriteSubMeshes(const std::vector<SubMesh> &subMeshes, FILE *fp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteJoints(const std::vector<MeshJoint> &joints, FILE *fp)
|
void WriteJoints(const std::vector<MeshJoint> &joints, FILE *fp, float scaleFactor)
|
||||||
{
|
{
|
||||||
uint32_t count = joints.size();
|
uint32_t count = joints.size();
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
|
@ -232,18 +237,28 @@ void WriteJoints(const std::vector<MeshJoint> &joints, FILE *fp)
|
||||||
int32_t parentIndex = GetIndexOf(joints, j->parentName);
|
int32_t parentIndex = GetIndexOf(joints, j->parentName);
|
||||||
fwrite(&parentIndex, 4, 1, fp);
|
fwrite(&parentIndex, 4, 1, fp);
|
||||||
|
|
||||||
fwrite(&j->localPosition.x, sizeof(float), 1, fp);
|
aiVector3D localPosition = j->localPosition;
|
||||||
fwrite(&j->localPosition.y, sizeof(float), 1, fp);
|
localPosition.x *= scaleFactor;
|
||||||
fwrite(&j->localPosition.z, sizeof(float), 1, fp);
|
localPosition.y *= scaleFactor;
|
||||||
|
localPosition.z *= scaleFactor;
|
||||||
|
|
||||||
|
aiVector3D offsetPosition = j->offsetPosition;
|
||||||
|
offsetPosition.x *= scaleFactor;
|
||||||
|
offsetPosition.y *= scaleFactor;
|
||||||
|
offsetPosition.z *= scaleFactor;
|
||||||
|
|
||||||
|
fwrite(&localPosition.x, sizeof(float), 1, fp);
|
||||||
|
fwrite(&localPosition.y, sizeof(float), 1, fp);
|
||||||
|
fwrite(&localPosition.z, sizeof(float), 1, fp);
|
||||||
|
|
||||||
fwrite(&j->localRotation.x, sizeof(float), 1, fp);
|
fwrite(&j->localRotation.x, sizeof(float), 1, fp);
|
||||||
fwrite(&j->localRotation.y, sizeof(float), 1, fp);
|
fwrite(&j->localRotation.y, sizeof(float), 1, fp);
|
||||||
fwrite(&j->localRotation.z, sizeof(float), 1, fp);
|
fwrite(&j->localRotation.z, sizeof(float), 1, fp);
|
||||||
fwrite(&j->localRotation.w, sizeof(float), 1, fp);
|
fwrite(&j->localRotation.w, sizeof(float), 1, fp);
|
||||||
|
|
||||||
fwrite(&j->offsetPosition.x, sizeof(float), 1, fp);
|
fwrite(&offsetPosition.x, sizeof(float), 1, fp);
|
||||||
fwrite(&j->offsetPosition.y, sizeof(float), 1, fp);
|
fwrite(&offsetPosition.y, sizeof(float), 1, fp);
|
||||||
fwrite(&j->offsetPosition.z, sizeof(float), 1, fp);
|
fwrite(&offsetPosition.z, sizeof(float), 1, fp);
|
||||||
|
|
||||||
fwrite(&j->offsetRotation.x, sizeof(float), 1, fp);
|
fwrite(&j->offsetRotation.x, sizeof(float), 1, fp);
|
||||||
fwrite(&j->offsetRotation.y, sizeof(float), 1, fp);
|
fwrite(&j->offsetRotation.y, sizeof(float), 1, fp);
|
||||||
|
@ -271,7 +286,7 @@ void WriteJointToVertexMap(const std::vector<uint32_t> &vertexToJointMap, FILE *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE *fp)
|
void WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE *fp, float scaleFactor)
|
||||||
{
|
{
|
||||||
uint32_t numJoints = jointKeyFrames.size();
|
uint32_t numJoints = jointKeyFrames.size();
|
||||||
if (numJoints == 0)
|
if (numJoints == 0)
|
||||||
|
@ -296,9 +311,14 @@ void WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE
|
||||||
{
|
{
|
||||||
const MeshJointKeyFrame *frame = &jointKeyFrames[i][j];
|
const MeshJointKeyFrame *frame = &jointKeyFrames[i][j];
|
||||||
|
|
||||||
fwrite(&frame->position.x, sizeof(float), 1, fp);
|
aiVector3D position = frame->position;
|
||||||
fwrite(&frame->position.y, sizeof(float), 1, fp);
|
position.x *= scaleFactor;
|
||||||
fwrite(&frame->position.z, sizeof(float), 1, fp);
|
position.y *= scaleFactor;
|
||||||
|
position.z *= scaleFactor;
|
||||||
|
|
||||||
|
fwrite(&position.x, sizeof(float), 1, fp);
|
||||||
|
fwrite(&position.y, sizeof(float), 1, fp);
|
||||||
|
fwrite(&position.z, sizeof(float), 1, fp);
|
||||||
|
|
||||||
fwrite(&frame->rotation.x, sizeof(float), 1, fp);
|
fwrite(&frame->rotation.x, sizeof(float), 1, fp);
|
||||||
fwrite(&frame->rotation.y, sizeof(float), 1, fp);
|
fwrite(&frame->rotation.y, sizeof(float), 1, fp);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
#include "../assimputils/utils.h"
|
#include "../assimputils/utils.h"
|
||||||
|
|
||||||
void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene)
|
void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene, float scaleFactor)
|
||||||
{
|
{
|
||||||
FILE *fp = fopen(outfile.c_str(), "wb");
|
FILE *fp = fopen(outfile.c_str(), "wb");
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
|
@ -21,7 +21,7 @@ void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene)
|
||||||
AssimpVertices texCoords;
|
AssimpVertices texCoords;
|
||||||
AssimpVerticesMap vertexIndicesMap;
|
AssimpVerticesMap vertexIndicesMap;
|
||||||
CollectAllMeshVertices(scene, vertices, normals, texCoords, vertexIndicesMap);
|
CollectAllMeshVertices(scene, vertices, normals, texCoords, vertexIndicesMap);
|
||||||
WriteVertices(vertices, fp);
|
WriteVertices(vertices, fp, scaleFactor);
|
||||||
WriteNormals(normals, fp);
|
WriteNormals(normals, fp);
|
||||||
WriteTexCoords(texCoords, fp);
|
WriteTexCoords(texCoords, fp);
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene)
|
||||||
joints.push_back(joint);
|
joints.push_back(joint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WriteJoints(joints, fp);
|
WriteJoints(joints, fp, scaleFactor);
|
||||||
WriteJointToVertexMap(vertexToJointMap, fp);
|
WriteJointToVertexMap(vertexToJointMap, fp);
|
||||||
|
|
||||||
// TODO: this collection process is dumb at the moment. assumes each bone
|
// TODO: this collection process is dumb at the moment. assumes each bone
|
||||||
|
@ -141,7 +141,7 @@ void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene)
|
||||||
|
|
||||||
meshFrames.push_back(jointFrames);
|
meshFrames.push_back(jointFrames);
|
||||||
}
|
}
|
||||||
WriteJointKeyFrames(meshFrames, fp);
|
WriteJointKeyFrames(meshFrames, fp, scaleFactor);
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
#include "../assimputils/utils.h"
|
#include "../assimputils/utils.h"
|
||||||
|
|
||||||
void ConvertStatic(const std::string &outfile, const aiScene *scene)
|
void ConvertStatic(const std::string &outfile, const aiScene *scene, float scaleFactor)
|
||||||
{
|
{
|
||||||
FILE *fp = fopen(outfile.c_str(), "wb");
|
FILE *fp = fopen(outfile.c_str(), "wb");
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
|
@ -21,7 +21,7 @@ void ConvertStatic(const std::string &outfile, const aiScene *scene)
|
||||||
AssimpVertices texCoords;
|
AssimpVertices texCoords;
|
||||||
AssimpVerticesMap vertexIndicesMap;
|
AssimpVerticesMap vertexIndicesMap;
|
||||||
CollectAllMeshVertices(scene, vertices, normals, texCoords, vertexIndicesMap);
|
CollectAllMeshVertices(scene, vertices, normals, texCoords, vertexIndicesMap);
|
||||||
WriteVertices(vertices, fp);
|
WriteVertices(vertices, fp, scaleFactor);
|
||||||
WriteNormals(normals, fp);
|
WriteNormals(normals, fp);
|
||||||
WriteTexCoords(texCoords, fp);
|
WriteTexCoords(texCoords, fp);
|
||||||
|
|
||||||
|
|
35
src/main.cpp
35
src/main.cpp
|
@ -17,15 +17,17 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
{
|
{
|
||||||
printf("Usage: assimptomesh.exe [--describe=txtfile] [--out=outputfile] inputfile\n\n");
|
printf("Usage: assimptomesh.exe [--describe=txtfile] [--out=outputfile] [--scale=scalefactor] inputfile\n\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// input file is always the last argument
|
// input file is always the last argument
|
||||||
std::string file = argv[argc - 1];
|
std::string file = argv[argc - 1];
|
||||||
|
|
||||||
std::string outputFile;
|
// default option values
|
||||||
std::string describeFile;
|
float scaleFactor = 1.0f;
|
||||||
|
std::string outputFile = "";
|
||||||
|
std::string describeFile = "";
|
||||||
|
|
||||||
// find any options
|
// find any options
|
||||||
for (int i = 1; i < argc - 1; ++i)
|
for (int i = 1; i < argc - 1; ++i)
|
||||||
|
@ -34,6 +36,8 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if (arg.substr(0, 11) == "--describe=")
|
if (arg.substr(0, 11) == "--describe=")
|
||||||
{
|
{
|
||||||
|
// description file
|
||||||
|
|
||||||
if (arg.length() == 11)
|
if (arg.length() == 11)
|
||||||
{
|
{
|
||||||
printf("Missing description output filename.\n");
|
printf("Missing description output filename.\n");
|
||||||
|
@ -44,6 +48,8 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
else if (arg.substr(0, 6) == "--out=")
|
else if (arg.substr(0, 6) == "--out=")
|
||||||
{
|
{
|
||||||
|
// different output filename
|
||||||
|
|
||||||
if (arg.length() == 6)
|
if (arg.length() == 6)
|
||||||
{
|
{
|
||||||
printf("Missing output filename.\n");
|
printf("Missing output filename.\n");
|
||||||
|
@ -51,6 +57,25 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
outputFile = arg.substr(6);
|
outputFile = arg.substr(6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arg.substr(0, 8) == "--scale=")
|
||||||
|
{
|
||||||
|
// scale factor
|
||||||
|
|
||||||
|
if (arg.length() == 8)
|
||||||
|
{
|
||||||
|
printf("Missing scale factor.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
scaleFactor = (float)atof(arg.substr(8).c_str());
|
||||||
|
|
||||||
|
if (scaleFactor == 0.0f)
|
||||||
|
{
|
||||||
|
printf("Invalid or 0.0 scale factor.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// attempt to load the input file
|
// attempt to load the input file
|
||||||
|
@ -109,7 +134,7 @@ int main(int argc, char *argv[])
|
||||||
printf("Using static converter.\n");
|
printf("Using static converter.\n");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ConvertStatic(outputFile, scene);
|
ConvertStatic(outputFile, scene, scaleFactor);
|
||||||
}
|
}
|
||||||
catch (std::exception &ex)
|
catch (std::exception &ex)
|
||||||
{
|
{
|
||||||
|
@ -123,7 +148,7 @@ int main(int argc, char *argv[])
|
||||||
printf("Using skeletal animation converter.\n");
|
printf("Using skeletal animation converter.\n");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ConvertSkeletalAnimated(outputFile, scene);
|
ConvertSkeletalAnimated(outputFile, scene, scaleFactor);
|
||||||
}
|
}
|
||||||
catch (std::exception &ex)
|
catch (std::exception &ex)
|
||||||
{
|
{
|
||||||
|
|
Reference in a new issue