MrShoor
Раз тебя беспокоит скорость улучшения движка, помоги его улучшать быстрее. Вот возьми и приведи в порядок аппаратные спрайты, чтобы для них генерировалсь геометрия и они рисовались батчами, а не как сейчас.
Huldra
> помоги его улучшать быстрее.
Может и помог бы, если бы:
1. Автор бы занимался разработкой
2. Не был зациклен на спрайтах, а держал курс на 3д в том числе. И вообще больше доступа к шейдерам и прочей магии, больше программирования под GPU, а не дрючево вершин на CPU
3. Параллельно с движком делалась бы игра
Увы, ни по одному пункту не проходит.
Huldra ты запуталась. Занимаешься не теми вещами, которые нужны.
Может RTX начнёшь прикручивать, лол?
Создаётся впечатление что ты код даже не видела.
MrShoor
> Ого скорость улучшений... притормози их там, а то еще к 20210 году AE может
> захватить мир.
Наступила эра прокрастинации. Начались нелепые правки в документации вместо глобального переписывания кода под современные архитектурные реалии.
Huldra
Знаешь что меньше всего я хочу в движке? Заниматься ручным рисованием спрайтов, Вызывать всякие Draw(). Меня, как игродела, недолжно волновать как движок это всё нарисует. Мне важно чтобы я оперировал более высокоуровневаыми объектами, то есть игровыми. Найди мужика себе, пусть он напишет тебе каркас движка за кастрюлю борща.
Huldra
Особенно меня поражает это:
Vec2Si32::Vec2Si32(const struct Vec2D &s) { x = static_cast<Si32>( s.x); y = static_cast<Si32>( s.y); }
Свой glm кривой и нахардкоженный)
void HwSprite::LoadFromData(const Ui8* data, Ui64 size_bytes, const char *file_name)
span и vector это сложна, лучше как обычно ловить краши.
void Draw(const HwSprite &to_sprite, const Si32 to_x, const Si32 to_y, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Si32 to_x, const Si32 to_y, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Si32 to_x, const Si32 to_y, const Si32 to_width, const Si32 to_height, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Si32 to_x, const Si32 to_y, const Si32 to_width, const Si32 to_height, const Si32 from_x, const Si32 from_y, const Si32 from_width, const Si32 from_height, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const HwSprite &to_sprite, const Si32 to_x, const Si32 to_y, const Si32 to_width, const Si32 to_height, const Si32 from_x, const Si32 from_y, const Si32 from_width, const Si32 from_height, DrawBlendingMode blending_mode, DrawFilterMode filter_mode, Rgba in_color); void Draw( const HwSprite &to_sprite, const Vec2Si32 to_pos, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const HwSprite &to_sprite, const Vec2Si32 to_pos, const Vec2Si32 to_size, DrawBlendingMode blending_mode, DrawFilterMode filter_mode, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Vec2Si32 to_pos, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Vec2Si32 to_pos, const Vec2Si32 to_size, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Vec2Si32 to_pos, const Vec2Si32 to_size, const Vec2Si32 from_pos, const Vec2Si32 from_size, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Si32 to_x, const Si32 to_y, const Si32 to_width, const Si32 to_height, const Si32 from_x, const Si32 from_y, const Si32 from_width, const Si32 from_height, const HwSprite &to_sprite, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)) const; void Draw( const Vec2F to, float angle_radians, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const float to_x, const float to_y, float angle_radians, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const Vec2F to, float angle_radians, float zoom, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( Rgba in_color, const float to_x, const float to_y, float angle_radians, float zoom, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest); [[deprecated( "Use Draw(Rgba in_color, const float to_x, const float to_y, float angle_radians, float zoom, DrawBlendingMode blending_mode, DrawFilterMode filter_mode)")]] void Draw( const float to_x, const float to_y, float angle_radians, float zoom, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff)); void Draw( const float to_x, const float to_y, float angle_radians, float zoom, const HwSprite &to_sprite, DrawBlendingMode blending_mode = kDrawBlendingModeAlphaBlend, DrawFilterMode filter_mode = kFilterNearest, Rgba in_color = Rgba( 0xffffffff));
А на случай рисования из центра есть вариант?
А на случай рисования из центра есть вариант?
Установи Pivot в центр и будет тебе рисование из центра.
Huldra тебе голодные студенты код пишут?
> kDrawBlendingModeAlphaBlend
Зачем в имя элемента перечисления добавлять DrawBlendingMode?
тоже самое в kFilterNearest
std::cin
> Зачем в имя элемента перечисления добавлять DrawBlendingMode?
> тоже самое в kFilterNearest
Чтобы отличить варианты допустимые для DrawBlendingMode от всего остального
Huldra
> Чтобы отличить варианты допустимые для DrawBlendingMode от всего остального
enum class для такого в плюсах есть из коробки (вместо обычного enum).
Бонусом - нельзя передать не ту константу ибо не скомпилируется
Фильтрацию можно было вынести в настройки самой текстуры. from_x это я так понимаю атлас, это можно было вынести в отдельные параметры и принимать именно их.
где рисовать спрайт, должен знать сам спрайт, знать где он находится. И получилось бы что то такое
Function( Sprite )
Function( Sprite, Params )
Params {
source_x
source_y
source_width
source_height
}
который тоже лучше вынести в Sprite, ведь именно он будет читать информацию из SpriteSheet (атлас)
Sprite.x
Sprite.y
Sprite.SpriteSheet.Texture.FilterMode
Sprite.SpriteSheet.source_x
Sprite.SpriteSheet.source_y
в итоге получится просто
Function( Sprite )
а лучше
Sprite.Draw(canvas)
Salamandr
> from_x это я так понимаю атлас, это можно было вынести в отдельные параметры и
> принимать именно их.
> где рисовать спрайт, должен знать сам спрайт
Так спрайт знает. Точнее, тут все - спрайты.
Атлас - спрайт, сами тайлы - тоже спрайты, которые ссылаются на кусочек атласа.
Примерно так:
Sprite atlas; Sprite tile1; Sprite tile2; ... atlas.Load("atlas.tga"); tile1.Reference( atlas, 0, 0, 32, 32); tile2.Reference( atlas, 32, 0, 32, 32);
Рисовать тайлы можно после этого например так
Vec2Si32 pos(100, 200); ... tile1.Draw( pos);
но идея про аппаратные спрайты на самом деле в том чтобы движок сам собирал/пересобирал из используемых вместе аппаратных спрайтов атласы в рантайме
u960
Huldra
> Чтобы отличить варианты допустимые для DrawBlendingMode от всего остального
enum BlendingMode { ADD, SUBSTRACT, MIN, MAX, ALPHA_BLEND }; int main() { BlendingMode bm = BlendingMode::ADD; std::cout << "Hello World!\n"; }
std::cin
Но в реальности будет написано вот так
BlendingMode bm = ADD;
Потому что скомпилируется
Huldra
> std::cin
> Но в реальности будет написано вот так
>
> BlendingMode bm = ADD;
>
> Потому что скомпилируется
Потому вместо
enum BlendingMode
{
ADD,
SUBSTRACT,
MIN,
MAX,
ALPHA_BLEND
};
нужно писать:
enum class BlendingMode { ADD, SUBSTRACT, MIN, MAX, ALPHA_BLEND };
И тогда
BlendingMode bm = ADD;
уже не скомпилируется, и нужно будет писать вот так:
BlendingMode bm = BlendingMode::ADD;