added scale factor command line option

This commit is contained in:
gered 2012-10-19 22:36:52 -04:00
parent 1ce5342232
commit 81db47a6b7
6 changed files with 76 additions and 31 deletions

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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);
}

View file

@ -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);

View file

@ -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)
{