summary refs log tree commit diff
path: root/src/Models.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Models.cpp')
-rw-r--r--src/Models.cpp79
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)