added scale factor command line option
This commit is contained in:
parent
1ce5342232
commit
81db47a6b7
|
@ -4,7 +4,7 @@
|
|||
#include <string>
|
||||
#include <assimp/aiScene.h>
|
||||
|
||||
void ConvertStatic(const std::string &outfile, const aiScene *scene);
|
||||
void ConvertSkeletalAnimated(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, float scaleFactor);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,14 +11,14 @@
|
|||
#include "meshjoint.h"
|
||||
|
||||
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 WriteTexCoords(const AssimpVertices &texCoords, FILE *fp);
|
||||
void WriteMaterials(const std::vector<MeshMaterial> &materials, FILE *fp);
|
||||
void WriteTriangles(const std::vector<MeshTriangle> &triangles, 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 WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE *fp);
|
||||
void WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE *fp, float scaleFactor);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -10,7 +10,7 @@ void WriteMeshHeader(FILE *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();
|
||||
if (count == 0)
|
||||
|
@ -27,9 +27,14 @@ void WriteVertices(const AssimpVertices &vertices, FILE *fp)
|
|||
|
||||
for (uint32_t i = 0; i < count; ++i)
|
||||
{
|
||||
fwrite(&vertices[i].x, sizeof(float), 1, fp);
|
||||
fwrite(&vertices[i].y, sizeof(float), 1, fp);
|
||||
fwrite(&vertices[i].z, sizeof(float), 1, fp);
|
||||
aiVector3D v = vertices[i];
|
||||
v.x *= scaleFactor;
|
||||
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();
|
||||
if (count == 0)
|
||||
|
@ -232,18 +237,28 @@ void WriteJoints(const std::vector<MeshJoint> &joints, FILE *fp)
|
|||
int32_t parentIndex = GetIndexOf(joints, j->parentName);
|
||||
fwrite(&parentIndex, 4, 1, fp);
|
||||
|
||||
fwrite(&j->localPosition.x, sizeof(float), 1, fp);
|
||||
fwrite(&j->localPosition.y, sizeof(float), 1, fp);
|
||||
fwrite(&j->localPosition.z, sizeof(float), 1, fp);
|
||||
aiVector3D localPosition = j->localPosition;
|
||||
localPosition.x *= scaleFactor;
|
||||
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.y, sizeof(float), 1, fp);
|
||||
fwrite(&j->localRotation.z, sizeof(float), 1, fp);
|
||||
fwrite(&j->localRotation.w, sizeof(float), 1, fp);
|
||||
|
||||
fwrite(&j->offsetPosition.x, sizeof(float), 1, fp);
|
||||
fwrite(&j->offsetPosition.y, sizeof(float), 1, fp);
|
||||
fwrite(&j->offsetPosition.z, sizeof(float), 1, fp);
|
||||
fwrite(&offsetPosition.x, sizeof(float), 1, fp);
|
||||
fwrite(&offsetPosition.y, sizeof(float), 1, fp);
|
||||
fwrite(&offsetPosition.z, sizeof(float), 1, fp);
|
||||
|
||||
fwrite(&j->offsetRotation.x, 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();
|
||||
if (numJoints == 0)
|
||||
|
@ -296,9 +311,14 @@ void WriteJointKeyFrames(const std::vector<JointKeyFrames> &jointKeyFrames, FILE
|
|||
{
|
||||
const MeshJointKeyFrame *frame = &jointKeyFrames[i][j];
|
||||
|
||||
fwrite(&frame->position.x, sizeof(float), 1, fp);
|
||||
fwrite(&frame->position.y, sizeof(float), 1, fp);
|
||||
fwrite(&frame->position.z, sizeof(float), 1, fp);
|
||||
aiVector3D position = frame->position;
|
||||
position.x *= scaleFactor;
|
||||
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.y, sizeof(float), 1, fp);
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "mesh.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");
|
||||
if (fp == NULL)
|
||||
|
@ -21,7 +21,7 @@ void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene)
|
|||
AssimpVertices texCoords;
|
||||
AssimpVerticesMap vertexIndicesMap;
|
||||
CollectAllMeshVertices(scene, vertices, normals, texCoords, vertexIndicesMap);
|
||||
WriteVertices(vertices, fp);
|
||||
WriteVertices(vertices, fp, scaleFactor);
|
||||
WriteNormals(normals, fp);
|
||||
WriteTexCoords(texCoords, fp);
|
||||
|
||||
|
@ -111,7 +111,7 @@ void ConvertSkeletalAnimated(const std::string &outfile, const aiScene *scene)
|
|||
joints.push_back(joint);
|
||||
}
|
||||
}
|
||||
WriteJoints(joints, fp);
|
||||
WriteJoints(joints, fp, scaleFactor);
|
||||
WriteJointToVertexMap(vertexToJointMap, fp);
|
||||
|
||||
// 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);
|
||||
}
|
||||
WriteJointKeyFrames(meshFrames, fp);
|
||||
WriteJointKeyFrames(meshFrames, fp, scaleFactor);
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "mesh.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");
|
||||
if (fp == NULL)
|
||||
|
@ -21,7 +21,7 @@ void ConvertStatic(const std::string &outfile, const aiScene *scene)
|
|||
AssimpVertices texCoords;
|
||||
AssimpVerticesMap vertexIndicesMap;
|
||||
CollectAllMeshVertices(scene, vertices, normals, texCoords, vertexIndicesMap);
|
||||
WriteVertices(vertices, fp);
|
||||
WriteVertices(vertices, fp, scaleFactor);
|
||||
WriteNormals(normals, 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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
// input file is always the last argument
|
||||
std::string file = argv[argc - 1];
|
||||
|
||||
std::string outputFile;
|
||||
std::string describeFile;
|
||||
// default option values
|
||||
float scaleFactor = 1.0f;
|
||||
std::string outputFile = "";
|
||||
std::string describeFile = "";
|
||||
|
||||
// find any options
|
||||
for (int i = 1; i < argc - 1; ++i)
|
||||
|
@ -34,6 +36,8 @@ int main(int argc, char *argv[])
|
|||
|
||||
if (arg.substr(0, 11) == "--describe=")
|
||||
{
|
||||
// description file
|
||||
|
||||
if (arg.length() == 11)
|
||||
{
|
||||
printf("Missing description output filename.\n");
|
||||
|
@ -44,6 +48,8 @@ int main(int argc, char *argv[])
|
|||
|
||||
else if (arg.substr(0, 6) == "--out=")
|
||||
{
|
||||
// different output filename
|
||||
|
||||
if (arg.length() == 6)
|
||||
{
|
||||
printf("Missing output filename.\n");
|
||||
|
@ -51,6 +57,25 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
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
|
||||
|
@ -109,7 +134,7 @@ int main(int argc, char *argv[])
|
|||
printf("Using static converter.\n");
|
||||
try
|
||||
{
|
||||
ConvertStatic(outputFile, scene);
|
||||
ConvertStatic(outputFile, scene, scaleFactor);
|
||||
}
|
||||
catch (std::exception &ex)
|
||||
{
|
||||
|
@ -123,7 +148,7 @@ int main(int argc, char *argv[])
|
|||
printf("Using skeletal animation converter.\n");
|
||||
try
|
||||
{
|
||||
ConvertSkeletalAnimated(outputFile, scene);
|
||||
ConvertSkeletalAnimated(outputFile, scene, scaleFactor);
|
||||
}
|
||||
catch (std::exception &ex)
|
||||
{
|
||||
|
|
Reference in a new issue