Тема: Странное.
Показать сообщение отдельно
Старый 25.10.2011, 17:58   #181
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Вот то что я понимаю под синглсюрфейс. Пытался сделать легкий доступ к кваду и вроде получилось. Осталось нормальный контроль кол-ва сделать и можно будет кой-чо делать.

//  вектор в тридэ
class float3 {
    public:
    
float x;
    
float y;
    
float z;

    
float3(){
    
x=0.0f;
    
y=0.0f;
    
z=0.0f;
    }

    
void set(float afloat b,float c)
    {
      
x=ay=b;z=c;
    }
};
//вершина
class vert_data {
    public:
    
int index;
    
Handle surf;
    
float3 *position;
    
float3 *normal;

    
vert_data(){
    
position= new float3;
    
normal= new float3;
    }

    
void setnormal(float afloat b,float c){
        
xVertexNormal(surf,index,a,b,c);
        
normal->set(a,b,c);}

    
void setposition(float afloat b,float c){
        
xVertexCoords(surf,index,a,b,c);
        
xVertexTexCoords(surf,index,a,c);
        
position->set(a,b,c);}
    
/*
    обновление нормали.
    есть четыре вектора (1,0,val00-val10) (0,1,val00-val01) (-1,0,val00-(val-10)) (0,1,val00-(val0-1))
    попарно векторное умножение даст четыре нормали сумма/4 результирующая нормаль.
    одно вычисление валидно для четырех квадов
    */
};
//квад
class quad {
    public:
    
Handle surf;
    
vert_data *v00;
    
vert_data *v01;
    
vert_data *v10;
    
vert_data *v11;
    
int index;

    
quad(){
    
v00= new vert_data;
    
v01= new vert_data;
    
v10= new vert_data;
    
v11= new vert_data;
    }
};

//менеджер квадов
class manager {
    public:
    
Handle mesh;
    
//массив под поверхности
    
Handle *surf;
    
// массив квадов
    // сикока квадо увсего
    
int cquad;
    
quad **sys;

    
//размер элемента группы квадов.
    
int size;
    
//methods area
    //constructor
    
manager();


};

manager :: manager(){
        
//ограничение числа индексов в 65536
        //значит число квадов в поверхности
        
int quadnum=256*64;
        
cquad=0;
        
mesh=xCreateMesh();
        
int number=4;
        
surf= new Handle[number];
        
sys = new quad*[quadnum*number];

        for(
int i=0;i<number;i++){
        
surf[i]=xCreateSurface(mesh);


            for(
int j=0;j<quadnum;j++){
            
int v00=xAddVertex(surf[i],0,0,0,0,0);
            
int v01=xAddVertex(surf[i],0,0,0,0,0);
            
int v10=xAddVertex(surf[i],0,0,0,0,0);
            
int v11=xAddVertex(surf[i],0,0,0,0,0);

            
xAddTriangle(surf[i],v00,v01,v10);
            
xAddTriangle(surf[i],v01,v11,v10);
            
//заполнение данными вышележащей(или глубже) структуры
            
sys[cquad]=new quad;
            
sys[cquad]->index=cquad;
            
sys[cquad]->surf=surf[i];
            
sys[cquad]->v00->index=v00;  sys[cquad]->v00->surf=sys[cquad]->surf;  sys[cquad]->v00->setposition(0.0f,0.0f,0.0f);   sys[cquad]->v00->setnormal(0.0f,1.0f,0.0f);
            
sys[cquad]->v10->index=v10;  sys[cquad]->v10->surf=sys[cquad]->surf;  sys[cquad]->v10->setposition(1.0f,0.0f,0.0f);   sys[cquad]->v10->setnormal(0.0f,1.0f,0.0f);
            
sys[cquad]->v01->index=v01;  sys[cquad]->v01->surf=sys[cquad]->surf;  sys[cquad]->v01->setposition(0.0f,0.0f,1.0f);   sys[cquad]->v01->setnormal(0.0f,1.0f,0.0f);
            
sys[cquad]->v11->index=v11;  sys[cquad]->v11->surf=sys[cquad]->surf;  sys[cquad]->v11->setposition(1.0f,0.0f,1.0f);   sys[cquad]->v11->setnormal(0.0f,1.0f,0.0f);

            
cquad++;
              }
        }
    } 
итоговый управляющий код:

manager uno;

     for(
int i=0;i<uno.cquad;i++){
     
uno.sys[i]->v00->setposition(i,i,0);       uno.sys[i]->v00->setnormal(0,1,0);
     
uno.sys[i]->v10->setposition(i+1,i+1,0);   uno.sys[i]->v10->setnormal(0,1,0);
     
uno.sys[i]->v01->setposition(i,i,1);       uno.sys[i]->v01->setnormal(0,1,0);
     
uno.sys[i]->v11->setposition(i+1,i+1,1);   uno.sys[i]->v11->setnormal(0,1,0);
    }
    
xCalculateFrustumVolume(uno.mesh); 
Смысл в том что одной поверхностью можно имитировать наличие нескольких тысяч частиц, тех же спрайтов к примеру. И рисоваться они будут за один дип вместо нескольких тысяч. На примере своего ландшафта я понял, что чем больше треугольников в одном дипе тем лучше. так как, что при 30к треугольников на экране, что при 150к фпс оставался практически идентичным даже на встроенном в сандибридж видео.

Последний раз редактировалось dsd, 29.10.2011 в 16:24.
(Offline)
 
Ответить с цитированием