Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сочинил класс который делает процесс создания поверхностей попроще.
struct vertex{
vec3 position;
vec3 normal;
vec2 texCoords;
vertex *parent;
vertex *child;
int index;
};
struct triangle{
int v0,v1,v2;
triangle *parent;
triangle *child;
int index;
};
class surf_fabric{
public:
Engine * eng;
Surface * surf;
vertex * first_vert;
vertex * last_vert;
triangle * first_trian;
triangle * last_trian;
int vert_index;
int trian_index;
int vert_num;
int trian_num;
surf_fabric(){
eng = Engine::Instance();
first_vert = new vertex;
last_vert = first_vert;
vert_index = 0;
first_trian = new triangle;
last_trian = first_trian;
trian_index = 0;
}
int AddVertex(vec3 position,vec3 normal,vec2 texCoords)
{
vertex * point = new vertex;
point->parent = last_vert;
last_vert->child = point;
point->position = position;
point->normal = normal;
point->texCoords = texCoords;
point->index = vert_index;
last_vert = point;
vert_index++;
return point->index;
}
int AddTriangle(int v0, int v1, int v2)
{
triangle * trian = new triangle;
trian->v0 = v0;
trian->v1 = v1;
trian->v2 = v2;
trian->index = trian_index;
trian_index++;
last_trian->child = trian;
trian->parent = last_trian;
last_trian = trian;
return trian->index;
}
Surface * BuildSurface(){
int count_vertices = last_vert->index;
int count_indices = 3*last_trian->index;
vertex * current_vert = first_vert;
triangle * current_trian = first_trian;
//создание поверхности
surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
while(current_vert!=last_vert){
//сначала ставлю вершины
current_vert = current_vert->child;
delete current_vert->parent;
surf->SetVertexPosition(current_vert->index,current_vert->position);
surf->SetVertexNormal(current_vert->index,current_vert->normal);
surf->SetVertexTexCoord(current_vert->index,current_vert->texCoords);
}
delete last_vert;
while(current_trian!=last_trian){
//потом трианглы
current_trian = current_trian->child;
delete current_trian->parent;
surf->SetTriangle(current_trian->index,current_trian->v0,current_trian->v1,current_trian->v2);
}
delete last_trian;
surf->RecalcTangents();
surf->UnLock();
first_vert = new vertex;
last_vert = first_vert;
vert_index = 0;
first_trian = new triangle;
last_trian = first_trian;
trian_index = 0;
return surf;
}
};
теперь поверхность можно делать так:
surf_fabric * surf = new surf_fabric();
for(int i=0;i<100;i++){
vec3 Position0(i+0,0,0) , Position1(i+0,0,1) , Position2(i+1,0,0) , Position3(i+1,0,1);
vec3 Normal(0,1,0);
vec2 texCoords(0,0);
int v0 = surf->AddVertex(Position0,Normal,texCoords);
int v1 = surf->AddVertex(Position1,Normal,texCoords);
int v2 = surf->AddVertex(Position2,Normal,texCoords);
int v3 = surf->AddVertex(Position3,Normal,texCoords);
int t0 = surf->AddTriangle(v0,v1,v2);
int t1 = surf->AddTriangle(v3,v2,v1);
}
Surface * surf0 = surf->BuildSurface();
Entity *body0 = s->Add(surf0);
StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));
body0->SetShader(StandartShaders::Render::OnlyNormals());
body0->SetPosition(0,0,0);
Может кому пригодится
|