Тема: Странное.
Показать сообщение отдельно
Старый 14.02.2012, 19:19   #407
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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);
        }
//****************************************************


Это черезжопный способ или пойдет?
А шейдером который на уровне полигонов работает нормали сложно считать?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (14.02.2012)