Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
без текстурных координат, но примитив прикольный

//*****************************************************
Surface *user_surface = eng->CreateSurface(26,15*3);
{
user_surface->Lock();
float fat=0.7f;
//звезда
vec3 v0(0,1,0);
vec3 v1(0.309,0.809,0.5);
vec3 v2(0.809,0.5,0.309);
vec3 v3(0.809,0.5,-0.309);
vec3 v4(0.309,0.809,-0.5);
vec3 v5(0.447,0.724,0.0);
//межзвездье
vec3 v00=vec3(0.0,0.873,0.333)*fat;
vec3 v01=vec3(0.539,0.539,0.539)*fat;
vec3 v02=vec3(0.873,0.333,0.0)*fat;
vec3 v03=vec3(0.539,0.539,-0.539)*fat;
vec3 v04=vec3(0.0,0.873,-0.333)*fat;
//полигон звезды
{
user_surface->SetVertexPosition(0,v0);
user_surface->SetVertexPosition(1,v1);
user_surface->SetVertexPosition(2,v2);
user_surface->SetVertexPosition(3,v3);
user_surface->SetVertexPosition(4,v4);
user_surface->SetVertexPosition(5,v5);
vec3 norm=((v0-v1).cross(v0-v2)).normalize();
user_surface->SetVertexNormal(0,norm);
user_surface->SetVertexNormal(1,norm);
user_surface->SetVertexNormal(2,norm);
user_surface->SetVertexNormal(3,norm);
user_surface->SetVertexNormal(4,norm);
user_surface->SetVertexNormal(5,norm);
user_surface->SetTriangle(0,5,0,2);
user_surface->SetTriangle(1,5,3,0);
user_surface->SetTriangle(2,5,1,3);
user_surface->SetTriangle(3,5,4,1);
user_surface->SetTriangle(4,5,2,4);
}
//бортик
int i=0;
int b=0;
{
user_surface->SetVertexPosition(6+i,v0);
user_surface->SetVertexPosition(7+i,v2);
user_surface->SetVertexPosition(8+i,v00);
user_surface->SetVertexPosition(9+i,v01);
vec3 norm=((v0-v2).cross(v00-v0)).normalize();
user_surface->SetVertexNormal(6+i,norm);
user_surface->SetVertexNormal(7+i,norm);
user_surface->SetVertexNormal(8+i,norm);
user_surface->SetVertexNormal(9+i,norm);
user_surface->SetTriangle(5+b,6+i,8+i,7+i);
user_surface->SetTriangle(6+b,8+i,9+i,7+i);
}
i=i+4;
b=b+2;
{
user_surface->SetVertexPosition(6+i,v2);
user_surface->SetVertexPosition(7+i,v4);
user_surface->SetVertexPosition(8+i,v02);
user_surface->SetVertexPosition(9+i,v03);
vec3 norm=((v2-v4).cross(v02-v2)).normalize();
user_surface->SetVertexNormal(6+i,norm);
user_surface->SetVertexNormal(7+i,norm);
user_surface->SetVertexNormal(8+i,norm);
user_surface->SetVertexNormal(9+i,norm);
user_surface->SetTriangle(5+b,6+i,8+i,7+i);
user_surface->SetTriangle(6+b,8+i,9+i,7+i);
}
i=i+4;
b=b+2;
{
user_surface->SetVertexPosition(6+i,v4);
user_surface->SetVertexPosition(7+i,v1);
user_surface->SetVertexPosition(8+i,v04);
user_surface->SetVertexPosition(9+i,v00);
vec3 norm=((v4-v1).cross(v04-v4)).normalize();
user_surface->SetVertexNormal(6+i,norm);
user_surface->SetVertexNormal(7+i,norm);
user_surface->SetVertexNormal(8+i,norm);
user_surface->SetVertexNormal(9+i,norm);
user_surface->SetTriangle(5+b,6+i,8+i,7+i);
user_surface->SetTriangle(6+b,8+i,9+i,7+i);
}
i=i+4;
b=b+2;
{
user_surface->SetVertexPosition(6+i,v1);
user_surface->SetVertexPosition(7+i,v3);
user_surface->SetVertexPosition(8+i,v01);
user_surface->SetVertexPosition(9+i,v02);
vec3 norm=((v1-v3).cross(v01-v1)).normalize();
user_surface->SetVertexNormal(6+i,norm);
user_surface->SetVertexNormal(7+i,norm);
user_surface->SetVertexNormal(8+i,norm);
user_surface->SetVertexNormal(9+i,norm);
user_surface->SetTriangle(5+b,6+i,8+i,7+i);
user_surface->SetTriangle(6+b,8+i,9+i,7+i);
}
i=i+4;
b=b+2;
{
user_surface->SetVertexPosition(6+i,v3);
user_surface->SetVertexPosition(7+i,v0);
user_surface->SetVertexPosition(8+i,v03);
user_surface->SetVertexPosition(9+i,v04);
vec3 norm=((v3-v0).cross(v03-v3)).normalize();
user_surface->SetVertexNormal(6+i,norm);
user_surface->SetVertexNormal(7+i,norm);
user_surface->SetVertexNormal(8+i,norm);
user_surface->SetVertexNormal(9+i,norm);
user_surface->SetTriangle(5+b,6+i,8+i,7+i);
user_surface->SetTriangle(6+b,8+i,9+i,7+i);
}
user_surface->RecalcTangents();
user_surface->UnLock();
}
Entity *body = s->Add(user_surface);
StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));
body->SetShader(StandartShaders::Render::OnlyNormals());
body->SetPosition(0,0,-6);
Entity *star = s->Add(user_surface);
{star->SetParent(body);
star->SetShader(StandartShaders::Render::OnlyNormals());
star->SetPosition(0,0,0);
star->Turn(180,0,0);
star=star->Copy();
star->Turn(90,90,0);
star=star->Copy();
star->Turn(270,90,0);
star=star->Copy();
star->Turn(90,0,90);
star=star->Copy();
star->Turn(90,0,270);
// зеркало
star=star->Copy();
star->Turn(0,180,0);
star=star->Copy();
star->Turn(180,180,0);
star=star->Copy();
star->Turn(90,270,0);
star=star->Copy();
star->Turn(270,270,0);
star=star->Copy();
star->Turn(90,180,90);
star=star->Copy();
star->Turn(90,180,270);
}
//****************************************************
Это черезжопный способ или пойдет?
А шейдером который на уровне полигонов работает нормали сложно считать?
|