forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   Sigel (http://forum.boolean.name/showthread.php?t=4960)

HolyDel 03.04.2009 04:29

Ответ: Sigel
 
1 float - 4 байта.
весь цвет занимает всего 4 байта.
позиция - 3 float -а.
получается жестко задано:
float3 (position) + float3(normal) + float2(UV). - 32 байта на вершину.
опционально:
float1 (rgba) - еще 4 байта.

т.е. в самом простом случае будет 32 мегобайта грубо говоря.
с цветом - 36.
если еще одни UV - 44
если еще одни UVWT - 60

W компонента в позиции - это проецирование ккординат.
т.е правильная позиция вершины это не x,y,z а
x/w,y/w,z/w

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

* сделал сохранение и загрузку шейпов из файла

-=Jack=- 03.04.2009 12:08

Ответ: Sigel
 
Цитата:

Сообщение от HolyDel (Сообщение 102641)
бинго! и без z координаты.

А почему? Имхо, нужно хотябы одно значение для одной фигуры, чтобы знать, какая над какой нарисуется. Или у тебя идёт ручная прорисовка после рендера?

HolyDel 03.04.2009 14:00

Ответ: Sigel
 
Цитата:

Или у тебя идёт ручная прорисовка после рендера?
именно. это аналог картонк, текста и т.д.

HolyDel 07.04.2009 10:58

Ответ: Sigel
 
Вложений: 2
решил немного переделать 2д систему. теперь можно выводить 2д графику так называемыми кусками. Причем внетри одного куска может быть дргой (вся графика внутреннего куска будет выводиться с учетом трансформации родительской геометрии).
как то так:
Код:

Begin2D();
Translate2D(carx,cary);
Turn2D(carangle);
car->Draw();

 Begin2D();
 Translate(-10,wheel1_suspendy);
 wheel->Draw();
 End2D();


 Begin2D();
 Translate(10,wheel2_suspendy);
 wheel->Draw();
 End2D();

End2D();

(осторожно, скрин получился весомым)
Вложение 5843

Вложение 5842


Код:

#define SIGEL_USE_ONLY

#include <sigel/ISigel.h>
float a=0;
Shape *star = 0;

void DrawFigure(int x,int y)
{
        Begin2D();
        Translate2D(x,y);
        Turn2D(a);
        Scale2D(2);
       
        StartTextDraw();
        for(int i=0;i<360;i+=5)
        {

                Color(hsl(i*255/360,255,128));

                Begin2D();
                Turn2D(i);
                Translate2D(100,0);
                Scale2D(0.75f);
                char buff[32];
                sprintf_s(buff,32,"angle: %f",AngleNormalize(a+i));
                Text(buff,0,0);
                End2D();
        }
        EndTextDraw();

        star->Draw();
        Begin2D();
        Turn2D(a * -2);
        Scale2D(2.3);
        star->Draw();
        End2D();

        for(int i=0;i<6;++i)
        {
                Scale2D(0.8f);
                Turn2D(a * 0.5);
                star->Draw();
        }
       
        End2D();
}
sGAME
{
        debug::startlog();
        //Init(800,600,32,2,8);
        Init();

        AppTitle("ShapesTest");

        VWait(0);
        CameraHelper ch;

        TFont *fnt = new TFont("tahoma.txt");
        fnt->Bind();

#define CREATE_NEW_STAR_SHAPE
#ifdef CREATE_NEW_STAR_SHAPE

        int cntl = 128;

        star = new Shape(cntl*3,cntl*3);
       
        for(int i=0;i<cntl*3;++i)
        {
                star->SetIndex(i,i);
        }

        float r1 = 75;
        float r2 = 100;

        for(int i=0;i<cntl;++i)
        {
                float a = (float)i * 6.283f / (float)cntl;
                float da = 6.283f / (float)(cntl*2);

                float x,y;

                x = sin(a)*r2;
                y = cos(a)*r2;

                star->SetVertexPos(i*3 + 0,x,y);
                star->SetVertexColor(i*3 + 0,255,255,0);

                x = sin(a-da)*r1;
                y = cos(a-da)*r1;

                star->SetVertexPos(i*3 + 2,x,y);
                star->SetVertexColor(i*3 + 2,255,0,0);

                x = sin(a+da)*r1;
                y = cos(a+da)*r1;

                star->SetVertexPos(i*3 + 1,x,y);
                star->SetVertexColor(i*3 + 1,255,0,0);

        }

        star->SetPrimType(GL_TRIANGLES);

        star->Save("megastar.shape");

        star->DrawMode(SDM_STATIC);       
#else
        star = new Shape("megastar.shape");
#endif

        float dt=0;

        a=0;
        Start2D();

        while(!KeyDown(VK_ESCAPE))
        {
                dt = GetFrameTime();
                a+=dt*0.01f;

                Render();
                Blend(BM_ADD);

                fnt->Smooth(1);

                DrawFigure(0,0);
                DrawFigure(0,ScreenHeight());
                DrawFigure(ScreenWidth(),0);
                DrawFigure(ScreenWidth(),ScreenHeight());
                DrawFigure(ScreenWidth()/2,ScreenHeight()/2);

                fnt->Smooth(0);
                Color(255,255,255,255);
                Text(GetFPS(),10,10);
                Flip();

                //Delay(16.67f);
        }

        DeInit();
        debug::endlog();
};


Taugeshtu 07.04.2009 13:06

Ответ: Sigel
 
Мьсье, вы маньяк!) В самом лучшем смысле этого слова

-=Jack=- 07.04.2009 16:12

Ответ: Sigel
 
320 фпс.
Насчёт реализации 2д - у меня тоже так :) только у меня не нужно рисовать объекты вручную, просто нужно вызвать одну функцию рендеринга 2д...

ЗЫ: можно ли загружать 2д-фигуры из файла? если да, то в каком редакторе можно их создавать?

HolyDel 07.04.2009 21:06

Ответ: Sigel
 
Код:

можно ли загружать 2д-фигуры из файла?
да. более того, можно фигуру даже сохранять в файл.

Код:

если да, то в каком редакторе можно их создавать?
это сделано скорее для кеширования, чем для чего то еще.

Цитата:

Насчёт реализации 2д - у меня тоже так только у меня не нужно рисовать объекты вручную, просто нужно вызвать одну функцию рендеринга 2д...
значит у тебя 2д картинки это такие же ентити как и 3д объекты :)
я решил оставить блицовую схему, потому, что она мне кажется удобнее.
т.е порядок и прочее я оставляю на совести пользователя.

*добавил макросы для отладки, чтобы писался файл, строка, и собственно текст в логи. из __FILE__ и __LINE__ естественно.
*доработал вывод текста (ато раньше он был кривым, сам менял блендинг)
*теперь текстурный шрифт тоже можно "забиндить". После этого текст можно выводить просто командой Text.

moka 07.04.2009 22:23

Ответ: Sigel
 
Олег, а ты знаком с Max2D (BlitzMax) отрисовкой 2D, или с FastImage (он аналогичен), я про логику и синтаксис, они отличаются от Blitz2D, расширенее и удобнее.
Что насчёт блендов, цвета, альфы?
Можешь написать пожалуста перечень функций по сопровождению 2D рендеринга (позиции, цвет ну и т.д.).
Обрати внимание на синтаксис, очень важный моммент, Очень, от синтаксиса будет сильно меняться комфорт, учитывай это :)

ABTOMAT 07.04.2009 22:23

Ответ: Sigel
 
ИМХО рисовать картинки ручками удобнее: больше контроля над ситуацией!

HolyDel 07.04.2009 22:38

Ответ: Sigel
 
MoKa
есть два основных способа вывести 2д графику.
1-й - простой. аля блитц3д. тупо выводим ее и все (указывая позицию и прочие параметры).
например:
Код:

Render();
Rect(10,10,20,50);
Oval(100,400,100);
usershape->Draw(400,100);
Flip();

2-й - сложный.
Код:

Render();

Begin2D();
Translate2D(10,20);
Rect(0,0,20,50);
End2D();

Begin2D();
Translate2D(100,400);
Oval(0,0,100);
End2D();

Begin2D();
Translate2D(400,100);
usershape->Draw();
End2D();
Flip();

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

Цвет, Блендиг, Альфа-тест, Шейдеры, Фбо, привязка текстур и прочее обрабатывается одинаково для обоих случаев.

moka 07.04.2009 22:53

Ответ: Sigel
 
В Max2D будет так:
Код:

SetColor 255,128,0
SetAlpha .5
SetBlend LIGHTBLEND
DrawOval 100,50,30,30

SetScale 2,3
SetRotation 45
DrawRect 10,10,50,50

При этом там можно указывать центр рисования от куда хочешь, таким образом можно легко реализовать камеру (в 2D).
По мне так такой способ весьма функциональный, чем он будет уступать кроме как родительственной концепции?

HolyDel 07.04.2009 23:08

Ответ: Sigel
 
по сути - этот метод на уровне гапи реализуется также как и у меня. просто уровень выше.

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

SetScale(x,y)
{
scalex = x; //некая глобальная переменная
scaley = y; //некая глобальная переменная
}

SetRotation(a)
{
rotation = a; //некая глобальная переменная
}

DrawRect(x,y,w,h)
{
Begin2D();
Translate2D(x,y);
Turn2D(rotation);
Scale2D(scalex,scaley);
_DrawRect(0,0,w,h);
End2D();
}

я просто предоставляю доступ к более низкому уровню.

FDsagizi 08.04.2009 08:51

Ответ: Sigel
 
HolyDel - А по чему все функции для работы с 2д глобальны ?

-=Jack=- 08.04.2009 09:28

Ответ: Sigel
 
>значит у тебя 2д картинки это такие же ентити как и 3д объекты
угу
>ИМХО рисовать картинки ручками удобнее: больше контроля над ситуацией!
Программировать на ассемблере удобнее: больше контроля над ситуацией! Может и 3д хочешь ручками рисовать?)

HolyDel 08.04.2009 09:48

Ответ: Sigel
 
Вложений: 2
Цитата:

HolyDel - А по чему все функции для работы с 2д глобальны ?
у меня половина функций глобальны. я даже хз зачем их по неймспейсам или graphics2dmanager-ам прятать. Впринципе я знаю, так принято писать типа:
Код:

Engine *engine = new Enging();
engine->Init();
Renderer *renderer = new OpenGLRenderer();
engine->ApplyRenderer(renderer);

и т.д. но мне это кажется лишним. по крайней мере пока. зачем громоздить тонны кода, когда можно не громоздить :) ?

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


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

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