FiEctro писал: Ну допустим если у нас такты физики считаются допустим фиксировано в 25фпс, а камера аттачится к такому объекту при нефиксированом фпс, это приведёт к подергиваниям
Ну ты в спирите небось аттачил разные камеры к разным объектам, ничего же не дёргалось?
Цитата:
FiEctro писал: А если я хочу вызвать скрипт когда уже кадр отрисован?
Если ты вызываешь скрипт, когда кадр уже отрисован - ты его вызываешь на новом кадре
Цитата:
FiEctro писал: Я про другое, вот допустим у тебя есть объект, он наследует класс ригидбоди, у которого например есть булева - ис кинематик. Так вот как мне её переключать?
А, да так же как в кваке. MOVETYPE, SOLID. Физдвижок не в скриптах, он неявно довлеет над ситуацией, а ты просто задаешь ему что симулировать и как. Классы - не наследуют никаких физических типов. Но каждому объекту можно задать любой тип симуляции, например.
Цитата:
FiEctro писал: Т.е. будет некий init.cpp из которого вызываем все наши функции, правильно?
Ну там не совсем. Интерфейсы будут, как туда, так и оттуда.
Цитата:
FiEctro писал: Самый простой пример - трасса из ориджина объекта, сталкивается с его собственным колайдером. Как это решить?
Ну а как решали в Кваке? Задвали хозяина. Трасса не коллидит со своим хозяином. А групповые коллизии через маску задаются, да это и в халфе было. И в физиксе оно так же.
Цитата:
FiEctro писал: Для этого я передаю vector3 поворота кости головы прямиком в шейдер
Ты опять не понял. Не надо ничего передавать из игрового кода прямо в шейдер. Материал сам возьмёт любой параметр из объекта, по его имени тогда, когда посчитает нужным. Объясняю. Допустим ты в классе завёл какую-то переменную и туда сохранил чего тебе надо. Дальше ты в описании материала заводишь новый юниформ vec3 и пишешь слинковать его с entity->myCoolVariable; И всё, материал сам профетчит эту переменную из текущего объекта при условии что текущий объект будет иметь модель, у которой будет хотя бы один такой материал.
Тебе не надо будет внутри самого объекта заниматься какими-то бесконечными SetUniform, достаточно просто обновлять переменную.
Цитата:
FiEctro писал: Супер, и гизмо можно рисовать?
А что такое Гизмо?
Цитата:
FiEctro писал: И самое интересное, будет ли какой то быстрый способ использовать движковый таймер и синхронизироваться с ним?
Гизмо это всякие фигуры и линии в редакторе. Например визуализация триггеров, трассы или нормалей.
Цитата:
Дядя Миша писал: Ну ты в спирите небось аттачил разные камеры к разным объектам, ничего же не дёргалось?
Хотелось полного контроля над такими вещами.
Цитата:
Дядя Миша писал: А, да так же как в кваке. MOVETYPE, SOLID. Физдвижок не в скриптах, он неявно довлеет над ситуацией, а ты просто задаешь ему что симулировать и как. Классы - не наследуют никаких физических типов. Но каждому объекту можно задать любой тип симуляции, например.
Я не помню уже как в кваке. Но если можно без особых костылей, уже хорошо.
Цитата:
Дядя Миша писал: Ты опять не понял. Не надо ничего передавать из игрового кода прямо в шейдер. Материал сам возьмёт любой параметр из объекта, по его имени тогда, когда посчитает нужным. Объясняю. Допустим ты в классе завёл какую-то переменную и туда сохранил чего тебе надо. Дальше ты в описании материала заводишь новый юниформ vec3 и пишешь слинковать его с entity->myCoolVariable; И всё, материал сам профетчит эту переменную из текущего объекта при условии что текущий объект будет иметь модель, у которой будет хотя бы один такой материал.
Тебе не надо будет внутри самого объекта заниматься какими-то бесконечными SetUniform, достаточно просто обновлять переменную.
Ну я так и думал, материал просто изменяет переменную в шейдере, а мы изменяем её в материале через скрипт.
Цитата:
Дядя Миша писал: А что такое движковый таймер?
Ну вот ты вызвал функцию, и внутри неё тебе что то нужно вызвать допустим ровно через 10 секунд, независимо от фпс. Как в таком случае будет выглядеть код, без костылей вроде всяких циклов?
Цитата:
XaeroX писал: Там у него очень любопытная анимация смерти, жестокая и кровавая. Видимо, от этого и пошло выражение "рисовать Гизмо".
Гизмо переводится буквально как ШТУКА.
А поддержка листов будет? https://metanit.com/sharp/tutorial/4.5.php
Да и вообще планируются какие нить фичи из шарпа? Было бы прикольно если ВМ хоть частично была с ним совместима.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro писал: Например визуализация триггеров, трассы или нормалей.
Дебуг-отрисовка корочи. Отладочная визуализация.
Цитата:
FiEctro писал:
Хотелось полного контроля над такими вещами.
Чтобы дёргалось? О каком контроле речь?
Цитата:
FiEctro писал: материал просто изменяет переменную в шейдере, а мы изменяем её в материале через скрипт.
Материал позволяет подключать новые переменные к шейдеру, какие угодно. У тебя же есть доступ к бета-тестированию, почитай документацию, там всё это подробно расписано.
Цитата:
FiEctro писал: и внутри неё тебе что то нужно вызвать допустим ровно через 10 секунд, независимо от фпс
Ну а как тчинки в кваке работали? SetNextThink( 10.0f ); и вызов будет ровно через 10 секунд, независимо от фпс.
На самом деле я вообще не понимаю тех проблем, которые сами себе придумали авторы современных движков.
Добавлено 05-12-2022 в 21:57:
Цитата:
FiEctro писал: А поддержка листов будет?
Мой язык позволяет не просто реализовать динамические массивы, но еще и шаблонные массивы, как в настоящем С++.
Вообщем представь себе язык с возможностями С++. Ну конечно он помедленее чем С++ работает, но по возможностям его даже превосходит в некоторых аспектах. По крайней мере в тех, которые нужны в играх и именно поэтому я так и заморочился созданием собственного языка, а не взял чужой.
Добавлено 05-12-2022 в 22:00:
Цитата:
FiEctro писал: Да и вообще планируются какие нить фичи из шарпа?
В шарпе абсолютно всё встроено внутрь стандартных объектов. Такой подход есть абсолютное зло, потому что во первых без редактора\документации понять что именно там есть невозможно.
А во вторых, рано или поздно каких-то возможностей не хватит и тогда встречайте новую версию шарпа, которая несовместима с преведущей.
В моём языке есть всего три базовых типа, int, float и string. А всё остальное пользователь создаёт самостоятельно.
Дядя Миша писал: В моём языке есть всего три базовых типа, int, float и string. А всё остальное пользователь создаёт самостоятельно.
Ну вот в этом и проблема, вместо того чтобы писать код игры, приходится писать какие то дурацкие структуры (в юнити например вопрос указателей и структур опущен, хоть они там и есть в полной мере как и в си++) и у каждого разраба они написаны по своему. Кто во что горазд короче, отсутсвует какая то стандартизация. Может я конечно С++ очень плохо знаю, но всё же всякие заготовленные объекты сильно облегчают задачу новичкам, да и читабельность кода. Хотелось бы услышать твоего совета по этой ситуации. Возможно в базовом скрипте будут какие то заготовки?
Добавлено 05-12-2022 в 23:02:
Цитата:
Дядя Миша писал: Чтобы дёргалось? О каком контроле речь?
Порядок вызова и возможность синхронизации как с физикой, так и с обычным фпс, а так же возможность выполнить код как можно позже.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro писал: Ну вот в этом и проблема, вместо того чтобы писать код игры, приходится писать какие то дурацкие структуры
Зачем? Я сам всё напишу и ротатаблю тоже. Будет несколько типовых заготовок-сценариев для различных игр.
Цитата:
FiEctro писал: Порядок вызова и возможность синхронизации как с физикой, так и с обычным фпс
Обычно такой выбор не имеет смысла. Если это игровые объекты, они сихронизируются с серверным временем, если локальные - то с клиентским.
Цитата:
FiEctro писал: возможность выполнить код как можно позже.
Еще в первой кваке были trigger_relay с возможностью задания любого времени действия. На одном из уровней, к примеру триггер срабатывал через несколько минут после старта.
Дядя Миша писал: Обычно такой выбор не имеет смысла. Если это игровые объекты, они сихронизируются с серверным временем, если локальные - то с клиентским.
А с рендером и физикой?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Выяснилось жуткое. Сам я над этим никогда не задумывался, а тут вдруг внезапно понял. Вот казалось бы, если мы создаём объект дочернего класса через new, а результат кастуем к родительскому классу, что в этом такого особенного?
Пример
error C2243: 'type cast' : conversion from 'class CInfoPoint *' to 'class CBaseEntity *' exists, but is inaccessible
Честно говоря я такой ошибки не получал примерно никогда вообще
Но ладно, мало ли. Может это на выражение new действует такое строгое условие, а если это сделать чуть ниже, то норм? Ок, видоизменяем код
C++ Source Code:
1
CBaseEntity *e2;
2
CInfoPoint *e;
3
4
e = new CInfoPoint;
5
e2 = e;
6
delete e;
И снова получаем ту же самую ошибку!
Цитата:
error C2243: 'type cast' : conversion from 'class CInfoPoint *' to 'class CBaseEntity *' exists, but is inaccessible
Странно. dynamic_cast в данном случае бесполезен, ведь мы идём вверх по иерархии, а не вниз. О чём компилятор честно предупреждает
Цитата:
dynamic_cast used to convert to inaccessible or ambiguous base; run-time test will fail ('class CInfoPoint *' to 'class CBaseEntity *')
Тогда нам нужен static_cast? И снова получаем ошибку
Цитата:
error C2243: 'static_cast' : conversion from 'class CInfoPoint *' to 'class CBaseEntity *' exists, but is inaccessible
Ну зараза, я тебя всё-таки победю! Через Си-шный каст
C++ Source Code:
1
CBaseEntity *e2;
2
CInfoPoint *e;
3
4
e = new CInfoPoint;
5
e2 = (CBaseEntity *)e;
6
delete e2;
И вот ошибка превращается в предупреждение
Цитата:
warning C4243: type cast conversion from 'class CInfoPoint *' to 'class CBaseEntity *' exists, but is inaccessible
На самом 4243 это и есть предупреждение, которое почему-то форсируется до ошибки.
Запускаем! Ну и получаем вот это
Добавлено 06-12-2022 в 11:17:
Иными словами - хотя у нас есть виртуальный деструктор, при принудительном кастовании указателя вверх там внутри ломается вообще всё. И деструктор CInfoPoint не вызывается, да еще и память повреждается.
Очуметь можно. Просто в Шоте это вполне себе законная конструкция.
Добавлено 06-12-2022 в 11:21:
Скорее всего подобное поведение происходит из-за возможности множественного наследования в С++, там каждый наследный класс имеет свою базу и свой уникальный указатель. Но когда множественного наследования нет, то и этой проблемы нет тоже. Кстати в Делфи аналогично.
Дядя Миша писал: Я сам всё напишу и ротатаблю тоже.
Насколько будет интуитивным управление трансформом, скейлом и ротейтом объектов? А так же преобразвания углой Эйлера в кватернионы и обратно. Ну и преобразования из локальных пространств в глобальные и наоборот.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
А что может быть субъективного в этих простых операциях? Просто не превращать их в простыню кода для пользователя, а то ещё и матрицы считать заставишь
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!