Тема: Странное.
Показать сообщение отдельно
Старый 09.11.2012, 21:34   #474
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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);
Может кому пригодится
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (09.11.2012)