diff options
Diffstat (limited to 'src/Models.cpp')
-rw-r--r-- | src/Models.cpp | 79 |
1 files changed, 45 insertions, 34 deletions
diff --git a/src/Models.cpp b/src/Models.cpp index cc69c44..6d8eecf 100644 --- a/src/Models.cpp +++ b/src/Models.cpp @@ -1,6 +1,5 @@ #include "Models.h" - -#include "Serialize.h" +#include "misc.h" //Functions void Model::UpdateVertexArray(){ @@ -62,43 +61,55 @@ void Model::UpdateVertexArray(){ boundingsphereradius=sqrt(boundingsphereradius); } -bool Model::load(Str255 Name) +void Model::load(const char* path) { - short tfile; - Files file; - - tfile=file.OpenFile(Name); - SetFPos(tfile,fsFromStart,0); - - // read model settings - ReadShort(tfile,1,&vertexNum); - ReadShort(tfile,1,&TriangleNum); - - // read the model data - ReadXYZ(tfile,vertexNum,vertex); - ReadTexturedTriangle(tfile,TriangleNum,Triangles); + auto model = loadModel(path); + vertexNum = model.vertices.len; + for (short i = 0; i < vertexNum; ++i) { + vertex[i].x = model.vertices.ptr[i].x; + vertex[i].y = model.vertices.ptr[i].y; + vertex[i].z = model.vertices.ptr[i].z; + } + free(model.vertices.ptr); - FSClose(tfile); + TriangleNum = model.faces.len; + for (short i = 0; i < TriangleNum; ++i) { + Triangles[i].vertex[0] = model.faces.ptr[i].v[0]; + Triangles[i].vertex[1] = model.faces.ptr[i].v[1]; + Triangles[i].vertex[2] = model.faces.ptr[i].v[2]; + Triangles[i].r = model.faces.ptr[i].r; + Triangles[i].g = model.faces.ptr[i].g; + Triangles[i].b = model.faces.ptr[i].b; + } + free(model.faces.ptr); - UpdateVertexArray(); + XYZ average {}; + for (auto&& v : vertex) + boundingspherecenter += v; + boundingspherecenter /= vertexNum; - XYZ average; - int howmany; - average=0; - howmany=0; - for(int i=0;i<vertexNum;i++){ - howmany++; - average=average+vertex[i]; - } - average=average/howmany; - boundingspherecenter=average; - boundingsphereradius=0; - for(int i=0;i<vertexNum;i++){ - if(findDistancefast(average,vertex[i])>boundingsphereradius)boundingsphereradius=findDistancefast(average,vertex[i]); - } - boundingsphereradius=sqrt(boundingsphereradius); + boundingsphereradius = 0; + for (auto&& v : vertex) + boundingsphereradius = max(boundingsphereradius, + findDistancefast(average, v)); + boundingsphereradius = sqrt(boundingsphereradius); + CalculateNormals(); +} - return 1; +void Model::save(const char* path) +{ + auto f = fopen(path, "w"); + fprintf(f, "%d %d 0\n", vertexNum, TriangleNum); + for (int i = 0; i < vertexNum; ++i) + fprintf(f, "%.3f %.3f %.3f\n", + vertex[i].x, vertex[i].y, vertex[i].z); + for (int i = 0; i < TriangleNum; ++i) + fprintf(f, "3 %d %d %d %.3f %.3f %.3f\n", + Triangles[i].vertex[0], + Triangles[i].vertex[1], + Triangles[i].vertex[2], + Triangles[i].r, Triangles[i].g, Triangles[i].b); + fclose(f); } void Model::Scale(float xscale,float yscale,float zscale) |