commit
2daaee8358
@ -284,7 +284,7 @@ namespace Components
|
|||||||
if (!scene->sceneModel[i].model)
|
if (!scene->sceneModel[i].model)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (Utils::Vec3SqrDistance(playerPosition, scene->sceneModel[i].placement.base.origin) < sqrDist)
|
if (Utils::Maths::Vec3SqrDistance(playerPosition, scene->sceneModel[i].placement.base.origin) < sqrDist)
|
||||||
{
|
{
|
||||||
auto b = scene->sceneModel[i].model->bounds;
|
auto b = scene->sceneModel[i].model->bounds;
|
||||||
b.midPoint[0] += scene->sceneModel[i].placement.base.origin[0];
|
b.midPoint[0] += scene->sceneModel[i].placement.base.origin[0];
|
||||||
@ -302,7 +302,7 @@ namespace Components
|
|||||||
for (auto i = 0; i < scene->sceneDObjCount; i++)
|
for (auto i = 0; i < scene->sceneDObjCount; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (Utils::Vec3SqrDistance(playerPosition, scene->sceneDObj[i].cull.bounds.midPoint) < sqrDist)
|
if (Utils::Maths::Vec3SqrDistance(playerPosition, scene->sceneDObj[i].cull.bounds.midPoint) < sqrDist)
|
||||||
{
|
{
|
||||||
scene->sceneDObj[i].cull.bounds.halfSize[0] = std::abs(scene->sceneDObj[i].cull.bounds.halfSize[0]);
|
scene->sceneDObj[i].cull.bounds.halfSize[0] = std::abs(scene->sceneDObj[i].cull.bounds.halfSize[0]);
|
||||||
scene->sceneDObj[i].cull.bounds.halfSize[1] = std::abs(scene->sceneDObj[i].cull.bounds.halfSize[1]);
|
scene->sceneDObj[i].cull.bounds.halfSize[1] = std::abs(scene->sceneDObj[i].cull.bounds.halfSize[1]);
|
||||||
@ -327,7 +327,7 @@ namespace Components
|
|||||||
{
|
{
|
||||||
auto staticModel = world->dpvs.smodelDrawInsts[i];
|
auto staticModel = world->dpvs.smodelDrawInsts[i];
|
||||||
|
|
||||||
if (Utils::Vec3SqrDistance(playerPosition, staticModel.placement.origin) < sqrDist)
|
if (Utils::Maths::Vec3SqrDistance(playerPosition, staticModel.placement.origin) < sqrDist)
|
||||||
{
|
{
|
||||||
if (staticModel.model)
|
if (staticModel.model)
|
||||||
{
|
{
|
||||||
@ -381,7 +381,7 @@ namespace Components
|
|||||||
if (!scene->sceneModel[i].model)
|
if (!scene->sceneModel[i].model)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (Utils::Vec3SqrDistance(playerPosition, scene->sceneModel[i].placement.base.origin) < sqrDist)
|
if (Utils::Maths::Vec3SqrDistance(playerPosition, scene->sceneModel[i].placement.base.origin) < sqrDist)
|
||||||
{
|
{
|
||||||
Game::R_AddDebugString(sceneModelsColor, scene->sceneModel[i].placement.base.origin, 1.0, scene->sceneModel[i].model->name);
|
Game::R_AddDebugString(sceneModelsColor, scene->sceneModel[i].placement.base.origin, 1.0, scene->sceneModel[i].model->name);
|
||||||
}
|
}
|
||||||
@ -395,7 +395,7 @@ namespace Components
|
|||||||
{
|
{
|
||||||
for (int j = 0; j < scene->sceneDObj[i].obj->numModels; j++)
|
for (int j = 0; j < scene->sceneDObj[i].obj->numModels; j++)
|
||||||
{
|
{
|
||||||
if (Utils::Vec3SqrDistance(playerPosition, scene->sceneDObj[i].placement.origin) < sqrDist)
|
if (Utils::Maths::Vec3SqrDistance(playerPosition, scene->sceneDObj[i].placement.origin) < sqrDist)
|
||||||
{
|
{
|
||||||
Game::R_AddDebugString(dobjsColor, scene->sceneDObj[i].placement.origin, 1.0, scene->sceneDObj[i].obj->models[j]->name);
|
Game::R_AddDebugString(dobjsColor, scene->sceneDObj[i].placement.origin, 1.0, scene->sceneDObj[i].obj->models[j]->name);
|
||||||
}
|
}
|
||||||
@ -411,7 +411,7 @@ namespace Components
|
|||||||
auto staticModel = world->dpvs.smodelDrawInsts[i];
|
auto staticModel = world->dpvs.smodelDrawInsts[i];
|
||||||
if (staticModel.model)
|
if (staticModel.model)
|
||||||
{
|
{
|
||||||
auto dist = Utils::Vec3SqrDistance(playerPosition, staticModel.placement.origin);
|
const auto dist = Utils::Maths::Vec3SqrDistance(playerPosition, staticModel.placement.origin);
|
||||||
if (dist < sqrDist)
|
if (dist < sqrDist)
|
||||||
{
|
{
|
||||||
Game::R_AddDebugString(staticModelsColor, staticModel.placement.origin, 1.0, staticModel.model->name);
|
Game::R_AddDebugString(staticModelsColor, staticModel.placement.origin, 1.0, staticModel.model->name);
|
||||||
|
@ -453,6 +453,11 @@ namespace Game
|
|||||||
|
|
||||||
player_die_t player_die = player_die_t(0x42BC70);
|
player_die_t player_die = player_die_t(0x42BC70);
|
||||||
|
|
||||||
|
Vec3Normalize_t Vec3Normalize = Vec3Normalize_t(0x453500);
|
||||||
|
Vec3NormalizeFast_t Vec3NormalizeFast = Vec3NormalizeFast_t(0x478F80);
|
||||||
|
Vec2Normalize_t Vec2Normalize = Vec2Normalize_t(0x416F70);
|
||||||
|
Vec2NormalizeFast_t Vec2NormalizeFast = Vec2NormalizeFast_t(0x5FC830);
|
||||||
|
|
||||||
XAssetHeader* DB_XAssetPool = reinterpret_cast<XAssetHeader*>(0x7998A8);
|
XAssetHeader* DB_XAssetPool = reinterpret_cast<XAssetHeader*>(0x7998A8);
|
||||||
unsigned int* g_poolSize = reinterpret_cast<unsigned int*>(0x7995E8);
|
unsigned int* g_poolSize = reinterpret_cast<unsigned int*>(0x7995E8);
|
||||||
|
|
||||||
@ -920,33 +925,6 @@ namespace Game
|
|||||||
return atoi(StringTable_Lookup(rankTable, 0, maxrank, 7));
|
return atoi(StringTable_Lookup(rankTable, 0, maxrank, 7));
|
||||||
}
|
}
|
||||||
|
|
||||||
float Vec2Normalize(vec2_t& vec)
|
|
||||||
{
|
|
||||||
const auto length = std::sqrt(vec[0] * vec[0] + vec[1] * vec[1]);
|
|
||||||
|
|
||||||
if (length > 0.0f)
|
|
||||||
{
|
|
||||||
vec[0] /= length;
|
|
||||||
vec[1] /= length;
|
|
||||||
}
|
|
||||||
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
float Vec3Normalize(vec3_t& vec)
|
|
||||||
{
|
|
||||||
const auto length = std::sqrt(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]);
|
|
||||||
|
|
||||||
if (length > 0.0f)
|
|
||||||
{
|
|
||||||
vec[0] /= length;
|
|
||||||
vec[1] /= length;
|
|
||||||
vec[2] /= length;
|
|
||||||
}
|
|
||||||
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Vec2UnpackTexCoords(const PackedTexCoords in, vec2_t* out)
|
void Vec2UnpackTexCoords(const PackedTexCoords in, vec2_t* out)
|
||||||
{
|
{
|
||||||
unsigned int v3; // xmm1_4
|
unsigned int v3; // xmm1_4
|
||||||
@ -1684,11 +1662,11 @@ namespace Game
|
|||||||
pushad
|
pushad
|
||||||
|
|
||||||
mov eax, [esp + 0x4 + 0x20] // dvar
|
mov eax, [esp + 0x4 + 0x20] // dvar
|
||||||
push[esp + 0x18 + 0x20] // source
|
push [esp + 0x18 + 0x20] // source
|
||||||
push[esp + 0x18 + 0x20] // value
|
push [esp + 0x18 + 0x20] // value
|
||||||
push[esp + 0x18 + 0x20] // value
|
push [esp + 0x18 + 0x20] // value
|
||||||
push[esp + 0x18 + 0x20] // value
|
push [esp + 0x18 + 0x20] // value
|
||||||
push[esp + 0x18 + 0x20] // value
|
push [esp + 0x18 + 0x20] // value
|
||||||
|
|
||||||
mov ebx, 0x647400
|
mov ebx, 0x647400
|
||||||
call ebx
|
call ebx
|
||||||
|
@ -1086,6 +1086,18 @@ namespace Game
|
|||||||
typedef void(__cdecl * player_die_t)(gentity_s* self, const gentity_s* inflictor, gentity_s* attacker, int damage, int meansOfDeath, int iWeapon, const float* vDir, const hitLocation_t hitLoc, int psTimeOffset);
|
typedef void(__cdecl * player_die_t)(gentity_s* self, const gentity_s* inflictor, gentity_s* attacker, int damage, int meansOfDeath, int iWeapon, const float* vDir, const hitLocation_t hitLoc, int psTimeOffset);
|
||||||
extern player_die_t player_die;
|
extern player_die_t player_die;
|
||||||
|
|
||||||
|
typedef float(__cdecl * Vec3Normalize_t)(float* v);
|
||||||
|
extern Vec3Normalize_t Vec3Normalize;
|
||||||
|
|
||||||
|
typedef void(__cdecl * Vec3NormalizeFast_t)(float* v);
|
||||||
|
extern Vec3NormalizeFast_t Vec3NormalizeFast;
|
||||||
|
|
||||||
|
typedef float(__cdecl * Vec2Normalize_t)(float* v);
|
||||||
|
extern Vec2Normalize_t Vec2Normalize;
|
||||||
|
|
||||||
|
typedef void(__cdecl * Vec2NormalizeFast_t)(float* v);
|
||||||
|
extern Vec2NormalizeFast_t Vec2NormalizeFast;
|
||||||
|
|
||||||
extern XAssetHeader* DB_XAssetPool;
|
extern XAssetHeader* DB_XAssetPool;
|
||||||
extern unsigned int* g_poolSize;
|
extern unsigned int* g_poolSize;
|
||||||
|
|
||||||
@ -1301,8 +1313,6 @@ namespace Game
|
|||||||
|
|
||||||
void Image_Setup(GfxImage* image, unsigned int width, unsigned int height, unsigned int depth, unsigned int flags, _D3DFORMAT format);
|
void Image_Setup(GfxImage* image, unsigned int width, unsigned int height, unsigned int depth, unsigned int flags, _D3DFORMAT format);
|
||||||
|
|
||||||
float Vec2Normalize(vec2_t& vec);
|
|
||||||
float Vec3Normalize(vec3_t& vec);
|
|
||||||
void Vec2UnpackTexCoords(const PackedTexCoords in, vec2_t* out);
|
void Vec2UnpackTexCoords(const PackedTexCoords in, vec2_t* out);
|
||||||
void MatrixVecMultiply(const float(&mulMat)[3][3], const vec3_t& mulVec, vec3_t& solution);
|
void MatrixVecMultiply(const float(&mulMat)[3][3], const vec3_t& mulVec, vec3_t& solution);
|
||||||
void QuatRot(vec3_t* vec, const vec4_t* quat);
|
void QuatRot(vec3_t* vec, const vec4_t* quat);
|
||||||
|
@ -128,6 +128,7 @@ using namespace std::literals;
|
|||||||
#include "Utils/IO.hpp"
|
#include "Utils/IO.hpp"
|
||||||
#include "Utils/Json.hpp"
|
#include "Utils/Json.hpp"
|
||||||
#include "Utils/Library.hpp"
|
#include "Utils/Library.hpp"
|
||||||
|
#include "Utils/Maths.hpp"
|
||||||
#include "Utils/String.hpp"
|
#include "Utils/String.hpp"
|
||||||
#include "Utils/Thread.hpp"
|
#include "Utils/Thread.hpp"
|
||||||
#include "Utils/Time.hpp"
|
#include "Utils/Time.hpp"
|
||||||
|
46
src/Utils/Maths.cpp
Normal file
46
src/Utils/Maths.cpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#include <STDInclude.hpp>
|
||||||
|
|
||||||
|
namespace Utils::Maths
|
||||||
|
{
|
||||||
|
float DotProduct(float v1[3], float v2[3])
|
||||||
|
{
|
||||||
|
return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void VectorSubtract(float va[3], float vb[3], float out[3])
|
||||||
|
{
|
||||||
|
out[0] = va[0] - vb[0];
|
||||||
|
out[1] = va[1] - vb[1];
|
||||||
|
out[2] = va[2] - vb[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void VectorAdd(float va[3], float vb[3], float out[3])
|
||||||
|
{
|
||||||
|
out[0] = va[0] + vb[0];
|
||||||
|
out[1] = va[1] + vb[1];
|
||||||
|
out[2] = va[2] + vb[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void VectorCopy(float in[3], float out[3])
|
||||||
|
{
|
||||||
|
out[0] = in[0];
|
||||||
|
out[1] = in[1];
|
||||||
|
out[2] = in[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void VectorScale(float v[3], float scale, float out[3])
|
||||||
|
{
|
||||||
|
out[0] = v[0] * scale;
|
||||||
|
out[1] = v[1] * scale;
|
||||||
|
out[2] = v[2] * scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Vec3SqrDistance(float v1[3], float v2[3])
|
||||||
|
{
|
||||||
|
float out[3];
|
||||||
|
|
||||||
|
VectorSubtract(v2, v1, out);
|
||||||
|
|
||||||
|
return (out[0] * out[0]) + (out[1] * out[1]) + (out[2] * out[2]);
|
||||||
|
}
|
||||||
|
}
|
15
src/Utils/Maths.hpp
Normal file
15
src/Utils/Maths.hpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Utils::Maths
|
||||||
|
{
|
||||||
|
// Macros in Quake-III
|
||||||
|
constexpr auto VectorClear(float x[3]) { x[0] = x[1] = x[2] = 0; }
|
||||||
|
constexpr auto VectorNegate(float x[3]) { x[0] = -x[0]; x[1] = -x[1]; x[2] = -x[2]; }
|
||||||
|
|
||||||
|
float DotProduct(float v1[3], float v2[3]);
|
||||||
|
void VectorSubtract(float va[3], float vb[3], float out[3]);
|
||||||
|
void VectorAdd(float va[3], float vb[3], float out[3]);
|
||||||
|
void VectorCopy(float in[3], float out[3]);
|
||||||
|
void VectorScale(float v[3], float scale, float out[3]);
|
||||||
|
float Vec3SqrDistance(float v1[3], float v2[3]);
|
||||||
|
}
|
@ -145,15 +145,4 @@ namespace Utils
|
|||||||
{
|
{
|
||||||
return !(base1 + len1 <= base2 || base2 + len2 <= base1);
|
return !(base1 + len1 <= base2 || base2 + len2 <= base1);
|
||||||
}
|
}
|
||||||
|
|
||||||
float Vec3SqrDistance(const float v1[3], const float v2[3])
|
|
||||||
{
|
|
||||||
auto x = v2[0] - v1[0];
|
|
||||||
auto y = v2[1] - v1[1];
|
|
||||||
auto z = v2[2] - v1[2];
|
|
||||||
|
|
||||||
return x * x + y * y + z * z;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,9 +24,8 @@ namespace Utils
|
|||||||
void OpenUrl(const std::string& url);
|
void OpenUrl(const std::string& url);
|
||||||
|
|
||||||
bool HasIntercection(unsigned int base1, unsigned int len1, unsigned int base2, unsigned int len2);
|
bool HasIntercection(unsigned int base1, unsigned int len1, unsigned int base2, unsigned int len2);
|
||||||
float Vec3SqrDistance(const float v1[3], const float v2[3]);
|
|
||||||
|
|
||||||
template <typename T> inline void RotLeft(T& object, size_t bits)
|
template <typename T> void RotLeft(T& object, size_t bits)
|
||||||
{
|
{
|
||||||
bits %= sizeof(T) * 8;
|
bits %= sizeof(T) * 8;
|
||||||
|
|
||||||
@ -39,13 +38,13 @@ namespace Utils
|
|||||||
object |= T(negative) << ((sizeof(T) * 8 - 1 + bits) % (sizeof(T) * 8));
|
object |= T(negative) << ((sizeof(T) * 8 - 1 + bits) % (sizeof(T) * 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> inline void RotRight(T& object, size_t bits)
|
template <typename T> void RotRight(T& object, size_t bits)
|
||||||
{
|
{
|
||||||
bits %= (sizeof(T) * 8);
|
bits %= (sizeof(T) * 8);
|
||||||
RotLeft<T>(object, ((sizeof(T) * 8) - bits));
|
RotLeft<T>(object, ((sizeof(T) * 8) - bits));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> inline void Merge(std::vector<T>* target, T* source, size_t length)
|
template <typename T> void Merge(std::vector<T>* target, T* source, size_t length)
|
||||||
{
|
{
|
||||||
if (source)
|
if (source)
|
||||||
{
|
{
|
||||||
@ -56,7 +55,7 @@ namespace Utils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> inline void Merge(std::vector<T>* target, std::vector<T> source)
|
template <typename T> void Merge(std::vector<T>* target, std::vector<T> source)
|
||||||
{
|
{
|
||||||
for (auto &entry : source)
|
for (auto &entry : source)
|
||||||
{
|
{
|
||||||
@ -122,7 +121,4 @@ namespace Utils
|
|||||||
mutable std::recursive_mutex mutex;
|
mutable std::recursive_mutex mutex;
|
||||||
std::vector<Slot<T>> slots;
|
std::vector<Slot<T>> slots;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
constexpr auto VectorCopy(T a, T b) { b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; }
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user