-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModel.cpp
More file actions
155 lines (139 loc) · 5.66 KB
/
Model.cpp
File metadata and controls
155 lines (139 loc) · 5.66 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include "Model.h"
#include "ObjLoader.h"
#include "custom_vertex.h"
#include <iostream>
#include <d3dx9.h>
using namespace std;
Model::Model(IDirect3DDevice9* gD3dDevice, ObjLoader* loader)
{
//inicializira model
//toy ne moje da sushtestvuva bez obektite s chiqto pomosht shte se risuva i loadva ot file
this->gD3dDevice = gD3dDevice;
this->loader = loader;
//NULL-vame bufferite
v_buffer = NULL;
i_buffer = NULL;
//nulirame broq triugulnici i vertexi
vertices = 0;
triangles = 0;
}
void Model::load_model(char* filename)//loadva model po dadeno ime na file
{
loader->load_model(filename);//loadera prochita file-a i zarejda modela otdelnite mu elementi vuv vektorite si
//cout<<8<<endl;
int n = 1000;//nachalen broy vertexi
int i = 0;
CUSTOMVERTEX* ver = new CUSTOMVERTEX[n];//suzdavame si masiv ot customvertexi, struktura koqto directx moje da risuva
CUSTOMVERTEX init_vertex;
for(int j = 0; j<loader->get_vv().size(); j++)
{
//za vseki edin procheten vertex si pravim customvertex i pulnim negovite stoynosti s tezi koito sme procheli
CUSTOMVERTEX cv;
//cout<<j<<endl;
cv.X = loader->get_vv().at(j)->x;
cv.Y = loader->get_vv().at(j)->y;
cv.Z = loader->get_vv().at(j)->z;
cv.NORMAL = {0.0f, 0.0f, -1.0f};//defaultskata stoynost na normalniq vector
//nalaga se zashtoto ima .obj failove koito nqmat v sebe si opisanie na normalnite vectori
//tuy kato tova ne e zaduljitelen element
ver[i++] = cv;
if(i == n)//ako broqt na slojenite veche vertexi e dostignal broq na razreshenite takiva razshirqvame masiva
{
CUSTOMVERTEX* p = ver;
ver = new CUSTOMVERTEX[n+1000];
for(int k = 0; k < n; k++)
{
ver[k] = p[k];
}
delete[] p;
n+=1000;
}
}
//cout<<9<<endl;
vertices = i; //zapazvame kolko vertexa sme napravili
int m = loader->get_faces().size()*6;
int* indi = new int[m];//zadelqme pamet za intexite
//cout<<10<<endl;
i = 0;
for(int j = 0; j<loader->get_faces().size(); j++)//za vseki face
{
//cout<<j<<endl;
//cout<<loader->get_faces().at(j)->number_of_vertices<<endl;
//cout<<loader->get_normals().size()<<endl;
for(int f = 0; f<loader->get_faces().at(j)->number_of_vertices; f++)//za vseki zapazen vuv face-a vertex
{
int number_of_vertex = loader->get_faces().at(j)->vertices[f]-1;//nomer na vertexa
indi[i++] = number_of_vertex;//number of vertex
if(loader->get_normals().size()>0){
//cout<<11<<endl;
ver[number_of_vertex].NORMAL = *(loader->get_normals().at(loader->get_faces().at(j)->normals[f]-1));
//cout<<12<<endl;
//ako ima normalen vektor slaga i nego na mqstoto na defaultskiq
}
}
}
//cout<<11<<endl;
// create a vertex buffer interface called v_buffer
gD3dDevice->CreateVertexBuffer(vertices*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);
VOID* pVoid; // a void pointer
// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, ver, vertices*sizeof(CUSTOMVERTEX));
v_buffer->Unlock();
// create an index buffer interface called i_buffer
gD3dDevice->CreateIndexBuffer(i*sizeof(int),
0,
D3DFMT_INDEX32,
D3DPOOL_MANAGED,
&i_buffer,
NULL);
// lock i_buffer and load the indices into it
i_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, indi, i*sizeof(int));
i_buffer->Unlock();
triangles = i/3;
}
LPDIRECT3DVERTEXBUFFER9& Model::get_v_buffer()
{
return v_buffer;
}
LPDIRECT3DINDEXBUFFER9& Model::get_i_buffer()
{
return i_buffer;
}
//risuva obekta v prostranstvoto na dadeni koordinati x y z rotiran po x y i z osta i scale-nat po x y z
void Model::draw(float x, float y, float z,
float rx, float ry, float rz,
float sx, float sy, float sz)
{
D3DXMATRIX scaleMatrix;//pravim matrica za mashtabirane
D3DXMatrixScaling(&scaleMatrix, sx, sy, sz);//zapulvame q s danni
D3DXMATRIX rotYMatrix;//pravim matrica za rotaciq po y
//D3DXVECTOR3 v = D3DXVECTOR3(rx,ry,rz);
D3DXMatrixRotationY(&rotYMatrix, ry);//zapulvame q s danni
D3DXMATRIX rotXMatrix;//pravim matrica za rotaciq po x
//D3DXVECTOR3 v = D3DXVECTOR3(rx,ry,rz);
D3DXMatrixRotationX(&rotXMatrix, rx);//zapulvame q s danni
D3DXMATRIX translateMatrix;//pravim matrica za translaciq
D3DXMatrixTranslation(&translateMatrix, x, y, z);//zapulvame q s danni
//proizvedenieto na tezi matrici e matrica opisvashta vsichki transformacii na koito e bil podlojen obekta predi da
//bude narisuvan
D3DXMATRIX worldMatrix = scaleMatrix*rotXMatrix*rotYMatrix*translateMatrix;
//kazvame koq she e transformaciqta
gD3dDevice->SetTransform( D3DTS_WORLD, &worldMatrix);
// select the vertex and index buffers to use
//kazvame koi she sa buferite
gD3dDevice->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
gD3dDevice->SetIndices(i_buffer);
//kazvame da narisuva index primitivata
gD3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, vertices, 0, triangles);
}
void Model::draw(float x, float y, float z, float s)
{
draw(x,y,z,0.0f,0.0f,0.0f,s,s,s);//vika gorniq draw method
}