std.tech: INSTEAD технологии


1 2
Reply to: DUZSft2ixyVRqX5HgA9A
From: Antokolos (syscall,12) 28.07.17 08:28 UTC
To: Peter
Subject: Re: INSTEAD на emscripten
>Если нужно, могу подробно описать что я сделал.
Да, было бы здорово.

Reply to: bKWA2ks4Yoag0S8LBjYR
From: Peter (syscall,1) 28.07.17 09:00 UTC
To: Antokolos
Subject: Re: INSTEAD на emscripten
> Да, было бы здорово.

После сборки у меня в ~/.emscripten_cache и ~/.emscripten_ports лежат собранные либы и сорцы SDL2.
Я зашел в ~/.emscripten_ports/sdl2/SDL2-version_13/src/video/emscripten
И заменил файл SDL_emscriptenevents.c на https://raw.githubusercontent.com/emscripten-ports /SDL2/master/src/video/emscripten/SDL_emscriptenev ents.c

После этого стер ~/.emscripten_cache/asm.js/sdl2.bc и пересобрался.

По хорошему нужно просто как то сказать emscripten использовать другой порт поновее, ну или ждать новую версию.

From: Peter (syscall,1) 18.08.17 17:13 UTC
To: All
Subject: Шумы перлина в будущем INSTEAD (3.1.0)
Пушнул сегодня эту функциональность. Удобна для генерации текстур, облаков и прочего подобного...

From: Peter (syscall,1) 20.08.17 09:43 UTC
To: All
Subject: INSTEAD 3.1.0
Инстед 3.1.0 вышел!

Выпущена новая версия INSTEAD 3.1.0. Кроме новых возможностей и исправленных ошибок, данная версия примечательна тем, что у INSTEAD появился новый официальный порт! INSTEAD-EM – emscripten порт INSTEAD, предназаначенный для запуска в WEB, который выглядит в вашем браузере точно так же, как и обычная версия INSTEAD. Прямо сейчас вы можете запустить любую игру из репозитория здесь: http://instead-games.ru/em.php.

Кроме того, версия 3.1.0 проходит подготовку для включения ее в Debian. Итак, список изменений:

* новый EMSCRIPTEN порт;
* исправлена ошибка деления на 0 в rnd;
* исправлена ошибка в loadmod (при вызове из gamefile);
* исправлена ошибка в path (.walk как функция);
* исправлены ошибки в документации;
* шумы Перлина (instead.noise1/2/3/4);
* pixels: scale()/rotate().

Бинарные сборки будут появляться по мере их готовности. И спасибо всем тем, кто поддерживает проект!

From: Antokolos (syscall,12) 01.09.17 19:16 UTC
To: All
Subject: Сборка INSTEAD для WinRT
Всем привет!
Давно хотел собрать INSTEAD для Windows Phone, и, наконец, что-то начало получаться.
http://nlbproject.com/dist/instead-win.zip
Проект открывать через Visual Studio 2015, может, можно и более поздней версией.
Солюшен в папке instead/VisualC-WinRT/WinPhone81_VS2015/instead/instead.sln
В папке instead свежесклонированная версия instead, которую я слегка пропатчил.
В данный момент сборка базируется на _WIN32_WCE, но надо будет переделать с новым ключом. Есть также некоторые недоделки.
Самая существенная недоделка в том, что игры пока не запускаются :) INSTEAD запускается, можно лазить в меню настроек, менять язык. Но игры из папки games не считываются.
По поводу папок INSTEAD (games, lang, themes, ...): они лежат в instead/VisualC-WinRT/WinPhone81_VS2015/instead/Debug/instead.Windows/AppX
argv почему-то передаётся как NULL, поэтому я подменяю argv[0] на ".". Кстати, в WinRT какая-то проблема с правами доступа, при открытии произвольного пути типа "C:\\Downloads\\" возникает ошибка.
Для сборки понадобились кое-какие файлы, скачанные где-то в Интернете. Они лежат в instead/VisualC-WinRT/WinPhone81_VS2015/instead/instead/instead.Shared
dirent.h слегка подправлен, другие, кажется, не менял, или почти не менял :)
В солюшене два проекта: instead.Windows и instead.WindowsPhone. Этот тип проекта рассчитан на создание универсального приложения для Win 8.1, но я пока мучал только десктопную версию.
В проекте instead.Windows только один cpp файл, winrt_main.cpp, запускалка. В проект для instead.WindowsPhone надо будет добавить какой-то аналогичный.
Файлы для libiconv в папке есть, но в проекте его поддержку пока не включал.
Запускать из Visual Studio по CTRL+F5, т.к. при запуске с дебаггером окно приложения через какое-то время отваливается. Не знаю точно, баг это или фича.
При попытке запустить собранный exe-шник возникает сообщение "Это приложение может работать только в контексте контейнера приложения". Наверно, для WinRT это норма.
Если есть опытные Windows-разработчики, то их помощь будет очень кстати. Если получится осилить сборку таких приложений, то можно будет размещать Инстед-игры в Windows Store. Ну и вообще, это круто :)

Reply to: b03mgbgVZgKKGZiQkdoY
From: Peter (syscall,1) 02.09.17 06:56 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
Проверь в отладчике, что находится в game_cwd, после инициализации?
Это когда из argv[0] получаем текущий путь. Это в instead_main непосредственно перед setdir() вызовом...

Reply to: b03mgbgVZgKKGZiQkdoY
From: Antokolos (syscall,12) 03.09.17 09:11 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
Обновил http://nlbproject.com/dist/instead-win.zip
См. патч внутри: instead/instead-win.patch
Объяснение некоторых моментов патча:

-static inline int game_cycle(void)
+static __inline int game_cycle(void)
компилятор ругался на слово inline. Погуглив, узнал, что для C-кода нужно использовать __inline
см. https://msdn.microsoft.com/ru- ru/library/bw1hbe6y.aspx
Ключевое слово inline доступно только в C++. Ключевые слова __inline и __forceinline доступны как в C, так и в C++.
Если другими компиляторами соберётся так, наверно, можно оставить так. Если нет, можно сделать #define. Причём, это дефайн не только на WinRT, а на компиляцию с помощью Visual Studio в целом.

-<-----><------>pixels += pitch * queue_y1 + queue_x1 * psize;
+<-----><------>pixels = ((char*) pixels) + pitch * queue_y1 + queue_x1 * psize;
Компилятор ругался на то, что к указателю типа void* неприменима операция +=

- #define errno 0
- #define strerror(a) ""
+ ///#define errno 0
+ ///#define strerror(a) ""
#define putenv(a) ;
- #define setlocale(a, b) ;
+ ///#define setlocale(a, b) ;
errno, strerror, setlocale оказались определены и эти дефайны вызывали ошибку компиляции

-#include <dir.h>
+///#include <dir.h>
компилятор не смог найти этот инклюд

char *dirpath(const char *path)
{
<----->static char fp[PATH_MAX * 4];
-<----->if (path[0] == '/')
+<----->if (path[0] == '/' || path[1] == ':')

Абсолютный путь начинался с C:, добавил проверку на символ :, чтобы отследить эту ситуацию.

/// Antokolos: dirname & basename copied from S60 above
Линкер сказал о ненайденных символах dirname и basename, скопировал их реализацию из S60, вроде сработало

-<----->libwince_init(argv[0], 1);
-<----->wince_init(argv[0]);
+<----->///libwince_init(argv[0], 1);
+<----->//setdir("./");
+<----->//strcpy(game_cwd, "./");
+<----->//wince_init(argv[0]);
+<----->unix_path(argv[0]);
+<----->strcpy(game_cwd, argv[0]);
тут надо ещё посмотреть, возможно, можно использовать wince_init и в исходном виде. libwince_init вроде не нужна

-<-----><------><------>FREE(opt_lang); opt_lang = strdup(langs[i].file);
+<-----><------><------>/// Antokolos: for some strange reason, this FREE call triggers a breakpoint in MSVCPP :(
+<-----><------><------>///FREE(opt_lang);
+<-----><------><------>opt_lang = strdup(langs[i].file);
тут вот действительно странно, но на этом вызове FREE происходит вылет, отладчик страшно ругается про Exception Thrown.
Проблема в том, что этот FREE ещё много где встречается, просто пока повезло на него не напороться

-#include <dir.h>
+///#include <dir.h>
+#include "unistd.h"
dir.h компилятор не нашёл, в unistd.h были какие-то из неопределённых символов

-<----->if (!GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME,
+<----->/// Antokolos: Note LOCALE_NAME_USER_DEFAULT instead of LOCALE_USER_DEFAULT
+<----->if (!GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SISO639LANGNAME,
GetLocalInfoA не нашёл линкер. Загуглил, что нужно использовать GetLocaleInfoEx. Оказалось, что правда. Однако, результат выполнения функции "r" вместо "ru". Поэтому пока захардкодил в "en", а по хорошему надо разобраться...

char *game_tmp_path(void)
{
+<----->return "/tmp";
пока так, ибо текущий код не проходит линковку. Было бы здорово, если бы можно было передавать темп. папку через командную строку INSTEAD, я смогу это сделать из winrt_main.cpp.

Reply to: mzIhT0u3THI7jyhQZKOV
From: Antokolos (syscall,12) 03.09.17 09:38 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
Про то, что ещё есть в проекте:

instead/VisualC-WinRT/WinPhone81_VS2015/instead/instead/instead.Shared
тут дополнительные h и c файлы, без которых не собиралось, немного пропатченные. Кроме того, тут есть папки games, lang, stead, themes из INSTEAD, но это я, думаю, уберу, включив их в проект непосредственно из кода INSTEAD. Они копируются в папку собранного приложения как ресурсы.

instead/VisualC-WinRT/WinPhone81_VS2015/instead/instead/instead.Windows
instead/VisualC-WinRT/WinPhone81_VS2015/instead/instead/instead.WindowsPhone

папки подпроектов для Windows и WindowsPhone. Пока рабочий только Windows. Тут же winrt_main.cpp для запуска. На всякий случай, включил свою копию в каждый из проектов.

instead/VisualC-WinRT/WinPhone81_VS2015
Тут подпроекты для lua52 и libiconv. Возможно, их нужно вынести на уровень выше. И возможно, сделав нормальный Visual Studio проект для libiconv. Для lua52 такой уже есть, правда, для Windows 8.1, а не для WindowsPhone 8.1

Что ещё добавим:
в папку instead/VisualC-WinRT добавлю подпапку с проектом UWP_VS2015. Это та самая Universal Windows Platform, которая Windows 10. Можно посмотреть в исходниках SDL, как у них сделано.

ещё можно добавить instead/VisualC, чтобы собирать обычный INSTEAD компилятором Visual Studio. В SDL соответствующий проект есть.

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

Reply to: mzIhT0u3THI7jyhQZKOV
From: Peter (syscall,1) 03.09.17 16:23 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
Кое что пушнул:
inline заменил на __inline
void * -> char * тоже
FREE(opt_lang) -- вероятно какой то баг в первичном присвоении opt_lang, там определяется язык по локали, и делается strdup.

Про tmp -- просто давай выберем какой должен быть путь для winrt и его введем в winrt.c

Reply to: 1wO8otj7QcXI44jSlJMU
From: Peter (syscall,1) 03.09.17 16:30 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
Насчет локали, дело в том, что Ex функция насколько я понимаю возвращает wchar строку, а не char.
То-есть эту строку надо потом сконвертить в обычную строку char. А wchar это и есть 'r', 0, 0, 0, 'u', 0, 0, 0 -- вот ты и увидел 'r'

Reply to: d7hEvE0VLwFmLVgOwvzZ
From: Antokolos (syscall,12) 04.09.17 19:03 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
Обновил http://nlbproject.com/dist/instead-win.zip
Теперь Инстед запускается на Windows Phone мобиле, т.е. второй проект тоже рабочий! Кроме того, выделил все доп. библиотеки типа lua, iconv в отдельные подпроекты. В будущем их можно будет использовать в других проектах Visual Studio.
Но все эти проекты в основной репозиторий коммитить пока ещё не стоит, работа пока не закончена...
Кроме того, вытянул из git те изменения, которые ты пушнул и снова пропатчил в необходимых местах, патч instead-win.patch в архиве.

Peter> Насчет локали, дело в том, что Ex функция насколько я понимаю возвращает wchar строку, а не char.
Peter> То-есть эту строку надо потом сконвертить в обычную строку char. А wchar это и есть 'r', 0, 0, 0, 'u', 0, 0, 0 -- вот ты и увидел 'r'
Так и есть, исправил это место, теперь корректно возвращает "ru"

Peter> inline заменил на __inline
В одном файлике забыл :) См. в патче

Peter> Про tmp -- просто давай выберем какой должен быть путь для winrt и его введем в winrt.c
Гуглил по запросу "общая temp папка в WinRT", но что-то ничего не нашёл... Возможно её и нет, там что-то было про права доступа WinRT приложений, и они ограничены.
Я таки сделал параметр tmppath, погляди, пожалуйста. Если одобришь, то так проще всего. Там есть код для получения темповой папки, доступной приложению, но он на C++, и я не знаю, как его вкорячить в C.
См. в VisualC-WinRT/WinPhone81_VS2015/instead/instead/instead.Windows/winrt_main.cpp, что я передаю в этот tmppath.

Вообще по коду: я могу попробовать начать менять сам, вводить дефайны итд. Просто как тебе потом проще будет, разбираться в моём коде или написать самому :)
Если что, это всё не горит, конечно, я могу пока попробовать UWP скомпилить или ещё что-нибудь. Например, сделать сборку Windows-версии Инстеда через Visual Studio.

Reply to: N7q26z3j19tTvLIjgYXY
From: Peter (syscall,1) 05.09.17 04:45 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
> В одном файлике забыл :) См. в патче
Ага, еще раз пушнул.
> См. в VisualC-WinRT/WinPhone81_VS2015/instead/instead/instead.Windows/winrt_main.cpp, что я передаю в этот tmppath.
Ты можешь оформить эту свою функцию как extern "C" { и вызывать из самого инстеда в принципе....

Reply to: N7q26z3j19tTvLIjgYXY
From: Peter (syscall,1) 05.09.17 05:10 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
>Гуглил по запросу "общая temp папка в WinRT", но что-то ничего не нашёл... Возможно её и нет

https://stackoverflow.com/questions/32099821 /equivalent-of-the-gettemppath-on-windows-phone

Второе сообщение по ссылке, вроде оно...

Reply to: GwKOwcAm1cdOAhlzzAQp
From: Peter (syscall,1) 05.09.17 05:12 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
Просто делаем winrt.cpp наряду с winrt.c и в нем все что надо на cpp, а из C вызываем это все как extern "C"...
Примерно как сделано с symbian.cpp

Reply to: N7q26z3j19tTvLIjgYXY
From: Peter (syscall,1) 05.09.17 05:41 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
> Вообще по коду: я могу попробовать начать менять сам, вводить дефайны итд. Просто как тебе потом проще будет, разбираться в моём коде или написать самому :)

Имхо на данном этапе нужно посмотреть что там с ротацией. Включить код для поворотов экрана и посмотреть на люмии -- все ли ок.
А так -- любой вариант норм. Мне в слепую сложновато делать патч, но думаю по твоим наработкам это будет не сложно.

Reply to: g5KY48C23IPoOZ4McoIJ
From: Antokolos (syscall,12) 05.09.17 12:38 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
Начал коммитить вот в эту ветку: https://github.com/Antokolos/instead/tree/winrt
Надеюсь, так будет легче делать патчи.
добавил winrt.c, winrt.h, попытался сделать дефайн _WINRT
Как будто бы пока всё запускается, но баги с мышью и ориентацией пока не фиксил

Reply to: b8PGIKFMdPC3jboEaUrG
From: Peter (syscall,1) 05.09.17 13:09 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
> Начал коммитить вот в эту ветку: https://github.com/Antokolos/instead/tree/winrt
> Надеюсь, так будет легче делать патчи.

Ага! Здорово! Только, наверное, стоит себя в заголовки winrt.c вписать. Ну и быть не против, что код, написанный тобой, будет под MIT. =)

Reply to: toEfSfR2AWsIredFGdS6
From: Antokolos (syscall,12) 06.09.17 20:07 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
>> Начал коммитить вот в эту ветку: https://github.com/Antokolos/instead/tree/winrt
>> Надеюсь, так будет легче делать патчи.

Peter> Ага! Здорово! Только, наверное, стоит себя в заголовки winrt.c вписать. Ну и быть не против, что код, написанный тобой, будет под MIT. =)
Не против, конечно! Сделаю.

Reply to: g5KY48C23IPoOZ4McoIJ
From: Antokolos (syscall,12) 15.09.17 09:12 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
По поводу кода для поворотов. Искать по #if defined(IOS) || defined(ANDROID) ?
Он в каком-то конкретном месте или надо во все такие места засунуть дополнительный дефайн?

Reply to: g5KY48C23IPoOZ4McoIJ
From: Antokolos (syscall,12) 15.09.17 18:47 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
Последние новости с полей: код для поворотов почти работает. По крайней мере, удалось увидеть нормальную картинку в Landscape-режиме.
Напомни-ка, пожалста, что мы передаём в параметр modes?
-modes w1xh1,w2xh2

где w1,h1 -- w, h для портретного режима,
w2,h2 -- w, h для landscape

так, или как-то по другому?
пока что, если включён -hires, то всё круто. Если -nohires, то при повороте в лэндскейп получается маленький участок в центре. Что-то такое точно было на Андроиде.
Код в свою ветку пушнул.

Reply to: yXuA5nA9X2RkgIKHfl2S
From: Peter (syscall,1) 15.09.17 19:11 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
Вроде бы в modes мы просто передаем допустимые разрешения. Если sdl работает корректно, то это не обязательно. А так мы типа сами говорим что за режимы мы умеем.
По идее растягивание в nohires тоже аппаратная штука. И это тоже под теми же ифдефами. Мы делаем масштабируемое окно. Это не работает в software режиме. При загрузке инстеда он не пишет что включил software? А так оно само должно просто оастянуться.

Reply to: sMzAjLAuRGyXqB0O04TI
From: Antokolos (syscall,12) 16.09.17 20:51 UTC
To: Peter
Subject: Re: Сборка INSTEAD для WinRT
Если НЕ передаю -modes, то показывает строчку
fprintf(stderr, "Fallback to software renderer.\n");
Если передаю -modes, то в это место не приходит
При этом, если -modes и -hires переданы, то всё выглядит корректно, но не поворачивается (что нормально)
Наверно, действительно software-режим...

Reply to: EgCgJAjDMBB9UWik2LIe
From: Peter (syscall,1) 17.09.17 16:48 UTC
To: Antokolos
Subject: Re: Сборка INSTEAD для WinRT
> При этом, если -modes и -hires переданы, то всё выглядит корректно, но не поворачивается (что нормально)
Да, поворачивается оно только если ширина == высоте. В противном случае ротация блокируется.
По идее, нужно реализовать функции: rotate_landscape(), rotate_portrait() и unlock_rotation() и посмотреть когда они вызываются...

В ANDROID и IOS при повороте (если он не залочен) срабатывает :

====
    case SDL_WINDOWEVENT_SIZE_CHANGED:
====
в input.c
И вот в эту ветку тоже можно смотреть.

1 2