Repository navigation
Expand file tree
/
Copy pathModel3D.cpp
More file actions
112 lines (88 loc) · 2.43 KB
/
Copy pathModel3D.cpp
File metadata and controls
112 lines (88 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "vec3.h"
#include "Model3D.h"
Model3D::Model3D(char* tekstura)
{
this->TeksturaModelu = new Tekstura(tekstura);
//this->pos = pos;
//this->color = color;
//this->scale = scale;
}
Model3D::~Model3D()
{
printf("Dekstruktor tekstury");
glDeleteLists(ModelID, 10);
delete TeksturaModelu;
}
bool Model3D::load(std::string filename)
{
FILE * fp = fopen(filename.c_str(), "r");
if (fp == NULL) {
printf("Nie wczytano pliku %s\n", filename.c_str());
return false;
}
struct SFace {
int v[3];
int n[3];
int t[3];
};
vertices.clear();
std::vector<vec3> loaded_vertices;
std::vector<SFace> loaded_faces;
std::vector<vec3> loaded_vn;
std::vector<vec3> loaded_vt;
char buf[256];
while (fgets(buf, 256, fp)) {
if (buf[0] == 'v' && buf[1] == ' ') {
vec3 vertex;
sscanf(buf, "v %f %f %f", &vertex.x, &vertex.y, &vertex.z);
loaded_vertices.push_back(vertex);
}
if (buf[0] == 'v' && buf[1] == 't') {
vec3 vt;
sscanf(buf, "vt %f %f %f", &vt.x, &vt.y, &vt.z);
loaded_vt.push_back(vt);
}
if (buf[0] == 'v' && buf[1] == 'n') {
vec3 vn;
sscanf(buf, "vn %f %f %f", &vn.x, &vn.y, &vn.z);
loaded_vn.push_back(vn);
}
if (buf[0] == 'f' && buf[1] == ' ') {
SFace face;
sscanf(buf, "f %d/%d/%d %d/%d/%d %d/%d/%d", &face.v[0], &face.t[0], &face.n[0], &face.v[1], &face.t[1], &face.n[1], &face.v[2], &face.t[2], &face.n[2] );
loaded_faces.push_back(face);
}
}
fclose(fp);
for (int i = 0; i < loaded_faces.size(); ++i) {
for (int j = 0; j < 3; ++j) {
vertices.push_back(loaded_vertices[loaded_faces[i].v[j] - 1]);
VT.push_back(loaded_vt[loaded_faces[i].t[j] - 1]);
VN.push_back(loaded_vn[loaded_faces[i].n[j] - 1]);
}
}
ModelID = glGenLists(1);
glNewList(ModelID, GL_COMPILE);
glBegin(GL_TRIANGLES);
for (int i = 0; i < vertices.size(); i++) {
glNormal3f(VN[i].x, VN[i].y, VN[i].z);
glTexCoord2f(VT[i].x, VT[i].y);
glVertex3f(vertices[i].x, vertices[i].y, vertices[i].z);
}
glEnd();
glEndList();
return true;
}
void Model3D::Render()
{
float mat_ambient2[] = { 1, 1,1 };
float mat_diffuse2[] = { 0, 0,0 };
float mat_specular2[] = { 1, 1,1 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient2);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse2);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular2);
}
void Model3D::Update()
{
//glDeleteLists(ModelID, 1);
}