Initial commit: ROW Client source code

Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 16:24:34 +09:00
commit e067522598
5135 changed files with 1745744 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
#pragma once
#include "./Vector3.h"
namespace CrossM{
namespace Scene{
class CCollisionEllipsoidHelper{
public:
CCollisionEllipsoidHelper();
~CCollisionEllipsoidHelper();
void SetEllipsoidRadius(const Math::VECTOR3& vRadius);
void SetHeightBias(float f);
// height bias <20><> <20><><EFBFBD>õ<EFBFBD> <20><>, <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20><> <20><> <20>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD>
void SetEllipsoidCenter(const Math::VECTOR3& vCenter);
void SetPosition(const Math::VECTOR3& vPos);
const Math::VECTOR3& GetEllipsoidRadius();
const Math::VECTOR3& GetEllipsoidCenter();
Math::VECTOR3 GetPosition(); // client <20><><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ
private:
// <20>浹 Ÿ<><C5B8>ü<EFBFBD><C3BC> <20>߽ɰ<DFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Math::VECTOR3 m_vEllipoidCenter;
Math::VECTOR3 m_vEllipsoidRaius;
// client <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF>ϴ<EFBFBD> <20><EFBFBD><E6B5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>ü <20>߽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> bias<61><73>
float m_fHeightBias;
};
}}

View File

@@ -0,0 +1,9 @@
#pragma once
namespace CrossM{
namespace Math{
const float F_EPSILON = 1.0e-5f;
const float F_PI = 3.1415926535f;
}}

View File

@@ -0,0 +1,84 @@
#include "./MathConst.h"
#include "./Vector3.h"
#pragma once
namespace CrossM{
namespace Math{
inline bool IsEquivalent(const float f1, const float f2, const float fEpsilon = F_EPSILON)
{
float d = f1 - f2;
return (d < fEpsilon && d > -fEpsilon);
}
/*!
<09><> v <20><> boxMin, boxMax <20><> <20>ּ<EFBFBD>/<2F>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AABB <20><> <20><><EFBFBD>ԵǴ<D4B5><C7B4><EFBFBD> <20><><EFBFBD>θ<EFBFBD> üũ
<09><><EFBFBD>Ե<EFBFBD> <20><><EFBFBD><EFBFBD> true, <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> false <20><>ȯ
*/
inline bool IsPointInAABB(const VECTOR3& vPoint, const VECTOR3& vAABBMin , const VECTOR3& vAABBMax)
{
if (vAABBMin.x <= vPoint.x && vPoint.x < vAABBMax.x &&
vAABBMin.y <= vPoint.y && vPoint.y < vAABBMax.y &&
vAABBMin.z <= vPoint.z && vPoint.z < vAABBMax.z)
{
return true;
}
return false;
}
/*
f1Min ~ f1Max <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> f2Min ~ f2Max <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> üũ
<09><>, <20>ݵ<EFBFBD><DDB5><EFBFBD> f1Min <= f1Max, f2Min <= f2Max <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>
*/
inline bool IsRangeOverlap(float f1Min, float f1Max, float f2Min, float f2Max)
{
if (f1Min <= f2Max && f2Min <= f1Max)
{
return true;
}
return false;
}
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> AABB <20>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ<D4B5><C7B4><EFBFBD> <20><><EFBFBD>θ<EFBFBD> Ȯ<><C8AE>
bool IsTriangleInAabb(const VECTOR3& vAabbMin, const VECTOR3& vAabbMax, const VECTOR3& vTri0, const VECTOR3& vTri1, const VECTOR3& vTri2);
// AABB <20><> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> intersection <20>׽<EFBFBD>Ʈ
bool CheckAabbTriangleIntersection(const VECTOR3& vAabbMin, const VECTOR3& vAabbMax, const VECTOR3& vTri0, const VECTOR3& vTri1, const VECTOR3& vTri2);
// AABB <20><> AABB <20><> intersection <20>׽<EFBFBD>Ʈ
bool CheckAabbAabbIntersection(const VECTOR3& vAabb1Min, const VECTOR3& vAabb1Max, const VECTOR3& vAabb2Min, const VECTOR3& vAabb2Max);
// <20><EFBFBD><EFB0A2>/Sweeping Sphere <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü
struct TriangSweepingSphere
{
Math::VECTOR3 m_vTri0;
Math::VECTOR3 m_vTri1;
Math::VECTOR3 m_vTri2;
Math::VECTOR3 m_vSphereSweepStart;
Math::VECTOR3 m_vSphereSweepPath;
float m_fSphereRadius;
};
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> sweeping sphere <20><> <20><20>׽<EFBFBD>Ʈ. <20><EFBFBD><E6B5B9> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E6B5B9> <20>Ͼ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>
bool CheckTriangleSweepingSphereCollision(float &fOutT, VECTOR3& vOutContactPoint, bool& bOutContactInsideTriangle, const TriangSweepingSphere& triAndSphere);
// <20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǾ<D4B5><C7BE>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
bool IsPointInTriangle(const VECTOR3& vPoint, const VECTOR3& vTri0, const VECTOR3& vTri1, const VECTOR3& vTri2);
}}
// <20>ӽÿ<D3BD> vector3 <20><EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
template<class _T>
void ConvVector3(CrossM::Math::VECTOR3& v, const _T& vOld)
{
v.SetValue(vOld.x, vOld.y, vOld.z);
}

View File

@@ -0,0 +1,137 @@
/*
Collision detection + response <20><> ó<><C3B3><EFBFBD>ϴ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
<20><20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> culling <20><> octree <20><> <20>̿<EFBFBD>
collision detection <20><> response <20>˰<EFBFBD><CBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Kasper Fauerby <20><>
'Improved Collision detection and Response' <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ڵ<EFBFBD><DAB5>̴<EFBFBD>
*/
#pragma once
#include "./Vector3.h"
#include <vector>
// forward decl.
struct IDirect3DDevice8;
namespace CrossM{
namespace Scene{
struct CollisionTriangleInfo
{
Math::VECTOR3 m_avVertex[3];
// <20>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD>..<2E≯<EFBFBD><CCB8>׸<EFBFBD> <20><> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> id <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>ҵ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ Ŭ<><C5AC><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>/<2F>Ͽ콺/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ)+<2B><> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƮID(<28><> <20>Ͽ콺<CFBF><ECBDBA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ)
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
Math::VECTOR3 m_vFaceNormal;
};
// octree <20><> node. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ϶<C6B4> <20>ٱ<EFBFBD> <20><><EFBFBD><20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
// <20>ٿ<EFBFBD><D9BF><EFBFBD> <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ<D4B5> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ϵȴ<CFB5>.
// (<28><><EFBFBD><20><>ġ<EFBFBD><C4A1> <20><> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>ϵ<EFBFBD>)
class COctreeCollisionNode
{
public:
COctreeCollisionNode();
~COctreeCollisionNode();
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void ReleaseSubNode();
// leaf node <20><><EFBFBD><EFBFBD> üũ
bool IsLeafNode();
// <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>Ե<EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>л<EFBFBD><D0BB><EFBFBD>Ų<EFBFBD><C5B2>.
// <20>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BFA1> <20>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20>Ѵ<EFBFBD>.
void BuildSubNode(
const std::vector< CollisionTriangleInfo >& vecTriangle,
const size_t nMaximumRecursion, const size_t nMinPolyCount,
size_t nCurrentRecursionLevel);
// <20><20><>ü<EFBFBD><C3BC> swept volume <20><> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> vecCollidableNode <20><> <20><><EFBFBD><EFBFBD>
void CollectCollidableNodes(
const Math::VECTOR3& vSweptVolumeMin, const Math::VECTOR3& vSweptVolumeMax,
std::vector< COctreeCollisionNode* >& vecCollidableNode);
Math::VECTOR3 m_vBoundingMin;
Math::VECTOR3 m_vBoundingMax;
std::vector< size_t > m_vecTriangleIndex;
COctreeCollisionNode* m_apSubNode[8];
};
class COctreeCollider
{
public:
COctreeCollider();
~COctreeCollider();
//////////////////////////////////////////////////////////////////////////
//
// Octree Build <20><><EFBFBD><EFBFBD> <20>޼ҵ<DEBC>
/*
<09><20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
<09><20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD><D2B4>ǰ<EFBFBD>, octree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1>ȴ<EFBFBD>.
BuildOctree() <20><> ȣ<><C8A3><EFBFBD>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> COctreeCollider <20><> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>
*/
void SetTriangleCount(unsigned int uiTriangleCount);
/*
<09><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><>ȯ.
<09><> <20>޼ҵ带 ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, octree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1>ȴ<EFBFBD>.
BuildOctree() <20><> ȣ<><C8A3><EFBFBD>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> COctreeCollider <20><> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>
*/
void GetTriangleDataPtr(CollisionTriangleInfo*& pTriangleData);
// <20><><EFBFBD>õ<EFBFBD> <20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʷ<EFBFBD> octree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool BuildOctree(const size_t nMaximumRecursion, const size_t nMinPolyCount);
//////////////////////////////////////////////////////////////////////////
//
// <20><EFBFBD><E6B5B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>޼ҵ<DEBC>
/*
<09>־<EFBFBD><D6BE><EFBFBD> Ÿ<><C5B8>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><>ġ(prevPos)<29><> <20>̵<EFBFBD><CCB5><EFBFBD> <20><>ġ(nextPos) <20><> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>ͷ<EFBFBD> <20>ѱ<EFBFBD><D1B1><EFBFBD>,
<09><EFBFBD><E6B5B9> üũ<C3BC>ϰ<EFBFBD> <20><EFBFBD><E6B5B9> <20>Ͼ<CFBE><EEB3B5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
*/
void GetCollisionRespondingPosition(
Math::VECTOR3& vRespondingPos,
const Math::VECTOR3& vPrevPos, const Math::VECTOR3& vNewPos,
const Math::VECTOR3& vEllipsoidRadius,
const unsigned int nRecursionLevel = 1);
// <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20>޼ҵ<DEBC>, <20><EFBFBD><E6B5B9> <20>Ͼ <20><> <20>ִ°<D6B4><C2B0><EFBFBD><EFBFBD><EFBFBD> Ȯ<>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void RenderCollidableNodeTriangles(IDirect3DDevice8* pDevice);
private:
std::vector< CollisionTriangleInfo > m_vecCollisionTriangle;
Math::VECTOR3 m_vCollisionBoundingMin;
Math::VECTOR3 m_vCollisionBoundingMax;
COctreeCollisionNode m_octreeRootNode;
// <20>ӽÿ<D3BD>, <20><EFBFBD><E6B5B9> <20>Ͼ <20><> <20>ִ°<D6B4><C2B0><EFBFBD><EFBFBD><EFBFBD> Ȯ<>ε<EFBFBD> leaf <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector< COctreeCollisionNode* > m_vecpCollidableNode;
// <20>ӽÿ<D3BD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector< Math::VECTOR3 > m_vecRenderVertex;
// <20>ӽÿ<D3BD>. <20><EFBFBD><E6B5B9> <20>Ͼ <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
size_t m_nColTriIndex;
};
}}

View File

@@ -0,0 +1,216 @@
#pragma once
#include "./MathConst.h"
#include <math.h>
namespace CrossM{
namespace Math{
struct VECTOR3
{
VECTOR3() {}
~VECTOR3() {}
VECTOR3(const float _x, const float _y, const float _z) : x(_x), y(_y), z(_z) {}
VECTOR3(const VECTOR3& v) : x(v.x), y(v.y), z(v.z) {}
void SetValue(const float _x, const float _y, const float _z)
{
x = _x;
y = _y;
z = _z;
}
float x, y, z;
};
//////////////////////////////////////////////////////////////////////////
inline VECTOR3& SetZeroVector(VECTOR3& v)
{
v.x = v.y = v.z = 0.0f;
return v;
}
// <20><><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
inline VECTOR3& SetValue(VECTOR3& vOut, const float x, const float y, const float z)
{
vOut.x = x;
vOut.y = y;
vOut.z = z;
return vOut;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD>
inline float GetLength(const VECTOR3& v)
{
return sqrtf(v.x*v.x + v.y*v.y + v.z*v.z);
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
inline float GetSquaredLength(const VECTOR3& v)
{
return v.x*v.x + v.y*v.y + v.z*v.z;
}
// Normalize
inline VECTOR3& Normalize(VECTOR3& vOut, const VECTOR3& vIn)
{
float fLen = GetLength(vIn);
if (fLen < F_EPSILON)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> 0<><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> x<><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2BAA4>
SetValue(vOut, 1.0f, 0.0f, 0.0f);
return vOut;
}
float fInv = 1.0f / fLen;
vOut.x = vIn.x * fInv;
vOut.y = vIn.y * fInv;
vOut.z = vIn.z * fInv;
return vOut;
}
// vOut = -vIn;
inline VECTOR3& Negate(VECTOR3& vOut, const VECTOR3& vIn)
{
vOut.x = -vIn.x;
vOut.y = -vIn.y;
vOut.z = -vIn.z;
return vOut;
}
// vOut = fScale x vIn
inline VECTOR3& Scale(VECTOR3& vOut, const VECTOR3& vIn, const float fScale)
{
vOut.x = vIn.x * fScale;
vOut.y = vIn.y * fScale;
vOut.z = vIn.z * fScale;
return vOut;
}
// vOut = v1 + v2
inline VECTOR3& Add(VECTOR3& vOut, const VECTOR3& v1, const VECTOR3& v2)
{
vOut.x = v1.x + v2.x;
vOut.y = v1.y + v2.y;
vOut.z = v1.z + v2.z;
return vOut;
}
// vOut = v1 - v2
inline VECTOR3& Subtract(VECTOR3& vOut, const VECTOR3& v1, const VECTOR3& v2)
{
vOut.x = v1.x - v2.x;
vOut.y = v1.y - v2.y;
vOut.z = v1.z - v2.z;
return vOut;
}
// v1 <20><> v2 <20><> <20><><EFBFBD><EFBFBD>.
inline float DotProduct(const VECTOR3& v1, const VECTOR3& v2)
{
return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
}
// v1 <20><> v2 <20><> <20><><EFBFBD><EFBFBD>. vOut = v1 x v2
inline VECTOR3& CrossProduct(VECTOR3& vOut, const VECTOR3& v1, const VECTOR3& v2)
{
VECTOR3 vTmp; // vOut <20><> v1 <20>̳<EFBFBD> v2 <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽú<D3BD><C3BA><EFBFBD>
vTmp.x = v1.y*v2.z - v1.z*v2.y;
vTmp.y = v1.z*v2.x - v1.x*v2.z;
vTmp.z = v1.x*v2.y - v1.y*v2.x;
vOut = vTmp;
return vOut;
}
// v1 <20><><EFBFBD><EFBFBD> v2 <20><> <20><><EFBFBD><EFBFBD> f<><66>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
inline VECTOR3& Lerp(VECTOR3& vOut, const VECTOR3& v1, const VECTOR3& v2, const float f)
{
float fRem = 1.0f - f;
vOut.x = v1.x*fRem + v2.x*f;
vOut.y = v1.y*fRem + v2.y*f;
vOut.z = v1.z*fRem + v2.z*f;
return vOut;
}
//////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline VECTOR3 operator - (const VECTOR3& v)
{
VECTOR3 vRet;
return Negate(vRet, v);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline VECTOR3 operator + (const VECTOR3& v1, const VECTOR3& v2)
{
VECTOR3 vRet;
return Add(vRet, v1, v2);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline VECTOR3 operator - (const VECTOR3& v1, const VECTOR3& v2)
{
VECTOR3 vRet;
return Subtract(vRet, v1, v2);
}
// <20><><EFBFBD><EFBFBD> <20><>Į<EFBFBD><C4AE><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
inline VECTOR3 operator * (const float f, const VECTOR3& v)
{
VECTOR3 vRet;
return Scale(vRet, v, f);
}
// <20><><EFBFBD><EFBFBD> <20><>Į<EFBFBD><C4AE><EFBFBD><EFBFBD>(<28><><EFBFBD>͸<EFBFBD><CDB8><EFBFBD>)
inline VECTOR3 operator * (const VECTOR3& v, const float f)
{
VECTOR3 vRet;
return Scale(vRet, v, f);
}
// <20><><EFBFBD><EFBFBD> <20><>Į<EFBFBD><C4AE><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
inline VECTOR3 operator / (const VECTOR3& v, const float& f)
{
VECTOR3 vRet;
return Scale(vRet, v, 1.0f/f);
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
inline float operator * (const VECTOR3& v1, const VECTOR3& v2)
{
return DotProduct(v1, v2);
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
inline VECTOR3 operator ^ (const VECTOR3& v1, const VECTOR3& v2)
{
VECTOR3 vRet;
return CrossProduct(vRet, v1, v2);
}
}}