You are not logged in.
@Alien - Не надо на "Вы" - я чувствую себя от этого древним и ветхим.
Заказ принят. С ARM я сам особо не разбирался (это еще впереди: нужно будет покопаться CTW/iOS и VC/iOS), а вот очередная часть по PPC будет точно, предположительно, где-то в районе выхода пятерки.
@DK22Pac - Хорошо, доберусь до дома, попробую заглянуть в базу (у меня с собой ее нет). exception-handlerы, если не происходит исключения, ничем не отличаются от любых других функций. Место в ntdll гораздо больше похоже на случайное, чем на обработчик исключения (точно можно сказать, если включить в студии загрузку debug-info с микрософтовских серверов)
Мне еще ни разу не приходилось пользоваться fastcall. Обычные методы либо cdecl, либо stdcall, либо thiscall, а то, что генерируется линкером, обычно получает параметры так, что без declspec(naked) не обойтись (тем более, что о сохранении регистров там тоже стоит позаботиться самому).
auto _RegisterFxSystem = reinterpret_cast<CFxSystem * (__thiscall *)(CParticleData *particleData, const char *filename, FILE *file)>(0x5C1F50);
PS. Я, кстати, научился инжектить нормально методы, так что последняя часть соответствующей статьи будет дописана (не прошло и пяти лет)
__thiscall * мобжно объявлять где угодно. первый параметр автоматом пойдет в ECX.
__fastcall - это совсем не то (два параметра в регистрах). Вылет - по рассыпанию стека из-за несовпадения ожидаемого и реального количества параметров на стеке
@009 - Физика в SA достаточно рудиментарна (осбенно после IV)
В тех кусках, что я выкладывал, были, как минимум структуры физического движка.
Если нужно (и если будет время), могу попробовать вспомнить, что к чему.
@Shag - Компоненты должны быть в массиве.
Если есть хотя бы два компонента - то все остальные находятся тривиально
4D0 - это направление фюзеляжа при полете (например, лететь боком).
@DK22Pac - DC == Display Command.
Т.е., несколько упрощая, по ходу обработки, они набираются в очередь и потом отрисовываются все пачкой. CBaseDC - базовый класс для всех DC, а Execute - метод, непосредственно выполняющий команду.
@Alien - Не совсем так.
Определения структуры может не быть вообще: указатель на структуру считается complete type.
Определение структуры требуется только в случае, если либо используется сама структура (не по указателю), либо производится обращение к каким-то ее полям
А что у LabView есть на тему подключения внешних dll ?
(в общем случае, пишется модуль-адаптер, который предоставляет требуемые LabView функции и, из них, вызывает функции устройства)
Можно, но это тоже получится не меньше четырех точек (а делать это будет сложнее).
С одной стороны, приятно, что можно ограничиться только CPed (т.е. не нужно трогать CPlayerPed и CEmergencyPed), с дургой стороны, у CPed три конструктора и один деструктор (что и дает нам четыре точки)
Метод, в общем, логичный.
Неиспользуемое поле в CPed - найти не вопрос. Как вариант - использовать поля CPlacement, которые используются только в статических объектах.
Проблема с созданием/удалением объекта решается перехватом конструктора и деструктора (~5 точек)
Из точки фокуса строишь четыре плоскости и проверяешь, что объект их не пересекает.
Поскольку у тебя камера фиксирована, все проверки получаются плоские (т.е. строишь плоскость параллельно экрану, считаешь в ней четыре лимита и проверяешь, что у тебя проекция объекта за них не выходит)
Это нужно один раз нарисовать и все станет очевидно.
Хорошо. До катсцен я еще не добирался.
Маленькое замечание: размер rage::Vector3 - не 12, а 16 байт (SSE-aligned)
В паре объектов "лишние" четыре байта используется для хранения даных, но, практически везде, это просто выравнивание.
Пропустил вопрос про FrameDof
DOF = Degree Of Freedom
короче, на первый взгляд, это ограничения для инверсной кинематики.
Они у меня были слегка разобраны, если надо - попробую поискать
Да и сейчас можно.
Там, правда, написано "Our HDD has broken and entirely site has lost. We are trying to recover. Please wait."
Как правило, при компиляции, делается обратное - чем больше вынесено во внешние модули, тем компактнее получается свой проект.
/MT достаточно, чтобы msvcrXX не использовался.
Если хочется собрать вообще без стандартных библиотек, придется повозиться.
Кстати, RtlCopyMemory медленнее memcpy примерно в десять раз, если включены /arch:SSE2 и /Oi
У компонентов в SA и ниже, вообще нет коллизий
что касается xmmN - они всегда по 128 бит. В x86 их 8, в x64 - 16.
Они могут использоваться для разных целей. Самая распространенная - использование для floating point, чтобы не возиться со стековой сопроцессорной арифметикой.
Альтернативное (вообще-то, оно задумывалось как основное) использование - параллельное выполнение действий над несколькими операндами.
// прибавление числа ко всем элементам вектора двумя командами
__inline Vector4& operator += (const float f) { v = _mm_add_ps (v, _mm_set_ps1 (f)); return *this; }С пересылкой: нужно именно MMX или SSE ? MMX не работает с плавающей точкой.
@DK22Pac -
Вместо указателя на rwFrame, есть указатели на несколько структур.
Кусочек ivModels.h
class ivBaseModelInfo { // size = 0x60
public:
// ... здесь были методы...
phArchetypeGta * m_pArchetype; // +04 - физика
gtaFragType * m_pFragType; // +08 - frag. используется только в ivPedModelInfo и ivVehicleModelInfo
ivDrawableReference * m_pDrawableRef; // +0C - модель. Используется для всех остальных классов
Vector4 m_vCenter; // +10
//#define m_fRadius (m_vCenter.w) // +1C
Vector4 m_vAabbMin; // +20
//#define m_fDrawDistance (m_vAabbMin.w) // +2C
Vector3 m_vAabbMax; // +30
//#define m_dwModelId (_f30.pad) // +3C
DWORD m_dwFlags; // +40 -- 0x800000: auto allocated
DWORD m_dwRefCount; // +44
WORD m_wTxdId; // +48
WORD m_wFirst2dfxRef;// +4A - index of the first 2dfx reference in ivModelInfoStore::ms_2dfxRefs1
WORD m_wAmatCount; // +4C - number of the first audio material
WORD m_wFirstAmatID; // +4E - count of the audio materials used
WORD _f50; // +50 - index of _F27FC4
WORD m_wBoundId; // +52
WORD m_wLodId; // +54
WORD m_wAnimationId; // +56
WORD m_wBlendshapeId;// +58
BYTE m_nb2dEffectCount; // +5A
BYTE _f5B; // 2dfx flags: 0x40 - have light shaft
DWORD _f5C; // +5C TODO: m_dwFragTypeAssignTime ?
};
struct ivDrawableReference {
rage::rmcDrawable * pDrawable; // +0
ivCustomShaderEffectBase * pShaderEffect; // +4
DWORD _f8;
ivDrawableReference * pPrev; // +C
ivDrawableReference * pNext; // +10
// и здесь были методы
};
Да, именно так.
Как-то так:
dwLoadOffset = (DWORD)GetModuleHandle (NULL)-0x400000;
С глобальной точки зрения, это не совсем корректный пример, потому что он позволяет получить адрес загрузки только основного модуля, но, в практических целях его хватит.
В ModelInfo есть указатель на drawable
Если не понятно, как получить modelinfo из entity - позже найду пример.
"Пользователи делятся на тех, кто увидев сообщение на экране, нажимает 'Да' и тех, кто нажимает 'Нет'. Если пользователь читает сообщение - это уже продвинутый пользователь".
Там же написано: админа с локалхоста не пускают. Либо пароль не совпадает, либо прописано ограничение по адресам.
@BritishColonist - Debugger -> Attach to process
__thiscall описывать как __cdecl нельзя. У __cdecl все параметры на стеке, у __thiscall - this передается в ECX
@BritishColonist
1. Здесь поможет не сам конструктор, а место, откуда он вызывается. Если объект выделяется динамически, перед вызовом конструктора вызывается оператор new. Ему передается параметром точный размер объекта. (примеры в 5.1). Если объект выделяется статически, пользы от конструктора ровно столько же, сколько и от любого другого метода - можно установить минимум, меньше которого объект быть не может (по максимально используемому смещению полей).
2. Функции члены класса никак не связаны с данными (и вообще не отличаются от функций, которым указатель на объект этого класса передается первым параметром).
3. Не влияет, т.к. они никак не связаны с данными.
Графические форматы RAGE разобраны процентов на 80 для IV и процентов на 50 для RDR.
(MC:LA - тоже процентов на 50). Просто большого потока интересующихся не было, и информация перестала выходить за пределы "узкого круга"