forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

HolyDel 13.02.2012 18:56

Ответ: Странное.
 
да. это правильно.

когда сюрфейс заполнен - это лишь заполненная область видеопамяти.
чтобы сюрфейс рендерился - его надо добавить в сцену. сюрфейс можно добавить тыщу раз в сцену. это будет тысяча инстанций одного сюрфейса. У них может быть свой материал, своя матрица трансформации. Но единая геометрия.

при этом ему надо назначить шейдер. то что щас работает - это глюк.

скорее всего для каждого типа геометрии будут свои шейдеры по умолчанию. Чтобы снизить кол-во кода для вывода одного кубика.

нормали пока считать не умеем.

вобщем чтобы хоть что то увидеть надо сделать такое:

* инициализировать окно
* создать сцену
* создать в сцене камеру
* создать геометрию
* добавить геометрию в сцену
* назначить шейдер объекту
* отрендерить сцену
* флипнуть буфера

как в блице одним CreateCube():Flip() не обойтись ((

dsd 14.02.2012 19:19

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


без текстурных координат, но примитив прикольный :)



Код:


//*****************************************************
        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);
        }
//****************************************************



Это черезжопный способ или пойдет?
А шейдером который на уровне полигонов работает нормали сложно считать?

HolyDel 14.02.2012 19:40

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

Это черезжопный способ или пойдет?
способ как способ. только это ни одна поверхность а 11. соотвественно рисоваться они будут за 11 дипов. Если надо - могу в следующий сдк добавить пересчет нормалей и работу с сюрфейсами. Типа скейла, перемещения, поворота и аттача.

Цитата:

А шейдером который на уровне полигонов работает нормали сложно считать?
только не сглаженные. считать просто - тупой crossproduct. А вот сглаженные уже не получится.

если тебе нравится генерировать примитивы, почему бы тебе не помочь проекту, и не написать генерацию сферы, конуса, торусов и т.д. (на свое усмотрение) в виде стандартной библиотеки примитивов. Я могу дать тебе доступ к SVN-ке на запись.

dsd 14.02.2012 19:56

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

Сообщение от HolyDel (Сообщение 219456)
способ как способ. только это ни одна поверхность а 11. соотвественно рисоваться они будут за 11 дипов. Если надо - могу в следующий сдк добавить пересчет нормалей и работу с сюрфейсами. Типа скейла, перемещения, поворота и аттача.

Я сомневаюсь, что нормальным людям такие функции потребуются хотя бы раз :) А маньяки и сами справятся :)

Цитата:

если тебе нравится генерировать примитивы, почему бы тебе не помочь проекту, и не написать генерацию сферы, конуса, торусов и т.д. (на свое усмотрение) в виде стандартной библиотеки примитивов. Я могу дать тебе доступ к SVN-ке на запись.
Я слишком тупой и ленивый для того, чтобы SVN пользоваться. Так что доступа мне лучше не давать. Но торы пружинки и прочую херь сделать смогу и скорее всего сделаю.

dsd 18.02.2012 23:14

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


Код:

Surface* sphere(int seg,float radius, Engine *eng){

//int resol=1<<seg;
int resol=seg;
//подсчет индексов для поверхности
int count_vertices = pow(resol+1,2);
int count_indices = resol * resol * 6;
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//расстановка точек.
for(int i=0;i<=resol;i++){
    for(int j=0;j<=resol;j++){

        int index=(resol+1)*i+j;
        float M_PI=2.0f*3.14159265358979323846f;
        float x=cos(M_PI*i/(float)resol);
        float y=sin(M_PI*i/(float)resol);
        float zc=cos(M_PI*j/(float)resol);
        float zs=sin(M_PI*j/(float)resol);
        vec3 position(x*zs,y*zs,zc);
        surf->SetVertexPosition(index,position*radius);
        surf->SetVertexNormal(index,position);
        surf->SetVertexTexCoord(index,i/(float)resol,j/(float)resol);
    }}

//натяжка полигонов
for(int i=0;i<resol;i++){
    for(int j=0;j<resol;j++){
        int index=2*(resol*i+j);
        int v00=(resol+1)*i+j;
        int v10=v00+1;
        int v01=v00+resol+1;
        int v11=v01+1;
        surf->SetTriangle(index,v00,v10,v01);
        surf->SetTriangle(index+1,v10,v11,v01);

    }}
surf->RecalcTangents();
surf->UnLock();
return surf;
}

Как мне в подобного вида функциях использовать cSurface чтоб в функцию указатель на двиг не передавать?

HolyDel 19.02.2012 02:10

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

Как мне в подобного вида функциях использовать cSurface чтоб в функцию указатель на двиг не передавать?
не передавать можно так:
Engine *eng = Engine::Instance();

чтобы пользоваться CSurface - надо писать в Cube.cpp например. Чтобы код оставался в длл-ке. Проще всего было бы использовать SVN-ку (благо, тебе надо лишь поставить tortoiseSVN и мне зарегить тебя) ибо в последних версиях sdk информация для системы контроля версий катается вместе с движком. Либо ты можешь включить какой нибудь файл, скажем, dsd_surfaces.cpp в движок, и писать код там. Тестируя на каком-нибудь сэмпле. А как наиграешься. передать его любым способом мне :)

dsd 21.02.2012 01:05

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



Код:

Surface* torus(int resol, int vresol, float radius, float inradius){
Engine *eng = Engine::Instance();


//подсчет индексов для поверхности
int count_vertices =(resol+1)*(vresol+1);
int count_indices = resol * vresol * 6;
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//расстановка точек.
for(int i=0;i<=resol;i++){
    for(int j=0;j<=vresol;j++){

        int index=(vresol+1)*i+j;
        float M_PI=2.0f*3.14159265358979323846f;
        float zc=inradius*cos(M_PI*j/(float)vresol);
        float zs=inradius*sin(M_PI*j/(float)vresol);
        float x=(radius+zs)*cos(M_PI*i/(float)resol);
        float y=(radius+zs)*sin(M_PI*i/(float)resol);

        vec3 position(x,y,zc);
        surf->SetVertexPosition(index,position*radius);

        //определение нормали
        x=(radius)*cos(M_PI*i/(float)resol);
        y=(radius)*sin(M_PI*i/(float)resol);

        position=(position-vec3(x,y,0)).normalize();

        surf->SetVertexNormal(index,position);
        surf->SetVertexTexCoord(index,i/(float)resol,j/(float)vresol);
    }}

//натяжка полигонов
for(int i=0;i<resol;i++){
    for(int j=0;j<vresol;j++){
        int index=2*(vresol*i+j);
        int v00=(vresol+1)*i+j;
        int v10=v00+1;
        int v01=v00+vresol+1;
        int v11=v01+1;
        surf->SetTriangle(index,v00,v10,v01);
        surf->SetTriangle(index+1,v10,v11,v01);

    }}
surf->RecalcTangents();
surf->UnLock();
return surf;
}

Почему границы полигонов проявляются? Какой то косяк при интерполяции значения нормали, так и надо, у dsd кривые руки?

HolyDel 21.02.2012 02:00

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

Почему границы полигонов проявляются?
честно говоря хз. да и странные они какие-то. больше похоже на глюк в шейдере освещения, чем глюк в расчетах нормали.

dsd 22.02.2012 16:58

Ответ: Странное.
 
ХолиДел, а как мне получать данные о точках и полигонах поверхности?


int q_vert=surf->CountVertices();
int q_tris=surf->CountTriangles();
Это я узнал количество точек и полигонов.
А как мне узнать какому полигону какие точки принадлежат и как мне
из VertexInfo данные точек читать?

HolyDel 22.02.2012 17:38

Ответ: Странное.
 
в текущем SDK нет такого функционала к сожалению ((
в той версии, что в СВН-ке, уже есть:

Код:

for(int i=0;i<cube->CountTriangles();++i)
                {
                        int index0,index1,index2;
                        cube->GetTriangle(i,index0,index1,index2);
                        std::cout<<"tris "<<i<<" ("<<index0<<","<<index1<<","<<index2<<")"<<std::endl;
                }

                for(int i=0;i<cube->CountVertices();++i)
                {
                        vec2 uv0;
                        vec2 uv1;

                        vec3 position;
                        vec3 normal;
                        vec3 tangent;
                        vec4 color;

                        cube->GetVertexPosition(i,position);
                        cube->GetVertexNormal(i,normal);
                        cube->GetVertexTangent(i,tangent);
                        cube->GetVertexColor(i,color);
                        cube->GetVertexTexCoord(i,uv0,0);
                        cube->GetVertexTexCoord(i,uv1,1);
                        std::cout<<"vertex "<<i<<std::endl;
                        std::cout<<"    position ("<<position.x<<","<<position.y<<","<<position.z<<")"<<std::endl;
                        std::cout<<"    normal  ("<<normal.x<<","<<normal.y<<","<<normal.z<<")"<<std::endl;
                        std::cout<<"    tangent  ("<<tangent.x<<","<<tangent.y<<","<<tangent.z<<")"<<std::endl;
                        std::cout<<"    color    ("<<color.x<<","<<color.y<<","<<color.z<<")"<<std::endl;

                        std::cout<<"    uv0      ("<<uv0.x<<","<<uv0.y<<")"<<std::endl;
                        std::cout<<"    uv1      ("<<uv1.x<<","<<uv1.y<<")"<<std::endl;
                }

новую версию SDK я смогу собрать только 6-7 марта.

dsd 22.02.2012 18:03

Ответ: Странное.
 
Тогда уж и обновление нормалей добавить надо. Я как раз такую функцию и хотел запилить. :)

HolyDel 22.02.2012 19:11

Ответ: Странное.
 
такие функции лучше все же внутри движка пилить. даже лучше внутри класса, чтобы не тратить время на лишних виртаульных вызовах.

dsd 24.02.2012 23:34

Ответ: Странное.
 
А сегодня в моем бложике день петросяна. :)

Цитата:

Подходит зебра к гаишнику, и, смущаясь, говорит: - Простите, а где вы это взяли?

Настойчивый верблюд 3 часа переплевывался с гопником.

- Когда ты понял что она пьяная?
-Когда мне пришла смска "Позвони мне, я немогу найти свой телефон"

Заходит студент,препод его спрашивает:
-Ты едешь в маршрутке там очень жарко,твои действия?
Студент:
-Я открою окно.
Препод:
-Правильно,а теперь рассчитай изменение в аэродинамике маршрутки в результате открытого окна!
Студент:
-Ээээээээээээ...
Препод:
-Идите, два.
И так он еще несколько человек завалил,после чего заходит девушка!
Он задает ей тот же самый вопрос:
-Вы едете в маршрутке,там жарко,ваши действия?
Девушка:
-Блузку сниму.
Препод:
-Вы не поняли,там жарко.
Девушка:
-Ну тогда лифчик сниму.
Препод:
-Вы снова не поняли..ТАМ ОЧЕНЬ ЖАРКО!
Девушка:
-ДА ПУСТЬ МЕНЯ ХОТЬ ВСЯ МАРШРУТКА ВЫЕБЕТ,ОКНО Я НЕ ОТКРОЮ!!


Солдат стоит на посту. К нему подходит полковник и спрашивает:
- Звание, фамилия?
- Рядовой Петров
- Сколько человек в роте?
- 75
- Сколько человек в батальоне?
- 250
- А ты чего же это военную тайну выдаёшь? Вдруг я шпион!
Раздаётся выстрел... Солдат:
- Ты посмотри какая наглая сволочь


Армянские ЭМО отращивают чёлку на груди.


- Человеку свойственно ошибаться... - издалека начал командир воинской части разговор с женой сапера...


Маленькая девочка подходит к маме заплаканная:
- Мама, моя черепашка умерла.
- Ну, доченька, не горюй, мы положим ее в картонную коробку, закопаем во дворе, положим на могилку цветочки, купим кока-колы, большой торт, позовем твоих друзей и устроим пышные похороны.
В это время черепаха высунула голову из панциря.
- Эй, дочка, так ведь она живая!
Дочка радостно:
- Ой, мама, а можно я ее придушу?!

Самолет American Airlines терпит крушение. Ну выходит стюардесса, и говорит: — Дамы и господа, минуточку внимания. Наш самолет падает. Поэтому, чтобы облегчить борт, мы уже выкинули весь багаж, а сейчас начнем выкидывать пассажиров. Однако, для обеспечения принципов справедливости, равенства и демократии, пассажиров будем выкидывать по алфавиту. Итак, я начинаю.
A — afroamericans…
B — black people…
C — coloured people…
В хвосте сидят два негра — папа и сын.
— dad, why don't we go, she allready called on us three times?
— Shut the fuck up, boy!! Today we are niggers and go right after mexicans!


-Я не был пьян.
-Чувак,ты кидал моего хомяка по комнате и орал:"Пикачу,я выбираю тебя".


- дорогой, ты так сильно ревнуешь.. это из-за той смс-ки, что я прочитала и быстренько удалила?
- нет. просто вчера ты была просто в дерьмо пьяная... тебя привели домой трое негров... потом вы трахались при мне


Купил мужик петуха. В первый день он всех кур трахнул, на второй всех гусей. Мужик думает, пиздец петуху придет, если и дальше всех так трахать будет. На третий день видит мужик лежит петух по среди двора, а вокруг него зерно. Мужик подошел и говорит: — Ах ты петух.. так и знал, что сдуешься! Петух приоткрыл один глаз и говорит:
— Сука, спугнешь ворон, я тебя выебу!

Положил детскую соску-пустышку рядом с плитой, она pасплавилась и пристала к столу. Набрал в Яндексе: как отодрать соску?... забыл, что искал...

Randomize 25.02.2012 12:35

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

dsd 02.03.2012 23:27

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


Код:



Surface* Cyle(int capSeg, int heightSeg, float radius, float height){
Engine *eng = Engine::Instance();


//подсчет индексов для поверхности
int count_vertices =(heightSeg+3)*(capSeg+1)+2;
int count_indices = 3*(2*(heightSeg*capSeg)+2*capSeg);
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//расстановка точек.
for(int i=0;i<=capSeg;i++){
    for(int j=0;j<=heightSeg;j++){

        int index=(heightSeg+1)*i+j;
        float M_PI=2.0f*3.14159265358979323846f;
        float zc=height*j/heightSeg;
        float x=radius*cos(M_PI*i/(float)capSeg);
        float y=radius*sin(M_PI*i/(float)capSeg);

        vec3 position(x,y,zc);
        surf->SetVertexPosition(index,position*radius);

        //определение нормали
        x=(radius)*cos(M_PI*i/(float)capSeg);
        y=(radius)*sin(M_PI*i/(float)capSeg);

        position=vec3(x,y,0).normalize();

        surf->SetVertexNormal(index,position);
        surf->SetVertexTexCoord(index,i/(float)capSeg,j/(float)heightSeg);
    }}

//натяжка полигонов
for(int i=0;i<capSeg;i++){
    for(int j=0;j<heightSeg;j++){
        int index=2*(heightSeg*i+j);
        int v00=(heightSeg+1)*i+j;
        int v10=v00+1;
        int v01=v00+heightSeg+1;
        int v11=v01+1;
        surf->SetTriangle(index,v10,v00,v01);
        surf->SetTriangle(index+1,v11,v10,v01);

    }}
//Затычка №1
for(int i=0;i<=capSeg;i++){
    int index=(heightSeg+1)*(capSeg+1)+i;
    float M_PI=2.0f*3.14159265358979323846f;
        float x=radius*cos(M_PI*i/(float)capSeg);
        float y=radius*sin(M_PI*i/(float)capSeg);
        float zc=0;
        vec3 position(x,y,zc);
        surf->SetVertexPosition(index,position*radius);

        position=vec3(0,0,-1);

        surf->SetVertexNormal(index,position);
        surf->SetVertexTexCoord(index,i/(float)capSeg,0);
}
int centerPoint=(heightSeg+2)*(capSeg+1);
//постановка центральной точки
        surf->SetVertexPosition(centerPoint,0,0,0);
        surf->SetVertexNormal(centerPoint,0,0,-1);
        surf->SetVertexTexCoord(centerPoint,0.5,0.5);
//палигоны

for(int i=0;i<capSeg;i++){
int index=2*(heightSeg*capSeg)+i;
int v0=centerPoint;
int v1=v0+i-capSeg-1;
int v2=v1+1;
surf->SetTriangle(index,v1,v0,v2);
}

//Затычка №2
for(int i=0;i<=capSeg;i++){
    int index=(heightSeg+2)*(capSeg+1)+i+1;
    float M_PI=2.0f*3.14159265358979323846f;
        float x=radius*cos(M_PI*i/(float)capSeg);
        float y=radius*sin(M_PI*i/(float)capSeg);
        float zc=height;
        vec3 position(x,y,zc);
        surf->SetVertexPosition(index,position*radius);

        position=vec3(0,0,1);

        surf->SetVertexNormal(index,position);
        surf->SetVertexTexCoord(index,i/(float)capSeg,0);
}
centerPoint=(heightSeg+3)*(capSeg+1)+1;
//постановка центральной точки
        vec3 position=vec3(0,0,height);
        surf->SetVertexPosition(centerPoint,position);
        position=vec3(0,0,1);
        surf->SetVertexNormal(centerPoint,position);
        surf->SetVertexTexCoord(centerPoint,0.5,0.5);
//палигоны

for(int i=0;i<capSeg;i++){
int index=2*(heightSeg*capSeg)+i+capSeg;
int v0=centerPoint;
int v1=v0+i-capSeg-1;
int v2=v1+1;
surf->SetTriangle(index,v0,v1,v2);
}
surf->RecalcTangents();
surf->UnLock();
return surf;
}

Оказалось цилиндр сложней тора :)
Имел странные глюки :) Получилось почему-то только с 4 раза. И то осталось впечатление, что я движок где-та наебал :))


Часовой пояс GMT +4, время: 01:15.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot