
Немножко другая сфера.

Surface* coolSphere(int segments){
Engine *eng = Engine::Instance();
//подсчет индексов для поверхности
//считаю количество точек
//высота меша в точках segments+1, ширина меша 2*segments+1
int count_vertices = (segments+1)*(2*segments+1);
//считаю трианглы
int count_indices = 3*segments*2*(segments+1);
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//ставлю точки куда следует
int index=0;
for(int i=0;i<=segments;i++){
for(int j=0;j<=2*segments;j++){
if(j<=segments){float M_PI=3.14159265358979323846f;
//определяю точку которая есть полюс
vec2 pole(0.5f*(segments),0.5f*(segments));
vec2 radius=vec2(0.5f*(segments)-i,0.5f*(segments)-j);
float forz=0.0f;
if(fabs(radius.x)>=fabs(radius.y)){forz=fabs(radius.x);}else{forz=fabs(radius.y);}
float zc=cos(0.5f*M_PI*forz/pole.x);
float zs=sin(0.5f*M_PI*forz/pole.x);
float l=sqrt(radius.x*radius.x+radius.y*radius.y);
if(l>0){radius=vec2(radius.x/l,radius.y/l);}
vec3 position(radius.x*zs,radius.y*zs,zc);
surf->SetVertexPosition(index,position);
surf->SetVertexNormal(index,position);
surf->SetVertexTexCoord(index,4*i/(float)segments,2*j/(float)segments,0);
}
if(j>segments){
/*а тут типа просто копирую позицию из уже сделанной части поверхности, ибо не осилил как сделать одной поверхностью идеологически верным способом*/
int magic_number=2*segments-j;
//теперь ищу точку симметричную данной
int index0=i*(2*segments+1)+magic_number;
vec3 position;
surf->GetVertexPosition(index0,position);
surf->SetVertexPosition(index,position.x,position.y,-position.z);
surf->SetVertexNormal(index,position.x,position.y,-position.z);
surf->SetVertexTexCoord(index,4*i/(float)segments,2*j/(float)segments,0);
}
index++;
}}
//ставлю полигоны
int trian_index=0;
for(int i=0;i<segments;i++){
for(int j=0;j<2*segments;j++){
//вычисляю для текущей клетки индексы точек в углах
int v0,v1,v2,v3;
//i - текущий ряд // j-текущий столбец
v0=i*(2*segments+1)+j;
v1=v0+1;
v2=v0+2*segments+1;
v3=v2+1;
surf->SetTriangle(trian_index,v1,v0,v2);
trian_index++;
surf->SetTriangle(trian_index,v3,v1,v2);
trian_index++;
}}
surf->RecalcTangents();
surf->UnLock();
return surf;
}
прикол в том что у нее нет скоплений точек, то есть вершины по поверхности относительно равномерно разбросаны.
плюс не понял как правильно текстуры грузить
Texture *tex=eng->LoadTexture(L"tex0.png");
Entity *body = s->Add(coolSphere(16));
body->SetShader(StandartShaders::Render::Texturing());
body->SetTexture(tex,0);
и ложу текстуру рядом с экзешником, в дебаге вообще почему то упало, а в релизе написало что файл найти не может после того как из кодеблокса запустил. Причем если экзешник из папки запускать находит. Что я делаю не так?