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

примерно 30-40% от планируемого класса фпс 350 при движении по диагонали, ~400 при движении параллельно осям. И сильно снизиться уже не должен
class ground{
//текущая позиция камеры
int x,y;
//***************************************
//меш прикидывающийся детализированным ландшафтам с лодами.
Handle mesh;
//его поверхности ближнего плана
Handle **surf;
//среднего плана
Handle **surfm;
//дальнего плана
// разрешение наиболее детализировнных ячеек.
int resolution;
// разрешение клеток средней детализации
int resol;
int number;
//data for deformations
//хранитель мирового зерна.
int uppersize;
float **seed;
int grain;
//массивы билжнего плана.
float ****strip;
//массивы среднего плана.
float ****stripm;

//шершавость нижнего уровня
float sharpness;
//сглживание
float smothing;
//нижняя точка всего ландшафта
float minimum;
//высота ландшафта
float height;
//******************************************

public:
//конструктор класса
ground(){
    //position intitilazer
    x=xEntityX(Pivot);
    y=xEntityZ(Pivot);
    //Mesh creation
    mesh=xCreateMesh();
    xEntityFX(mesh,2);
    xPositionEntity(mesh,x,0,y);
    //surface for mesh
    //создание ближнего квадрата
    number=6;
    resolution=32;
    sharpness=0.17f;
    smothing=3;
    minimum=1000.4f;
    //ближний план
    surf=new Handle*[number];
    for(int i=0;i<number;i++){surf[i]=new Handle[number];}
    for(int i=0;i<number;i++){for(int j=0;j<number;j++){surf[i][j]=xCreateSurface(mesh);C_Plane(surf[i][j],resolution,resolution*(i-number*0.5f),resolution*(j-number*0.5f));}}

    //генерация мирового зерна
    uppersize=4*128;
    grain=xMillisecs();
    First_Generator(uppersize,5.1f,3,50);
    //структура данных ближнего плана
    strip= new float ***[number+2];
    for(int i=0;i<number+2;i++){strip[i]=new float **[number+2];}
    //генерация деформационных массивов ближнего квадрата.
    for(int i=0;i<number+2;i++){for(int j=0;j<number+2;j++){
    strip[i][j]=new float *[resolution+1];
    for(int k=0;k<=resolution;k++){strip[i][j][k]=new float[resolution+1];}}}
    for(int i=0;i<number+2;i++){for(int j=0;j<number+2;j++){Diamond_Square(i,j,sharpness, smothing);}}
    for(int i=0;i<number;i++){for(int j=0;j<number;j++){Surface_Monolitizer(i,j);}}

    //структура данных среднего плана
    resol=resolution/4;
        //средний план
    surfm=new Handle*[3*number];
    for(int i=0;i<3*number;i++){surfm[i]=new Handle[3*number];}
    for(int i=0;i<3*number;i++){for(int j=0;j<3*number;j++){
       surfm[i][j]=xCreateSurface(mesh);C_Plane_m(surfm[i][j],resol,resolution*(i-1.5f*number),resolution*(j-1.5f*number));
       }}
    stripm= new float ***[3*number+2];
    for(int i=0;i<3*number+2;i++){stripm[i]=new float **[3*number+2];}
    //генерация деформационных массивов ближнего квадрата.
    for(int i=0;i<3*number+2;i++){for(int j=0;j<3*number+2;j++){
    stripm[i][j]=new float *[resol+1];
    for(int k=0;k<=resol;k++){stripm[i][j][k]=new float[resol+1];}}}
    for(int i=0;i<3*number+2;i++){for(int j=0;j<3*number+2;j++){Diamond_Squarem(i,j,sharpness, smothing);}}
    for(int i=0;i<3*number;i++){for(int j=0;j<3*number;j++){Surface_Monolitizerm(i,j);}}
    //*******************************************
    xCalculateFrustumVolume(mesh);
}
//***************************************************
void update(){
    //position intitilazer
    int xc=xEntityX(Pivot);
    int yc=xEntityZ(Pivot);
    if(xc-resolution-1>x){x=x+resolution;Data_Switcher(0);Surface_Switcher(0);Data_Switcherm(0);Surface_Switcherm(0);xCalculateFrustumVolume(mesh);}
    if(xc+resolution+1<x){x=x-resolution;Data_Switcher(1);Surface_Switcher(1);Data_Switcherm(1);Surface_Switcherm(1);xCalculateFrustumVolume(mesh);}
    if(yc-resolution-1>y){y=y+resolution;Data_Switcher(2);Surface_Switcher(2);Data_Switcherm(2);Surface_Switcherm(2);xCalculateFrustumVolume(mesh);}
    if(yc+resolution+1<y){y=y-resolution;Data_Switcher(3);Surface_Switcher(3);Data_Switcherm(3);Surface_Switcherm(3);xCalculateFrustumVolume(mesh);}
    //Создать давилку для среднего под ближним
    //Создать давилку для дальнего под средним

}
//***************************************************
//***************************************************
//***************************************************
void Surface_Monolitizer(int a,int b){

    float m[3][4];
    for(int i=0;i<=resolution;i++){for(int j=0;j<=resolution;j++){
    //вычисляю индекс вершины
    int index=i*(resolution+1)+j;
    //первая нормаль
    int x1=-1; int z1=0;
    int x2=0; int z2=1;
    float y0=strip[a+1][b+1][i][j];
    float y1;
    if(i==0){y1=strip[a][b+1][i+x1+resolution][j+z1];} else{y1=strip[a+1][b+1][i+x1][j+z1];}
    float y2;
    if(j==resolution){y2=strip[a+1][b+2][i+x2][j+z2-resolution];} else{y2=strip[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][0]=y1-y0;
    //y's
    m[1][0]=-1;
    //z's
    m[2][0]=y0-y2;

    //вторая нормаль
    x1=0; z1=1;
    x2=1; z2=0;
    if(j==resolution){y1=strip[a+1][b+2][i+x1][j+z1-resolution];} else{y1=strip[a+1][b+1][i+x1][j+z1];}
    if(i==resolution){y2=strip[a+2][b+1][i+x2-resolution][j+z2];} else{y2=strip[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][1]=y0-y2;
    //y's
    m[1][1]=-1;
    //z's
    m[2][1]=y0-y1;

    //третья нормаль
    x1=1; z1=0;
    x2=0; z2=-1;
    if(i==resolution) {y1=strip[a+2][b+1][i+x1-resolution][j+z1];} else{y1=strip[a+1][b+1][i+x1][j+z1];}
    if(j==0) {y2=strip[a+1][b][i+x2][j+z2+resolution];} else{y2=strip[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][2]=y0-y1;
    //y's
    m[1][2]=-1;
    //z's
    m[2][2]=y2-y0;

    //четвертая нормаль
    x1=0; z1=-1;
    x2=-1; z2=0;
    if(j==0){y1=strip[a+1][b][i+x1][j+z1+resolution];} else{y1=strip[a+1][b+1][i+x1][j+z1];}
    if(i==0){y2=strip[a][b+1][i+x2+resolution][j+z2];} else{y2=strip[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][3]=y2-y0;
    //y's
    m[1][3]=-1;
    //z's
    m[2][3]=y1-y0;
    m[0][0]=-0.25f*(m[0][0]+m[0][1]+m[0][2]+m[0][3]);
    m[1][0]=-0.25f*(m[1][0]+m[1][1]+m[1][2]+m[1][3]);
    m[2][0]=-0.25f*(m[2][0]+m[2][1]+m[2][2]+m[2][3]);
    //вершино переставлялко
    //*****************************
    if(y0>=0){xVertexCoords(surf[a][b],index,xVertexX(surf[a][b],index),y0*y0*0.03f,xVertexZ(surf[a][b],index));}
    if(y0<0){xVertexCoords(surf[a][b],index,xVertexX(surf[a][b],index),-y0*y0*0.03f,xVertexZ(surf[a][b],index));}
    //****************************
    xVertexNormal(surf[a][b],index,m[0][0],m[1][0],m[2][0]);
    xVertexColor(surf[a][b],index,127,89,63);
    //*******************************************
    //раскрас поверхности
    //*******************************************
    //y0=y0*3;
    //xVertexColor(surf[a][b],index,y0,y0+70,y0-70);
    //морское дно глубже 2
    if(y0<=-2){xVertexColor(surf[a][b],index,95,75,55);}

    //песок 255,255,125 на побережье
    if(fabs(y0)<2){xVertexColor(surf[a][b],index,255,238+xRnd(-15,15),89+xRnd(-15,15));}
    if(y0>=2 && y0<5){xVertexColor(surf[a][b],index,192+xRnd(-15,15),255,109+xRnd(-15,15));}
    if(y0>=5+xRnd(-0.5,0.5) && y0<10+xRnd(-1,1)){xVertexColor(surf[a][b],index,100+xRnd(-15,15),255,63+xRnd(-15,15));}
    if(y0>=10+xRnd(-1,1) && y0<60+xRnd(-1,1)){xVertexColor(surf[a][b],index,0+xRnd(-15,15),127+xRnd(-15,15),40+xRnd(-15,15));}
    //снег на двадцать единиц ниже пиков
    if(y0>90+xRnd(-3,3)){xVertexColor(surf[a][b],index,255,255,255);}
    }}


}
//***************************************************
void Surface_Monolitizerm(int a,int b){

    float m[3][4];
    for(int i=0;i<=resol;i++){for(int j=0;j<=resol;j++){
    //вычисляю индекс вершины
    int index=i*(resol+1)+j;
    //первая нормаль
    int x1=-1; int z1=0;
    int x2=0; int z2=1;
    float y0=stripm[a+1][b+1][i][j];
    //вершино переставлялко
    //*****************************
    int delta=0;

    if(y0>=0){xVertexCoords(surfm[a][b],index,xVertexX(surfm[a][b],index),y0*y0*0.03f,xVertexZ(surfm[a][b],index));}
    if(y0<0){xVertexCoords(surfm[a][b],index,xVertexX(surfm[a][b],index),-y0*y0*0.03f,xVertexZ(surfm[a][b],index));}
    //если a>
     float y1;
    if(i==0){y1=stripm[a][b+1][i+x1+resol][j+z1];} else{y1=stripm[a+1][b+1][i+x1][j+z1];}
    float y2;
    if(j==resol){y2=stripm[a+1][b+2][i+x2][j+z2-resol];} else{y2=stripm[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][0]=y1-y0;
    //y's
    m[1][0]=-1;
    //z's
    m[2][0]=y0-y2;

    //вторая нормаль
    x1=0; z1=1;
    x2=1; z2=0;
    if(j==resol){y1=stripm[a+1][b+2][i+x1][j+z1-resol];} else{y1=stripm[a+1][b+1][i+x1][j+z1];}
    if(i==resol){y2=stripm[a+2][b+1][i+x2-resol][j+z2];} else{y2=stripm[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][1]=y0-y2;
    //y's
    m[1][1]=-1;
    //z's
    m[2][1]=y0-y1;

    //третья нормаль
    x1=1; z1=0;
    x2=0; z2=-1;
    if(i==resol) {y1=stripm[a+2][b+1][i+x1-resol][j+z1];} else{y1=stripm[a+1][b+1][i+x1][j+z1];}
    if(j==0) {y2=stripm[a+1][b][i+x2][j+z2+resol];} else{y2=stripm[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][2]=y0-y1;
    //y's
    m[1][2]=-1;
    //z's
    m[2][2]=y2-y0;

    //четвертая нормаль
    x1=0; z1=-1;
    x2=-1; z2=0;
    if(j==0){y1=stripm[a+1][b][i+x1][j+z1+resol];} else{y1=stripm[a+1][b+1][i+x1][j+z1];}
    if(i==0){y2=stripm[a][b+1][i+x2+resol][j+z2];} else{y2=stripm[a+1][b+1][i+x2][j+z2];}
    //x's
    m[0][3]=y2-y0;
    //y's
    m[1][3]=-1;
    //z's
    m[2][3]=y1-y0;
    m[0][0]=-0.25f*(m[0][0]+m[0][1]+m[0][2]+m[0][3]);
    m[1][0]=-0.25f*(m[1][0]+m[1][1]+m[1][2]+m[1][3]);
    m[2][0]=-0.25f*(m[2][0]+m[2][1]+m[2][2]+m[2][3]);

    //****************************
    xVertexNormal(surfm[a][b],index,m[0][0],m[1][0],m[2][0]);
    xVertexColor(surfm[a][b],index,127,89,63);
    //*******************************************
    //раскрас поверхности
    //*******************************************
    //y0=y0*3;
    //xVertexColor(surf[a][b],index,y0,y0+70,y0-70);
    //морское дно глубже 2
    if(y0<=-2){xVertexColor(surfm[a][b],index,95,75,55);}

    //песок 255,255,125 на побережье
    if(fabs(y0)<2){xVertexColor(surfm[a][b],index,255,238+xRnd(-15,15),89+xRnd(-15,15));}
    if(y0>=2 && y0<5){xVertexColor(surfm[a][b],index,192+xRnd(-15,15),255,109+xRnd(-15,15));}
    if(y0>=5+xRnd(-0.5,0.5) && y0<10+xRnd(-1,1)){xVertexColor(surfm[a][b],index,100+xRnd(-15,15),255,63+xRnd(-15,15));}
    if(y0>=10+xRnd(-1,1) && y0<60+xRnd(-1,1)){xVertexColor(surfm[a][b],index,0+xRnd(-15,15),127+xRnd(-15,15),40+xRnd(-15,15));}
    //снег на двадцать единиц ниже пиков
    if(y0>90+xRnd(-3,3)){xVertexColor(surfm[a][b],index,255,255,255);}
    }}


}

//****************************************
void Data_Switcher(int flag){

float **temp[number+2];
//do not touch this, never ever.
    if(flag==0){
        for(int i=0;i<number+2;i++){
            temp[i]=strip[0][i];
                for(int k=0;k<number+1;k++) {strip[k][i]=strip[k+1][i];}
                strip[number+1][i]=temp[i];
                Diamond_Square(number+1,i,sharpness,smothing);}}
    if(flag==1){
        for(int i=0;i<number+2;i++){
            temp[i]=strip[number+1][i];
                for(int k=number+1;k>0;k--) {strip[k][i]=strip[k-1][i];}
                strip[0][i]=temp[i];
                Diamond_Square2(0,i,sharpness,smothing);}}
    if(flag==2){
        for(int i=0;i<number+2;i++){
            temp[i]=strip[i][0];
                for(int k=0;k<number+1;k++) {strip[i][k]=strip[i][k+1];}
                strip[i][number+1]=temp[i];
                Diamond_Square(i,number+1,sharpness,smothing);}}
    if(flag==3){
        for(int i=0;i<number+2;i++){
            temp[i]=strip[i][number+1];
                for(int k=number+1;k>0;k--) {strip[i][k]=strip[i][k-1];}
                strip[i][0]=temp[i];
                Diamond_Square3(i,0,sharpness,smothing);}}

}
//*******************************************
void Data_Switcherm(int flag){

float **temp[3*number+2];
//do not touch this, never ever.
    if(flag==0){
        for(int i=0;i<3*number+2;i++){
            temp[i]=stripm[0][i];
                for(int k=0;k<3*number+1;k++) {stripm[k][i]=stripm[k+1][i];}
                stripm[3*number+1][i]=temp[i];
                Diamond_Squarem(3*number+1,i,sharpness,smothing);}}
    if(flag==1){
        for(int i=0;i<3*number+2;i++){
            temp[i]=stripm[3*number+1][i];
                for(int k=3*number+1;k>0;k--) {stripm[k][i]=stripm[k-1][i];}
                stripm[0][i]=temp[i];
                Diamond_Square2m(0,i,sharpness,smothing);}}
    if(flag==2){
        for(int i=0;i<3*number+2;i++){
            temp[i]=stripm[i][0];
                for(int k=0;k<3*number+1;k++) {stripm[i][k]=stripm[i][k+1];}
                stripm[i][3*number+1]=temp[i];
                Diamond_Squarem(i,3*number+1,sharpness,smothing);}}
    if(flag==3){
        for(int i=0;i<3*number+2;i++){
            temp[i]=stripm[i][3*number+1];
                for(int k=3*number+1;k>0;k--) {stripm[i][k]=stripm[i][k-1];}
                stripm[i][0]=temp[i];
                Diamond_Square3m(i,0,sharpness,smothing);}}

}

//****************************************
void Surface_Switcher(int flag){
//do not touch this, never ever.
    Handle temp[number];
    if(flag==0){ for(int i=0;i<number;i++){temp[i]=surf[0][i];
     for(int k=0;k<number-1;k++) {surf[k][i]=surf[k+1][i];}
      surf[number-1][i]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j)+number*resolution,xVertexY(temp[i],j),xVertexZ(temp[i],j));}}
        for(int i=0;i<number;i++){Surface_Monolitizer(number-1,i);}}

    if(flag==1){ for(int i=0;i<number;i++){temp[i]=surf[number-1][i];
     for(int k=number-1;k>0;k--) {surf[k][i]=surf[k-1][i];}
     surf[0][i]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j)-number*resolution,xVertexY(temp[i],j),xVertexZ(temp[i],j));}}
        for(int i=0;i<number;i++){
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            Surface_Monolitizer(0,i);}}

    if(flag==2){ for(int i=0;i<number;i++){temp[i]=surf[i][0];
     for(int k=0;k<number-1;k++) {surf[i][k]=surf[i][k+1];}
      surf[i][number-1]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j),xVertexY(temp[i],j),xVertexZ(temp[i],j)+number*resolution);}}
        for(int i=0;i<number;i++){Surface_Monolitizer(i,number-1);}}

    if(flag==3){ for(int i=0;i<number;i++){temp[i]=surf[i][number-1];
     for(int k=number-1;k>0;k--) {surf[i][k]=surf[i][k-1];}
     surf[i][0]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j),xVertexY(temp[i],j),xVertexZ(temp[i],j)-number*resolution);}}
        for(int i=0;i<number;i++){
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
           Surface_Monolitizer(i,0);}}
}
//****************************************
void Surface_Switcherm(int flag){
//do not touch this, never ever.
    Handle temp[3*number];
    if(flag==0){ for(int i=0;i<3*number;i++){temp[i]=surfm[0][i];
     for(int k=0;k<3*number-1;k++) {surfm[k][i]=surfm[k+1][i];}
      surfm[3*number-1][i]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j)+3*number*resolution,xVertexY(temp[i],j),xVertexZ(temp[i],j));}}
        for(int i=0;i<3*number;i++){Surface_Monolitizerm(3*number-1,i);}}

    if(flag==1){ for(int i=0;i<3*number;i++){temp[i]=surfm[3*number-1][i];
     for(int k=3*number-1;k>0;k--) {surfm[k][i]=surfm[k-1][i];}
     surfm[0][i]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j)-3*number*resolution,xVertexY(temp[i],j),xVertexZ(temp[i],j));}}
        for(int i=0;i<3*number;i++){
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            Surface_Monolitizerm(0,i);}}

    if(flag==2){ for(int i=0;i<3*number;i++){temp[i]=surfm[i][0];
     for(int k=0;k<3*number-1;k++) {surfm[i][k]=surfm[i][k+1];}
      surfm[i][3*number-1]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j),xVertexY(temp[i],j),xVertexZ(temp[i],j)+3*number*resolution);}}
        for(int i=0;i<3*number;i++){Surface_Monolitizerm(i,3*number-1);}}

    if(flag==3){ for(int i=0;i<3*number;i++){temp[i]=surfm[i][3*number-1];
     for(int k=3*number-1;k>0;k--) {surfm[i][k]=surfm[i][k-1];}
     surfm[i][0]=temp[i];
        int qvert=xCountVertices(temp[i]);
        for(int j=0;j<qvert;j++){xVertexCoords(temp[i],j,xVertexX(temp[i],j),xVertexY(temp[i],j),xVertexZ(temp[i],j)-3*number*resolution);}}
        for(int i=0;i<3*number;i++){
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
           Surface_Monolitizerm(i,0);}}
}

//---------------------------------------------------
Handle C_Plane(Handle surf,int resolution, int posx, int posy){
    for(int i=0;i<=resolution;i++){for(int j=0;j<=resolution;j++){int v0=xAddVertex(surf,i+posx,0,j+posy,i+posx,j+posy);xVertexNormal(surf,v0,0,1,0);}}
    int qvert=xCountVertices(surf);
    for(int i=0;i<qvert-resolution-1;i++){int v0=i; int v1=i+1; int v2=i+resolution+1; int v3=v2+1;
    if(v3<qvert && xMod(i,resolution+1)!=resolution){xAddTriangle(surf,v2,v1,v3); xAddTriangle(surf,v2,v0,v1);}}
    return surf;}
//----------------------------------------------------
Handle C_Plane_m(Handle surf,int resol, int posx, int posy){
    for(int i=0;i<=resol;i++){for(int j=0;j<=resol;j++){int v0=xAddVertex(surf,i*4+posx,0,j*4+posy,i*4+posx,j*4+posy);xVertexNormal(surf,v0,0,1,0);}}
    int qvert=xCountVertices(surf);
    for(int i=0;i<qvert-resol-1;i++){int v0=i; int v1=i+1; int v2=i+resol+1; int v3=v2+1;
    if(v3<qvert && xMod(i,resol+1)!=resol){xAddTriangle(surf,v2,v1,v3); xAddTriangle(surf,v2,v0,v1);}}
    return surf;}
//---------------------------------------------------

//----------------------------------------------------

//*******************************************************
void Diamond_Square(int a,int b, float sharp, int diff){
int size=resolution;
for(int i=0;i<=size;i++){
    for(int j=0;j<=size;j++){
        strip[a][b][i][j]=0;
        }
    }

//зерно
srand(seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b,uppersize)]);
//боковая и нижняя строки.

for(int i=0;i<=size;i++){
        if(a>0){strip[a][b][0][i]=strip[a-1][b][size][i];}
        if(b>0){strip[a][b][i][0]=strip[a][b-1][i][size];}
}

//заполнение краев
if(strip[a][b][0][0]==0){ strip[a][b][0][0]=seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b,uppersize)];}
if(strip[a][b][size][0]==0) {strip[a][b][size][0]=seed[xMod(x/resolution+a+1,uppersize)][xMod(y/resolution+b,uppersize)];}
if(strip[a][b][0][size]==0) {strip[a][b][0][size]=seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b+1,uppersize)];}
if(strip[a][b][size][size]==0) {strip[a][b][size][size]=seed[xMod(x/resolution+a+1,uppersize)][xMod(y/resolution+b+1,uppersize)];}

int step=size>>1;
while(step>0){
    //первая строка
    for(int i=step;i<=size-step;i=i+2*step){
        for(int j=step;j<=size-step;j=j+2*step){

        float val00=strip[a][b][i-step][j-step];
        float val01=strip[a][b][i-step][j+step];
        float val10=strip[a][b][i+step][j-step];
        float val11=strip[a][b][i+step][j+step];

        if(strip[a][b][i][j]==0){strip[a][b][i][j]=0.25f*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(strip[a][b][i-step][j]==0){strip[a][b][i-step][j]=0.5f*(val00+val01+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i+step][j]==0){strip[a][b][i+step][j]=0.5f*(val10+val11+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i][j-step]==0){strip[a][b][i][j-step]=0.5f*(val00+val10+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i][j+step]==0){strip[a][b][i][j+step]=0.5f*(val01+val11+step*xRnd(-sharp,sharp));}
        }
    }
step=step>>1;}

}
//********************************************************
void Diamond_Square2(int a,int b, float sharp, int diff){
int size=resolution;
for(int i=0;i<=size;i++){
    for(int j=0;j<=size;j++){
        strip[a][b][i][j]=0;
        }
    }

//зерно
srand(seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b,uppersize)]);
//боковая и нижняя строки.

for(int i=0;i<=size;i++){
        if(a<number){strip[a][b][size][i]=strip[a+1][b][0][i];}
        if(b>0){strip[a][b][i][0]=strip[a][b-1][i][size];}
}

//заполнение краев
if(strip[a][b][0][0]==0){ strip[a][b][0][0]=seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b,uppersize)];}
if(strip[a][b][size][0]==0) {strip[a][b][size][0]=seed[xMod(x/resolution+a+1,uppersize)][xMod(y/resolution+b,uppersize)];}
if(strip[a][b][0][size]==0) {strip[a][b][0][size]=seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b+1,uppersize)];}
if(strip[a][b][size][size]==0) {strip[a][b][size][size]=seed[xMod(x/resolution+a+1,uppersize)][xMod(y/resolution+b+1,uppersize)];}

int step=size>>1;
while(step>0){
    //первая строка
    for(int i=step;i<=size-step;i=i+2*step){
        for(int j=step;j<=size-step;j=j+2*step){

        float val00=strip[a][b][i-step][j-step];
        float val01=strip[a][b][i-step][j+step];
        float val10=strip[a][b][i+step][j-step];
        float val11=strip[a][b][i+step][j+step];

        if(strip[a][b][i][j]==0){strip[a][b][i][j]=0.25f*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(strip[a][b][i-step][j]==0){strip[a][b][i-step][j]=0.5f*(val00+val01+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i+step][j]==0){strip[a][b][i+step][j]=0.5f*(val10+val11+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i][j-step]==0){strip[a][b][i][j-step]=0.5f*(val00+val10+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i][j+step]==0){strip[a][b][i][j+step]=0.5f*(val01+val11+step*xRnd(-sharp,sharp));}
        }
    }
step=step>>1;}

}
//********************************************************
void Diamond_Square3(int a,int b, float sharp, int diff){
int size=resolution;
for(int i=0;i<=size;i++){
    for(int j=0;j<=size;j++){
        strip[a][b][i][j]=0;
        }
    }

//зерно
srand(seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b,uppersize)]);
//боковая и нижняя строки.

for(int i=0;i<=size;i++){
        if(a>0){strip[a][b][0][i]=strip[a-1][b][size][i];}
        if(b<number){strip[a][b][i][size]=strip[a][b+1][i][0];}
}

//заполнение краев
if(strip[a][b][0][0]==0){ strip[a][b][0][0]=seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b,uppersize)];}
if(strip[a][b][size][0]==0) {strip[a][b][size][0]=seed[xMod(x/resolution+a+1,uppersize)][xMod(y/resolution+b,uppersize)];}
if(strip[a][b][0][size]==0) {strip[a][b][0][size]=seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b+1,uppersize)];}
if(strip[a][b][size][size]==0) {strip[a][b][size][size]=seed[xMod(x/resolution+a+1,uppersize)][xMod(y/resolution+b+1,uppersize)];}

int step=size>>1;
while(step>0){
    //первая строка
    for(int i=step;i<=size-step;i=i+2*step){
        for(int j=step;j<=size-step;j=j+2*step){

        float val00=strip[a][b][i-step][j-step];
        float val01=strip[a][b][i-step][j+step];
        float val10=strip[a][b][i+step][j-step];
        float val11=strip[a][b][i+step][j+step];

        if(strip[a][b][i][j]==0){strip[a][b][i][j]=0.25f*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(strip[a][b][i-step][j]==0){strip[a][b][i-step][j]=0.5f*(val00+val01+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i+step][j]==0){strip[a][b][i+step][j]=0.5f*(val10+val11+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i][j-step]==0){strip[a][b][i][j-step]=0.5f*(val00+val10+step*xRnd(-sharp,sharp));}
        if(strip[a][b][i][j+step]==0){strip[a][b][i][j+step]=0.5f*(val01+val11+step*xRnd(-sharp,sharp));}
        }
    }
step=step>>1;}

}

//*-**-*-*-*-*--*-*-*-*-*-*
//*******************************************************
void Diamond_Squarem(int a,int b, float sharp, int diff){
int size=resol;
for(int i=0;i<=size;i++){
    for(int j=0;j<=size;j++){
        stripm[a][b][i][j]=0;
        }
    }

//зерно
//srand(seed[xMod(x/resolution+a,uppersize)][xMod(y/resolution+b,uppersize)]);
srand(seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b-number,uppersize)]);
//боковая и нижняя строки.

for(int i=0;i<=size;i++){
        if(a>0){stripm[a][b][0][i]=stripm[a-1][b][size][i];}
        if(b>0){stripm[a][b][i][0]=stripm[a][b-1][i][size];}
}

//заполнение краев
if(stripm[a][b][0][0]==0){ stripm[a][b][0][0]=seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b-number,uppersize)];}
if(stripm[a][b][size][0]==0) {stripm[a][b][size][0]=seed[xMod(x/resolution+a+1-number,uppersize)][xMod(y/resolution+b-number,uppersize)];}
if(stripm[a][b][0][size]==0) {stripm[a][b][0][size]=seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b+1-number,uppersize)];}
if(stripm[a][b][size][size]==0) {stripm[a][b][size][size]=seed[xMod(x/resolution+a+1-number,uppersize)][xMod(y/resolution+b+1-number,uppersize)];}

int step=size>>1;
while(step>0){
    //первая строка
    for(int i=step;i<=size-step;i=i+2*step){
        for(int j=step;j<=size-step;j=j+2*step){

        float val00=stripm[a][b][i-step][j-step];
        float val01=stripm[a][b][i-step][j+step];
        float val10=stripm[a][b][i+step][j-step];
        float val11=stripm[a][b][i+step][j+step];

        if(stripm[a][b][i][j]==0){stripm[a][b][i][j]=0.25f*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(stripm[a][b][i-step][j]==0){stripm[a][b][i-step][j]=0.5f*(val00+val01+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i+step][j]==0){stripm[a][b][i+step][j]=0.5f*(val10+val11+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i][j-step]==0){stripm[a][b][i][j-step]=0.5f*(val00+val10+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i][j+step]==0){stripm[a][b][i][j+step]=0.5f*(val01+val11+step*xRnd(-sharp,sharp));}
        }
    }
step=step>>1;}

}
//********************************************************
void Diamond_Square2m(int a,int b, float sharp, int diff){
int size=resol;
for(int i=0;i<=size;i++){
    for(int j=0;j<=size;j++){
        stripm[a][b][i][j]=0;
        }
    }

//зерно
srand(seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b-number,uppersize)]);
//боковая и нижняя строки.

for(int i=0;i<=size;i++){
        if(a<number){stripm[a][b][size][i]=stripm[a+1][b][0][i];}
        if(b>0){stripm[a][b][i][0]=stripm[a][b-1][i][size];}
}

//заполнение краев
if(stripm[a][b][0][0]==0){ stripm[a][b][0][0]=seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b-number,uppersize)];}
if(stripm[a][b][size][0]==0) {stripm[a][b][size][0]=seed[xMod(x/resolution+a+1-number,uppersize)][xMod(y/resolution+b-number,uppersize)];}
if(stripm[a][b][0][size]==0) {stripm[a][b][0][size]=seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b+1-number,uppersize)];}
if(stripm[a][b][size][size]==0) {stripm[a][b][size][size]=seed[xMod(x/resolution+a+1-number,uppersize)][xMod(y/resolution+b+1-number,uppersize)];}

int step=size>>1;
while(step>0){
    //первая строка
    for(int i=step;i<=size-step;i=i+2*step){
        for(int j=step;j<=size-step;j=j+2*step){

        float val00=stripm[a][b][i-step][j-step];
        float val01=stripm[a][b][i-step][j+step];
        float val10=stripm[a][b][i+step][j-step];
        float val11=stripm[a][b][i+step][j+step];

        if(stripm[a][b][i][j]==0){stripm[a][b][i][j]=0.25f*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(stripm[a][b][i-step][j]==0){stripm[a][b][i-step][j]=0.5f*(val00+val01+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i+step][j]==0){stripm[a][b][i+step][j]=0.5f*(val10+val11+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i][j-step]==0){stripm[a][b][i][j-step]=0.5f*(val00+val10+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i][j+step]==0){stripm[a][b][i][j+step]=0.5f*(val01+val11+step*xRnd(-sharp,sharp));}
        }
    }
step=step>>1;}

}
//********************************************************
void Diamond_Square3m(int a,int b, float sharp, int diff){
int size=resol;
for(int i=0;i<=size;i++){
    for(int j=0;j<=size;j++){
        stripm[a][b][i][j]=0;
        }
    }

//зерно
srand(seed[xMod(x/resol+a-number,uppersize)][xMod(y/resol+b-number,uppersize)]);
//боковая и нижняя строки.

for(int i=0;i<=size;i++){
        if(a>0){stripm[a][b][0][i]=stripm[a-1][b][size][i];}
        if(b<number){stripm[a][b][i][size]=stripm[a][b+1][i][0];}
}

//заполнение краев
if(stripm[a][b][0][0]==0){ stripm[a][b][0][0]=seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b-number,uppersize)];}
if(stripm[a][b][size][0]==0) {stripm[a][b][size][0]=seed[xMod(x/resolution+a+1-number,uppersize)][xMod(y/resolution+b-number,uppersize)];}
if(stripm[a][b][0][size]==0) {stripm[a][b][0][size]=seed[xMod(x/resolution+a-number,uppersize)][xMod(y/resolution+b+1-number,uppersize)];}
if(stripm[a][b][size][size]==0) {stripm[a][b][size][size]=seed[xMod(x/resolution+a+1-number,uppersize)][xMod(y/resolution+b+1-number,uppersize)];}

int step=size>>1;
while(step>0){
    //первая строка
    for(int i=step;i<=size-step;i=i+2*step){
        for(int j=step;j<=size-step;j=j+2*step){

        float val00=stripm[a][b][i-step][j-step];
        float val01=stripm[a][b][i-step][j+step];
        float val10=stripm[a][b][i+step][j-step];
        float val11=stripm[a][b][i+step][j+step];

        if(stripm[a][b][i][j]==0){stripm[a][b][i][j]=0.25f*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(stripm[a][b][i-step][j]==0){stripm[a][b][i-step][j]=0.5f*(val00+val01+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i+step][j]==0){stripm[a][b][i+step][j]=0.5f*(val10+val11+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i][j-step]==0){stripm[a][b][i][j-step]=0.5f*(val00+val10+step*xRnd(-sharp,sharp));}
        if(stripm[a][b][i][j+step]==0){stripm[a][b][i][j+step]=0.5f*(val01+val11+step*xRnd(-sharp,sharp));}
        }
    }
step=step>>1;}

}
//********************************************************
float xRnd(float min, float max){
    float length=max-min;
    float var =((float) rand() / (float)RAND_MAX);
    float value=min+var*length;
return value;}
//********************************************************
void First_Generator(int size, float sharp, int diff , int height){
float max=-10000.01;
srand(grain);
//создается массив для значений
seed=new float*[size+1];
for(int i=0;i<=size;i++){
    seed[i]= new float[size+1];
}
for(int i=0;i<=size;i++){
    for(int j=0;j<=size;j++){
        seed[i][j]=0;
        }
    }

for(int i=0;i<=size;i=i+(size>>2)){
    for(int j=0;j<=size;j=j+(size>>2)){
        seed[i][j]=xRnd(-height,height);
        }
    }
int step=size>>1;
while(step>0){
    //первая строка
    for(int i=step;i<=size-step;i=i+2*step){
        for(int j=step;j<=size-step;j=j+2*step){

        float val00=seed[i-step][j-step];
        float val01=seed[i-step][j+step];
        float val10=seed[i+step][j-step];
        float val11=seed[i+step][j+step];

        if(seed[i][j]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){seed[i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(seed[i-step][j]==0 && val00!=0 && val01!=0){seed[i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
        if(seed[i+step][j]==0 && val10!=0 && val11!=0){seed[i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
        if(seed[i][j-step]==0 && val00!=0 && val10!=0){seed[i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
        if(seed[i][j+step]==0 && val01!=0 && val11!=0){seed[i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
        }
    }
step=step>>1;

}
for(int i=0;i<=size;i++){for(int j=0;j<=size;j++){
        if(seed[i][j]<minimum){minimum=seed[i][j];}
        if(seed[i][j]>max){max=seed[i][j];}
    }}
    height=max-minimum;


}
//********************************************************
int xMod(int a,int b){
int c=a-b*floor(a/b);
if(c<0) {c=c+b;}
return c;
}
//********************************************************
};
(Offline)
 
Ответить с цитированием