Перейти к контенту
Rolan

Редактирование движка X-Ray

Рекомендуемые сообщения

3 часа назад, Zander_driver сказал:

А как в X-Ray проще всего проверить коллизию произвольных координат, (x,y,z), с статичной геометрией локации?

Точки нигде и ни с чем не коллизятся, им бы еще измерений несколько накинуть.

В xrCDB.h в классе COLLIDER есть методы ray_query, box_query, frustum_query.

Изменено пользователем abramcumner
  • Спасибо 1

Подарки

  • Ссылка на комментарий

    В связи с тем, что куда-то утерялись ссылки на исходники ЛА 2014 года с тремя рендерами. Удалось найти, поделюсь ссылкой, вдруг кому-то пригодится: Тык

    jpwsa5byp73nyaufrbis15dcci1y.png
     

    Ссылка на комментарий

    Люди, движок не компилится. Отсутствует файл config.h при компиляции ode.dll. также компилятор ругался на стандартную библиотеку. Если что, visual C++ 19

    Ссылка на комментарий
    12.07.2020 в 21:42, Expropriator сказал:

    по хиту. Если торкнуло, то

    От таких ответов было бы смешно, если бы не было так грустно :rolleyes:

    А вообще, ввиду того что раскопки по движку не обнаружили ничего готового к немедленному применению для обозначенной цели, даже в составе OGSR-движка. Ну или я плохо искал... во всяком случае, готового удобоваримого инструмента такого назначения, я в свободном доступе не видел. Написал быстренько свой клас-обертку над api движка, для тестирования коллизий с геометрией локации и объектов. Уже тестировалось - работает, причем даже сразу без всяких багов. Выкладываю, может быть, кому-то пригодится.

    Куда нажимать и за что дергать:

    InitSet(Fvector3, bool, bool) - Стартовые настройки. Задает центр лучеиспускания, и флаги - считать ли столкновения с актором, считать ли столкновения с игровыми объектами. Если оба false, то будет фиксировать столкновения только с геометрией локации.

    Valid(Fvector3) - Пустить (из стартовых координат), луч с указанной дирекцией. Можно передавать не-нормализованные вектора - по их длине определит дальность трассировки. Возвращает true/false. Столкнулись/не столкнулись.

    CollisionDist() - узнать дистанцию от старта до точки столкновения, если с чем-то/кем-то столкнулись.
     

    Скрытый текст

     

     

    
    /**
    	Класс для проверки коллизии любого произвольного луча с геометрией уровня и объектов.
    	Zander, 2020
    */
    #pragma once
    class CLevel;
    class CObject;
    
    struct S_LRQ_fvPacket {
    	Fvector3 		A;
    	Fvector3 		B;
    	Fvector3* 		C;
    	bool 			stopOnActor;
    	bool 			stopOnObjects;
    	S_LRQ_fvPacket(Fvector3 a, Fvector3 b, Fvector3 c, bool d, bool e) {
    		A.set(a);
    		B.set(b);
    		C = &c;
    		stopOnActor = d;
    		stopOnObjects = e;
    	}
    };
    
    class CLevelRQCast
    {
    public:
    	CLevelRQCast();
    	virtual ~CLevelRQCast();
    private:
    	// For collision testing
    	bool 					TestRQ(Fvector3 a, Fvector3 b);	// Запуск теста столкновения.
    	collide::rq_results		rq_storage;
    	friend	CLevel;
    	bool 					initialized;
    	bool 					withActor;
    	bool 					withObjects;
    	bool 					collided;
    protected:
    	Fvector3				test_dir;			// Дирекция ожидаемых координат относительно старта трассировки
    	Fvector3				initialCoords;		// Старт трассировки в мировых координатах
    	Fvector3				collisionPoint;		// предполагаемое следующее положение камеры в мировых координатах
    	static BOOL 			test_callback(const collide::ray_defs& rd, CObject* object, LPVOID params);
    	static BOOL				trace_callback(collide::rq_result& result, LPVOID params);
    public:
    	void InitSet(Fvector3 pos, bool a, bool b); 	// Старт подключения. Указываем центр луче-испускания, и управляющие флаги.
    	bool Valid(Fvector3 target);	// Возвращает true, если текущий луч (источник-таргет) ни с чем не столкнулся. false в обратном случае.
    	float CollisionDist();
    };

     

     

     

     

    Скрытый текст

     

     

     

    
    /**
    	Класс для проверки коллизии любого произвольного луча с геометрией уровня и объектов.
    	Zander, 2020
    */
    #include "stdafx.h"
    #include "CLevelRQCast.h"
    #include "level.h"
    #include "actor.h"
    
    
    CLevelRQCast::CLevelRQCast()
    {
    	initialized = false;
    	withActor = false;
    	withObjects = false;
    	collided = false;
    }
    
    CLevelRQCast::~CLevelRQCast()
    {
    }
    
    bool CLevelRQCast::Valid(Fvector3 target)
    {
    	if (!initialized) return false;
    	test_dir.set(pos);
    	collided = TestRQ(initialCoords, test_dir);
    	return collided;
    }
    
    float CLevelRQCast::CollisionDist()
    {
    	if (initialized && collided)
    		return initialCoords.distance_to(collisionPoint);
    		
    	return (-1);
    }
    
    void CLevelRQCast::InitSet(Fvector3 pos, bool a, bool b)
    {
    	initialCoords.set(pos);
    	initialized = true;
    	withActor = a;
    	withObjects = b;
    }
    
    bool CLevelRQCast::TestRQ(Fvector3 a, Fvector3 b)
    {
    	rq_storage.r_clear();
    	collisionPoint.set(initialCoords);
    	float range = test_dir.length();
    	test_dir.normalize();
    	collide::ray_defs RD(initialCoords, test_dir, range, CDB::OPT_CULL, collide::rqtBoth);
    	BOOL result = FALSE;
    	VERIFY(!fis_zero(RD.dir.square_magnitude()));
    	S_LRQ_fvPacket* rda = xr_new<S_LRQ_fvPacket>(initialCoords, test_dir, collisionPoint, withActor, withObjects);
    	result = Level().ObjectSpace.RayQuery(rq_storage, RD, trace_callback, rda, test_callback, rda);
    
    	xr_delete(rda);
    
    	return (!result);
    }
    
    BOOL  CLevelRQCast::trace_callback(collide::rq_result& result, LPVOID params)
    {
    	BOOL R;
    	S_LRQ_fvPacket* pfd_RDA = (S_LRQ_fvPacket*)params;
    	//динамический объект
    	if (result.O) {
    		R = TRUE;
    		if (pfd_RDA->stopOnObjects) R = FALSE;
    		if (result.O->ID() == Actor()->ID() && pfd_RDA->stopOnActor) R = FALSE; 
    	}
    	else R = FALSE;
    
    	//вычислить точку попадания
    	Fvector3 ep;
    	ep.mad(pfd_RDA->A, pfd_RDA->B, result.range); 
    	pfd_RDA->C->set(ep);
    
    	return R;
    }
    
    BOOL CLevelRQCast::test_callback(const collide::ray_defs& rd, CObject* object, LPVOID params)
    {
    	BOOL R = TRUE;
    	S_LRQ_fvPacket* pfd_RDA = (S_LRQ_fvPacket*)params;
    	if (object) {
    		if (pfd_RDA->stopOnObjects) R = FALSE;
    		if (object->ID() == Actor()->ID() && pfd_RDA->stopOnActor) R = FALSE;
    	}
    	
    	return R;
    }

     

     

     

     

     

     

     

     

    Изменено пользователем Zander_driver
    • Полезно 2

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий

    @Zander_driver, а в чем изобретение? В движке постоянно такие лучики пускаются для разных проверок.

     

    Можно вспомнить моё замечание о костылях и велосипедах. Я писал через год, но ты похоже идёшь опережающим темпом.

    Изменено пользователем dsh
    Ссылка на комментарий
    16 часов назад, dsh сказал:

    В движке постоянно такие лучики пускаются для разных проверок.

    Естественно, да. Но удобной обертки для внешнего использования, на всем этом как-то не было. И вот любопытно, что есть костыль по твоему: лапша из вызовов пускания лучиков для проверок в 100500 разных классов, или один удобный класс к которому можно обратиться откуда угодно.

     

    Upd. Не вижу смысла спорить об этом. Да и тема не для этого.

    p.s. Для чего там колбеки и что в них делается, ты видел)

    Изменено пользователем Zander_driver

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий

    @Zander_driver, вот то, что ты написал, кажется мне велосипедом. Т.к. материалы ты не обрабатываешь, то и коллбеки не нужны и можно обойтись уже готовыми средствами. Например чем-то вроде

    
    Level().ObjectSpace.RayPick(Position(), dir, m_fJumpHeight, collide::rqtBoth, RQ, this)
    
    

    Это я просто скопировал из первого попавшегося кода. Что означают параметры разобраться не сложно.

     

    Изменено пользователем dsh
    Ссылка на комментарий

    Всем доброго времени суток. Не знаю уже кого и спросить.. Не сочтите идиотом, но простая задача завела в тупик. :crazy2:

    Хотел вернуть второй слот исключительно под пистолеты, а третий под автоматы, smg, шотганы и прочее, как это было в ЧН и ТЧ. Казалось бы, сократи сетку в actor_menu.xml и дело в шляпе, дык нет же, при любом удобном способе ГГ пытается запихать дробовик в кобуру, от чего получает ожидаемый вылет с логом "нет места на ячейках". Тщательно сломав голову о конфиги и написав различные варианты решения скриптами, убедился что править нужно xrGame :dash2: А так как я далёк от распаковок, перепаковок, исходников и самого С++, принял решение НЕХнуть xrGame ЧН и напялить код блокировки неподходящего слота на ЗП, что разумеется так же ни к чему не привело. Поняв что где-то внутри, в каком-нибудь dragdrop'e сидит строчка которая вопреки моему мнению говорит что "slot2 и slot3 считай одно и то же, прыгайте хоть туда, хоть сюда, значения не имеет" решил с ней бороться. Помогите пожалуйста её найти и направить на путь истины, сил моих больше нет :cray5:

    Ссылка на комментарий

    Всем доброго вечера! Подскажите пожалуйста, какие основные и дополнительные компоненты при установке VS2019 нужно установить для сборки движка? Заранее благодарен!

    Ссылка на комментарий
    Только что, Expropriator сказал:

    отдыхает

    Мне кажется, что в этой теме, хорошим тоном считается постить фрагменты программного кода, а не скрины...

    Вот если б вы исходниками своего рендера поделились - это другое дело... :grin2:

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий

    @Zander_driver, специально для тебя премьера нового движка. Эксклюзив!

    https://yadi.sk/d/cF2kYZjrM00XDA

    Основано на движках SCS (1510), ALL(1602)

    Рабочий рендер R3 + R1 серверный.

    R1 еще пока в хламе. Я его не почистил.

    Меня прошу не материть за код Я для себя это делаю.

     

    Тестировать можно на старой базе движка SCS :

    https://www3.gameru.net/forum/index.php?s=&showtopic=71230&view=findpost&p=1680257

    Мелкий патч:

    https://www3.gameru.net/forum/index.php?s=&showtopic=71230&view=findpost&p=1680614

    Последний билд https://yadi.sk/d/4iHz5YDV2dUFAw

     

    Изменено пользователем Expropriator
    • Нравится 1

    andreyholkin.gif

    rod_cccp.gif

     

    Ссылка на комментарий
    2 часа назад, Expropriator сказал:

    SCS

    https://ru.wikipedia.org/wiki/SCS_Software

    (Тут была шутка :) но совпадение и правда забавное)

    впрочем, я все равно в этом не разбираюсь. :wink:

    2 часа назад, Expropriator сказал:

    специально для тебя

    Спасибо, но меня и моё устраивает) А так, здорово что выложил, кому-нибудь пригодится.

    Изменено пользователем Zander_driver

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий

    Где можно найти рабочие исходники SDK 0.7? Те что идут с исходниками движка скомпилил, но сдк не запустился. Да и размер LevelEditor.exe у меня получился 2.1 мб, а в сдк этот файл 2.4 весит. Т.е. скорее всего исходники не полные.

    Ссылка на комментарий

    @XinnogeN XinnogeN

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

    • Согласен 1
    Ссылка на комментарий
    10 минут назад, AndreySol сказал:

    к ним и прилагается, обычно

    Вообще-то, нет. Не всегда. Тем более речь об СДК, а не самом движке.

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий
    11.09.2020 в 00:09, Expropriator сказал:

    Крайэнгина 2 отдыхает

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

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

    Ссылка на комментарий

    @aromatizer, r2_dof_kernel 1. естественно. У меня же 7 вкорячено.

     

    Последняя версия, уже точно.

    https://www.amk-team.ru/forum/topic/14029-scs-redux/?do=findComment&comment=1348758

    Изменено пользователем Expropriator

    andreyholkin.gif

    rod_cccp.gif

     

    Ссылка на комментарий
    37 минут назад, Expropriator сказал:

    r2_dof_kernel 1. естественно. У меня же 7 вкорячено.

    Я не тактик, а стратег.)

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

    Ссылка на комментарий

    Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

    Комментарии могут оставлять только зарегистрированные пользователи

    Создать аккаунт

    Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

    Зарегистрировать новый аккаунт

    Войти

    Есть аккаунт? Войти.

    Войти
    • Недавно просматривали   0 пользователей

      Ни один зарегистрированный пользователь не просматривает эту страницу.

    AMK-Team.ru

    ×
    ×
    • Создать...