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

View file

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

View file

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

View file

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

View file

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

View file

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