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:
36
Engine/CrossM/Include/CollisionEllipsoidHelper.h
Normal file
36
Engine/CrossM/Include/CollisionEllipsoidHelper.h
Normal 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;
|
||||
};
|
||||
|
||||
}}
|
||||
9
Engine/CrossM/Include/MathConst.h
Normal file
9
Engine/CrossM/Include/MathConst.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
namespace CrossM{
|
||||
namespace Math{
|
||||
|
||||
const float F_EPSILON = 1.0e-5f;
|
||||
const float F_PI = 3.1415926535f;
|
||||
|
||||
}}
|
||||
84
Engine/CrossM/Include/MathUtil.h
Normal file
84
Engine/CrossM/Include/MathUtil.h
Normal 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);
|
||||
}
|
||||
137
Engine/CrossM/Include/OctreeCollider.h
Normal file
137
Engine/CrossM/Include/OctreeCollider.h
Normal 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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
}}
|
||||
216
Engine/CrossM/Include/Vector3.h
Normal file
216
Engine/CrossM/Include/Vector3.h
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
}}
|
||||
Reference in New Issue
Block a user