diff --git a/src/convert/convert.h b/src/convert/convert.h index 39b9f30..aa0d459 100644 --- a/src/convert/convert.h +++ b/src/convert/convert.h @@ -4,7 +4,7 @@ #include #include -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 diff --git a/src/convert/mesh.h b/src/convert/mesh.h index 16575ae..b96d6f9 100644 --- a/src/convert/mesh.h +++ b/src/convert/mesh.h @@ -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 &materials, FILE *fp); void WriteTriangles(const std::vector &triangles, FILE *fp); void WriteSubMeshes(const std::vector &subMeshes, FILE *fp); -void WriteJoints(const std::vector &joints, FILE *fp); +void WriteJoints(const std::vector &joints, FILE *fp, float scaleFactor); void WriteJointToVertexMap(const std::vector &vertexToJointMap, FILE *fp); -void WriteJointKeyFrames(const std::vector &jointKeyFrames, FILE *fp); +void WriteJointKeyFrames(const std::vector &jointKeyFrames, FILE *fp, float scaleFactor); #endif diff --git a/src/convert/meshutils.cpp b/src/convert/meshutils.cpp index 7287445..ae3ee0c 100644 --- a/src/convert/meshutils.cpp +++ b/src/convert/meshutils.cpp @@ -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 &subMeshes, FILE *fp) } } -void WriteJoints(const std::vector &joints, FILE *fp) +void WriteJoints(const std::vector &joints, FILE *fp, float scaleFactor) { uint32_t count = joints.size(); if (count == 0) @@ -232,18 +237,28 @@ void WriteJoints(const std::vector &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 &vertexToJointMap, FILE * } } -void WriteJointKeyFrames(const std::vector &jointKeyFrames, FILE *fp) +void WriteJointKeyFrames(const std::vector &jointKeyFrames, FILE *fp, float scaleFactor) { uint32_t numJoints = jointKeyFrames.size(); if (numJoints == 0) @@ -296,9 +311,14 @@ void WriteJointKeyFrames(const std::vector &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); diff --git a/src/convert/skeletalanimated.cpp b/src/convert/skeletalanimated.cpp index a51a4ec..5cca6c8 100644 --- a/src/convert/skeletalanimated.cpp +++ b/src/convert/skeletalanimated.cpp @@ -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); } diff --git a/src/convert/static.cpp b/src/convert/static.cpp index 567ddc5..db61b51 100644 --- a/src/convert/static.cpp +++ b/src/convert/static.cpp @@ -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); diff --git a/src/main.cpp b/src/main.cpp index 1722cb5..161991a 100644 --- a/src/main.cpp +++ b/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) {