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

256
Engine/CrossM/CrossM.vcproj Normal file
View File

@@ -0,0 +1,256 @@
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="CrossM"
ProjectGUID="{540A7517-D29E-4835-8392-1922B8D53B7B}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="./Include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CrossM.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="./Include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CrossM.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release_NoGD|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="./Include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CrossM.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release_MY|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="./Include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CrossM.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Debug_MY|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="./Include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CrossM.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Math"
Filter="">
<File
RelativePath=".\Include\MathConst.h">
</File>
<File
RelativePath=".\Src\MathUtil.cpp">
</File>
<File
RelativePath=".\Include\MathUtil.h">
</File>
<File
RelativePath=".\Include\Vector3.h">
</File>
</Filter>
<Filter
Name="Scene"
Filter="">
<File
RelativePath=".\Src\CollisionEllipsoidHelper.cpp">
</File>
<File
RelativePath=".\Include\CollisionEllipsoidHelper.h">
</File>
<File
RelativePath=".\Src\OctreeCollider.cpp">
</File>
<File
RelativePath=".\Include\OctreeCollider.h">
</File>
</Filter>
<File
RelativePath=".\ReadMe.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug_MY|Win32">
<Configuration>Debug_MY</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_MY|Win32">
<Configuration>Release_MY</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_NoGD|Win32">
<Configuration>Release_NoGD</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{540A7517-D29E-4835-8392-1922B8D53B7B}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>./Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CrossM.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>./Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<OpenMPSupport>true</OpenMPSupport>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CrossM.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>./Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CrossM.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>./Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CrossM.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>./Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CrossM.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="Include\MathConst.h" />
<ClInclude Include="Include\MathUtil.h" />
<ClInclude Include="Include\Vector3.h" />
<ClInclude Include="Include\CollisionEllipsoidHelper.h" />
<ClInclude Include="Include\OctreeCollider.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Src\MathUtil.cpp" />
<ClCompile Include="Src\CollisionEllipsoidHelper.cpp" />
<ClCompile Include="Src\OctreeCollider.cpp" />
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Math">
<UniqueIdentifier>{1d328367-6680-4a76-8582-a7986b1ef097}</UniqueIdentifier>
</Filter>
<Filter Include="Scene">
<UniqueIdentifier>{a57a23b6-3e84-4fbe-86a4-66cbe049b94b}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Include\MathConst.h">
<Filter>Math</Filter>
</ClInclude>
<ClInclude Include="Include\MathUtil.h">
<Filter>Math</Filter>
</ClInclude>
<ClInclude Include="Include\Vector3.h">
<Filter>Math</Filter>
</ClInclude>
<ClInclude Include="Include\CollisionEllipsoidHelper.h">
<Filter>Scene</Filter>
</ClInclude>
<ClInclude Include="Include\OctreeCollider.h">
<Filter>Scene</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Src\MathUtil.cpp">
<Filter>Math</Filter>
</ClCompile>
<ClCompile Include="Src\CollisionEllipsoidHelper.cpp">
<Filter>Scene</Filter>
</ClCompile>
<ClCompile Include="Src\OctreeCollider.cpp">
<Filter>Scene</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
</ItemGroup>
</Project>

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);
}
}}

21
Engine/CrossM/ReadMe.txt Normal file
View File

@@ -0,0 +1,21 @@
========================================================================
<20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺귯<CCBA><EAB7AF> : CrossM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
========================================================================
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7BFA1> <20><> CrossM <20><><EFBFBD>̺귯<CCBA><EAB7AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.
CrossM.vcproj
<20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VC++ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
<20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visual C++<2B><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD>
<20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ɿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.
/////////////////////////////////////////////////////////////////////////////
<EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD>:
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7BFA1> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> "TODO:" <20>ּ<EFBFBD><D6BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>߰<EFBFBD><DFB0>ϰų<CFB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϴ<EFBFBD>
<EFBFBD>ҽ<EFBFBD> <20>ڵ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD>ϴ<EFBFBD>.
/////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,56 @@
#include "../Include/CollisionEllipsoidHelper.h"
namespace CrossM{
namespace Scene{
CCollisionEllipsoidHelper::CCollisionEllipsoidHelper()
{
m_vEllipoidCenter.SetValue(0,0,0);
m_vEllipsoidRaius.SetValue(1,1,1);
m_fHeightBias = 0.0f;
}
CCollisionEllipsoidHelper::~CCollisionEllipsoidHelper()
{
}
void CCollisionEllipsoidHelper::SetEllipsoidRadius(const Math::VECTOR3& vRadius)
{
m_vEllipsoidRaius = vRadius;
}
void CCollisionEllipsoidHelper::SetHeightBias(float f)
{
m_fHeightBias = f;
}
void CCollisionEllipsoidHelper::SetEllipsoidCenter(const Math::VECTOR3& vCenter)
{
m_vEllipoidCenter = vCenter;
}
void CCollisionEllipsoidHelper::SetPosition(const Math::VECTOR3& vPos)
{
m_vEllipoidCenter.SetValue(vPos.x, vPos.y-m_fHeightBias, vPos.z);
}
const Math::VECTOR3& CCollisionEllipsoidHelper::GetEllipsoidRadius()
{
return m_vEllipsoidRaius;
}
const Math::VECTOR3& CCollisionEllipsoidHelper::GetEllipsoidCenter()
{
return m_vEllipoidCenter;
}
Math::VECTOR3 CCollisionEllipsoidHelper::GetPosition()
{
return Math::VECTOR3(m_vEllipoidCenter.x, m_vEllipoidCenter.y+m_fHeightBias, m_vEllipoidCenter.z);
}
}}

View File

@@ -0,0 +1,419 @@
#include "../Include/MathUtil.h"
#include <algorithm>
namespace CrossM{
namespace Math{
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> AABB <20>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ<D4B5><C7B4><EFBFBD> <20>˻<EFBFBD>
bool IsTriangleInAabb(const VECTOR3& vAabbMin, const VECTOR3& vAabbMax, const VECTOR3& vTri0, const VECTOR3& vTri1, const VECTOR3& vTri2)
{
if (vAabbMin.x <= vTri0.x && vTri0.x <= vAabbMax.x &&
vAabbMin.y <= vTri0.y && vTri0.y <= vAabbMax.y &&
vAabbMin.z <= vTri0.z && vTri0.z <= vAabbMax.z &&
vAabbMin.x <= vTri1.x && vTri1.x <= vAabbMax.x &&
vAabbMin.y <= vTri1.y && vTri1.y <= vAabbMax.y &&
vAabbMin.z <= vTri1.z && vTri1.z <= vAabbMax.z &&
vAabbMin.x <= vTri2.x && vTri2.x <= vAabbMax.x &&
vAabbMin.y <= vTri2.y && vTri2.y <= vAabbMax.y &&
vAabbMin.z <= vTri2.z && vTri2.z <= vAabbMax.z)
{
return true;
}
return false;
}
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> AABB <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
bool CheckAabbTriangleIntersection(const VECTOR3& vAabbMin, const VECTOR3& vAabbMax, const VECTOR3& vTri0, const VECTOR3& vTri1, const VECTOR3& vTri2)
{
// Separation of Axes <20><> <20><><EFBFBD><EFBFBD> AABB - triangle intersection test <20><><EFBFBD><EFBFBD>
// 6 <20><20><><EFBFBD><EFBFBD> AABB <20><> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> projection <20><> <20><>, <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD><C2B0>̰<EFBFBD>, <20><> <20><20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ʴ´ٸ<C2B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>
float fBoxProjectionMin, fBoxProjectionMax;
float fTriProjectionMin, fTriProjectionMax;
// AABB <20><> <20><> <20><20><><EFBFBD><EFBFBD> projection <20><> <20>˻<EFBFBD>
// X <20><>
fBoxProjectionMin = vAabbMin.x;
fBoxProjectionMax = vAabbMax.x;
fTriProjectionMin = std::min(vTri0.x, std::min(vTri1.x, vTri2.x));
fTriProjectionMax = std::max(vTri0.x, std::max(vTri1.x, vTri2.x));
if (false == IsRangeOverlap(fTriProjectionMin, fTriProjectionMax, fBoxProjectionMin, fBoxProjectionMax))
{
return false;
}
// Y <20><>
fBoxProjectionMin = vAabbMin.y;
fBoxProjectionMax = vAabbMax.y;
fTriProjectionMin = std::min(vTri0.y, std::min(vTri1.y, vTri2.y));
fTriProjectionMax = std::max(vTri0.y, std::max(vTri1.y, vTri2.y));
if (false == IsRangeOverlap(fTriProjectionMin, fTriProjectionMax, fBoxProjectionMin, fBoxProjectionMax))
{
return false;
}
// Z <20><>
fBoxProjectionMin = vAabbMin.z;
fBoxProjectionMax = vAabbMax.z;
fTriProjectionMin = std::min(vTri0.z, std::min(vTri1.z, vTri2.z));
fTriProjectionMax = std::max(vTri0.z, std::max(vTri1.z, vTri2.z));
if (false == IsRangeOverlap(fTriProjectionMin, fTriProjectionMax, fBoxProjectionMin, fBoxProjectionMax))
{
return false;
}
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><> <20><> <20><20><><EFBFBD><EFBFBD> projection <20><> <20>˻<EFBFBD>
VECTOR3 avAxis[3]; // <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><> <20>𼭸<EFBFBD>
Math::Subtract(avAxis[0], vTri1, vTri0);
Math::Subtract(avAxis[1], vTri2, vTri0);
Math::Subtract(avAxis[2], vTri2, vTri1);
// <20><EFBFBD><EFB0A2> <20><> <20><><EFBFBD><EFBFBD> <20>࿡ projection <20><> <20><>
float fProjectionTri0, fProjectionTri1, fProjectionTri2;
for (int i = 0; i < 3; ++i)
{
VECTOR3& vAxis = avAxis[i];
// AABB <20><> max/min <20><><EFBFBD><EFBFBD> xyz <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>/<2F>ּҰ<D6BC><D2B0>̹Ƿ<CCB9>,
// axis <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ밪<D6B4><EBB0AA> <20><><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
// x,y,z <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ū <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
// (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AABB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> xyz <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>/<2F>ּҰ<D6BC><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9>,
// x,y,z <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ƿ<EFBFBD> <20>ִ<EFBFBD>/<2F>ּҸ<D6BC> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD> <20>ص<EFBFBD> <20><><EFBFBD>h <20><> <20>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ<D4B5> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.)
fBoxProjectionMin =
((vAxis.x > 0) ? vAabbMin.x : vAabbMax.x) * vAxis.x +
((vAxis.y > 0) ? vAabbMin.y : vAabbMax.y) * vAxis.y +
((vAxis.z > 0) ? vAabbMin.z : vAabbMax.z) * vAxis.z;
fBoxProjectionMax =
((vAxis.x > 0) ? vAabbMax.x : vAabbMin.x) * vAxis.x +
((vAxis.y > 0) ? vAabbMax.y : vAabbMin.y) * vAxis.y +
((vAxis.z > 0) ? vAabbMax.z : vAabbMin.z) * vAxis.z;
fProjectionTri0 = Math::DotProduct(vTri0, vAxis);
fProjectionTri1 = Math::DotProduct(vTri1, vAxis);
fProjectionTri2 = Math::DotProduct(vTri2, vAxis);
fTriProjectionMin = std::min(fProjectionTri0, std::min(fProjectionTri1, fProjectionTri2));
fTriProjectionMax = std::max(fProjectionTri0, std::max(fProjectionTri1, fProjectionTri2));
if (false == IsRangeOverlap(fTriProjectionMin, fTriProjectionMax, fBoxProjectionMin, fBoxProjectionMax))
{
return false;
}
}
return true;
}
// <20><> AABB <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
bool CheckAabbAabbIntersection(const VECTOR3& vAabb1Min, const VECTOR3& vAabb1Max, const VECTOR3& vAabb2Min, const VECTOR3& vAabb2Max)
{
if (false ==IsRangeOverlap(vAabb1Min.x, vAabb1Max.x, vAabb2Min.x, vAabb2Max.x)) return false;
if (false ==IsRangeOverlap(vAabb1Min.y, vAabb1Max.y, vAabb2Min.y, vAabb2Max.y)) return false;
if (false ==IsRangeOverlap(vAabb1Min.z, vAabb1Max.z, vAabb2Min.z, vAabb2Max.z)) return false;
return true;
}
// CheckTriangleSweepingSphereCollision <20><> <20>μ<EFBFBD> <20>Լ<EFBFBD>.
// ax^2 + bx + c <20><> <20><> <20><> min~max <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ظ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ذ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false <20><>ȯ
static bool GetLowestRootInRange(const float a, const float b, const float c, const float fMinRoot, const float fMaxRoot, float& fRoot)
{
// <20>Ǽ<EFBFBD><C7BC>ذ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> <20>Ǻ<EFBFBD><C7BA><EFBFBD> <20><><EFBFBD><EFBFBD>
float fDeterminant = b*b - 4.0f*a*c;
// <20>Ǽ<EFBFBD><C7BC>ذ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
if (fDeterminant < 0.0f) return false;
// <20>ΰ<EFBFBD><CEB0><EFBFBD> <20>ظ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
float fSqrtD = sqrtf(fDeterminant);
float r1 = (-b - fSqrtD) / (2*a);
float r2 = (-b + fSqrtD) / (2*a);
// r1 < r2 <20><> ũ<><20>ǵ<EFBFBD><C7B5><EFBFBD> <20><><EFBFBD><EFBFBD>
if (r1 > r2) std::swap(r1, r2);
// <20><><EFBFBD><EFBFBD><EFBFBD>ʺ<EFBFBD><CABA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǻ<EFBFBD><C7BA><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>طμ<D8B7> <20><><EFBFBD><EFBFBD>
if (r1 > fMinRoot && r1 < fMaxRoot)
{
fRoot = r1;
return true;
}
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ū <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>
if (r2 > fMinRoot && r2 < fMaxRoot)
{
fRoot = r2;
return true;
}
return false;
}
bool CheckTriangleSweepingSphereCollision(float &fOutT, VECTOR3& vOutContactPoint, bool& bOutContactInsideTriangle, const TriangSweepingSphere& triAndSphere)
{
// <20><EFBFBD><E0B0A3> alias
const Math::VECTOR3 &vBasePoint = triAndSphere.m_vSphereSweepStart;
const Math::VECTOR3 &vTri0 = triAndSphere.m_vTri0;
const Math::VECTOR3 &vTri1 = triAndSphere.m_vTri1;
const Math::VECTOR3 &vTri2 = triAndSphere.m_vTri2;
const Math::VECTOR3 &vPath = triAndSphere.m_vSphereSweepPath;
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><> <20>𼭸<EFBFBD>
Math::VECTOR3 vTriEdge01, vTriEdge02, vTriEdge12;
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> plane Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>
Math::VECTOR3 vTriPlaneNormal;
float fTriPlaneConstant;
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><> <20>𼭸<EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD>..
Math::Subtract(vTriEdge01, vTri1, vTri0);
Math::Subtract(vTriEdge02, vTri2, vTri0);
Math::Subtract(vTriEdge12, vTri2, vTri1);
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD>Ե<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD>
Math::CrossProduct(vTriPlaneNormal, vTriEdge01, vTriEdge02);
Math::Normalize(vTriPlaneNormal, vTriPlaneNormal);
fTriPlaneConstant = -Math::DotProduct(vTriPlaneNormal, vTri0);
// sweeping path <20><> <20><EFBFBD><E6B5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fNormalDotPath = Math::DotProduct(vTriPlaneNormal, vPath);
// sphere <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD>
if (fNormalDotPath > 0.0f)
{
return false;
}
float t0, t1;
bool bEmbededInPlane = false;
float fSignedDistBaseToTriPlane = Math::DotProduct(vTriPlaneNormal, vBasePoint) + fTriPlaneConstant;
if (0.0f == fNormalDotPath)
{
// sphere <20><> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (fabs(fSignedDistBaseToTriPlane) >= triAndSphere.m_fSphereRadius)
{
return false; // <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD><E9BFA1> <20>ָ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>
}
else
{
bEmbededInPlane = true;
t0 = 0.0f;
t1 = 1.0f;
}
}
else
{
t0 = (-triAndSphere.m_fSphereRadius-fSignedDistBaseToTriPlane)/fNormalDotPath;
t1 = (triAndSphere.m_fSphereRadius-fSignedDistBaseToTriPlane)/fNormalDotPath;
// t0 < t1 <20><><EFBFBD><EFBFBD> <20><>Ʈ
if (t0 > t1)
{
std::swap(t0, t1);
}
// t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sphere <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD>
if (t0 > 1.0f || t1 <0.0f)
{
return false;
}
// t <20><><EFBFBD><EFBFBD> 0~1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
t0 = std::max(t0, 0.0f);
t1 = std::min(t1, 1.0f);
}
VECTOR3 vContactPoint;
bool bFoundCollision = false;
float t = 1.0f;
// <20><EFBFBD><EFB0A2> <20><><EFBFBD>ο<EFBFBD> üũ
if (!bEmbededInPlane)
{
vContactPoint = vBasePoint + (vPath*t0) - vTriPlaneNormal;
if (IsPointInTriangle(vContactPoint, vTri0, vTri1, vTri2))
{
bFoundCollision = true;
t = t0;
}
}
// <20><><EFBFBD><EFBFBD> <20><EFBFBD><E6B5B9><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD>ߴٸ<DFB4> <20>𼭸<EFBFBD><F0BCADB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>
if (!bFoundCollision)
{
float fSQuaredPathLength = GetSquaredLength(vPath);
float a, b, c;
float newT;
float fSquaredRadius = triAndSphere.m_fSphereRadius*triAndSphere.m_fSphereRadius;
a = fSQuaredPathLength;
// vTri0
b = 2.0f * (DotProduct(vPath, vBasePoint - vTri0));
c = (Math::GetSquaredLength(vTri0 - vBasePoint) - fSquaredRadius);
if (GetLowestRootInRange(a, b, c, 0.0f, t, newT))
{
t = newT;
bFoundCollision = true;
vContactPoint = vTri0;
}
// vTri1
if (bFoundCollision)
{
b = 2.0f * (DotProduct(vPath, vBasePoint - vTri1));
c = (Math::GetSquaredLength(vTri1 - vBasePoint) - fSquaredRadius);
if (GetLowestRootInRange(a, b, c, 0.0f, t, newT))
{
t = newT;
bFoundCollision = true;
vContactPoint = vTri1;
}
}
// vTri2
if (bFoundCollision)
{
b = 2.0f * (DotProduct(vPath, vBasePoint - vTri2));
c = (Math::GetSquaredLength(vTri2 - vBasePoint) - fSquaredRadius);
if (GetLowestRootInRange(a, b, c, 0.0f, t, newT))
{
t = newT;
bFoundCollision = true;
vContactPoint = vTri0;
}
}
// <20>𼭸<EFBFBD><F0BCADB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ
VECTOR3 vBaseToVertex;
float fEdgeSquaredLength;
float fEdgeDotPath;
float fEdgeDotBaseToVertex;
// vTri0 ~ vTri1
vBaseToVertex = vTri0 - vBasePoint;
fEdgeSquaredLength = GetSquaredLength(vTriEdge01);
fEdgeDotPath = DotProduct(vTriEdge01, vPath);
fEdgeDotBaseToVertex = DotProduct(vTriEdge01, vBaseToVertex);
a = fEdgeSquaredLength* -fSQuaredPathLength +
fEdgeDotPath*fEdgeDotPath;
b = fEdgeSquaredLength* (2.0f*Math::DotProduct(vPath, vBaseToVertex)) -
2.0f*fEdgeDotPath*fEdgeDotBaseToVertex;
c = (fEdgeSquaredLength* (1.0f - Math::GetSquaredLength(vBaseToVertex)) +
fEdgeDotBaseToVertex*fEdgeDotBaseToVertex);
if (GetLowestRootInRange(a, b, c, 0.0f, t, newT))
{
float f = (fEdgeDotPath*t - fEdgeDotBaseToVertex) / fEdgeSquaredLength;
if (f >= 0.0f && f <= 1.0f)
{
t = newT;
bFoundCollision = true;
vContactPoint = vTri0 + vTriEdge01*f;
}
}
// vTri0 ~ vTri2
vBaseToVertex = vTri0 - vBasePoint;
fEdgeSquaredLength = GetSquaredLength(vTriEdge02);
fEdgeDotPath = DotProduct(vTriEdge02, vPath);
fEdgeDotBaseToVertex = DotProduct(vTriEdge02, vBaseToVertex);
a = fEdgeSquaredLength* -fSQuaredPathLength +
fEdgeDotPath*fEdgeDotPath;
b = fEdgeSquaredLength* (2.0f*Math::DotProduct(vPath, vBaseToVertex)) -
2.0f*fEdgeDotPath*fEdgeDotBaseToVertex;
c = (fEdgeSquaredLength* (1.0f - Math::GetSquaredLength(vBaseToVertex)) +
fEdgeDotBaseToVertex*fEdgeDotBaseToVertex);
if (GetLowestRootInRange(a, b, c, 0.0f, t, newT))
{
float f = (fEdgeDotPath*t - fEdgeDotBaseToVertex) / fEdgeSquaredLength;
if (f >= 0.0f && f <= 1.0f)
{
t = newT;
bFoundCollision = true;
vContactPoint = vTri0 + vTriEdge02*f;
}
}
// vTri1 ~ vTri2
vBaseToVertex = vTri1 - vBasePoint;
fEdgeSquaredLength = GetSquaredLength(vTriEdge12);
fEdgeDotPath = DotProduct(vTriEdge12, vPath);
fEdgeDotBaseToVertex = DotProduct(vTriEdge12, vBaseToVertex);
a = fEdgeSquaredLength* -fSQuaredPathLength +
fEdgeDotPath*fEdgeDotPath;
b = fEdgeSquaredLength* (2.0f*Math::DotProduct(vPath, vBaseToVertex)) -
2.0f*fEdgeDotPath*fEdgeDotBaseToVertex;
c = (fEdgeSquaredLength* (1.0f - Math::GetSquaredLength(vBaseToVertex)) +
fEdgeDotBaseToVertex*fEdgeDotBaseToVertex);
if (GetLowestRootInRange(a, b, c, 0.0f, t, newT))
{
float f = (fEdgeDotPath*t - fEdgeDotBaseToVertex) / fEdgeSquaredLength;
if (f >= 0.0f && f <= 1.0f)
{
t = newT;
bFoundCollision = true;
vContactPoint = vTri1 + vTriEdge12*f;
}
}
}
if (bFoundCollision)
{
fOutT = t;
vOutContactPoint = vContactPoint;
return true;
}
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ<D4B5><C7B4><EFBFBD> Ȯ<><C8AE><EFBFBD>ϴ<EFBFBD> <20>ڵ<EFBFBD>
// Fauerby <20><> <20>ۿ<EFBFBD> Keidy <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20>Ѵ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20>𸣰ڴ<F0B8A3B0>-_- <20>ϴ<EFBFBD> <20>̿<EFBFBD>
bool IsPointInTriangle(const VECTOR3& p, const VECTOR3& vTri0, const VECTOR3& vTri1, const VECTOR3& vTri2)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><EFBFBD><EFB0A2> <20>𼭸<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> p <20><> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD>
VECTOR3 vEdge1, vEdge2, pTri;
Math::Subtract(vEdge1, vTri1, vTri0);
Math::Subtract(vEdge2, vTri2, vTri0);
Math::Subtract(pTri, p, vTri0);
float a = Math::DotProduct(vEdge1, vEdge1);
float b = Math::DotProduct(vEdge1, vEdge2);
float c = Math::DotProduct(vEdge2, vEdge2);
float d = Math::DotProduct(pTri, vEdge1);
float e = Math::DotProduct(pTri, vEdge2);
float x = d*c - e*b;
float y = e*a - d*b;
float z = x + y - (a*c - b*b);
return ( ((unsigned int&)z) & ~ ( ((unsigned int&)x) | ((unsigned int&)y) ) & 0x80000000) != 0 ? true : false;
}
}}

View File

@@ -0,0 +1,541 @@
#include "../Include/OctreeCollider.h"
#include "../Include/MathUtil.h"
#include <algorithm>
#include <windows.h>
#include <d3d8.h>
#include <d3dx8.h>
namespace CrossM{
namespace Scene{
COctreeCollisionNode::COctreeCollisionNode()
{
for (int i = 0; i < 8; ++i)
{
m_apSubNode[i] = NULL;
}
m_vBoundingMin.SetValue(0,0,0);
m_vBoundingMax.SetValue(0,0,0);
}
COctreeCollisionNode::~COctreeCollisionNode()
{
ReleaseSubNode();
}
void COctreeCollisionNode::ReleaseSubNode()
{
for (int i = 0; i < 8; ++i)
{
if (NULL != m_apSubNode[i])
{
delete m_apSubNode[i];
m_apSubNode[i] = NULL;
}
}
}
// <20>ڽij<DABD><C4B3><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool COctreeCollisionNode::IsLeafNode()
{
for (int i = 0; i < 8; ++i)
{
if (NULL != m_apSubNode[i])
{
return false;
}
}
return true;
}
void COctreeCollisionNode::BuildSubNode(
const std::vector< CollisionTriangleInfo >& vecTriangle,
const size_t nMaximumRecursion, const size_t nMinPolyCount,
size_t nCurrentRecursionLevel)
{
static size_t nProcessedTri = 0;
unsigned int i, j;
// recursion level <20><> <20>ʹ<EFBFBD> <20><><EFBFBD>ų<EFBFBD>, <20><><EFBFBD>Ե<EFBFBD> face <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>̻<EFBFBD> sub node <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
if (nCurrentRecursionLevel >= nMaximumRecursion ||
m_vecTriangleIndex.size() <= nMinPolyCount)
{
nProcessedTri += m_vecTriangleIndex.size();
printf("\r%d / %d", nProcessedTri, vecTriangle.size());
return;
}
// <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bounding box min/max
Math::VECTOR3 aSubNodeBoundingMin[8];
Math::VECTOR3 aSubNodeBoundingMax[8];
Math::VECTOR3 vMedian = (m_vBoundingMin + m_vBoundingMax)/2.0f;
// <20>ٿ<EFBFBD><D9BF><EFBFBD> <20>ڽ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
for (i = 0; i < 8; ++i)
{
if (0 == (i & 1))
{
aSubNodeBoundingMin[i].x = m_vBoundingMin.x;
aSubNodeBoundingMax[i].x = vMedian.x;
}
else
{
aSubNodeBoundingMin[i].x = vMedian.x;
aSubNodeBoundingMax[i].x = m_vBoundingMax.x;
}
if (0 == (i & 2))
{
aSubNodeBoundingMin[i].y = m_vBoundingMin.y;
aSubNodeBoundingMax[i].y = vMedian.y;
}
else
{
aSubNodeBoundingMin[i].y = vMedian.y;
aSubNodeBoundingMax[i].y = m_vBoundingMax.y;
}
if (0 == (i & 4))
{
aSubNodeBoundingMin[i].z = m_vBoundingMin.z;
aSubNodeBoundingMax[i].z = vMedian.z;
}
else
{
aSubNodeBoundingMin[i].z = vMedian.z;
aSubNodeBoundingMax[i].z = m_vBoundingMax.z;
}
}
// <20>Ѱܹ<D1B0><DCB9><EFBFBD> <20><EFBFBD><EFB0A2> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϻ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ɰ͵<C9B0><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD>
for (j = 0; j < m_vecTriangleIndex.size(); ++j)
{
// <20><EFBFBD><EFB0A2> <20><> <20><> <20><><EFBFBD><EFBFBD>
const CollisionTriangleInfo &tri = vecTriangle[ m_vecTriangleIndex[j] ];
const Math::VECTOR3 &vTri0 = tri.m_avVertex[0];
const Math::VECTOR3 &vTri1 = tri.m_avVertex[1];
const Math::VECTOR3 &vTri2 = tri.m_avVertex[2];
// <20><> <20>ڽij<DABD><C4B3><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ<D4B5><C7B4><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>
bool bIncludedInSubNode = false; // <20>ڽ<EFBFBD> <20><><EFBFBD><20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ<D4B5><C7B4><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
for (i = 0; i < 8; ++i)
{
if (Math::IsTriangleInAabb(aSubNodeBoundingMin[i], aSubNodeBoundingMax[i], vTri0, vTri1, vTri2))
{
// <20><><EFBFBD><20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>
COctreeCollisionNode* &pNode = m_apSubNode[i];
if (NULL == pNode)
{
pNode = new COctreeCollisionNode;
pNode->m_vBoundingMin = aSubNodeBoundingMin[i];
pNode->m_vBoundingMax = aSubNodeBoundingMax[i];
}
// <20>ڽij<DABD><C4B3><20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><EFBFBD><EFB0A2> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pNode->m_vecTriangleIndex.push_back(m_vecTriangleIndex[j]);
bIncludedInSubNode = true;
break;
}
}
if (!bIncludedInSubNode)
{
// <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǴ°<C7B4><C2B0><EFBFBD> <20>ƴ϶<C6B4> <20>ټ<EFBFBD> <20><><EFBFBD><EFBFBD><E5B0A3> <20><>ġ<EFBFBD><C4A1> <20><EFBFBD><EFB0A2><EFBFBD>̹Ƿ<CCB9>,
// triangle - AABB intersection <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ѵ<EFBFBD>
for (i = 0; i < 8; ++i)
{
if (Math::CheckAabbTriangleIntersection(aSubNodeBoundingMin[i], aSubNodeBoundingMax[i], vTri0, vTri1, vTri2))
{
// <20><><EFBFBD><20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>
COctreeCollisionNode* &pNode = m_apSubNode[i];
if (NULL == pNode)
{
pNode = new COctreeCollisionNode;
pNode->m_vBoundingMin = aSubNodeBoundingMin[i];
pNode->m_vBoundingMax = aSubNodeBoundingMax[i];
}
// <20>ڽij<DABD><C4B3><20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><EFBFBD><EFB0A2> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pNode->m_vecTriangleIndex.push_back(m_vecTriangleIndex[j]);
}
}
}
}
// <20><EFBFBD><EFB0A2> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0>־<EFBFBD><D6BE><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><> <20>̻<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ䰡 <20><><EFBFBD><EFBFBD>
m_vecTriangleIndex.clear();
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BuildSubNode <20><> ȣ<><C8A3><EFBFBD>Ѵ<EFBFBD>
for (i = 0; i < 8; ++i)
{
if (NULL != m_apSubNode[i])
{
m_apSubNode[i]->BuildSubNode(vecTriangle, nMaximumRecursion, nMinPolyCount, nCurrentRecursionLevel+1);
}
}
}
void COctreeCollisionNode::CollectCollidableNodes(
const Math::VECTOR3& vSweptVolumeMin, const Math::VECTOR3& vSweptVolumeMax,
std::vector< COctreeCollisionNode* >& vecCollidableNode)
{
if(!Math::CheckAabbAabbIntersection(vSweptVolumeMin, vSweptVolumeMax, m_vBoundingMin, m_vBoundingMax))
{
return;
}
if (IsLeafNode())
{
vecCollidableNode.push_back(this);
}
else
{
for (int i = 0; i < 8; ++i)
{
if (NULL != m_apSubNode[i])
{
m_apSubNode[i]->CollectCollidableNodes(vSweptVolumeMin, vSweptVolumeMax, vecCollidableNode);
}
}
}
}
//////////////////////////////////////////////////////////////////////////
COctreeCollider::COctreeCollider()
{
m_nColTriIndex = 0;
}
COctreeCollider::~COctreeCollider()
{
}
void COctreeCollider::SetTriangleCount(unsigned int uiTriangleCount)
{
m_vecCollisionTriangle.resize(uiTriangleCount);
}
void COctreeCollider::GetTriangleDataPtr(CollisionTriangleInfo*& pTriangleData)
{
if (m_vecCollisionTriangle.size() > 0)
{
pTriangleData = &(m_vecCollisionTriangle[0]);
}
else
{
pTriangleData = NULL;
}
}
bool COctreeCollider::BuildOctree(const size_t nMaximumRecursion, const size_t nMinPolyCount)
{
unsigned int i, j;
if (0 == m_vecCollisionTriangle.size())
{
m_vCollisionBoundingMin.SetValue(0,0,0);
m_vCollisionBoundingMax.SetValue(0,0,0);
return true; // <20>޽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>־ <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
}
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_octreeRootNode.ReleaseSubNode();
// bounding min/max <20><><EFBFBD>ϱ<EFBFBD>
m_vCollisionBoundingMin = m_vecCollisionTriangle[0].m_avVertex[0];
m_vCollisionBoundingMax = m_vecCollisionTriangle[0].m_avVertex[0];
for (i = 0; i < m_vecCollisionTriangle.size(); ++i)
{
for (j = 0; j < 3; ++j)
{
CrossM::Math::VECTOR3& v = m_vecCollisionTriangle[i].m_avVertex[j];
if (v.x < m_vCollisionBoundingMin.x) m_vCollisionBoundingMin.x = v.x;
if (v.y < m_vCollisionBoundingMin.y) m_vCollisionBoundingMin.y = v.y;
if (v.z < m_vCollisionBoundingMin.z) m_vCollisionBoundingMin.z = v.z;
if (v.x > m_vCollisionBoundingMax.x) m_vCollisionBoundingMax.x = v.x;
if (v.y > m_vCollisionBoundingMax.y) m_vCollisionBoundingMax.y = v.y;
if (v.z > m_vCollisionBoundingMax.z) m_vCollisionBoundingMax.z = v.z;
}
}
// octree root node <20><> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20>ڽ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
m_octreeRootNode.m_vBoundingMin = m_vCollisionBoundingMin;
m_octreeRootNode.m_vBoundingMax = m_vCollisionBoundingMax;
// octree root node <20><> <20><><EFBFBD>Ե<EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>(<28><>ü)<29><> <20><><EFBFBD><EFBFBD>
m_octreeRootNode.m_vecTriangleIndex.resize(m_vecCollisionTriangle.size());
for (i = 0; i < m_octreeRootNode.m_vecTriangleIndex.size(); ++i)
{
m_octreeRootNode.m_vecTriangleIndex[i] = i;
}
// DWORD dwTime = timeGetTime();
// for (i = 0; i < m_vecCollisionTriangle.size(); ++i)
// {
// CollisionTriangleInfo& tri = m_vecCollisionTriangle[i];
// Math::VECTOR3& vTri0 = m_vecCollisionVertex[ tri.m_lIndex[0] ];
// Math::VECTOR3& vTri1 = m_vecCollisionVertex[ tri.m_lIndex[1] ];
// Math::VECTOR3& vTri2 = m_vecCollisionVertex[ tri.m_lIndex[2] ];
//
// Math::CheckAabbTriangleIntersection(m_vCollisionBoundingMin, m_vCollisionBoundingMax, vTri0, vTri1, vTri2);
// }
// DWORD dwElapsed = timeGetTime() - dwTime;
//
// dwTime = timeGetTime();
// for (i = 0; i < m_vecCollisionTriangle.size(); ++i)
// {
// CollisionTriangleInfo& tri = m_vecCollisionTriangle[i];
// Math::VECTOR3& vTri0 = m_vecCollisionVertex[ tri.m_lIndex[0] ];
// Math::VECTOR3& vTri1 = m_vecCollisionVertex[ tri.m_lIndex[1] ];
// Math::VECTOR3& vTri2 = m_vecCollisionVertex[ tri.m_lIndex[2] ];
//
// Math::IsTriangleInAabb(m_vCollisionBoundingMin, m_vCollisionBoundingMax, vTri0, vTri1, vTri2);
// }
// DWORD dwElapsed2 = timeGetTime() - dwTime;
// <20>Ϻ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_octreeRootNode.BuildSubNode(m_vecCollisionTriangle, nMaximumRecursion, nMinPolyCount, 0);
return true;
}
void COctreeCollider::GetCollisionRespondingPosition(
Math::VECTOR3& vOutRespondingPos,
const Math::VECTOR3& vPrevPos, const Math::VECTOR3& vNewPos,
const Math::VECTOR3& vEllipsoidRadius,
const unsigned int nRecursionLevel)
{
size_t i, j, nMinCollisionTriangleIndex;
// ellipsoid <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD>ϴ<EFBFBD> <20><EFBFBD><E7B0A2>(AABB)<29><> min/max <20><>
Math::VECTOR3 vSweptVolumeMin, vSweptVolumeMax;
vSweptVolumeMin.x = min(vPrevPos.x, vNewPos.x) - vEllipsoidRadius.x;
vSweptVolumeMax.x = max(vPrevPos.x, vNewPos.x) + vEllipsoidRadius.x;
vSweptVolumeMin.y = min(vPrevPos.y, vNewPos.y) - vEllipsoidRadius.y;
vSweptVolumeMax.y = max(vPrevPos.y, vNewPos.y) + vEllipsoidRadius.y;
vSweptVolumeMin.z = min(vPrevPos.z, vNewPos.z) - vEllipsoidRadius.z;
vSweptVolumeMax.z = max(vPrevPos.z, vNewPos.z) + vEllipsoidRadius.z;
m_vecpCollidableNode.clear();
m_octreeRootNode.CollectCollidableNodes(vSweptVolumeMin, vSweptVolumeMax, m_vecpCollidableNode);
if (0 == m_vecpCollidableNode.size())
{
// <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
vOutRespondingPos = vNewPos;
return;
}
// ellipsoid <20><>ǥ<EFBFBD><C7A5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. sweep <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sweep <20><><EFBFBD><EFBFBD><E2BAA4>, sweep <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Math::VECTOR3 vESweepStart, vESweepEnd, vESweepPath;
float fESweepLength;
vESweepStart.SetValue(vPrevPos.x/vEllipsoidRadius.x, vPrevPos.y/vEllipsoidRadius.y, vPrevPos.z/vEllipsoidRadius.z);
vESweepEnd.SetValue(vNewPos.x/vEllipsoidRadius.x, vNewPos.y/vEllipsoidRadius.y, vNewPos.z/vEllipsoidRadius.z);
Math::Subtract(vESweepPath, vESweepEnd, vESweepStart);
fESweepLength = Math::GetLength(vESweepPath);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (fESweepLength < Math::F_EPSILON)
{
vOutRespondingPos = vPrevPos;
return;
}
// sweeping sphere <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Math::TriangSweepingSphere triAndSphere;
triAndSphere.m_vSphereSweepStart = vESweepStart;
triAndSphere.m_vSphereSweepPath = vESweepPath;
triAndSphere.m_fSphereRadius = 1.0f; // ellipsoid <20><>ǥ<EFBFBD><C7A5><EFBFBD>̹Ƿ<CCB9> <20>浹Ÿ<E6B5B9><C5B8>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><>ȯ<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>
bool bCollision = false; // <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1> <20><EFBFBD><E6B5B9> <20>Ͼ <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
float fMinCollisionDistFactor = 9999.0f;// collision <20><> <20>Ͼ <20><><EFBFBD><EFBFBD> sweeping path <20><> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 0 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 1 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Math::VECTOR3 vMinContactPoint; // fMinCollisionDistFactor <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ. ellipsoid <20><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD>
bool bMinContactInsideTriangle; // fMinCollisionDistFactor <20><><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>𼭸<EFBFBD><F0BCADB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>) <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
for (i = 0; i < m_vecpCollidableNode.size(); ++i)
{
COctreeCollisionNode& node = *(m_vecpCollidableNode[i]);
for (j = 0; j < node.m_vecTriangleIndex.size(); ++j)
{
CollisionTriangleInfo& tri = m_vecCollisionTriangle[ node.m_vecTriangleIndex[j] ];
// <20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Math::VECTOR3& vTri0 = tri.m_avVertex[0];
Math::VECTOR3& vTri1 = tri.m_avVertex[1];
Math::VECTOR3& vTri2 = tri.m_avVertex[2];
// <20><EFBFBD><EFB0A2> <20><><EFBFBD><EFBFBD> ellipsoid <20><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><>-
triAndSphere.m_vTri0.SetValue(vTri0.x/vEllipsoidRadius.x, vTri0.y/vEllipsoidRadius.y, vTri0.z/vEllipsoidRadius.z);
triAndSphere.m_vTri1.SetValue(vTri1.x/vEllipsoidRadius.x, vTri1.y/vEllipsoidRadius.y, vTri1.z/vEllipsoidRadius.z);
triAndSphere.m_vTri2.SetValue(vTri2.x/vEllipsoidRadius.x, vTri2.y/vEllipsoidRadius.y, vTri2.z/vEllipsoidRadius.z);
float fCollisionDistFactor;
Math::VECTOR3 vContactPoint;
bool bContactInside;
// <20><EFBFBD><EFB0A2> - sweeping sphere <20><20>˻<EFBFBD>
if (Math::CheckTriangleSweepingSphereCollision(fCollisionDistFactor, vContactPoint, bContactInside, triAndSphere))
{
// <20><EFBFBD≯<EFBFBD>
bCollision = true;
if(fCollisionDistFactor < fMinCollisionDistFactor)
{
vMinContactPoint = vContactPoint;
fMinCollisionDistFactor = fCollisionDistFactor;
nMinCollisionTriangleIndex = node.m_vecTriangleIndex[j];
bMinContactInsideTriangle = bContactInside;
}
}
}
}
if (!bCollision)
{
// <20><20><><EFBFBD><EFBFBD>
vOutRespondingPos = vNewPos;
return;
}
m_nColTriIndex = nMinCollisionTriangleIndex;
// collision response phase
Math::VECTOR3 vMovedPos; // <20>ϴ<EFBFBD> <20><EFBFBD><E6B5B9> <20>Ͼ<CFBE><EEB3AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><>ġ
Math::Lerp(vMovedPos, vPrevPos, vNewPos, fMinCollisionDistFactor); // <20>ϴ<EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>Űܳ<C5B0><DCB3><EFBFBD> <20><>..
// <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>Ϸ<EFBFBD><CFB7><EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD> 90% <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߰ų<DFB0>, recursion <20><> 4<><34> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (fMinCollisionDistFactor > 0.9f || nRecursionLevel >= 4)
{
vOutRespondingPos = vMovedPos;
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ<EFBFBD><C7A5> ellipsoid <20><>ǥ<EFBFBD><EFBFBD><E8BFA1> <20><><EFBFBD><EFBFBD> <20><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD> ȯ<><C8AF>
vMinContactPoint.x *= vEllipsoidRadius.x;
vMinContactPoint.y *= vEllipsoidRadius.y;
vMinContactPoint.z *= vEllipsoidRadius.z;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Math::VECTOR3 vTangentPlaneNormal;
if (bMinContactInsideTriangle)
{
// <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><E6B5B9> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> normal <20><> <20>״<EFBFBD><D7B4><EFBFBD> <20>̿<EFBFBD><CCBF>Ѵ<EFBFBD>
CollisionTriangleInfo& colTriInfo = m_vecCollisionTriangle[nMinCollisionTriangleIndex];
Math::VECTOR3& vCollTri0 = colTriInfo.m_avVertex[0];
Math::VECTOR3& vCollTri1 = colTriInfo.m_avVertex[1];
Math::VECTOR3& vCollTri2 = colTriInfo.m_avVertex[2];
vTangentPlaneNormal = ((vCollTri1 - vCollTri0) ^ (vCollTri2 - vCollTri0));
}
else
{
// <20>𼭸<EFBFBD><F0BCADB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E6B5B9> <20><><EFBFBD><EFBFBD>, Ÿ<><C5B8>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> normal <20><> <20><><EFBFBD>Ѵ<EFBFBD>
Math::Subtract(vTangentPlaneNormal, vMovedPos, vMinContactPoint);
vTangentPlaneNormal.x /= (vEllipsoidRadius.x*vEllipsoidRadius.x);
vTangentPlaneNormal.y /= (vEllipsoidRadius.y*vEllipsoidRadius.y);
vTangentPlaneNormal.z /= (vEllipsoidRadius.z*vEllipsoidRadius.z);
Math::Normalize(vTangentPlaneNormal, vTangentPlaneNormal);
}
Math::Normalize(vTangentPlaneNormal, vTangentPlaneNormal);
// <20><EFBFBD><E6B5B9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD>
Math::VECTOR3 vRemainder;
Math::Subtract(vRemainder, vNewPos, vMovedPos);
// <20><EFBFBD><E6B5B9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fVanishingComponentFactor = Math::DotProduct(vTangentPlaneNormal, vRemainder);
Math::VECTOR3 vVanishingComponent;
Math::Scale(vVanishingComponent, vTangentPlaneNormal, fVanishingComponentFactor);
// <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Math::Subtract(vRemainder, vRemainder, vVanishingComponent);
// <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD>͸<EFBFBD>ŭ<EFBFBD><C5AD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>浹üũ <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3>
GetCollisionRespondingPosition(vOutRespondingPos, vMovedPos, vMovedPos+vRemainder, vEllipsoidRadius, nRecursionLevel+1);
}
void COctreeCollider::RenderCollidableNodeTriangles(IDirect3DDevice8* pDevice)
{
size_t nRenderTriCount; //j, i, nTriFilled;
if (0 == m_vecpCollidableNode.size())
{
return;
}
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFB0A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// nRenderTriCount = 0;
// for (i = 0; i < m_vecpCollidableNode.size(); ++i)
// {
// nRenderTriCount += m_vecpCollidableNode[i]->m_vecTriangleIndex.size();
// }
//
// // <20><><EFBFBD>ؽ<EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
// m_vecRenderVertex.resize(nRenderTriCount*3);
//
// nTriFilled = 0;
// for (i = 0; i < m_vecpCollidableNode.size(); ++i)
// {
// COctreeCollisionNode& node = *(m_vecpCollidableNode[i]);
//
// for (j = 0; j < node.m_vecTriangleIndex.size(); ++j)
// {
// size_t nTriIndex = node.m_vecTriangleIndex[j];
// CollisionTriangleInfo& tri = m_vecCollisionTriangle[nTriIndex];
//
// m_vecRenderVertex[nTriFilled*3] = tri.m_avVertex[0];
// m_vecRenderVertex[nTriFilled*3 + 1] = tri.m_avVertex[1];
// m_vecRenderVertex[nTriFilled*3 + 2] = tri.m_avVertex[2];
// ++nTriFilled;
// }
// }
nRenderTriCount = 1; // <20><EFBFBD><EFBFBD><EFB0A2> 1<><31><EFBFBD><EFBFBD>
m_vecRenderVertex.resize(nRenderTriCount*3);
CollisionTriangleInfo& tri = m_vecCollisionTriangle[m_nColTriIndex];
m_vecRenderVertex[0] = tri.m_avVertex[0];
m_vecRenderVertex[1] = tri.m_avVertex[1];
m_vecRenderVertex[2] = tri.m_avVertex[2];
D3DXMATRIX mTmp;
D3DXMatrixIdentity(&mTmp);
pDevice->SetTransform(D3DTS_WORLD, &mTmp);
DWORD dwFillMode, dwZFunc;
pDevice->GetRenderState(D3DRS_FILLMODE, &dwFillMode);
pDevice->GetRenderState(D3DRS_ZFUNC, &dwZFunc);
pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
pDevice->SetVertexShader(D3DFVF_XYZ);
pDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, (UINT)nRenderTriCount, &(m_vecRenderVertex[0]), sizeof(Math::VECTOR3));
pDevice->SetRenderState(D3DRS_FILLMODE, dwFillMode);
pDevice->SetRenderState(D3DRS_ZFUNC, dwZFunc);
}
}}