Ответ: Странное.

провел ацкую для моих способностей кодера битву за дипы. Снизил их количество радикально. Узнал много нового про ссылки и че нельзя и чего не надо делать с классами. Результат двоякий, фпс минимальный не повысился, средний возрос от полутора до двух раз. Теперь можно в любом месте вырезать дырку без регенерации поверхностей. Теперь данные генерируются и хранятся в одном классе, а модели в другом.
Код:
// вектор в тридэ
class float3 {
public:
float x;
float y;
float z;
float3(){
x=0.0f;
y=0.0f;
z=0.0f;
}
float3(float a, float b, float c){
x=a;
y=b;
z=c;
}
void set(float a, float b,float c)
{
x=a;
y=b;
z=c;
}
};
float3 operator*(float3 a, float3 b){
float3 result;
result.x=a.y*b.z-b.y*a.z;
result.y=a.z*b.x-b.z*a.x;
result.z=a.x*b.y-b.x*a.y;
return result;
}
float3 operator*(float3 a, float b){
float3 result(a.x*b,a.y*b,a.z*b);
return result;
}
float3 operator*(float a, float3 b){
float3 result(b.x*a,b.y*a,b.z*a);
return result;
}
float3 operator+(float3 a,float3 b){
float3 result;
result.x=a.x+b.x;
result.y=a.y+b.y;
result.z=a.z+b.z;
return result;
}
float3 operator/(float3 a, float b){
float3 result;
result.x=a.x/b;
result.y=a.y/b;
result.z=a.z/b;
return result;
}
//вершина
class vert_data {
public:
int index;
Handle surf;
void setnormal(float a, float b,float c){
xVertexNormal(surf,index,a,b,c);
}
void setnormal(float3 a){
xVertexNormal(surf,index,a.x,a.y,a.z);
}
void setposition(float a, float b,float c){
xVertexCoords(surf,index,a,b,c);
xVertexTexCoords(surf,index,a,c);
}
/*
обновление нормали.
есть четыре вектора (1,0,val00-val10) (0,1,val00-val01) (-1,0,val00-(val-10)) (0,1,val00-(val0-1))
попарно векторное умножение даст четыре нормали сумма/4 результирующая нормаль.
одно вычисление валидно для четырех квадов
*/
};
//квад
class quadz {
public:
Handle surf;
vert_data v00;
vert_data v01;
vert_data v10;
vert_data v11;
int index;
};
//менеджер квадов
class manager {
public:
Handle mesh;
//массив под поверхности
Handle *surf;
// массив квадов
// сикока квадо увсего
quadz **quad;
//размер элемента группы квадов.
int size;
//methods area
//constructor
manager(int limiter);
};
manager::manager(int limiter){
//ограничитель кол-ва квадов
//ограничение числа индексов в 65536
//значит число квадов в поверхности
int quadnum=256*64;
int cquad=0;
mesh=xCreateMesh();
int number=ceil(limiter/quadnum)+1;
surf= new Handle[number];
quad = new quadz*[quadnum*number];
for(int i=0;i<number;i++){
surf[i]=xCreateSurface(mesh);
for(int j=0;j<quadnum;j++){
if(cquad==limiter){break;}
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);
//заполнение данными вышележащей(или глубже) структуры
quad[cquad]=new quadz;
quad[cquad]->index=cquad;
quad[cquad]->surf=surf[i];
quad[cquad]->v00.index=v00; quad[cquad]->v00.surf=quad[cquad]->surf;
quad[cquad]->v10.index=v10; quad[cquad]->v10.surf=quad[cquad]->surf;
quad[cquad]->v01.index=v01; quad[cquad]->v01.surf=quad[cquad]->surf;
quad[cquad]->v11.index=v11; quad[cquad]->v11.surf=quad[cquad]->surf;
cquad++;
}
if(cquad==limiter){break;}
}
size=cquad;
}
class ground{
public:
//текущая позиция камеры
int x,y;
//***************************************
//далекое
Handle farmesh;
//далекое поверхность
Handle farsur;
// разрешение наиболее детализировнных ячеек.
int resolution;
// разрешение клеток средней детализации
int resol;
int number;
//data for deformations
//хранитель мирового зерна.
int uppersize;
float **seed;
int grain;
//массивы билжнего плана.
float ****strip;
//массивы среднего плана.
float ****stripm;
//шершавость нижнего уровня
float sharpness;
//сглживание
float smothing;
float defkof;
//нижняя точка всего ландшафта
float minimum;
//высота ландшафта
float height;
//скэйл текстур
//******************************************
//конструктор класса
ground(){
//position intitilazer
x=xEntityX(Pivot);
y=xEntityZ(Pivot);
//Mesh creation
//surface for mesh
//создание ближнего квадрата
number=6;
resolution=32;
sharpness=0.25f;
minimum=1000.4f;
//ближний план
//генерация мирового зерна
int upsize=10;
uppersize=1<<upsize;
grain=xMillisecs();
First_Generator(upsize,xMillisecs());
//структура данных ближнего плана
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);}}
//структура данных среднего плана
resol=resolution/4;
//средний план
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,4*sharpness, smothing);}}
//*******************************************
farmesh=xCreateMesh();
//xEntityFX(farmesh,2);
farsur=xCreateSurface(farmesh);
int seize=50;
for(int i=-0.5*seize;i<=0.5*seize;i++){for(int j=-0.5*seize;j<=0.5*seize;j++){
int v0=xAddVertex(farsur,i*resolution,0,j*resolution,i*resolution,j*resolution);
int v1=xAddVertex(farsur,(i+1)*resolution,0,j*resolution,(i+1)*resolution,j*resolution);
int v2=xAddVertex(farsur,i*resolution,0,(j+1)*resolution,i*resolution,(j+1)*resolution);
int v3=xAddVertex(farsur,(i+1)*resolution,0,(j+1)*resolution,(i+1)*resolution,(j+1)*resolution);
if(((i>=number*1.5 || i<-number*1.5) && (j>=number*1.5 || number*1.5<-1)) || ((i<number*1.5 || i>-number*1.5) && (j>=number*1.5 || j<-number*1.5)) ||((i>=number*1.5 || i<-number*1.5) && (j<number*1.5 || j>-number*1.5))) {xAddTriangle(farsur,v1,v0,v2); xAddTriangle(farsur,v3,v1,v2);}
}}
Handle seaside_tex=xLoadTexture("tex/Gravel01.jpg");
Handle lgrass_tex=xLoadTexture("tex/Grass01.jpg");
Handle dgrass_tex=xLoadTexture("tex/Grass02.jpg");
Handle plain_tex=xLoadTexture("tex/Gravel02.jpg");
Handle lmountain_tex=xLoadTexture("tex/dirt01.jpg");
Handle mmountain_tex=xLoadTexture("tex/rock01.jpg");
Handle hmountain_tex=xLoadTexture("tex/snow02.jpg");
Handle smountain_tex=xLoadTexture("tex/snow01.jpg");
Handle rock_tex=xLoadTexture("tex/rockn.jpg");
Handle Shader=xLoadFXFile("shader/landpainter.fx");
xSetEntityEffect(farmesh,Shader);
xSetEffectTexture(farmesh,"seaside",seaside_tex);
xSetEffectTexture(farmesh,"lgrass",lgrass_tex);
xSetEffectTexture(farmesh,"dgrass",dgrass_tex);
xSetEffectTexture(farmesh,"plain",plain_tex);
xSetEffectTexture(farmesh,"lmountain",lmountain_tex);
xSetEffectTexture(farmesh,"mmountain",mmountain_tex);
xSetEffectTexture(farmesh,"hmountain",hmountain_tex);
xSetEffectTexture(farmesh,"smountain",smountain_tex);
xSetEffectTexture(farmesh,"rockn",rock_tex);
xSetEffectTechnique(farmesh, "Diffuse");
xSetEffectFloat(farmesh,"scale",0.3);
}
//***************************************************
//***************************************************
void Update_Environment(){
srand(x+y);
xPositionEntity(farmesh,x,0,y);
int qvert=xCountVertices(farsur);
for(int i=0;i<qvert;i++){
//смотрим в мировое зерно
int u=xVertexX(farsur,i);
int v=xVertexZ(farsur,i);
//адрес текущей точки в массиве значений
int xj=xMod((x+u)/resolution+4,uppersize);
int yj=xMod((y+v)/resolution+4,uppersize);
float val=seed[xj][yj];
xVertexCoords(farsur,i,u,val,v);
float m[3][4];
//вычисляю индекс вершины
//первая нормаль
int x1=-1; int z1=0;
int x2=0; int z2=1;
float y0=seed[xMod(xj,uppersize)][xMod(yj,uppersize)];
float y1=seed[xMod(xj+x1,uppersize)][xMod(yj+z1,uppersize)];
float y2=seed[xMod(xj+x2,uppersize)][xMod(yj+z2,uppersize)];
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
y1=seed[xMod(xj+x1,uppersize)][xMod(yj+z1,uppersize)];
y2=seed[xMod(xj+x2,uppersize)][xMod(yj+z2,uppersize)];
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
y1=seed[xMod(xj+x1,uppersize)][xMod(yj+z1,uppersize)];
y2=seed[xMod(xj+x2,uppersize)][xMod(yj+z2,uppersize)];
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
y1=seed[xMod(xj+x1,uppersize)][xMod(yj+z1,uppersize)];
y2=seed[xMod(xj+x2,uppersize)][xMod(yj+z2,uppersize)];
m[0][3]=y2-y0;
m[1][3]=-1;
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]=-4.0f*(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(farsur,i,m[0][0],m[1][0],m[2][0]);
}
xCalculateFrustumVolume(farmesh);
}
//***************************************************
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,4*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,4*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,4*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,4*sharpness,smothing);}}
}
//сокращение нижнего уровня
void regenerator(int a,int b, float sharp, int size, float ****m, int dis){
//заполнение краев
if(m[a][b][0][0]==0){ m[a][b][0][0]=seed[xMod(x/resolution+a-dis,uppersize)][xMod(y/resolution+b-dis,uppersize)];}
if(m[a][b][size][0]==0) {m[a][b][size][0]=seed[xMod(x/resolution+a+1-dis,uppersize)][xMod(y/resolution+b-dis,uppersize)];}
if(m[a][b][0][size]==0) {m[a][b][0][size]=seed[xMod(x/resolution+a-dis,uppersize)][xMod(y/resolution+b+1-dis,uppersize)];}
if(m[a][b][size][size]==0) {m[a][b][size][size]=seed[xMod(x/resolution+a+1-dis,uppersize)][xMod(y/resolution+b+1-dis,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=m[a][b][i-step][j-step];
float val01=m[a][b][i-step][j+step];
float val10=m[a][b][i+step][j-step];
float val11=m[a][b][i+step][j+step];
if(m[a][b][i][j]==0){m[a][b][i][j]=0.25f*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
if(m[a][b][i-step][j]==0){m[a][b][i-step][j]=0.5f*(val00+val01+step*xRnd(-sharp,sharp));}
if(m[a][b][i+step][j]==0){m[a][b][i+step][j]=0.5f*(val10+val11+step*xRnd(-sharp,sharp));}
if(m[a][b][i][j-step]==0){m[a][b][i][j-step]=0.5f*(val00+val10+step*xRnd(-sharp,sharp));}
if(m[a][b][i][j+step]==0){m[a][b][i][j+step]=0.5f*(val01+val11+step*xRnd(-sharp,sharp));}}}
step=step>>1;}
}
//*******************************************************
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];}}
regenerator(a,b,sharp,size,strip,0);}
//********************************************************
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];}}
regenerator(a,b,sharp,size,strip,0);}
//********************************************************
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];}}
regenerator(a,b,sharp,size,strip,0);}
//*******************************************************
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-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];}}
regenerator(a,b,sharp,size,stripm,number);}
//********************************************************
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];}}
regenerator(a,b,sharp,size,stripm,number);}
//********************************************************
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];}}
regenerator(a,b,sharp,size,stripm,number);}
//********************************************************
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, int grain){
float max=-10000.01;
srand(grain);
int resolution=1<<size;
//создание структуры данных
float **m1[size];
for(int i=0;i<size;i++){
m1[i]=new float*[resolution];
for(int j=0;j<resolution;j++){m1[i][j]=new float[resolution];}}
//обнуление
for(int i=0;i<size;i++){for(int j=0;j<resolution;j++){for(int k=0;k<resolution;k++){m1[i][j][k]=0;}}}
//создание исходного шума
float length=0;
for(int i=0;i<size;i++){
int width=1<<(i+1);
//kof коэффициент веса октавы
float detsize=2.0f;
float kof=(size-i);
if(i==0){kof=detsize*16;}
if(i==1){kof=detsize*32;}
if(i==2){kof=detsize*64;}
if(i==3){kof=detsize*32;}
if(i==4){kof=detsize*16;}
if(i==5){kof=detsize*8;}
if(i>5){kof=detsize*4;}
for(int j=0;j<width;j++){for(int k=0;k<width;k++){m1[i][j<<(size-i-1)][k<<(size-i-1)]=kof*(1-2*(float)rand()/RAND_MAX);}}
//cуммируется вес октав это будет максимально возможный перепад высот
length=length+kof;}
//что бы коегде заменить все деления умножением
float len=(0.5/length);
//тут градиентный шум считается
for(int k=0;k<size-1;k++){
int step=resolution>>1;
while(step>0){
for(int i=step;i<resolution-step;i=i+2*step){
for(int j=step;j<resolution-step;j=j+2*step){
//данные в углах текущей клетки
float val00=m1[k][i-step][j-step];
float val01=m1[k][i-step][j+step];
float val10=m1[k][i+step][j-step];
float val11=m1[k][i+step][j+step];
//если текущая клетка пуста, то пишется в клетку крест значений
if(m1[k][i][j]==0){
m1[k][i][j]=0.25*(val00+val01+val10+val11);
m1[k][i-step][j]=0.5*(val00+val01);
m1[k][i+step][j]=0.5*(val10+val11);
m1[k][i][j-step]=0.5*(val00+val10);
m1[k][i][j+step]=0.5*(val01+val11);}
}}
step=step>>1;}}
//суммирование в последний массив
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){for(int k=0;k<size-1;k++){m1[size-1][i][j]=m1[size-1][i][j]+m1[k][i][j];}}}
seed=new float*[resolution];
for(int j=0;j<resolution;j++){seed[j]=new float[resolution];}
//суммирование в последний массив
for(int i=0;i<resolution;i++){
for(int j=0;j<resolution;j++){
seed[i][j]=m1[size-1][i][j];
}}
}
//********************************************************
int xMod(int a,int b){
int c=a-b*floor(a/b);
if(c<0) {c=c+b;}
return c;
}
//********************************************************
};
class land {
public:
int resolution;
int resol;
int number;
//ссылка на первичный класс земли
ground first;
//это координаты мира для которых система квадов прикинута миром.
int x,y;
//манагер квадов
manager *surf;
manager *surfm;
//структура для квадов
int ****strip;
int ****stripm;
land();
void updateland(){
int xc=xEntityX(Pivot);
int yc=xEntityZ(Pivot);
if(xc-resolution-1>x){
x=x+resolution;
first.x=x;
first.Data_Switcher(0);
first.Data_Switcherm(0);
first.Update_Environment();
Data_Switcher(0);
Data_Switcherm(0);}
if(xc+resolution+1<x){
x=x-resolution;
first.x=x;
first.Data_Switcher(1);
first.Data_Switcherm(1);
first.Update_Environment();
Data_Switcher(1);
Data_Switcherm(1);}
if(yc-resolution-1>y){
y=y+resolution;
first.y=y;
first.Data_Switcher(2);
first.Data_Switcherm(2);
first.Update_Environment();
Data_Switcher(2);
Data_Switcherm(2);}
if(yc+resolution+1<y){
y=y-resolution;
first.y=y;
first.Data_Switcher(3);
first.Data_Switcherm(3);
first.Update_Environment();
Data_Switcher(3);
Data_Switcherm(3);}
}
void Data_Switcher(int flag){
int **temp[number];
//do not touch this, never ever.
if(flag==0){
for(int i=0;i<number;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];}
for(int i=0;i<number;i++){migrate_quads(number-1,i);}}
if(flag==1){
for(int i=0;i<number;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];}
for(int i=0;i<number;i++){migrate_quads(0,i);}}
if(flag==2){
for(int i=0;i<number;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];}
for(int i=0;i<number;i++){migrate_quads(i,number-1);}}
if(flag==3){
for(int i=0;i<number;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];}
for(int i=0;i<number;i++){migrate_quads(i,0);}}
xCalculateFrustumVolume(surf->mesh);
}
void Data_Switcherm(int flag){
int **temp[3*number];
//do not touch this, never ever.
collapse_quadsm();
if(flag==0){
for(int i=0;i<3*number;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];}
for(int i=0;i<3*number;i++){migrate_quadsm(3*number-1,i);}
for(int i=number;i<2*number;i++){migrate_quadsm(number-1,i);}}
if(flag==1){
for(int i=0;i<3*number;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];}
for(int i=0;i<3*number;i++){migrate_quadsm(0,i);}
for(int i=number;i<2*number;i++){migrate_quadsm(2*number,i);}}
if(flag==2){
for(int i=0;i<3*number;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];}
for(int i=0;i<3*number;i++){migrate_quadsm(i,3*number-1);}
for(int i=number;i<2*number;i++){migrate_quadsm(i,number-1);}}
if(flag==3){
for(int i=0;i<3*number;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];}
for(int i=0;i<3*number;i++){migrate_quadsm(i,0);}
for(int i=number;i<2*number;i++){migrate_quadsm(i,2*number);}}
xCalculateFrustumVolume(surfm->mesh);
}
void collapse_quadsm(){
for(int a=number;a<2*number;a++){
for(int b=number;b<2*number;b++) {
for(int i=0;i<resol;i++){
for(int j=0;j<resol;j++){
int index=stripm[a][b][i][j];
int cont=-100;
surfm->quad[index]->v00.setposition(x+(a-1.5*number)*resolution+i*4,first.stripm[a+1][b+1][i][j]+cont,y+(b-1.5*number)*resolution+j*4);
surfm->quad[index]->v10.setposition(x+(a-1.5*number)*resolution+i*4+4,first.stripm[a+1][b+1][i+1][j]+cont,y+(b-1.5*number)*resolution+j*4);
surfm->quad[index]->v01.setposition(x+(a-1.5*number)*resolution+i*4,first.stripm[a+1][b+1][i][j+1]+cont,y+(b-1.5*number)*resolution+j*4+1*4);
surfm->quad[index]->v11.setposition(x+(a-1.5*number)*resolution+i*4+4,first.stripm[a+1][b+1][i+1][j+1]+cont,y+(b-1.5*number)*resolution+j*4+1*4);
}}}}
}
void migrate_quadsm(int a,int b){
for(int i=0;i<resol;i++){
for(int j=0;j<resol;j++){
int index=stripm[a][b][i][j];
surfm->quad[index]->v00.setposition(x+(a-1.5*number)*resolution+i*4,first.stripm[a+1][b+1][i][j],y+(b-1.5*number)*resolution+j*4);
surfm->quad[index]->v10.setposition(x+(a-1.5*number)*resolution+i*4+4,first.stripm[a+1][b+1][i+1][j],y+(b-1.5*number)*resolution+j*4);
surfm->quad[index]->v01.setposition(x+(a-1.5*number)*resolution+i*4,first.stripm[a+1][b+1][i][j+1],y+(b-1.5*number)*resolution+j*4+1*4);
surfm->quad[index]->v11.setposition(x+(a-1.5*number)*resolution+i*4+4,first.stripm[a+1][b+1][i+1][j+1],y+(b-1.5*number)*resolution+j*4+1*4);
//расчет нормалей
//нормаль для точки v00
//получение значений
float m[3][4];
//первая нормаль
int x1=-1; int z1=0;
int x2=0; int z2=1;
float y0=first.stripm[a+1][b+1][i][j];
float y1;
if(i==0){y1=first.stripm[a][b+1][i+x1+resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
float y2;
if(j==resol){y2=first.stripm[a+1][b+2][i+x2][j+z2-resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resol){y1=first.stripm[a+1][b+2][i+x1][j+z1-resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==resol){y2=first.stripm[a+2][b+1][i+x2-resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
//x's
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resol) {y1=first.stripm[a+2][b+1][i+x1-resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.stripm[a+1][b][i+x2][j+z2+resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.stripm[a+1][b][i+x1][j+z1+resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.stripm[a][b+1][i+x2+resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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.8f*(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]);
surfm->quad[index]->v00.setnormal(m[0][0],m[1][0],m[2][0]);
i++;
//нормаль для точки v10
//получение значений
m[3][4];
//первая нормаль
x1=-1; z1=0;
x2=0; z2=1;
y0=first.stripm[a+1][b+1][i][j];
y1;
if(i==0){y1=first.stripm[a][b+1][i+x1+resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
y2;
if(j==resol){y2=first.stripm[a+1][b+2][i+x2][j+z2-resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resol){y1=first.stripm[a+1][b+2][i+x1][j+z1-resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==resol){y2=first.stripm[a+2][b+1][i+x2-resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
//x's
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resol) {y1=first.stripm[a+2][b+1][i+x1-resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.stripm[a+1][b][i+x2][j+z2+resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.stripm[a+1][b][i+x1][j+z1+resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.stripm[a][b+1][i+x2+resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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.8f*(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]);
surfm->quad[index]->v10.setnormal(m[0][0],m[1][0],m[2][0]);
j++;
//нормаль для точки v11
//получение значений
m[3][4];
//первая нормаль
x1=-1; z1=0;
x2=0; z2=1;
y0=first.stripm[a+1][b+1][i][j];
y1;
if(i==0){y1=first.stripm[a][b+1][i+x1+resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
y2;
if(j==resol){y2=first.stripm[a+1][b+2][i+x2][j+z2-resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resol){y1=first.stripm[a+1][b+2][i+x1][j+z1-resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==resol){y2=first.stripm[a+2][b+1][i+x2-resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
//x's
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resol) {y1=first.stripm[a+2][b+1][i+x1-resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.stripm[a+1][b][i+x2][j+z2+resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.stripm[a+1][b][i+x1][j+z1+resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.stripm[a][b+1][i+x2+resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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.8f*(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]);
surfm->quad[index]->v11.setnormal(m[0][0],m[1][0],m[2][0]);
i--;
//нормаль для точки v01
//получение значений
m[3][4];
//первая нормаль
x1=-1; z1=0;
x2=0; z2=1;
y0=first.stripm[a+1][b+1][i][j];
y1;
if(i==0){y1=first.stripm[a][b+1][i+x1+resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
y2;
if(j==resol){y2=first.stripm[a+1][b+2][i+x2][j+z2-resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resol){y1=first.stripm[a+1][b+2][i+x1][j+z1-resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==resol){y2=first.stripm[a+2][b+1][i+x2-resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
//x's
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resol) {y1=first.stripm[a+2][b+1][i+x1-resol][j+z1];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.stripm[a+1][b][i+x2][j+z2+resol];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.stripm[a+1][b][i+x1][j+z1+resol];} else{y1=first.stripm[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.stripm[a][b+1][i+x2+resol][j+z2];} else{y2=first.stripm[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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.8f*(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]);
surfm->quad[index]->v01.setnormal(m[0][0],m[1][0],m[2][0]);
j--;
}}
}
void migrate_quads(int a,int b){
for(int i=0;i<resolution;i++){
for(int j=0;j<resolution;j++){
int index=strip[a][b][i][j];
surf->quad[index]->v00.setposition(x+(a-number/2)*resolution+i,first.strip[a+1][b+1][i][j],y+(b-number/2)*resolution+j);
surf->quad[index]->v10.setposition(x+(a-number/2)*resolution+i+1,first.strip[a+1][b+1][i+1][j],y+(b-number/2)*resolution+j);
surf->quad[index]->v01.setposition(x+(a-number/2)*resolution+i,first.strip[a+1][b+1][i][j+1],y+(b-number/2)*resolution+j+1);
surf->quad[index]->v11.setposition(x+(a-number/2)*resolution+i+1,first.strip[a+1][b+1][i+1][j+1],y+(b-number/2)*resolution+j+1);
//расчет нормалей
//нормаль для точки v00
//получение значений
float m[3][4];
int x1=-1; int z1=0;
int x2=0; int z2=1;
float y0=first.strip[a+1][b+1][i][j];
float y1;
if(i==0){y1=first.strip[a][b+1][i+x1+resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
float y2;
if(j==resolution){y2=first.strip[a+1][b+2][i+x2][j+z2-resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resolution){y1=first.strip[a+1][b+2][i+x1][j+z1-resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==resolution){y2=first.strip[a+2][b+1][i+x2-resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resolution) {y1=first.strip[a+2][b+1][i+x1-resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.strip[a+1][b][i+x2][j+z2+resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.strip[a+1][b][i+x1][j+z1+resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.strip[a][b+1][i+x2+resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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]);
surf->quad[index]->v00.setnormal(m[0][0],m[1][0],m[2][0]);
//нормаль для точки v01
//получение значений
j++;
m[3][4];
x1=-1; z1=0;
x2=0; z2=1;
y0=first.strip[a+1][b+1][i][j];
y1;
if(i==0){y1=first.strip[a][b+1][i+x1+resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
y2;
if(j==resolution){y2=first.strip[a+1][b+2][i+x2][j+z2-resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resolution){y1=first.strip[a+1][b+2][i+x1][j+z1-resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==resolution){y2=first.strip[a+2][b+1][i+x2-resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resolution) {y1=first.strip[a+2][b+1][i+x1-resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.strip[a+1][b][i+x2][j+z2+resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.strip[a+1][b][i+x1][j+z1+resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.strip[a][b+1][i+x2+resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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]);
surf->quad[index]->v01.setnormal(m[0][0],m[1][0],m[2][0]);
i++;
//нормаль для точки v11
//получение значений
m[3][4];
x1=-1; z1=0;
x2=0; z2=1;
y0=first.strip[a+1][b+1][i][j];
y1;
if(i==0){y1=first.strip[a][b+1][i+x1+resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
y2;
if(j==resolution){y2=first.strip[a+1][b+2][i+x2][j+z2-resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resolution){y1=first.strip[a+1][b+2][i+x1][j+z1-resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==resolution){y2=first.strip[a+2][b+1][i+x2-resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resolution) {y1=first.strip[a+2][b+1][i+x1-resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.strip[a+1][b][i+x2][j+z2+resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.strip[a+1][b][i+x1][j+z1+resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.strip[a][b+1][i+x2+resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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]);
surf->quad[index]->v11.setnormal(m[0][0],m[1][0],m[2][0]);
j--;
//нормаль для точки v10
//получение значений
m[3][4];
x1=-1; z1=0;
x2=0; z2=1;
y0=first.strip[a+1][b+1][i][j];
y1;
if(i==0){y1=first.strip[a][b+1][i+x1+resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
y2;
if(j==resolution){y2=first.strip[a+1][b+2][i+x2][j+z2-resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][0]=y1-y0;
m[1][0]=-1;
m[2][0]=y0-y2;
//вторая нормаль
x1=0; z1=1;
x2=1; z2=0;
if(j==resolution){y1=first.strip[a+1][b+2][i+x1][j+z1-resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==resolution){y2=first.strip[a+2][b+1][i+x2-resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][1]=y0-y2;
m[1][1]=-1;
m[2][1]=y0-y1;
//третья нормаль
x1=1; z1=0;
x2=0; z2=-1;
if(i==resolution) {y1=first.strip[a+2][b+1][i+x1-resolution][j+z1];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(j==0) {y2=first.strip[a+1][b][i+x2][j+z2+resolution];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][2]=y0-y1;
m[1][2]=-1;
m[2][2]=y2-y0;
//четвертая нормаль
x1=0; z1=-1;
x2=-1; z2=0;
if(j==0){y1=first.strip[a+1][b][i+x1][j+z1+resolution];} else{y1=first.strip[a+1][b+1][i+x1][j+z1];}
if(i==0){y2=first.strip[a][b+1][i+x2+resolution][j+z2];} else{y2=first.strip[a+1][b+1][i+x2][j+z2];}
m[0][3]=y2-y0;
m[1][3]=-1;
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]);
surf->quad[index]->v10.setnormal(m[0][0],m[1][0],m[2][0]);
i--;
}}
}
};
land::land() {
//узнаю из переданного объекта разрешение
resolution=first.resolution;
number=first.number;
int quantity=resolution*resolution*number*number;
//создан объект который прикинется землей ближнего круга.
surf= new manager(quantity);
//теперь делю квады на нужное кол-во групп и пишу их индексы в массив
strip= new int ***[number];
for(int i=0;i<number;i++){strip[i]=new int **[number];}
//генерация деформационных массивов ближнего квадрата.
for(int i=0;i<number;i++){for(int j=0;j<number;j++){
strip[i][j]=new int *[resolution];
for(int k=0;k<resolution;k++){strip[i][j][k]=new int[resolution];}}}
x=0;
y=0;
//пишу индексы в размеченный массив.
int index=0;
for(int a=0;a<number;a++){
for(int b=0;b<number;b++) {
for(int i=0;i<resolution;i++){
for(int j=0;j<resolution;j++){
strip[a][b][i][j]=index;
surf->quad[index]->v00.setposition((a-number/2)*resolution+i,first.strip[a+1][b+1][i][j],(b-number/2)*resolution+j);
surf->quad[index]->v10.setposition((a-number/2)*resolution+i+1,first.strip[a+1][b+1][i+1][j],(b-number/2)*resolution+j);
surf->quad[index]->v01.setposition((a-number/2)*resolution+i,first.strip[a+1][b+1][i][j+1],(b-number/2)*resolution+j+1);
surf->quad[index]->v11.setposition((a-number/2)*resolution+i+1,first.strip[a+1][b+1][i+1][j+1],(b-number/2)*resolution+j+1);
index++;}}}}
for(int a=0;a<number;a++){
for(int b=0;b<number;b++) {migrate_quads(a,b);}}
resol=first.resol;
quantity=resol*resol*number*number*3*3;
//создан объект который прикинется землей ближнего круга.
surfm= new manager(quantity);
stripm= new int ***[3*number];
for(int i=0;i<3*number;i++){stripm[i]=new int **[3*number];}
//генерация деформационных массивов среднего квадрата.
for(int i=0;i<3*number;i++){for(int j=0;j<3*number;j++){
stripm[i][j]=new int *[resol];
for(int k=0;k<resol;k++){stripm[i][j][k]=new int[resol];}}}
index=0;
for(int a=0;a<3*number;a++){
for(int b=0;b<3*number;b++) {
for(int i=0;i<resol;i++){
for(int j=0;j<resol;j++){
stripm[a][b][i][j]=index;
surfm->quad[index]->v00.setposition((a-1.5*number)*resolution+i*4,first.stripm[a+1][b+1][i][j],(b-1.5*number)*resolution+j*4);
surfm->quad[index]->v10.setposition((a-1.5*number)*resolution+(i+1)*4,first.stripm[a+1][b+1][i+1][j],(b-1.5*number)*resolution+j*4);
surfm->quad[index]->v01.setposition((a-1.5*number)*resolution+i*4,first.stripm[a+1][b+1][i][j+1],(b-1.5*number)*resolution+(j+1)*4);
surfm->quad[index]->v11.setposition((a-1.5*number)*resolution+(i+1)*4,first.stripm[a+1][b+1][i+1][j+1],(b-1.5*number)*resolution+(j+1)*4);
index++;}}}}
for(int i=0;i<3*number;i++){for(int j=0;j<3*number;j++){migrate_quadsm(i,j);}}
//краска
Handle seaside_tex=xLoadTexture("tex/Gravel01.jpg");
Handle lgrass_tex=xLoadTexture("tex/Grass01.jpg");
Handle dgrass_tex=xLoadTexture("tex/Grass02.jpg");
Handle plain_tex=xLoadTexture("tex/Gravel02.jpg");
Handle lmountain_tex=xLoadTexture("tex/dirt01.jpg");
Handle mmountain_tex=xLoadTexture("tex/rock01.jpg");
Handle hmountain_tex=xLoadTexture("tex/snow02.jpg");
Handle smountain_tex=xLoadTexture("tex/snow01.jpg");
Handle rock_tex=xLoadTexture("tex/rockn.jpg");
Handle Shader=xLoadFXFile("shader/landpainter.fx");
xSetEntityEffect(surf->mesh,Shader);
xSetEffectTexture(surf->mesh,"seaside",seaside_tex);
xSetEffectTexture(surf->mesh,"lgrass",lgrass_tex);
xSetEffectTexture(surf->mesh,"dgrass",dgrass_tex);
xSetEffectTexture(surf->mesh,"plain",plain_tex);
xSetEffectTexture(surf->mesh,"lmountain",lmountain_tex);
xSetEffectTexture(surf->mesh,"mmountain",mmountain_tex);
xSetEffectTexture(surf->mesh,"hmountain",hmountain_tex);
xSetEffectTexture(surf->mesh,"smountain",smountain_tex);
xSetEffectTexture(surf->mesh,"rockn",rock_tex);
xSetEffectTechnique(surf->mesh, "Diffuse");
xSetEffectFloat(surf->mesh,"scale",0.3);
xSetEntityEffect(surfm->mesh,Shader);
xSetEffectTexture(surfm->mesh,"seaside",seaside_tex);
xSetEffectTexture(surfm->mesh,"lgrass",lgrass_tex);
xSetEffectTexture(surfm->mesh,"dgrass",dgrass_tex);
xSetEffectTexture(surfm->mesh,"plain",plain_tex);
xSetEffectTexture(surfm->mesh,"lmountain",lmountain_tex);
xSetEffectTexture(surfm->mesh,"mmountain",mmountain_tex);
xSetEffectTexture(surfm->mesh,"hmountain",hmountain_tex);
xSetEffectTexture(surfm->mesh,"smountain",smountain_tex);
xSetEffectTexture(surfm->mesh,"rockn",rock_tex);
xSetEffectTechnique(surf->mesh, "Diffuse");
xSetEffectFloat(surf->mesh,"scale",0.3);
}
А ведь на глаз разницы нету.
|