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)

dsd 05.02.2012 01:29

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


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

Mr_F_ 05.02.2012 01:41

Ответ: Странное.
 
начало нормальное, но детали (рот, нос, уши, глаза) стоит доделать.
а так вообще хитман в silent assasin/contracts примерно на таком же уровне смоделен.
в первую очередь уши опусти, у них низ примерно на уровне низа носа, а верх примерно на уровне бровей должен быть.

dsd 05.02.2012 02:32

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

Я вообще фанатею от этой книжки, терь за пару часов могу намоделить, то что не сделал бы и за месяц парой лет раньше :)

Mr_F_ 05.02.2012 04:04

Ответ: Странное.
 
а что за книжка?

HolyDel 05.02.2012 15:37

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

char msgBuffer[129];
#define text(a,b,c,d) \
sprintf(msgBuffer,c,d);\
xText(a,b,msgBuffer)

лучше так:
Код:

#define text(a,b,c,d) \
{char msgBuffer[129];sprintf(msgBuffer,c,d);\
xText(a,b,msgBuffer);}

вообще есть sprintf_s если чо, на студийном компиляторе.

dsd 05.02.2012 16:32

Ответ: Странное.
 
Mr_F_ Drawing the human head Burne Hogarth. Мне в ней нравится что о способах штриховки и особенностях выбора карандашей ни слова, только формы и еще раз формы поверхностей :)

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

HolyDel 05.02.2012 16:47

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

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

pozitiffcat 06.02.2012 09:34

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

Сообщение от dsd (Сообщение 218326)
Мой первый макрос :)
Вроде работает, вроде удобно :)
Код:

char msgBuffer[129];
#define text(a,b,c,d) \
sprintf(msgBuffer,c,d);\
xText(a,b,msgBuffer)

text(120,120,"current FPS is: %d",xGetFPS());

и сразу же второй :)
Код:

#define b_for(a,b) for(int a=0;a<b;a++)

вот для цикла макрос прокатит, а для функции text лучше написать inline функцию, а не макрос. ИМХО

HolyDel 06.02.2012 13:05

Ответ: Странное.
 
кстати да.

Код:

inlinte text(int x, int y, const char *foo, ...)
{
char buff[16535];
sprintf_s(buff,foo);
xtext(x,y,buff);
}

так наверное будет лучшее

dsd 06.02.2012 15:21

Ответ: Странное.
 
А по-моему макрос лучше.
И если макросу в принципе пофиг какие там типы входных данных, то для функции либо писать дополнительные варианты, либо писать шаблоном. Так что на мой вкус в данном случае функции лишнее, а макрос самое то.

HolyDel 06.02.2012 17:33

Ответ: Странное.
 
я извиняюсь, так просто все не работает.

работает с ms-специфик функцией vsprintf

Код:

inlinte text(int x, int y, const char *foo, ...)
{
va_list ap;
char buff[16535];
va_start(ap, foo);
vsprintf_s(buff,foo,ap);
va_end(ap);
xtext(x,y,buff);
}

просто так можно ее использовать как то так:
Код:

Print(L"The FPS:%d, Tris:%d, MousePos(%d,%d)",eng->GetStatistics()->GetFPS(),eng->GetStatistics()->TrisRendered(), MouseX(), MouseY());
а в твоем варианте ограниченно только одной переменной.

кстати, объясните мне пожалуйста почему первая функция не работает? можно ли как то сделать не ms специфик версию?

dsd 06.02.2012 18:30

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

Сообщение от HolyDel (Сообщение 218805)

а в твоем варианте ограниченно только одной переменной.

Это единственное, что я понял из всего поста.

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

HolyDel 06.02.2012 19:38

Ответ: Странное.
 
макросы всегда зло.

им пофиг на тип переменных, они вычисляют значения своих параметров каждый раз, и самое главное они ничего не знают об области видимости.
в частности WinAPI мне портит немало нервов из за того, что назвала макрос LoadImage. А у меня так метод называется. Ошибку трудно найти сразу, потому, что препроцессор. И хорошо, что оно еще не скомпилировалось :)

impersonalis 07.02.2012 01:57

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

Сообщение от HolyDel (Сообщение 218805)
я извиняюсь, так просто все не работает.

работает с ms-специфик функцией vsprintf

Код:

inlinte text(int x, int y, const char *foo, ...)
{
va_list ap;
char buff[16535];
va_start(ap, foo);
vsprintf_s(buff,foo,ap);
va_end(ap);
xtext(x,y,buff);
}


Страуструп не рекомендует использовать эту возможность языка.

inline ? А void чего опустили?

pozitiffcat 07.02.2012 09:32

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

Сообщение от dsd (Сообщение 218812)
Это единственное, что я понял из всего поста.

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

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

dsd 07.02.2012 12:58

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

Сообщение от pozitiffcat (Сообщение 218875)
макросы используются в других вещях. Нахера ты все в кучу мешаешь. Вот макрос с циклом ты правильно написал, тут можно использовать, но нахера макросом описывать функцию O_o

Примерно по тем же причинам по которым ты высказываешь негодование по этому поводу, потому что я могу это.

pozitiffcat 07.02.2012 14:19

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

Сообщение от dsd (Сообщение 218888)
потому что я могу это.

дык не только ты можешь :-D

HolyDel 07.02.2012 14:56

Ответ: Странное.
 
да ладно, чо вы пристали к парню )) один раз потратит ночь на отладку программы из-за некстати объявленного макроса, и не будет их пользовать больше в случаях, где можно без них обойтись :)

Цитата:

inline ? А void чего опустили?
сорри. в браузере набирал.

dsd 12.02.2012 21:54

Ответ: Странное.
 
HolyDel, в общем э...
CSurface *surf = new CSurface(24,36);
Смотрел на примере куба. Перовое число это количество точек в поверхности. Второе я не понял. Что это?
Из конструктора сplane я не догнал что это и как мне посчитать кол-во этих индексов, если я захотел сделать свой примитив. Как?
indices_ = new unsigned char[count_indices_*index_size_];
ZeroMemory(indices_,count_indices_ * index_size_);
vao_ =0;
vbo_ =0;
uabo_ =0;
ibo_ =0;
Или я не туда лезу? Справку я не понял :)

HolyDel 12.02.2012 23:19

Ответ: Странное.
 
второе - это число индексов. Так как сейчас единственный способ рисования сюрфейсов - это triangles list, то его можно понимать как кол-во триугольников * 3.

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

Цитата:

Surface *user_surface = eng->CreateSurface(24,12);
user_surface->Lock();
user_surface->SetVertexPosition(i,i,i,i);
user_surface->SetTriangle(i,v1,v2,v3);
user_surface->UnLock();
справку сложно понять - ее ведь нет ))

dsd 13.02.2012 13:55

Ответ: Странное.
 
Испытал проблемы с прорисовкой моего треугольника.
Оно стало рисоваться только после добавления моей поверхности к сцене из стандартного примера.
Так и надо? Или просто мой треугольник не попадал в кадр?

Код:

#include <axelynx/axelynx.h>
using namespace axelynx;

int main()
{
        Engine *eng = Engine::Init();
        Window *wnd = eng->AddWindow(800,600);
        //TODO: Place your resource loading and scene creating code here


        Scene *s = eng->AddScene();
        Camera *cam = s->AddCamera();
        Surface *cube = StandartSurfaces::Cube();
        Entity *body = s->Add(cube);
        StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));
        body->SetShader(StandartShaders::Render::OnlyNormals());
        body->SetPosition(0,0,-6);

        Entity *turret = s->Add(cube);
        turret->SetParent(body);
        turret->SetShader(StandartShaders::Render::OnlyNormals());
        turret->SetPosition(0,0.0,-1.25);
        turret->SetScale(0.25);

        turret = turret->Copy();
        turret->SetPosition(0,0,1.25);

        turret = turret->Copy();
        turret->SetPosition(0,-1.25,0);

        turret = turret->Copy();
        turret->SetPosition(0,1.25,0);

        turret = turret->Copy();
        turret->SetPosition(-1.25,0,0);

        turret = turret->Copy();
        turret->SetPosition(1.25,0,0);


//*****************************************************
        Surface *user_surface = eng->CreateSurface(3,6);
        user_surface->Lock();

        user_surface->SetVertexPosition(0,0,-16,6);
        user_surface->SetVertexPosition(1,16,0,6);
        user_surface->SetVertexPosition(2,-16,0,6);

        user_surface->SetVertexTexCoord(0,vec2(0.5,1));
        user_surface->SetVertexTexCoord(1,vec2(1,0));
        user_surface->SetVertexTexCoord(2,vec2(0,0));

        user_surface->SetVertexNormal(0,0,1,0);
        user_surface->SetVertexNormal(1,0,1,0);
        user_surface->SetVertexNormal(2,0,1,0);

        user_surface->SetVertexColor(0,vec4(1.0f,1.0f,1.0f,1.0f));
        user_surface->SetVertexColor(1,vec4(1.0f,1.0f,1.0f,1.0f));
        user_surface->SetVertexColor(2,vec4(1.0f,1.0f,1.0f,1.0f));

        user_surface->SetTriangle(0,0,2,1);
        user_surface->SetTriangle(0,0,1,2);

        user_surface->RecalcTangents();
        user_surface->UnLock();
        //отрисовалось только после этого. Это правильно?
        s->Add(user_surface);
//****************************************************

        float dx=0,dy=0;

        while(wnd->isRunning())
        {
                if(KeyDown('A'))
                        dx -= 1.0;
                if(KeyDown('D'))
                        dx += 1.0;
                if(KeyDown('W'))
                        dy -= 1.0;
                if(KeyDown('S'))
                        dy += 1.0;
                //TODO: Place your rendering code here
                float dt = Timer::Delta() * 0.01;

                dx *= 0.95;
                dy *= 0.95;
                body->Turn(dt*dy,dt*dx,0);

                s->Render();

                wnd->Flip();
        }
        //TODO: Place your deinitalize code here
        eng->Free();
}

Нормали оно само пересчитывать не умеет?

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 раза. И то осталось впечатление, что я движок где-та наебал :))

dsd 03.03.2012 21:16

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


Код:

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


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

float something=sqrt(radius*radius+height*height);
float cSomething=radius/something;
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 zs=1-zc/height;
        float x=zs*radius*cos(M_PI*i/(float)capSeg);
        float y=zs*radius*sin(M_PI*i/(float)capSeg);

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

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

        position=(vec3(x,y,cSomething)).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 zc=0;
        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);

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

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

Нормаль к поверхности это косинусы углов этой поверхности к соотв осям, да? Дно у цилиндра и конуса имеет кривые текстурные координаты :)

HolyDel 20.07.2012 01:44

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

новую версию SDK я смогу собрать только 6-7 марта.
версия вышла значительно позже, но в ней зато есть теперь:
Цитата:

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

dsd 20.07.2012 02:54

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

Сообщение от HolyDel (Сообщение 233396)
+ я с твоего разрешения перенесу твои функции в ядро, ок? в список стандартных примитивов. а то кубов и плоскостей - мало.

Я согласен:))))

А про ошибку в конструкторе я не допер :) за полгода с++ стал забываться :) Но сейчас кодинг вроде вновь интересен стал.

dsd 21.07.2012 02:27

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

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

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;
}

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

плюс не понял как правильно текстуры грузить
PHP код:

Texture *tex=eng->LoadTexture(L"tex0.png");
        
Entity *body s->Add(coolSphere(16));
        
body->SetShader(StandartShaders::Render::Texturing());
        
body->SetTexture(tex,0); 

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

HolyDel 21.07.2012 15:16

Ответ: Странное.
 
текстура как то странно натянута. так и задумывалось?

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

dsd 21.07.2012 15:51

Ответ: Странное.
 
так и задумывалось :) плюс по диагоналям там чу-чуть бубном постучать надо(это на них максимальное искажение). К ночи может выйдет повторить тот генератор камней-планет.

Это в общем плоскость 1х2 и первая часть обернута вокруг полусферы с полюсом в (0.5 0.5), и вторая часть обернута по той же сфере. Это чтобы карту шума накладывать можно было без искажений у полюсов.
Если научусь массив флоатов переводить быстро в картинку то можно будет сразу автоматом считать текстуру по которой нормали отворачивать, чтобы рельеф имитировать, карту смещений и заодно текстуру делать наподобие той что была в последней версии генератора поверхности земли под хорс. В общем занятный примитив должен выйти, причем только кодом. А учитывая как я пишу код хрен кто скопировать сможет если даже захочет :)))

HolyDel 21.07.2012 15:54

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

Если научусь массив флоатов переводить быстро в картинку
Код:

float my_floats[512][512];
Texture::Desc desc();
desc.Size(512,512);
desc.Bpc(4); //4 байта на канал. для флоата
desc.Cpp(1); //один канал на пиксель
desc.Data(my_floats);
Texture *tex = eng->CreateTexture(desc);

как то так.

dsd 21.07.2012 21:27

Ответ: Странное.
 
axmath.h
PHP код:

#pragma once

#include "../axlib.h"

#include "vectormath.h"

namespace axelynx
{
    
AXELYNX_API int FAST_CALL rand(int max);
    
AXELYNX_API int FAST_CALL rand(int minint max);
    
AXELYNX_API float FAST_CALL rnd(float max);
    
AXELYNX_API float FAST_CALL rnd(float minfloat max);

    
AXELYNX_API void sincos(float a,float s,float );

    
AXELYNX_API bool LineSphereIntersect(const vec3base, const vec3dir, const vec4sphere);



    
AXELYNX_API void CalcTriangleBasis( const axelynx::vec3E, const axelynx::vec3F, const axelynx::vec3Gfloat sE,
            
float tEfloat sFfloat tFfloat sGfloat tGaxelynx::vec3tangentX,
            
axelynx::vec3tangentY );
    
AXELYNX_API axelynx::vec3 ClosestPointOnLine( const axelynx::vec3a, const axelynx::vec3b, const axelynx::vec3);
    
AXELYNX_API axelynx::vec3 Ortogonalize( const axelynx::vec3v1, const axelynx::vec3v2 );


а где аналог srand()? Нужен, однако, а rand() из <cmath> не хочет почему то работать.

HolyDel 21.07.2012 22:54

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

а где аналог srand()? Нужен, однако, а rand() из <cmath> не хочет почему то работать.
только он в cstdlib, в не cmath. а так srand из cmath-а отлично работает с акселевской математикой.
Код:

srand(42);
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;

                srand(42);
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;

                srand(42);
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;
                std::cout<<axelynx::rand(100)<<std::endl;


dsd 21.07.2012 23:32

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


вроде получается по чучуть. теперь оно хотя бы запускается :))
на стрелки можно двигать камеру

зы: терь не просит текстуру

HolyDel 22.07.2012 00:55

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

dsd 22.07.2012 02:01

Ответ: Странное.
 
я в курсе. это оно в черне заработало.
Теперь буду пилить и сам шум и геометрию сферы, надо ее по диагоналям более разреженной сделать, а шов из-за кривого генератора шума. там где смещения читаются для последней строки стоят немного не те значения. карта просто шире слегка чем количество точек в меше.
Плюс я тупее в с++ стал. сильно тупей. по этому и исходник пока не приложил, там такой ужас :))))

dsd 26.07.2012 02:37

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


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

dsd 28.07.2012 22:14

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

и ложу текстуру рядом с экзешником, в дебаге вообще почему то упало, а в релизе написало что файл найти не может после того как из кодеблокса запустил. Причем если экзешник из папки запускать находит. Что я делаю не так?
Цитата:

Сообщение от HolyDel (Сообщение 233665)
проблема с ресурсами в том - что он ищет файлы в папке проекта (при дебаге). я не нашел в кодеблоксах где настроить этот параметр.
поэтому теперь выбор - или складывать все ексешники и прочее барахло в папку с проектами (и в мсвс визарде также), соответственно переименовывать их, например coolsphere_d.exe (все ето будет ткже делать визардом), или возиться с путями.


вот тут это фиксится




Код:

int main()
{
        Engine *eng = Engine::Init();
        Window *wnd = eng->AddWindow(800,600);
        wnd->VSync(false);
        //TODO: Place your resource loading and scene creating code here
        Scene *s = eng->AddScene();
        Canvas *c = eng->GetCanvas();

        my_Cam *cam= new my_Cam(s,800,600);

        StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));

        Planet *something = new Planet(s,                      //сцена
                                      64,                    //разрешение меша
                                      vec3(2,0,-8)            //позиция объекта
                                      );




        while(wnd->isRunning())
        {
                Turn_it_by_wasd(something->body,0.5);
                cam->Update();
                c->Clear();
                s->Render();

                c->SetPosition(10,10);
                c->Print(L"fps: %d",eng->GetStatistics()->GetFPS());
                wnd->Flip();
        }
        //TODO: Place your deinitalize code here
        eng->Free();
}



причем иногда сразу после запуска показывает нормальные цифирки.

как мне починить это? И есть ли какой редактор с подсветкой синтаксиса шейдеров?

пдф'ка про шейдеры жжет, я ожидал там чтото типа шагов для хорса :)))

HolyDel 28.07.2012 23:45

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

вот тут это фиксится
спасиб. просто поправлю проекты темплейта тогда.

Цитата:

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

dsd 29.07.2012 14:13

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

вроде бы получше.
на пробел поменять зерно для шума
на wasd крутить планету
на стрелки летать

HolyDel 29.07.2012 16:16

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

c->SetBlendMode(BM_ALPHA);
перед выводом текста надо поставить. текст выводится с альфой. дефолтный шейдер требует режим с альфой.

dsd 31.07.2012 20:30

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

Сообщение от HolyDel (Сообщение 233675)
Код:

float my_floats[512][512];
Texture::Desc desc();
desc.Size(512,512);
desc.Bpc(4); //4 байта на канал. для флоата
desc.Cpp(1); //один канал на пиксель
desc.Data(my_floats);
Texture *tex = eng->CreateTexture(desc);

как то так.



не получается так ничего.:dontknow:

HolyDel 31.07.2012 22:05

Ответ: Странное.
 
попробуй пока явно поля позадовать:

Код:

desc.width = 512;
desc.height = 512;
desc.bpc = 4; //4 байта на канал. для флоата
desc.cpp = 1; //один канал на пиксель
desc.texels = my_floats;


dsd 31.07.2012 23:08

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

Сообщение от HolyDel (Сообщение 234900)
попробуй пока явно поля позадовать:

Код:

desc.width = 512;
desc.height = 512;
desc.bpc = 4; //4 байта на канал. для флоата
desc.cpp = 1; //один канал на пиксель
desc.texels = my_floats;




неа, так тоже не работает :))
Может что-то из папки "source" заинклюдидь надо? ибо сам двиг собирался у меня из исходников без проблем.

jimon 31.07.2012 23:13

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

Сообщение от dsd (Сообщение 234904)


неа, так тоже не работает :))
Может что-то из папки "source" заинклюдидь надо? ибо сам двиг собирался у меня из исходников без проблем.

если конструктор пустой по не нужно ставить скобки () после имени переменной, если их ставить то получается что декларируешь функцию, а не создаёшь экземпляр класса на стеке

HolyDel 31.07.2012 23:18

Ответ: Странное.
 
jimon уже написал в чем дело :)

Цитата:

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

dsd 01.08.2012 19:41

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

Сообщение от HolyDel (Сообщение 234907)
если хочешь - я дам тебе доступ к сурсам на ассембле.

я тут еще в базовых функциях движка и с++ путаюсь. Не надо мне доступа, я все сломаю.



И еще, как мне обычную текстуру сделать с argb или как там, в общем 4 канала по 256 цветов?
Мне показалось или движок без проблем прожевывает меши с 2-3 миллионами точек и 4 миллионами полигонов в одной поверхности?

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

HolyDel 01.08.2012 20:18

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

Не надо мне доступа, я все сломаю.
read only :)

Цитата:

И еще, как мне обычную текстуру сделать с argb или как там, в общем 4 канала по 256 цветов?
Код:

desc.bpc = 1;
desc.cpp = 4;

вообще тут:

Код:

desc.bpc = 4;
число байт на канал - должно быть 1 - 256 цветов, 2 - half-float или 4 - float.

Код:

desc.cpp = 1;
число каналов - должно быть от 1-го до 4.

Цитата:

Мне показалось или движок без проблем прожевывает меши с 2-3 миллионами точек и 4 миллионами полигонов в одной
поверхности?
от видеокарты зависит. сам движок ограничений не накладывает. это же не блиц :)

dsd 02.08.2012 23:58

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

вроде научился раскрашивать меш поприкольней.

ХолиДел, вот рисовать текстуры я теперь умею, а обратно построить массив данных из текстуры тоже можно?

MouseHit() и MouseDown() чето найти никак не могу. И аналоги типа TForm есть?

теперь по иксу "x" в рандомном месте на меше появится чето типа кратера, с глюками если попадает на края меша. по пробелу сделать новую планету.

зы: а из далека уже ничего :) если добавить меш для воды, облаков и вывернутый для атмосферы вообще красотища будет.

HolyDel 03.08.2012 00:51

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

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

Цитата:

И аналоги типа TForm есть?
есть векторная математика.
можно получить матрицу трансформации ноды(пивота) и множить нужный вектор на нее.

Цитата:

MouseHit() и MouseDown()
KeyHit, KeyDown с 1 или 2.

dsd 05.08.2012 00:22

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

добавил слегка анимированную воду спертую из сэмплов, плывущие облачка и атмосферу без шейдера.
фпс уныл из-за урагана порвавшего все провода в городе :)) а с батареи оно много не дает.

а как в шейдерах сэмплеры настраивать?
Как полупрозрачность делать? а то discard не красиво и не то.

HolyDel 05.08.2012 01:11

Ответ: Странное.
 
сэмплеры называются фиксированными именами:
Код:

sampler2D texture0
sampler2D texture1
sampler2D texture2
...
sampler2D texture31

в клиентском коде текстура задается к ентити или материалу так:
Код:

ent->SetTexture(some_texture,0);
вот второй параметр и связывает текстуру с семплером в шейдере.

полупрозрачность так:
Код:

ent->SetBlend(BM_ALPHA);
и в альфу (в 4-й компонент выходного вектора фрагментного шейдера) писать некоторое значение меньше 1.


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

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