1
0
forked from metin2/client

Solution refactoring and restructuring, removed Boost dependency, removed unused tools

This commit is contained in:
2022-11-21 23:42:01 +02:00
parent 33f19f9ff6
commit 9ef9f39e88
817 changed files with 326 additions and 59698 deletions

View File

@ -0,0 +1,522 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Distribute|Win32">
<Configuration>Distribute</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="MfcDebug|Win32">
<Configuration>MfcDebug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="MfcRelease|Win32">
<Configuration>MfcRelease</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="VTune|Win32">
<Configuration>VTune</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<ProjectName>EterGrnLib</ProjectName>
<ProjectGuid>{E1FF7630-628F-4AD0-BF66-F14D86A04035}</ProjectGuid>
<RootNamespace>EterGrnLib</RootNamespace>
<SccProjectName>SAK</SccProjectName>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
<SccProvider>SAK</SccProvider>
<Keyword>MFCProj</Keyword>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>Static</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>Static</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</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" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
</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" />
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>17.0.32203.90</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<VcpkgUseStatic>true</VcpkgUseStatic>
<VcpkgConfiguration>$(Configuration)</VcpkgConfiguration>
</PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">
<VcpkgUseStatic>true</VcpkgUseStatic>
<VcpkgConfiguration>$(Configuration)</VcpkgConfiguration>
</PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<VcpkgUseStatic>true</VcpkgUseStatic>
<VcpkgConfiguration>$(Configuration)</VcpkgConfiguration>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(SolutionDir)extern\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>.\Debug/eterGrnLib.pch</PrecompiledHeaderOutputFile>
<AssemblerListingLocation>.\Debug/</AssemblerListingLocation>
<ObjectFileName>.\Debug/</ObjectFileName>
<ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>
<BrowseInformation />
<WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
<IgnoreStandardIncludePath>true</IgnoreStandardIncludePath>
</ResourceCompile>
<Lib>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>$(SolutionDir)extern\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeaderOutputFile>.\Distribute/eterGrnLib.pch</PrecompiledHeaderOutputFile>
<AssemblerOutput>All</AssemblerOutput>
<AssemblerListingLocation>.\Distribute/</AssemblerListingLocation>
<ObjectFileName>.\Distribute/</ObjectFileName>
<ProgramDataBaseFileName>.\Distribute/</ProgramDataBaseFileName>
<BrowseInformation />
<WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
</ResourceCompile>
<Lib>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">
<ClCompile>
<Optimization>MinSpace</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>.;../../extern/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>.\MfcRelease/eterGrnLib.pch</PrecompiledHeaderOutputFile>
<AssemblerOutput>All</AssemblerOutput>
<AssemblerListingLocation>.\MfcRelease/</AssemblerListingLocation>
<ObjectFileName>.\MfcRelease/</ObjectFileName>
<ProgramDataBaseFileName>.\MfcRelease/</ProgramDataBaseFileName>
<BrowseInformation />
<WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
</ResourceCompile>
<Lib>
<OutputFile>.\MfcRelease\eterGrnLib.lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">
<ClCompile>
<AdditionalOptions>/Gs %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>.;../../extern/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeaderOutputFile>.\VTune/eterGrnLib.pch</PrecompiledHeaderOutputFile>
<AssemblerOutput>All</AssemblerOutput>
<AssemblerListingLocation>.\VTune/</AssemblerListingLocation>
<ObjectFileName>.\VTune/</ObjectFileName>
<ProgramDataBaseFileName>.\VTune/</ProgramDataBaseFileName>
<BrowseInformation />
<WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
</ResourceCompile>
<Lib>
<OutputFile>.\VTune\eterGrnLib.lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.;../../extern/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>.\MfcDebug/eterGrnLib.pch</PrecompiledHeaderOutputFile>
<AssemblerListingLocation>.\MfcDebug/</AssemblerListingLocation>
<ObjectFileName>.\MfcDebug/</ObjectFileName>
<ProgramDataBaseFileName>.\MfcDebug/</ProgramDataBaseFileName>
<BrowseInformation />
<WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
</ResourceCompile>
<Lib>
<OutputFile>.\MfcDebug\eterGrnLib.lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<Optimization>MinSpace</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>$(SolutionDir)extern\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeaderOutputFile>.\Release/eterGrnLib.pch</PrecompiledHeaderOutputFile>
<AssemblerListingLocation>.\Release/</AssemblerListingLocation>
<ObjectFileName>.\Release/</ObjectFileName>
<ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
<BrowseInformation />
<WarningLevel>Level3</WarningLevel>
<SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>Default</CompileAs>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
</ResourceCompile>
<Lib>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="LODController.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="Material.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="Mesh.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="Model.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="ModelInstance.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="ModelInstanceCollisionDetection.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="ModelInstanceModel.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="ModelInstanceMotion.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="ModelInstanceRender.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="ModelInstanceUpdate.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="Motion.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="StdAfx.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">Create</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">stdafx.h</PrecompiledHeaderFile>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Create</PrecompiledHeader>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">Create</PrecompiledHeader>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">stdafx.h</PrecompiledHeaderFile>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Create</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">stdafx.h</PrecompiledHeaderFile>
</ClCompile>
<ClCompile Include="Thing.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="ThingInstance.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
<ClCompile Include="Util.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='MfcDebug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='MfcRelease|Win32'">MinSpace</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
<FavorSizeOrSpeed Condition="'$(Configuration)|$(Platform)'=='VTune|Win32'">Size</FavorSizeOrSpeed>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="LODController.h" />
<ClInclude Include="Material.h" />
<ClInclude Include="Mesh.h" />
<ClInclude Include="Model.h" />
<ClInclude Include="ModelInstance.h" />
<ClInclude Include="Motion.h" />
<ClInclude Include="StdAfx.h" />
<ClInclude Include="Thing.h" />
<ClInclude Include="ThingInstance.h" />
<ClInclude Include="Util.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{6576bcac-5f4b-45be-9028-0bc5d24f98a7}</UniqueIdentifier>
<Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{09cf94e2-767a-4df6-8be0-a19454507cf1}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="LODController.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Material.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Mesh.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Model.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ModelInstance.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ModelInstanceCollisionDetection.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ModelInstanceModel.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ModelInstanceMotion.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ModelInstanceRender.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ModelInstanceUpdate.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Motion.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="StdAfx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Thing.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ThingInstance.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Util.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="LODController.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Material.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Mesh.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Model.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ModelInstance.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Motion.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="StdAfx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Thing.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ThingInstance.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Util.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -0,0 +1,695 @@
#include "StdAfx.h"
#include "LODController.h"
static float LODHEIGHT_ACTOR = 500.0f;
static float LODDISTANCE_ACTOR = 5000.0f;
static float LODDISTANCE_BUILDING = 25000.0f;
static const float c_fNearLodScale = 3.0f;
static const float c_fFarLodScale = 25.0f;
static const float LOD_APPLY_MAX = 2000.0f;
static const float LOD_APPLY_MIN = 500.0f;
bool ms_isMinLODModeEnable=false;
enum
{
SHARED_VB_500 = 0,
SHARED_VB_1000 = 1,
SHARED_VB_1500 = 2,
SHARED_VB_2000 = 3,
SHARED_VB_2500 = 4,
SHARED_VB_3000 = 5,
SHARED_VB_3500 = 6,
SHARED_VB_4000 = 7,
SHARED_VB_NUM = 9,
};
static std::vector<CGraphicVertexBuffer*> gs_vbs[SHARED_VB_NUM];
static CGraphicVertexBuffer gs_emptyVB;
#include <time.h>
static CGraphicVertexBuffer* __AllocDeformVertexBuffer(unsigned deformableVertexCount)
{
if (deformableVertexCount == 0)
return &gs_emptyVB;
unsigned capacity = (((deformableVertexCount-1) / 500) + 1) * 500;
unsigned index = (deformableVertexCount-1) / 500;
if (index < SHARED_VB_NUM)
{
std::vector<CGraphicVertexBuffer*>& vbs = gs_vbs[index];
if (!vbs.empty())
{
//TraceError("REUSE %d(%d)", capacity, deformableVertexCount);
CGraphicVertexBuffer* pkRetVB = vbs.back();
vbs.pop_back();
return pkRetVB;
}
}
static time_t base = time(NULL);
//TraceError("NEW %8d: %d(%d)", time(NULL) - base, capacity, deformableVertexCount);
CGraphicVertexBuffer* pkNewVB = new CGraphicVertexBuffer;
if (!pkNewVB->Create(
capacity,
D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
D3DUSAGE_WRITEONLY,
D3DPOOL_MANAGED))
{
TraceError("NEW_ERROR %8d: %d(%d)", time(NULL) - base, capacity, deformableVertexCount);
}
return pkNewVB;
}
void __FreeDeformVertexBuffer(CGraphicVertexBuffer* pkDelVB)
{
if (pkDelVB)
{
if (pkDelVB == &gs_emptyVB)
return;
unsigned index = (pkDelVB->GetVertexCount() - 1) / 500;
if (index < SHARED_VB_NUM)
{
gs_vbs[index].push_back(pkDelVB);
}
else
{
pkDelVB->Destroy();
delete pkDelVB;
}
}
}
void __ReserveSharedVertexBuffers(unsigned index, unsigned count)
{
NANOBEGIN
if (index >= SHARED_VB_NUM)
return;
unsigned capacity = (index + 1) * 500;
for (unsigned i = 0; i != count; ++i)
{
CGraphicVertexBuffer* pkNewVB = new CGraphicVertexBuffer;
pkNewVB->Create(
capacity,
D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
D3DUSAGE_WRITEONLY,
D3DPOOL_MANAGED);
gs_vbs[index].push_back(pkNewVB);
}
NANOEND
}
void GrannyCreateSharedDeformBuffer()
{
__ReserveSharedVertexBuffers(SHARED_VB_500, 40);
__ReserveSharedVertexBuffers(SHARED_VB_1000, 20);
__ReserveSharedVertexBuffers(SHARED_VB_1500, 20);
__ReserveSharedVertexBuffers(SHARED_VB_2000, 40);
__ReserveSharedVertexBuffers(SHARED_VB_3000, 20);
}
void GrannyDestroySharedDeformBuffer()
{
#ifdef _DEBUG
TraceError("granny_shared_vbs:");
#endif
for (int i = 0; i != SHARED_VB_NUM; ++i)
{
std::vector<CGraphicVertexBuffer*>& vbs = gs_vbs[i];
#ifdef _DEBUG
TraceError("\t%d: %d", i, vbs.size());
#endif
std::vector<CGraphicVertexBuffer*>::iterator v;
for (v = vbs.begin(); v != vbs.end(); ++v)
{
CGraphicVertexBuffer* pkEachVB = (*v);
pkEachVB->Destroy();
delete pkEachVB;
}
vbs.clear();
}
}
void CGrannyLODController::SetMinLODMode(bool isEnable)
{
ms_isMinLODModeEnable=isEnable;
}
void CGrannyLODController::SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage)
{
std::deque<CGrannyModelInstance *>::iterator i;
for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i)
{
CGrannyModelInstance* pkModelInst=(*i);
pkModelInst->SetMaterialImagePointer(c_szImageName, pImage);
}
}
void CGrannyLODController::SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData)
{
std::deque<CGrannyModelInstance *>::iterator i;
for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i)
{
CGrannyModelInstance* pkModelInst=(*i);
pkModelInst->SetMaterialData(c_szImageName, c_rkMaterialData);
}
}
void CGrannyLODController::SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower)
{
std::deque<CGrannyModelInstance *>::iterator i;
for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i)
{
CGrannyModelInstance* pkModelInst=(*i);
pkModelInst->SetSpecularInfo(c_szMtrlName, bEnable, fPower);
}
}
CGrannyLODController::CGrannyLODController() :
m_pCurrentModelInstance(NULL),
m_bLODLevel(0),
m_pAttachedParentModel(NULL),
m_fLODDistance(0.0f),
m_dwLODAniFPS(CGrannyModelInstance::ANIFPS_MAX),
m_pkSharedDeformableVertexBuffer(NULL)
/////////////////////////////////////////////////////
{
}
CGrannyLODController::~CGrannyLODController()
{
__FreeDeformVertexBuffer(m_pkSharedDeformableVertexBuffer);
Clear();
}
void CGrannyLODController::Clear()
{
if (m_pAttachedParentModel)
{
m_pAttachedParentModel->DetachModelInstance(this);
}
m_pCurrentModelInstance = NULL;
m_pAttachedParentModel = NULL;
std::for_each(m_que_pkModelInst.begin(), m_que_pkModelInst.end(), CGrannyModelInstance::Delete);
m_que_pkModelInst.clear();
std::vector<TAttachingModelData>::iterator itor = m_AttachedModelDataVector.begin();
for (; m_AttachedModelDataVector.end() != itor; ++itor)
{
TAttachingModelData & rData = *itor;
rData.pkLODController->m_pAttachedParentModel = NULL;
}
m_AttachedModelDataVector.clear();
}
void CGrannyLODController::AddModel(CGraphicThing * pThing, int iSrcModel, CGrannyLODController * pSkelLODController)
{
if (!pThing)
return;
if (pSkelLODController && pSkelLODController->m_que_pkModelInst.empty())
{
assert(!"EMPTY SKELETON(CANNON LINK)");
return;
}
assert(pThing->GetReferenceCount()>=1);
pThing->AddReference();
if (pThing->GetModelCount() <= iSrcModel)
{
pThing->Release();
return;
}
CGrannyModel * pModel = pThing->GetModelPointer(iSrcModel);
if (!pModel)
{
pThing->Release();
return;
}
CGrannyModelInstance * pModelInstance = CGrannyModelInstance::New();
__ReserveSharedDeformableVertexBuffer(pModel->GetDeformVertexCount());
if (pSkelLODController)
{
pModelInstance->SetLinkedModelPointer(pModel, m_pkSharedDeformableVertexBuffer, &pSkelLODController->m_pCurrentModelInstance);
}
else
{
pModelInstance->SetLinkedModelPointer(pModel, m_pkSharedDeformableVertexBuffer, NULL);
}
// END_OF_WORK
if (!m_pCurrentModelInstance)
{
m_pCurrentModelInstance = pModelInstance;
pModelInstance->DeformNoSkin(&ms_matIdentity);
D3DXVECTOR3 vtMin, vtMax;
pModelInstance->GetBoundBox(&vtMin, &vtMax);
float fSize = 0.0f;
fSize = fMAX(fSize, fabs(vtMin.x - vtMax.x));
fSize = fMAX(fSize, fabs(vtMin.y - vtMax.y));
fSize = fMAX(fSize, fabs(vtMin.z - vtMax.z));
if (fSize<LODHEIGHT_ACTOR)
SetLODLimits(0.0f, LODDISTANCE_ACTOR);
else
//
SetLODLimits(0.0f, LODDISTANCE_BUILDING);
}
else
{
// FIXME : CModelInstance::m_pgrnWorldPose<73><65> Update<74><65><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4>,
// Deform<72><6D> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL <20>Դϴ<D4B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. - [levites]
pModelInstance->DeformNoSkin(&ms_matIdentity);
}
pThing->Release();
m_que_pkModelInst.push_front(pModelInstance);
}
void CGrannyLODController::__ReserveSharedDeformableVertexBuffer(DWORD deformableVertexCount)
{
if (m_pkSharedDeformableVertexBuffer &&
m_pkSharedDeformableVertexBuffer->GetVertexCount() >= deformableVertexCount)
return;
__FreeDeformVertexBuffer(m_pkSharedDeformableVertexBuffer);
m_pkSharedDeformableVertexBuffer = __AllocDeformVertexBuffer(deformableVertexCount);
}
void CGrannyLODController::AttachModelInstance(CGrannyLODController * pSrcLODController, const char * c_szBoneName)
{
CGrannyModelInstance * pSrcInstance = pSrcLODController->GetModelInstance();
if (!pSrcInstance)
return;
CGrannyModelInstance * pDestInstance = GetModelInstance();
if (pDestInstance)
{
pSrcInstance->SetParentModelInstance(pDestInstance, c_szBoneName);
}
if (!pSrcLODController->GetModelInstance())
return;
// Link Parent Data
pSrcLODController->m_pAttachedParentModel = this;
// Link Child Data
std::vector<TAttachingModelData>::iterator itor = m_AttachedModelDataVector.begin();
for (; m_AttachedModelDataVector.end() != itor;)
{
TAttachingModelData & rData = *itor;
if (pSrcLODController == rData.pkLODController)
{
itor = m_AttachedModelDataVector.erase(itor);
}
else
{
++itor;
}
}
TAttachingModelData AttachingModelData;
AttachingModelData.pkLODController = pSrcLODController;
AttachingModelData.strBoneName = c_szBoneName;
m_AttachedModelDataVector.push_back(AttachingModelData);
}
void CGrannyLODController::DetachModelInstance(CGrannyLODController * pSrcLODController)
{
CGrannyModelInstance * pSrcInstance = pSrcLODController->GetModelInstance();
if (!pSrcInstance)
return;
CGrannyModelInstance * pDestInstance = GetModelInstance();
if (pDestInstance)
{
pSrcInstance->SetParentModelInstance(NULL, 0);
}
// if (!pSrcLODController->GetModelInstance())
// return;
// Unlink Child Data
std::vector<TAttachingModelData>::iterator itor = m_AttachedModelDataVector.begin();
for (; m_AttachedModelDataVector.end() != itor;)
{
TAttachingModelData & rData = *itor;
if (pSrcLODController == rData.pkLODController)
{
itor = m_AttachedModelDataVector.erase(itor);
}
else
{
++itor;
}
}
// Unlink Parent Data
pSrcLODController->m_pAttachedParentModel = NULL;
}
void CGrannyLODController::SetLODLimits(float /*fNearLOD*/, float fFarLOD)
{
m_fLODDistance = fFarLOD;
}
void CGrannyLODController::SetLODLevel(BYTE bLodLevel)
{
assert(m_que_pkModelInst.size() > 0);
if (m_que_pkModelInst.size() > 0)
m_bLODLevel = (BYTE) MIN(m_que_pkModelInst.size() - 1, bLodLevel);
}
void CGrannyLODController::CreateDeviceObjects()
{
std::for_each(m_que_pkModelInst.begin(),
m_que_pkModelInst.end(),
CGrannyModelInstance::FCreateDeviceObjects());
}
void CGrannyLODController::DestroyDeviceObjects()
{
std::for_each(m_que_pkModelInst.begin(),
m_que_pkModelInst.end(),
CGrannyModelInstance::FDestroyDeviceObjects());
}
void CGrannyLODController::RenderWithOneTexture()
{
assert(m_pCurrentModelInstance != NULL);
//#define CHECK_LOD
#ifdef CHECK_LOD
if (m_que_pkModelInst.size() > 0 && m_pCurrentModelInstance == m_que_pkModelInst[0])
m_pCurrentModelInstance->RenderWithoutTexture();
if (m_que_pkModelInst.size() > 1 && m_pCurrentModelInstance == m_que_pkModelInst[1])
m_pCurrentModelInstance->RenderWithOneTexture();
if (m_que_pkModelInst.size() > 2 && m_pCurrentModelInstance == m_que_pkModelInst[2])
m_pCurrentModelInstance->RenderWithOneTexture();
if (m_que_pkModelInst.size() > 3 && m_pCurrentModelInstance == m_que_pkModelInst[3])
m_pCurrentModelInstance->RenderWithOneTexture();
#else
m_pCurrentModelInstance->RenderWithOneTexture();
#endif
}
void CGrannyLODController::BlendRenderWithOneTexture()
{
assert(m_pCurrentModelInstance != NULL);
m_pCurrentModelInstance->BlendRenderWithOneTexture();
}
void CGrannyLODController::RenderWithTwoTexture()
{
assert(m_pCurrentModelInstance != NULL);
m_pCurrentModelInstance->RenderWithTwoTexture();
}
void CGrannyLODController::BlendRenderWithTwoTexture()
{
assert(m_pCurrentModelInstance != NULL);
m_pCurrentModelInstance->BlendRenderWithTwoTexture();
}
void CGrannyLODController::Update(float fElapsedTime, float fDistanceFromCenter, float fDistanceFromCamera)
{
UpdateLODLevel(fDistanceFromCenter, fDistanceFromCamera);
UpdateTime(fElapsedTime);
}
void CGrannyLODController::UpdateLODLevel(float fDistanceFromCenter, float fDistanceFromCamera)
{
if (m_que_pkModelInst.size()<=1)
return;
assert(m_pCurrentModelInstance != NULL);
if (fDistanceFromCenter > LOD_APPLY_MIN) // <20>߽<EFBFBD> LOD <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
// ī<>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD><EFBFBD> fLODRate<74><65> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD>
// 3<><33> LOD<4F><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20>հ<EFBFBD> 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD>
// 100fps 50fps 33fps 25fps 20fps
// 10ms 20ms 30ms 40ms 50ms
float fLODFactor = fMINMAX(0.0f, (m_fLODDistance-fDistanceFromCamera), m_fLODDistance);
if (m_fLODDistance>0.0f)
m_dwLODAniFPS = (DWORD) ((CGrannyModelInstance::ANIFPS_MAX - CGrannyModelInstance::ANIFPS_MIN) * fLODFactor / m_fLODDistance + CGrannyModelInstance::ANIFPS_MIN);
else
m_dwLODAniFPS = CGrannyModelInstance::ANIFPS_MIN;
assert(m_dwLODAniFPS > 0);
m_dwLODAniFPS /= 10;
m_dwLODAniFPS *= 10;
float fLODStep = m_fLODDistance / m_que_pkModelInst.size();
BYTE bLODLevel = BYTE(fLODFactor / fLODStep);
if (m_fLODDistance <= 5000.0f)
{
if (fDistanceFromCamera < 500.0f)
{
bLODLevel = 0;
}
else if (fDistanceFromCamera < 1500.0f)
{
bLODLevel = 1;
}
else if (fDistanceFromCamera < 2500.0f)
{
bLODLevel = 2;
}
else
{
bLODLevel = 3;
}
bLODLevel = (BYTE) (m_que_pkModelInst.size() - min(bLODLevel, m_que_pkModelInst.size()) - 1);
}
if (ms_isMinLODModeEnable)
bLODLevel=0;
SetLODLevel(bLODLevel);
if (m_pCurrentModelInstance != m_que_pkModelInst[m_bLODLevel])
{
SetCurrentModelInstance(m_que_pkModelInst[m_bLODLevel]);
}
}
else
{
m_dwLODAniFPS=CGrannyModelInstance::ANIFPS_MAX;
if (!m_que_pkModelInst.empty())
{
if (m_pCurrentModelInstance != m_que_pkModelInst.back())
{
SetCurrentModelInstance(m_que_pkModelInst.back());
}
}
}
}
void CGrannyLODController::UpdateTime(float fElapsedTime)
{
assert(m_pCurrentModelInstance != NULL);
m_pCurrentModelInstance->Update(m_dwLODAniFPS);
//DWORD t3=timeGetTime();
m_pCurrentModelInstance->UpdateLocalTime(fElapsedTime);
//DWORD t4=timeGetTime();
#ifdef __PERFORMANCE_CHECKER__
{
static FILE* fp=fopen("perf_lod_update.txt", "w");
if (t4-t1>3)
{
fprintf(fp, "LOD.Total %d (Time %f)\n", t4-t1, timeGetTime()/1000.0f);
fprintf(fp, "LOD.SMI %d\n", t2-t1);
fprintf(fp, "LOD.UP %d\n", t3-t2);
fprintf(fp, "LOD.UL %d\n", t4-t3);
fprintf(fp, "-------------------------------- \n");
fflush(fp);
}
fflush(fp);
}
#endif
}
void CGrannyLODController::SetCurrentModelInstance(CGrannyModelInstance * pgrnModelInstance)
{
// Copy Motion
pgrnModelInstance->CopyMotion(m_pCurrentModelInstance, true);
m_pCurrentModelInstance = pgrnModelInstance;
// Change children attaching link
RefreshAttachedModelInstance();
// Change parent attaching link
if (m_pAttachedParentModel)
{
m_pAttachedParentModel->RefreshAttachedModelInstance();
}
}
void CGrannyLODController::RefreshAttachedModelInstance()
{
if (!m_pCurrentModelInstance)
return;
for (DWORD i = 0; i < m_AttachedModelDataVector.size(); ++i)
{
TAttachingModelData & rModelData = m_AttachedModelDataVector[i];
CGrannyModelInstance * pSrcInstance = rModelData.pkLODController->GetModelInstance();
if (!pSrcInstance)
{
Tracenf("CGrannyLODController::RefreshAttachedModelInstance : m_AttachedModelDataVector[%d]->pkLODController->GetModelIntance()==NULL", i);
continue;
}
pSrcInstance->SetParentModelInstance(m_pCurrentModelInstance, rModelData.strBoneName.c_str());
}
}
void CGrannyLODController::UpdateSkeleton(const D3DXMATRIX * c_pWorldMatrix, float fElapsedTime)
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->UpdateSkeleton(c_pWorldMatrix, fElapsedTime);
}
void CGrannyLODController::DeformAll(const D3DXMATRIX * c_pWorldMatrix)
{
std::deque<CGrannyModelInstance *>::iterator i;
for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i)
{
CGrannyModelInstance* pkModelInst=(*i);
pkModelInst->Deform(c_pWorldMatrix);
}
}
void CGrannyLODController::DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix)
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->DeformNoSkin(c_pWorldMatrix);
}
void CGrannyLODController::Deform(const D3DXMATRIX * c_pWorldMatrix)
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->Deform(c_pWorldMatrix);
}
void CGrannyLODController::RenderToShadowMap()
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->RenderWithoutTexture();
}
void CGrannyLODController::RenderShadow()
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->RenderWithOneTexture();
}
void CGrannyLODController::ReloadTexture()
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->ReloadTexture();
}
void CGrannyLODController::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->GetBoundBox(vtMin, vtMax);
}
bool CGrannyLODController::Intersect(const D3DXMATRIX * c_pMatrix, float * u, float * v, float * t)
{
if (!m_pCurrentModelInstance)
return false;
return m_pCurrentModelInstance->Intersect(c_pMatrix, u, v, t);
}
void CGrannyLODController::SetLocalTime(float fLocalTime)
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->SetLocalTime(fLocalTime);
}
void CGrannyLODController::ResetLocalTime()
{
assert(m_pCurrentModelInstance != NULL);
m_pCurrentModelInstance->ResetLocalTime();
}
void CGrannyLODController::SetMotionPointer(const CGrannyMotion * c_pMotion, float fBlendTime, int iLoopCount, float speedRatio)
{
assert(m_pCurrentModelInstance != NULL);
m_pCurrentModelInstance->SetMotionPointer(c_pMotion, fBlendTime, iLoopCount, speedRatio);
}
void CGrannyLODController::ChangeMotionPointer(const CGrannyMotion * c_pMotion, int iLoopCount, float speedRatio)
{
assert(m_pCurrentModelInstance != NULL);
m_pCurrentModelInstance->ChangeMotionPointer(c_pMotion, iLoopCount, speedRatio);
}
void CGrannyLODController::SetMotionAtEnd()
{
if (m_pCurrentModelInstance)
m_pCurrentModelInstance->SetMotionAtEnd();
}
BOOL CGrannyLODController::isModelInstance()
{
if (!m_pCurrentModelInstance)
return FALSE;
return TRUE;
}
CGrannyModelInstance * CGrannyLODController::GetModelInstance()
{
return m_pCurrentModelInstance;
}

View File

@ -0,0 +1,304 @@
#pragma once
#pragma warning(disable:4786)
#include <deque>
#include "Thing.h"
#include "ModelInstance.h"
class CGrannyLODController : public CGraphicBase
{
public:
static void SetMinLODMode(bool isEnable);
public:
struct FSetLocalTime
{
float fLocalTime;
void operator() (CGrannyLODController * pController)
{
pController->SetLocalTime(fLocalTime);
}
};
struct FUpdateTime
{
float fElapsedTime;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->UpdateTime(fElapsedTime);
}
};
struct FUpdateLODLevel
{
float fDistanceFromCenter;
float fDistanceFromCamera;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->UpdateLODLevel(fDistanceFromCenter, fDistanceFromCamera);
}
};
struct FRenderWithOneTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderWithOneTexture();
}
};
struct FBlendRenderWithOneTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->BlendRenderWithOneTexture();
}
};
struct FRenderWithTwoTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderWithTwoTexture();
}
};
struct FBlendRenderWithTwoTexture
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->BlendRenderWithTwoTexture();
}
};
struct FRenderToShadowMap
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderToShadowMap();
}
};
struct FRenderShadow
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->RenderShadow();
}
};
struct FDeform
{
const D3DXMATRIX * mc_pWorldMatrix;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->Deform(mc_pWorldMatrix);
}
};
struct FDeformNoSkin
{
const D3DXMATRIX * mc_pWorldMatrix;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->DeformNoSkin(mc_pWorldMatrix);
}
};
struct FDeformAll
{
const D3DXMATRIX * mc_pWorldMatrix;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->DeformAll(mc_pWorldMatrix);
}
};
struct FCreateDeviceObjects
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->CreateDeviceObjects();
}
};
struct FDestroyDeviceObjects
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->DestroyDeviceObjects();
}
};
struct FBoundBox
{
D3DXVECTOR3* m_vtMin;
D3DXVECTOR3* m_vtMax;
FBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
{
m_vtMin = vtMin;
m_vtMax = vtMax;
}
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->GetBoundBox(m_vtMin, m_vtMax);
}
};
struct FResetLocalTime
{
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->ResetLocalTime();
}
};
struct FReloadTexture
{
void operator () (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->ReloadTexture();
}
};
struct FSetMotionPointer
{
const CGrannyMotion * m_pMotion;
float m_speedRatio;
float m_blendTime;
int m_loopCount;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->SetMotionPointer(m_pMotion, m_blendTime, m_loopCount, m_speedRatio);
}
};
struct FChangeMotionPointer
{
const CGrannyMotion * m_pMotion;
float m_speedRatio;
int m_loopCount;
void operator() (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->ChangeMotionPointer(m_pMotion, m_loopCount, m_speedRatio);
}
};
struct FEndStopMotionPointer
{
const CGrannyMotion * m_pMotion;
void operator () (CGrannyLODController * pController)
{
if (pController->isModelInstance())
pController->SetMotionAtEnd();
}
};
CGrannyLODController();
virtual ~CGrannyLODController();
void Clear();
void CreateDeviceObjects();
void DestroyDeviceObjects();
void AddModel(CGraphicThing * pThing, int iSrcModel, CGrannyLODController * pSkelLODController=NULL);
void AttachModelInstance(CGrannyLODController * pSrcLODController, const char * c_szBoneName);
void DetachModelInstance(CGrannyLODController * pSrcLODController);
void SetLODLimits(float fNearLOD, float fFarLOD);
void SetLODLevel(BYTE bLODLevel);
BYTE GetLODLevel() { return m_bLODLevel; }
void SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage);
void SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData);
void SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower);
void RenderWithOneTexture();
void RenderWithTwoTexture();
void BlendRenderWithOneTexture();
void BlendRenderWithTwoTexture();
void Update(float fElapsedTime, float fDistanceFromCenter, float fDistanceFromCamera);
void UpdateLODLevel(float fDistanceFromCenter, float fDistanceFromCamera);
void UpdateTime(float fElapsedTime);
void UpdateSkeleton(const D3DXMATRIX * c_pWorldMatrix, float fElapsedTime);
void Deform(const D3DXMATRIX * c_pWorldMatrix);
void DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix);
void DeformAll(const D3DXMATRIX * c_pWorldMatrix);
void RenderToShadowMap();
void RenderShadow();
void ReloadTexture();
void GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax);
bool Intersect(const D3DXMATRIX * c_pMatrix, float * u, float * v, float * t);
void SetLocalTime(float fLocalTime);
void ResetLocalTime();
void SetMotionPointer(const CGrannyMotion * c_pMotion, float fBlendTime, int iLoopCount, float speedRatio);
void ChangeMotionPointer(const CGrannyMotion * c_pMotion, int iLoopCount, float speedRatio);
void SetMotionAtEnd();
BOOL isModelInstance();
CGrannyModelInstance* GetModelInstance();
bool HaveBlendThing() { return 0 != GetModelInstance() ? GetModelInstance()->HaveBlendThing() : false; } // NOTE: GetModelInstance() == 0<><30> <20><> Ŭ<><C5AC> ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(2012. 05. 07)
protected:
void SetCurrentModelInstance(CGrannyModelInstance * pgrnModelInstance);
void RefreshAttachedModelInstance();
void __ReserveSharedDeformableVertexBuffer(DWORD deformableVertexCount);
protected:
float m_fLODDistance;
DWORD m_dwLODAniFPS;
//// Attaching Link Data
// Data of Parent Side
typedef struct SAttachingModelData
{
CGrannyLODController * pkLODController;
std::string strBoneName;
} TAttachingModelData;
std::vector<TAttachingModelData> m_AttachedModelDataVector;
// Data of Child Side
CGrannyLODController * m_pAttachedParentModel;
BYTE m_bLODLevel;
CGrannyModelInstance * m_pCurrentModelInstance;
// WORK
std::deque<CGrannyModelInstance *> m_que_pkModelInst;
CGraphicVertexBuffer* m_pkSharedDeformableVertexBuffer;
// END_OF_WORK
};

560
src/EterGrnLib/Material.cpp Normal file
View File

@ -0,0 +1,560 @@
#include "StdAfx.h"
#include "Material.h"
#include "Mesh.h"
#include "../eterbase/Filename.h"
#include "../eterlib/ResourceManager.h"
#include "../eterlib/StateManager.h"
#include "../eterlib/GrpScreen.h"
CGraphicImageInstance CGrannyMaterial::ms_akSphereMapInstance[SPHEREMAP_NUM];
D3DXVECTOR3 CGrannyMaterial::ms_v3SpecularTrans(0.0f, 0.0f, 0.0f);
D3DXMATRIX CGrannyMaterial::ms_matSpecular;
D3DXCOLOR g_fSpecularColor = D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f);
void CGrannyMaterial::TranslateSpecularMatrix(float fAddX, float fAddY, float fAddZ)
{
static float SPECULAR_TRANSLATE_MAX = 1000000.0f;
ms_v3SpecularTrans.x+=fAddX;
ms_v3SpecularTrans.y+=fAddY;
ms_v3SpecularTrans.z+=fAddZ;
if (ms_v3SpecularTrans.x>=SPECULAR_TRANSLATE_MAX)
ms_v3SpecularTrans.x=0.0f;
if (ms_v3SpecularTrans.y>=SPECULAR_TRANSLATE_MAX)
ms_v3SpecularTrans.y=0.0f;
if (ms_v3SpecularTrans.z>=SPECULAR_TRANSLATE_MAX)
ms_v3SpecularTrans.z=0.0f;
D3DXMatrixTranslation(&ms_matSpecular,
ms_v3SpecularTrans.x,
ms_v3SpecularTrans.y,
ms_v3SpecularTrans.z
);
}
void CGrannyMaterial::ApplyRenderState()
{
assert(m_pfnApplyRenderState!=NULL && "CGrannyMaterial::SaveRenderState");
(this->*m_pfnApplyRenderState)();
}
void CGrannyMaterial::RestoreRenderState()
{
assert(m_pfnRestoreRenderState!=NULL && "CGrannyMaterial::RestoreRenderState");
(this->*m_pfnRestoreRenderState)();
}
void CGrannyMaterial::Copy(CGrannyMaterial& rkMtrl)
{
m_pgrnMaterial = rkMtrl.m_pgrnMaterial;
m_roImage[0] = rkMtrl.m_roImage[0];
m_roImage[1] = rkMtrl.m_roImage[1];
m_eType = rkMtrl.m_eType;
}
CGrannyMaterial::CGrannyMaterial()
{
m_bTwoSideRender = false;
m_dwLastCullRenderStateForTwoSideRendering = D3DCULL_CW;
Initialize();
}
CGrannyMaterial::~CGrannyMaterial()
{
}
CGrannyMaterial::EType CGrannyMaterial::GetType() const
{
return m_eType;
}
void CGrannyMaterial::SetImagePointer(int iStage, CGraphicImage* pImage)
{
assert(iStage<2 && "CGrannyMaterial::SetImagePointer");
m_roImage[iStage]=pImage;
}
bool CGrannyMaterial::IsIn(const char* c_szImageName, int* piStage)
{
std::string strImageName = c_szImageName;
CFileNameHelper::StringPath(strImageName);
granny_texture * pgrnDiffuseTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyDiffuseColorTexture);
if (pgrnDiffuseTexture)
{
std::string strDiffuseFileName = pgrnDiffuseTexture->FromFileName;
CFileNameHelper::StringPath(strDiffuseFileName);
if (strDiffuseFileName == strImageName)
{
*piStage=0;
return true;
}
}
granny_texture * pgrnOpacityTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyOpacityTexture);
if (pgrnOpacityTexture)
{
std::string strOpacityFileName = pgrnOpacityTexture->FromFileName;
CFileNameHelper::StringPath(strOpacityFileName);
if (strOpacityFileName == strImageName)
{
*piStage=1;
return true;
}
}
return false;
}
void CGrannyMaterial::SetSpecularInfo(BOOL bFlag, float fPower, BYTE uSphereMapIndex)
{
m_fSpecularPower = fPower;
m_bSphereMapIndex = uSphereMapIndex;
m_bSpecularEnable = bFlag;
if (bFlag)
{
m_pfnApplyRenderState = &CGrannyMaterial::__ApplySpecularRenderState;
m_pfnRestoreRenderState = &CGrannyMaterial::__RestoreSpecularRenderState;
}
else
{
m_pfnApplyRenderState = &CGrannyMaterial::__ApplyDiffuseRenderState;
m_pfnRestoreRenderState = &CGrannyMaterial::__RestoreDiffuseRenderState;
}
}
bool CGrannyMaterial::IsEqual(granny_material* pgrnMaterial) const
{
if (m_pgrnMaterial==pgrnMaterial)
return true;
return false;
}
LPDIRECT3DTEXTURE8 CGrannyMaterial::GetD3DTexture(int iStage) const
{
const CGraphicImage::TRef & ratImage = m_roImage[iStage];
if (ratImage.IsNull())
return NULL;
CGraphicImage * pImage = ratImage.GetPointer();
const CGraphicTexture * pTexture = pImage->GetTexturePointer();
return pTexture->GetD3DTexture();
}
CGraphicImage * CGrannyMaterial::GetImagePointer(int iStage) const
{
const CGraphicImage::TRef & ratImage = m_roImage[iStage];
if (ratImage.IsNull())
return NULL;
CGraphicImage * pImage = ratImage.GetPointer();
return pImage;
}
const CGraphicTexture* CGrannyMaterial::GetDiffuseTexture() const
{
if (m_roImage[0].IsNull())
return NULL;
return m_roImage[0].GetPointer()->GetTexturePointer();
}
const CGraphicTexture* CGrannyMaterial::GetOpacityTexture() const
{
if (m_roImage[1].IsNull())
return NULL;
return m_roImage[1].GetPointer()->GetTexturePointer();
}
BOOL CGrannyMaterial::__IsSpecularEnable() const
{
return m_bSpecularEnable;
}
float CGrannyMaterial::__GetSpecularPower() const
{
return m_fSpecularPower;
}
extern const std::string& GetModelLocalPath();
CGraphicImage* CGrannyMaterial::__GetImagePointer(const char* fileName)
{
assert(*fileName != '\0');
CResourceManager& rkResMgr = CResourceManager::Instance();
// SUPPORT_LOCAL_TEXTURE
int fileName_len = strlen(fileName);
if (fileName_len > 2 && fileName[1] != ':')
{
char localFileName[256];
const std::string& modelLocalPath = GetModelLocalPath();
int localFileName_len = modelLocalPath.length() + 1 + fileName_len;
if (localFileName_len < sizeof(localFileName) - 1)
{
_snprintf(localFileName, sizeof(localFileName), "%s%s", GetModelLocalPath().c_str(), fileName);
CResource* pResource = rkResMgr.GetResourcePointer(localFileName);
return static_cast<CGraphicImage*>(pResource);
}
}
// END_OF_SUPPORT_LOCAL_TEXTURE
CResource* pResource = rkResMgr.GetResourcePointer(fileName);
return static_cast<CGraphicImage*>(pResource);
}
bool CGrannyMaterial::CreateFromGrannyMaterialPointer(granny_material * pgrnMaterial)
{
m_pgrnMaterial = pgrnMaterial;
granny_texture * pgrnDiffuseTexture = NULL;
granny_texture * pgrnOpacityTexture = NULL;
if (pgrnMaterial)
{
if (pgrnMaterial->MapCount > 1 && !strnicmp(pgrnMaterial->Name, "Blend", 5))
{
pgrnDiffuseTexture = GrannyGetMaterialTextureByType(pgrnMaterial->Maps[0].Material, GrannyDiffuseColorTexture);
pgrnOpacityTexture = GrannyGetMaterialTextureByType(pgrnMaterial->Maps[1].Material, GrannyDiffuseColorTexture);
}
else
{
pgrnDiffuseTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyDiffuseColorTexture);
pgrnOpacityTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyOpacityTexture);
}
// Two-Side <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20>˻<EFBFBD>
{
granny_int32 twoSided = 0;
granny_data_type_definition TwoSidedFieldType[] =
{
{GrannyInt32Member, "Two-sided"},
{GrannyEndMember},
};
granny_variant twoSideResult = GrannyFindMatchingMember(pgrnMaterial->ExtendedData.Type, pgrnMaterial->ExtendedData.Object, "Two-sided");
if (NULL != twoSideResult.Type)
GrannyConvertSingleObject(twoSideResult.Type, twoSideResult.Object, TwoSidedFieldType, &twoSided);
m_bTwoSideRender = 1 == twoSided;
}
}
if (pgrnDiffuseTexture)
m_roImage[0].SetPointer(__GetImagePointer(pgrnDiffuseTexture->FromFileName));
if (pgrnOpacityTexture)
m_roImage[1].SetPointer(__GetImagePointer(pgrnOpacityTexture->FromFileName));
// <20><><EFBFBD>۽<EFBFBD>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD>
if (!m_roImage[1].IsNull())
m_eType = TYPE_BLEND_PNT;
else
m_eType = TYPE_DIFFUSE_PNT;
return true;
}
void CGrannyMaterial::Initialize()
{
m_roImage[0] = NULL;
m_roImage[1] = NULL;
SetSpecularInfo(FALSE, 0.0f, 0);
}
void CGrannyMaterial::__ApplyDiffuseRenderState()
{
STATEMANAGER.SetTexture(0, GetD3DTexture(0));
if (m_bTwoSideRender)
{
// -_-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... Save & Restore <20>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>δ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Save & Restore <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
m_dwLastCullRenderStateForTwoSideRendering = STATEMANAGER.GetRenderState(D3DRS_CULLMODE);
STATEMANAGER.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
}
}
void CGrannyMaterial::__RestoreDiffuseRenderState()
{
if (m_bTwoSideRender)
{
STATEMANAGER.SetRenderState(D3DRS_CULLMODE, m_dwLastCullRenderStateForTwoSideRendering);
}
}
void CGrannyMaterial::__ApplySpecularRenderState()
{
if (TRUE == STATEMANAGER.GetRenderState(D3DRS_ALPHABLENDENABLE))
{
__ApplyDiffuseRenderState();
return;
}
CGraphicTexture* pkTexture=ms_akSphereMapInstance[m_bSphereMapIndex].GetTexturePointer();
STATEMANAGER.SetTexture(0, GetD3DTexture(0));
if (pkTexture)
STATEMANAGER.SetTexture(1, pkTexture->GetD3DTexture());
else
STATEMANAGER.SetTexture(1, NULL);
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(g_fSpecularColor.r, g_fSpecularColor.g, g_fSpecularColor.b, __GetSpecularPower()));
STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &ms_matSpecular);
STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
}
void CGrannyMaterial::__RestoreSpecularRenderState()
{
if (TRUE == STATEMANAGER.GetRenderState(D3DRS_ALPHABLENDENABLE))
{
__RestoreDiffuseRenderState();
return;
}
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS);
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSU);
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSV);
STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXCOORDINDEX);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG2);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP);
}
void CGrannyMaterial::CreateSphereMap(UINT uMapIndex, const char* c_szSphereMapImageFileName)
{
CResourceManager& rkResMgr = CResourceManager::Instance();
CGraphicImage * pImage = (CGraphicImage *)rkResMgr.GetResourcePointer(c_szSphereMapImageFileName);
ms_akSphereMapInstance[uMapIndex].SetImagePointer(pImage);
}
void CGrannyMaterial::DestroySphereMap()
{
for (UINT uMapIndex=0; uMapIndex<SPHEREMAP_NUM; ++uMapIndex)
ms_akSphereMapInstance[uMapIndex].Destroy();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CGrannyMaterialPalette::CGrannyMaterialPalette()
{
}
CGrannyMaterialPalette::~CGrannyMaterialPalette()
{
Clear();
}
void CGrannyMaterialPalette::Copy(const CGrannyMaterialPalette& rkMtrlPalSrc)
{
m_mtrlVector=rkMtrlPalSrc.m_mtrlVector;
}
void CGrannyMaterialPalette::Clear()
{
m_mtrlVector.clear();
}
CGrannyMaterial& CGrannyMaterialPalette::GetMaterialRef(DWORD mtrlIndex)
{
assert(mtrlIndex<m_mtrlVector.size());
return *m_mtrlVector[mtrlIndex].GetPointer();
}
void CGrannyMaterialPalette::SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage)
{
DWORD size=m_mtrlVector.size();
DWORD i;
for (i=0; i<size; ++i)
{
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
int iStage;
if (roMtrl->IsIn(c_szImageName, &iStage))
{
CGrannyMaterial* pkNewMtrl=new CGrannyMaterial;
pkNewMtrl->Copy(*roMtrl.GetPointer());
pkNewMtrl->SetImagePointer(iStage, pImage);
roMtrl=pkNewMtrl;
return;
}
}
}
void CGrannyMaterialPalette::SetMaterialData(const char* c_szMtrlName, const SMaterialData& c_rkMaterialData)
{
if (c_szMtrlName)
{
std::vector<CGrannyMaterial::TRef>::iterator i;
for (i=m_mtrlVector.begin(); i!=m_mtrlVector.end(); ++i)
{
CGrannyMaterial::TRef& roMtrl=*i;
int iStage;
if (roMtrl->IsIn(c_szMtrlName, &iStage))
{
CGrannyMaterial* pkNewMtrl=new CGrannyMaterial;
pkNewMtrl->Copy(*roMtrl.GetPointer());
pkNewMtrl->SetImagePointer(iStage, c_rkMaterialData.pImage);
pkNewMtrl->SetSpecularInfo(c_rkMaterialData.isSpecularEnable, c_rkMaterialData.fSpecularPower, c_rkMaterialData.bSphereMapIndex);
roMtrl=pkNewMtrl;
return;
}
}
}
else
{
std::vector<CGrannyMaterial::TRef>::iterator i;
for (i=m_mtrlVector.begin(); i!=m_mtrlVector.end(); ++i)
{
CGrannyMaterial::TRef& roMtrl=*i;
roMtrl->SetSpecularInfo(c_rkMaterialData.isSpecularEnable, c_rkMaterialData.fSpecularPower, c_rkMaterialData.bSphereMapIndex);
}
}
}
void CGrannyMaterialPalette::SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower)
{
DWORD size=m_mtrlVector.size();
DWORD i;
if (c_szMtrlName)
{
for (i=0; i<size; ++i)
{
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
int iStage;
if (roMtrl->IsIn(c_szMtrlName, &iStage))
{
roMtrl->SetSpecularInfo(bEnable, fPower, 0);
return;
}
}
}
else
{
for (i=0; i<size; ++i)
{
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
roMtrl->SetSpecularInfo(bEnable, fPower, 0);
}
}
}
DWORD CGrannyMaterialPalette::RegisterMaterial(granny_material* pgrnMaterial)
{
DWORD size=m_mtrlVector.size();
DWORD i;
for (i=0; i<size; ++i)
{
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
if (roMtrl->IsEqual(pgrnMaterial))
return i;
}
CGrannyMaterial* pkNewMtrl=new CGrannyMaterial;
pkNewMtrl->CreateFromGrannyMaterialPointer(pgrnMaterial);
m_mtrlVector.push_back(pkNewMtrl);
return size;
}
DWORD CGrannyMaterialPalette::GetMaterialCount() const
{
return m_mtrlVector.size();
}
/*
void CActorInstance::BeginSpecularRender()
{
// NOTE - Blending<6E>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> Specular<61><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20>ʴ´<CAB4> - [levites]
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(1.0f, 1.0f, 1.0f, m_AddColor.r));
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
// STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
// STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
// STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
// STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
//
// STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
// STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
// STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR);
// STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
// STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
// D3DXMATRIX texMatrix;
// GetSphereMatrix(&texMatrix);
// STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &texMatrix);
// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
// Type 1
// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
// // Type 2
// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL);
}
void CActorInstance::EndSpecularRender()
{
// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
}
*/

120
src/EterGrnLib/Material.h Normal file
View File

@ -0,0 +1,120 @@
#pragma once
#include <granny.h>
#include <windows.h>
#include <d3d8.h>
#include "../eterlib/ReferenceObject.h"
#include "../eterlib/Ref.h"
#include "../eterlib/GrpImageInstance.h"
#include "Util.h"
class CGrannyMaterial : public CReferenceObject
{
public:
typedef CRef<CGrannyMaterial> TRef;
static void CreateSphereMap(UINT uMapIndex, const char* c_szSphereMapImageFileName);
static void DestroySphereMap();
public:
enum EType
{
TYPE_DIFFUSE_PNT,
TYPE_BLEND_PNT,
TYPE_MAX_NUM
};
public:
static void TranslateSpecularMatrix(float fAddX, float fAddY, float fAddZ);
private:
static D3DXMATRIX ms_matSpecular;
static D3DXVECTOR3 ms_v3SpecularTrans;
public:
CGrannyMaterial();
virtual ~CGrannyMaterial();
void Destroy();
void Copy(CGrannyMaterial& rkMtrl);
bool IsEqual(granny_material * pgrnMaterial) const;
bool IsIn(const char* c_szImageName, int* iStage);
void SetSpecularInfo(BOOL bFlag, float fPower, BYTE uSphereMapIndex);
void ApplyRenderState();
void RestoreRenderState();
protected:
void Initialize();
public:
bool CreateFromGrannyMaterialPointer(granny_material* pgrnMaterial);
void SetImagePointer(int iStage, CGraphicImage* pImage);
CGrannyMaterial::EType GetType() const;
CGraphicImage * GetImagePointer(int iStage) const;
const CGraphicTexture * GetDiffuseTexture() const;
const CGraphicTexture * GetOpacityTexture() const;
LPDIRECT3DTEXTURE8 GetD3DTexture(int iStage) const;
bool IsTwoSided() const { return m_bTwoSideRender; }
protected:
CGraphicImage * __GetImagePointer(const char * c_szFileName);
BOOL __IsSpecularEnable() const;
float __GetSpecularPower() const;
void __ApplyDiffuseRenderState();
void __RestoreDiffuseRenderState();
void __ApplySpecularRenderState();
void __RestoreSpecularRenderState();
protected:
granny_material * m_pgrnMaterial;
CGraphicImage::TRef m_roImage[2];
EType m_eType;
float m_fSpecularPower;
BOOL m_bSpecularEnable;
bool m_bTwoSideRender;
DWORD m_dwLastCullRenderStateForTwoSideRendering;
BYTE m_bSphereMapIndex;
void (CGrannyMaterial::*m_pfnApplyRenderState)();
void (CGrannyMaterial::*m_pfnRestoreRenderState)();
private:
enum
{
SPHEREMAP_NUM = 10,
};
static CGraphicImageInstance ms_akSphereMapInstance[SPHEREMAP_NUM];
};
class CGrannyMaterialPalette
{
public:
CGrannyMaterialPalette();
virtual ~CGrannyMaterialPalette();
void Clear();
void Copy(const CGrannyMaterialPalette& rkMtrlPalSrc);
DWORD RegisterMaterial(granny_material* pgrnMaterial);
void SetMaterialImagePointer(const char* c_szMtrlName, CGraphicImage* pImage);
void SetMaterialData(const char* c_szMtrlName, const SMaterialData& c_rkMaterialData);
void SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower);
CGrannyMaterial& GetMaterialRef(DWORD mtrlIndex);
DWORD GetMaterialCount() const;
protected:
std::vector<CGrannyMaterial::TRef> m_mtrlVector;
};

311
src/EterGrnLib/Mesh.cpp Normal file
View File

@ -0,0 +1,311 @@
#include "StdAfx.h"
#include "Mesh.h"
#include "Model.h"
#include "Material.h"
granny_data_type_definition GrannyPNT3322VertexType[5] =
{
{GrannyReal32Member, GrannyVertexPositionName, 0, 3},
{GrannyReal32Member, GrannyVertexNormalName, 0, 3},
{GrannyReal32Member, GrannyVertexTextureCoordinatesName"0", 0, 2},
{GrannyReal32Member, GrannyVertexTextureCoordinatesName"1", 0, 2},
{GrannyEndMember}
};
void CGrannyMesh::LoadIndices(void * dstBaseIndices)
{
const granny_mesh * pgrnMesh = GetGrannyMeshPointer();
TIndex * dstIndices = ((TIndex *)dstBaseIndices) + m_idxBasePos;
GrannyCopyMeshIndices(pgrnMesh, sizeof(TIndex), dstIndices);
}
void CGrannyMesh::LoadPNTVertices(void * dstBaseVertices)
{
const granny_mesh * pgrnMesh = GetGrannyMeshPointer();
if (!GrannyMeshIsRigid(pgrnMesh))
return;
TPNTVertex * dstVertices = ((TPNTVertex *)dstBaseVertices) + m_vtxBasePos;
GrannyCopyMeshVertices(pgrnMesh, m_pgrnMeshType, dstVertices);
}
void CGrannyMesh::NEW_LoadVertices(void * dstBaseVertices)
{
const granny_mesh * pgrnMesh = GetGrannyMeshPointer();
if (!GrannyMeshIsRigid(pgrnMesh))
return;
TPNTVertex * dstVertices = ((TPNTVertex *)dstBaseVertices) + m_vtxBasePos;
GrannyCopyMeshVertices(pgrnMesh, m_pgrnMeshType, dstVertices);
}
void CGrannyMesh::DeformPNTVertices(void * dstBaseVertices, D3DXMATRIX * boneMatrices, granny_mesh_binding* pgrnMeshBinding) const
{
assert(dstBaseVertices != NULL);
assert(boneMatrices != NULL);
assert(m_pgrnMeshDeformer != NULL);
const granny_mesh * pgrnMesh = GetGrannyMeshPointer();
TPNTVertex * srcVertices = (TPNTVertex *) GrannyGetMeshVertices(pgrnMesh);
TPNTVertex * dstVertices = ((TPNTVertex *) dstBaseVertices) + m_vtxBasePos;
int vtxCount = GrannyGetMeshVertexCount(pgrnMesh);
// WORK
int * boneIndices = GrannyGetMeshBindingToBoneIndices(pgrnMeshBinding);
// END_OF_WORK
GrannyDeformVertices(
m_pgrnMeshDeformer,
boneIndices,
(float *)boneMatrices,
vtxCount,
srcVertices,
dstVertices);
}
bool CGrannyMesh::CanDeformPNTVertices() const
{
return m_canDeformPNTVertex;
}
const granny_mesh * CGrannyMesh::GetGrannyMeshPointer() const
{
return m_pgrnMesh;
}
const CGrannyMesh::TTriGroupNode * CGrannyMesh::GetTriGroupNodeList(CGrannyMaterial::EType eMtrlType) const
{
return m_triGroupNodeLists[eMtrlType];
}
int CGrannyMesh::GetVertexCount() const
{
assert(m_pgrnMesh!=NULL);
return GrannyGetMeshVertexCount(m_pgrnMesh);
}
int CGrannyMesh::GetVertexBasePosition() const
{
return m_vtxBasePos;
}
int CGrannyMesh::GetIndexBasePosition() const
{
return m_idxBasePos;
}
// WORK
int * CGrannyMesh::GetDefaultBoneIndices() const
{
return GrannyGetMeshBindingToBoneIndices(m_pgrnMeshBindingTemp);
}
// END_OF_WORK
bool CGrannyMesh::IsEmpty() const
{
if (m_pgrnMesh)
return false;
return true;
}
bool CGrannyMesh::CreateFromGrannyMeshPointer(granny_skeleton * pgrnSkeleton, granny_mesh * pgrnMesh, int vtxBasePos, int idxBasePos, CGrannyMaterialPalette& rkMtrlPal)
{
assert(IsEmpty());
m_pgrnMesh = pgrnMesh;
m_vtxBasePos = vtxBasePos;
m_idxBasePos = idxBasePos;
if (m_pgrnMesh->BoneBindingCount < 0)
return true;
// WORK
m_pgrnMeshBindingTemp = GrannyNewMeshBinding(m_pgrnMesh, pgrnSkeleton, pgrnSkeleton);
// END_OF_WORK
if (!GrannyMeshIsRigid(m_pgrnMesh))
{
m_canDeformPNTVertex = true;
granny_data_type_definition * pgrnInputType = GrannyGetMeshVertexType(m_pgrnMesh);
granny_data_type_definition * pgrnOutputType = m_pgrnMeshType;
m_pgrnMeshDeformer = GrannyNewMeshDeformer(pgrnInputType, pgrnOutputType, GrannyDeformPositionNormal);
assert(m_pgrnMeshDeformer != NULL && "Cannot create mesh deformer");
}
// Two Side Mesh
if (!strncmp(m_pgrnMesh->Name, "2x", 2))
m_isTwoSide = true;
if (!LoadMaterials(rkMtrlPal))
return false;
if (!LoadTriGroupNodeList(rkMtrlPal))
return false;
return true;
}
bool CGrannyMesh::LoadTriGroupNodeList(CGrannyMaterialPalette& rkMtrlPal)
{
assert(m_pgrnMesh != NULL);
assert(m_triGroupNodes == NULL);
int mtrlCount = m_pgrnMesh->MaterialBindingCount;
if (mtrlCount <= 0) // õ<><C3B5> <20><><EFBFBD><EFBFBD> 2<><32> ũ<><C5A9><EFBFBD><EFBFBD> <20>߻<EFBFBD>
return true;
int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh);
if (GroupNodeCount <= 0)
return true;
m_triGroupNodes = new TTriGroupNode[GroupNodeCount];
const granny_tri_material_group * c_pgrnTriGroups = GrannyGetMeshTriangleGroups(m_pgrnMesh);
for (int g = 0; g < GroupNodeCount; ++g)
{
const granny_tri_material_group & c_rgrnTriGroup = c_pgrnTriGroups[g];
TTriGroupNode * pTriGroupNode = m_triGroupNodes + g;
pTriGroupNode->idxPos = m_idxBasePos + c_rgrnTriGroup.TriFirst * 3;
pTriGroupNode->triCount = c_rgrnTriGroup.TriCount;
int iMtrl = c_rgrnTriGroup.MaterialIndex;
if (iMtrl < 0 || iMtrl >= mtrlCount)
{
pTriGroupNode->mtrlIndex=0;//m_mtrlIndexVector[iMtrl];
}
else
{
pTriGroupNode->mtrlIndex=m_mtrlIndexVector[iMtrl];
}
const CGrannyMaterial& rkMtrl=rkMtrlPal.GetMaterialRef(pTriGroupNode->mtrlIndex);
pTriGroupNode->pNextTriGroupNode = m_triGroupNodeLists[rkMtrl.GetType()];
m_triGroupNodeLists[rkMtrl.GetType()] = pTriGroupNode;
}
return true;
}
void CGrannyMesh::RebuildTriGroupNodeList()
{
assert(!"CGrannyMesh::RebuildTriGroupNodeList() - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><20>ϴ°<CFB4>- -?");
/*
int mtrlCount = m_pgrnMesh->MaterialBindingCount;
int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh);
if (GroupNodeCount <= 0)
return;
const granny_tri_material_group * c_pgrnTriGroups = GrannyGetMeshTriangleGroups(m_pgrnMesh);
for (int g = 0; g < GroupNodeCount; ++g)
{
const granny_tri_material_group& c_rgrnTriGroup = c_pgrnTriGroups[g];
TTriGroupNode * pTriGroupNode = m_triGroupNodes + g;
int iMtrl = c_rgrnTriGroup.MaterialIndex;
if (iMtrl >= 0 && iMtrl < mtrlCount)
{
CGrannyMaterial & rMtrl = m_mtrls[iMtrl];
pTriGroupNode->lpd3dTextures[0] = rMtrl.GetD3DTexture(0);
pTriGroupNode->lpd3dTextures[1] = rMtrl.GetD3DTexture(1);
}
}
*/
}
bool CGrannyMesh::LoadMaterials(CGrannyMaterialPalette& rkMtrlPal)
{
assert(m_pgrnMesh != NULL);
if (m_pgrnMesh->MaterialBindingCount <= 0)
return true;
int mtrlCount = m_pgrnMesh->MaterialBindingCount;
bool bHaveBlendThing = false;
for (int m = 0; m < mtrlCount; ++m)
{
granny_material* pgrnMaterial = m_pgrnMesh->MaterialBindings[m].Material;
DWORD mtrlIndex=rkMtrlPal.RegisterMaterial(pgrnMaterial);
m_mtrlIndexVector.push_back(mtrlIndex);
bHaveBlendThing |= rkMtrlPal.GetMaterialRef(mtrlIndex).GetType() == CGrannyMaterial::TYPE_BLEND_PNT;
}
m_bHaveBlendThing = bHaveBlendThing;
return true;
}
bool CGrannyMesh::IsTwoSide() const
{
return m_isTwoSide;
}
void CGrannyMesh::SetPNT2Mesh()
{
m_pgrnMeshType = GrannyPNT3322VertexType;
}
void CGrannyMesh::Destroy()
{
if (m_triGroupNodes)
delete [] m_triGroupNodes;
m_mtrlIndexVector.clear();
// WORK
if (m_pgrnMeshBindingTemp)
GrannyFreeMeshBinding(m_pgrnMeshBindingTemp);
// END_OF_WORK
if (m_pgrnMeshDeformer)
GrannyFreeMeshDeformer(m_pgrnMeshDeformer);
Initialize();
}
void CGrannyMesh::Initialize()
{
for (int r = 0; r < CGrannyMaterial::TYPE_MAX_NUM; ++r)
m_triGroupNodeLists[r] = NULL;
m_pgrnMeshType = GrannyPNT332VertexType;
m_pgrnMesh = NULL;
// WORK
m_pgrnMeshBindingTemp = NULL;
// END_OF_WORK
m_pgrnMeshDeformer = NULL;
m_triGroupNodes = NULL;
m_vtxBasePos = 0;
m_idxBasePos = 0;
m_canDeformPNTVertex = false;
m_isTwoSide = false;
m_bHaveBlendThing = false;
}
CGrannyMesh::CGrannyMesh()
{
Initialize();
}
CGrannyMesh::~CGrannyMesh()
{
Destroy();
}

98
src/EterGrnLib/Mesh.h Normal file
View File

@ -0,0 +1,98 @@
#pragma once
#include "Material.h"
extern granny_data_type_definition GrannyPNT3322VertexType[5];
struct granny_pnt3322_vertex
{
granny_real32 Position[3];
granny_real32 Normal[3];
granny_real32 UV0[2];
granny_real32 UV1[2];
};
class CGrannyMesh
{
public:
enum EType
{
TYPE_RIGID,
TYPE_DEFORM,
TYPE_MAX_NUM
};
typedef struct STriGroupNode
{
STriGroupNode * pNextTriGroupNode;
int idxPos;
int triCount;
DWORD mtrlIndex;
} TTriGroupNode;
public:
CGrannyMesh();
virtual ~CGrannyMesh();
bool IsEmpty() const;
bool CreateFromGrannyMeshPointer(granny_skeleton* pgrnSkeleton, granny_mesh* pgrnMesh, int vtxBasePos, int idxBasePos, CGrannyMaterialPalette& rkMtrlPal);
void LoadIndices(void* dstBaseIndices);
void LoadPNTVertices(void* dstBaseVertices);
void NEW_LoadVertices(void* dstBaseVertices);
void Destroy();
void SetPNT2Mesh();
void DeformPNTVertices(void* dstBaseVertices, D3DXMATRIX* boneMatrices, granny_mesh_binding* pgrnMeshBinding) const;
bool CanDeformPNTVertices() const;
bool IsTwoSide() const;
int GetVertexCount() const;
// WORK
int * GetDefaultBoneIndices() const;
// END_OF_WORK
int GetVertexBasePosition() const;
int GetIndexBasePosition() const;
const granny_mesh * GetGrannyMeshPointer() const;
const CGrannyMesh::TTriGroupNode * GetTriGroupNodeList(CGrannyMaterial::EType eMtrlType) const;
void RebuildTriGroupNodeList();
void ReloadMaterials();
protected:
void Initialize();
bool LoadMaterials(CGrannyMaterialPalette& rkMtrlPal);
bool LoadTriGroupNodeList(CGrannyMaterialPalette& rkMtrlPal);
protected:
// Granny Mesh Data
granny_data_type_definition * m_pgrnMeshType;
granny_mesh * m_pgrnMesh;
// WORK
granny_mesh_binding * m_pgrnMeshBindingTemp;
// END_OF_WORK
granny_mesh_deformer * m_pgrnMeshDeformer;
// Granny Material Data
std::vector<DWORD> m_mtrlIndexVector;
// TriGroups Data
TTriGroupNode * m_triGroupNodes;
TTriGroupNode * m_triGroupNodeLists[CGrannyMaterial::TYPE_MAX_NUM];
int m_vtxBasePos;
int m_idxBasePos;
bool m_canDeformPNTVertex;
bool m_isTwoSide;
private:
bool m_bHaveBlendThing;
public:
bool HaveBlendThing() { return m_bHaveBlendThing; }
};

419
src/EterGrnLib/Model.cpp Normal file
View File

@ -0,0 +1,419 @@
#include "StdAfx.h"
#include "Model.h"
#include "Mesh.h"
const CGrannyMaterialPalette& CGrannyModel::GetMaterialPalette() const
{
return m_kMtrlPal;
}
const CGrannyModel::TMeshNode* CGrannyModel::GetMeshNodeList(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType) const
{
return m_meshNodeLists[eMeshType][eMtrlType];
}
CGrannyMesh * CGrannyModel::GetMeshPointer(int iMesh)
{
assert(CheckMeshIndex(iMesh));
assert(m_meshs != NULL);
return m_meshs + iMesh;
}
const CGrannyMesh* CGrannyModel::GetMeshPointer(int iMesh) const
{
assert(CheckMeshIndex(iMesh));
assert(m_meshs != NULL);
return m_meshs + iMesh;
}
bool CGrannyModel::CanDeformPNTVertices() const
{
return m_canDeformPNVertices;
}
void CGrannyModel::DeformPNTVertices(void * dstBaseVertices, D3DXMATRIX * boneMatrices, const std::vector<granny_mesh_binding*>& c_rvct_pgrnMeshBinding) const
{
int meshCount = GetMeshCount();
for (int iMesh = 0; iMesh < meshCount; ++iMesh)
{
assert(iMesh < c_rvct_pgrnMeshBinding.size());
CGrannyMesh & rMesh = m_meshs[iMesh];
if (rMesh.CanDeformPNTVertices())
rMesh.DeformPNTVertices(dstBaseVertices, boneMatrices, c_rvct_pgrnMeshBinding[iMesh]);
}
}
int CGrannyModel::GetRigidVertexCount() const
{
return m_rigidVtxCount;
}
int CGrannyModel::GetDeformVertexCount() const
{
return m_deformVtxCount;
}
int CGrannyModel::GetVertexCount() const
{
return m_vtxCount;
}
int CGrannyModel::GetMeshCount() const
{
return m_pgrnModel ? m_pgrnModel->MeshBindingCount : 0;
}
granny_model* CGrannyModel::GetGrannyModelPointer()
{
return m_pgrnModel;
}
LPDIRECT3DINDEXBUFFER8 CGrannyModel::GetD3DIndexBuffer() const
{
return m_idxBuf.GetD3DIndexBuffer();
}
LPDIRECT3DVERTEXBUFFER8 CGrannyModel::GetPNTD3DVertexBuffer() const
{
return m_pntVtxBuf.GetD3DVertexBuffer();
}
bool CGrannyModel::LockVertices(void** indicies, void** vertices) const
{
if (!m_idxBuf.Lock(indicies))
return false;
if (!m_pntVtxBuf.Lock(vertices))
{
m_idxBuf.Unlock();
return false;
}
return true;
}
void CGrannyModel::UnlockVertices() const
{
m_idxBuf.Unlock();
m_pntVtxBuf.Unlock();
}
bool CGrannyModel::LoadPNTVertices()
{
if (m_rigidVtxCount <= 0)
return true;
assert(m_meshs != NULL);
if (!m_pntVtxBuf.Create(m_rigidVtxCount, m_dwFvF, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED))
return false;
void* vertices;
if (!m_pntVtxBuf.Lock(&vertices))
return false;
for (int m = 0; m < m_pgrnModel->MeshBindingCount; ++m)
{
CGrannyMesh& rMesh = m_meshs[m];
rMesh.LoadPNTVertices(vertices);
}
m_pntVtxBuf.Unlock();
return true;
}
bool CGrannyModel::LoadIndices()
{
//assert(m_idxCount > 0);
if (m_idxCount <= 0)
return true;
if (!m_idxBuf.Create(m_idxCount, D3DFMT_INDEX16))
return false;
void * indices;
if (!m_idxBuf.Lock((void**)&indices))
return false;
for (int m = 0; m < m_pgrnModel->MeshBindingCount; ++m)
{
CGrannyMesh& rMesh = m_meshs[m];
rMesh.LoadIndices(indices);
}
m_idxBuf.Unlock();
return true;
}
bool CGrannyModel::LoadMeshs()
{
assert(m_meshs == NULL);
assert(m_pgrnModel != NULL);
if (m_pgrnModel->MeshBindingCount <= 0) // <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return true;
granny_skeleton * pgrnSkeleton = m_pgrnModel->Skeleton;
int vtxRigidPos = 0;
int vtxDeformPos = 0;
int vtxPos = 0;
int idxPos = 0;
int diffusePNTMeshNodeCount = 0;
int blendPNTMeshNodeCount = 0;
int blendPNT2MeshNodeCount = 0;
int meshCount = GetMeshCount();
m_meshs = new CGrannyMesh[meshCount];
m_dwFvF = 0;
for (int m = 0; m < meshCount; ++m)
{
CGrannyMesh& rMesh = m_meshs[m];
granny_mesh* pgrnMesh = m_pgrnModel->MeshBindings[m].Mesh;
if (GrannyMeshIsRigid(pgrnMesh))
{
if (!rMesh.CreateFromGrannyMeshPointer(pgrnSkeleton, pgrnMesh, vtxRigidPos, idxPos, m_kMtrlPal))
return false;
vtxRigidPos += GrannyGetMeshVertexCount(pgrnMesh);
}
else
{
if (!rMesh.CreateFromGrannyMeshPointer(pgrnSkeleton, pgrnMesh, vtxDeformPos, idxPos, m_kMtrlPal))
return false;
vtxDeformPos += GrannyGetMeshVertexCount(pgrnMesh);
m_canDeformPNVertices |= rMesh.CanDeformPNTVertices();
}
m_bHaveBlendThing |= rMesh.HaveBlendThing();
granny_int32x grni32xTypeCount = GrannyGetTotalTypeSize(pgrnMesh->PrimaryVertexData->VertexType) / 32;
int i = 0;
while (i < grni32xTypeCount)
{
if (NULL == pgrnMesh->PrimaryVertexData->VertexType[i].Name || 0 == strlen(pgrnMesh->PrimaryVertexData->VertexType[i].Name))
{
++i;
continue;
}
if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexPositionName) )
m_dwFvF |= D3DFVF_XYZ;
else if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexNormalName) )
m_dwFvF |= D3DFVF_NORMAL;
else if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexTextureCoordinatesName"0") )
m_dwFvF |= D3DFVF_TEX1;
else if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexTextureCoordinatesName"1") )
m_dwFvF |= D3DFVF_TEX2;
++i;
}
vtxPos += GrannyGetMeshVertexCount(pgrnMesh);
idxPos += GrannyGetMeshIndexCount(pgrnMesh);
if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_DIFFUSE_PNT))
++diffusePNTMeshNodeCount;
if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_BLEND_PNT))
++blendPNTMeshNodeCount;
}
m_meshNodeCapacity = diffusePNTMeshNodeCount + blendPNTMeshNodeCount + blendPNT2MeshNodeCount;
m_meshNodes = new TMeshNode[m_meshNodeCapacity];
for (int n = 0; n < meshCount; ++n)
{
CGrannyMesh& rMesh = m_meshs[n];
granny_mesh* pgrnMesh = m_pgrnModel->MeshBindings[n].Mesh;
CGrannyMesh::EType eMeshType = GrannyMeshIsRigid(pgrnMesh) ? CGrannyMesh::TYPE_RIGID : CGrannyMesh::TYPE_DEFORM;
if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_DIFFUSE_PNT))
AppendMeshNode(eMeshType, CGrannyMaterial::TYPE_DIFFUSE_PNT, n);
if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_BLEND_PNT))
AppendMeshNode(eMeshType, CGrannyMaterial::TYPE_BLEND_PNT, n);
}
// For Dungeon Block
if ((D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1|D3DFVF_TEX2) == m_dwFvF)
{
for (int n = 0; n < meshCount; ++n)
{
CGrannyMesh& rMesh = m_meshs[n];
rMesh.SetPNT2Mesh();
}
}
m_rigidVtxCount = vtxRigidPos;
m_deformVtxCount = vtxDeformPos;
m_vtxCount = vtxPos;
m_idxCount = idxPos;
return true;
}
BOOL CGrannyModel::CheckMeshIndex(int iIndex) const
{
if (iIndex < 0)
return FALSE;
if (iIndex >= m_meshNodeSize)
return FALSE;
return TRUE;
}
void CGrannyModel::AppendMeshNode(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType, int iMesh)
{
assert(m_meshNodeSize < m_meshNodeCapacity);
TMeshNode& rMeshNode = m_meshNodes[m_meshNodeSize++];
rMeshNode.iMesh = iMesh;
rMeshNode.pMesh = m_meshs + iMesh;
rMeshNode.pNextMeshNode = m_meshNodeLists[eMeshType][eMtrlType];
m_meshNodeLists[eMeshType][eMtrlType] = &rMeshNode;
}
bool CGrannyModel::CreateFromGrannyModelPointer(granny_model* pgrnModel)
{
assert(IsEmpty());
m_pgrnModel = pgrnModel;
if (!LoadMeshs())
return false;
if (!__LoadVertices())
return false;
if (!LoadIndices())
return false;
AddReference();
return true;
}
int CGrannyModel::GetIdxCount()
{
return m_idxCount;
}
bool CGrannyModel::CreateDeviceObjects()
{
if (m_rigidVtxCount > 0)
if (!m_pntVtxBuf.CreateDeviceObjects())
return false;
if (m_idxCount > 0)
if (!m_idxBuf.CreateDeviceObjects())
return false;
int meshCount = GetMeshCount();
for (int i = 0; i < meshCount; ++i)
{
CGrannyMesh& rMesh = m_meshs[i];
rMesh.RebuildTriGroupNodeList();
}
return true;
}
void CGrannyModel::DestroyDeviceObjects()
{
m_pntVtxBuf.DestroyDeviceObjects();
m_idxBuf.DestroyDeviceObjects();
}
bool CGrannyModel::IsEmpty() const
{
if (m_pgrnModel)
return false;
return true;
}
void CGrannyModel::Destroy()
{
m_kMtrlPal.Clear();
if (m_meshNodes)
delete [] m_meshNodes;
if (m_meshs)
delete [] m_meshs;
m_pntVtxBuf.Destroy();
m_idxBuf.Destroy();
Initialize();
}
bool CGrannyModel::__LoadVertices()
{
if (m_rigidVtxCount <= 0)
return true;
assert(m_meshs != NULL);
// assert((m_dwFvF & (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)) == m_dwFvF);
// if (!m_pntVtxBuf.Create(m_rigidVtxCount, D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED))
if (!m_pntVtxBuf.Create(m_rigidVtxCount, m_dwFvF, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED))
return false;
void* vertices;
if (!m_pntVtxBuf.Lock(&vertices))
return false;
for (int m = 0; m < m_pgrnModel->MeshBindingCount; ++m)
{
CGrannyMesh& rMesh = m_meshs[m];
rMesh.NEW_LoadVertices(vertices);
}
m_pntVtxBuf.Unlock();
return true;
}
void CGrannyModel::Initialize()
{
memset(m_meshNodeLists, 0, sizeof(m_meshNodeLists));
m_pgrnModel = NULL;
m_meshs = NULL;
m_meshNodes = NULL;
m_meshNodeSize = 0;
m_meshNodeCapacity = 0;
m_rigidVtxCount = 0;
m_deformVtxCount = 0;
m_vtxCount = 0;
m_idxCount = 0;
m_canDeformPNVertices = false;
m_dwFvF = 0;
m_bHaveBlendThing = false;
}
CGrannyModel::CGrannyModel()
{
Initialize();
}
CGrannyModel::~CGrannyModel()
{
Destroy();
}

98
src/EterGrnLib/Model.h Normal file
View File

@ -0,0 +1,98 @@
#pragma once
#include "../eterlib/GrpVertexBuffer.h"
#include "../eterlib/GrpIndexBuffer.h"
#include "Mesh.h"
class CGrannyModel : public CReferenceObject
{
public:
typedef struct SMeshNode
{
int iMesh;
const CGrannyMesh * pMesh;
SMeshNode * pNextMeshNode;
} TMeshNode;
public:
CGrannyModel();
virtual ~CGrannyModel();
bool IsEmpty() const;
bool CreateFromGrannyModelPointer(granny_model* pgrnModel);
bool CreateDeviceObjects();
void DestroyDeviceObjects();
void Destroy();
int GetRigidVertexCount() const;
int GetDeformVertexCount() const;
int GetVertexCount() const;
bool CanDeformPNTVertices() const;
void DeformPNTVertices(void* dstBaseVertices, D3DXMATRIX* boneMatrices, const std::vector<granny_mesh_binding*>& c_rvct_pgrnMeshBinding) const;
int GetIdxCount();
int GetMeshCount() const;
CGrannyMesh * GetMeshPointer(int iMesh);
granny_model * GetGrannyModelPointer();
const CGrannyMesh* GetMeshPointer(int iMesh) const;
LPDIRECT3DVERTEXBUFFER8 GetPNTD3DVertexBuffer() const;
LPDIRECT3DINDEXBUFFER8 GetD3DIndexBuffer() const;
const CGrannyModel::TMeshNode* GetMeshNodeList(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType) const;
bool LockVertices(void** indicies, void** vertices) const;
void UnlockVertices() const;
const CGrannyMaterialPalette& GetMaterialPalette() const;
protected:
bool LoadMeshs();
bool LoadPNTVertices();
bool LoadIndices();
void Initialize();
BOOL CheckMeshIndex(int iIndex) const;
void AppendMeshNode(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType, int iMesh);
protected:
// Granny Data
granny_model * m_pgrnModel;
// Static Data
CGrannyMesh * m_meshs;
CGraphicVertexBuffer m_pntVtxBuf; // for rigid mesh
CGraphicIndexBuffer m_idxBuf;
TMeshNode * m_meshNodes;
TMeshNode * m_meshNodeLists[CGrannyMesh::TYPE_MAX_NUM][CGrannyMaterial::TYPE_MAX_NUM];
int m_deformVtxCount;
int m_rigidVtxCount;
int m_vtxCount;
int m_idxCount;
int m_meshNodeSize;
int m_meshNodeCapacity;
bool m_canDeformPNVertices;
CGrannyMaterialPalette m_kMtrlPal;
private:
bool m_bHaveBlendThing;
public:
bool HaveBlendThing() { return m_bHaveBlendThing; }
//////////////////////////////////////////////////////////////////////////
// New members to support PNT2 type models
protected:
bool __LoadVertices();
protected:
DWORD m_dwFvF;
// New members to support PNT2 type models
//////////////////////////////////////////////////////////////////////////
};

View File

@ -0,0 +1,140 @@
#include "StdAfx.h"
#include "ModelInstance.h"
#include "Model.h"
#include "../EterLib/ResourceManager.h"
CGrannyModel* CGrannyModelInstance::GetModel()
{
return m_pModel;
}
void CGrannyModelInstance::SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage)
{
m_kMtrlPal.SetMaterialImagePointer(c_szImageName, pImage);
}
void CGrannyModelInstance::SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData)
{
m_kMtrlPal.SetMaterialData(c_szImageName, c_rkMaterialData);
}
void CGrannyModelInstance::SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower)
{
m_kMtrlPal.SetSpecularInfo(c_szMtrlName, bEnable, fPower);
}
void CGrannyModelInstance::SetLocalTime(float fLocalTime)
{
m_fLocalTime = fLocalTime;
}
int CGrannyModelInstance::ResetLocalTime()
{
m_fLocalTime = 0.0f;
return 0;
}
float CGrannyModelInstance::GetLocalTime()
{
return m_fLocalTime;
}
void CGrannyModelInstance::SetParentModelInstance(const CGrannyModelInstance* c_pParentModelInstance, const char * c_szBoneName)
{
int iBoneIndex;
if (!c_pParentModelInstance->GetBoneIndexByName(c_szBoneName, &iBoneIndex))
return;
SetParentModelInstance(c_pParentModelInstance, iBoneIndex);
}
void CGrannyModelInstance::SetParentModelInstance(const CGrannyModelInstance* c_pParentModelInstance, int iBone)
{
mc_pParentInstance = c_pParentModelInstance;
m_iParentBoneIndex = iBone;
}
bool CGrannyModelInstance::IsEmpty()
{
if (m_pModel)
{
// NO_MESH_BUG_FIX
if (!m_meshMatrices)
return true;
// END_OF_NO_MESH_BUG_FIX
return false;
}
return true;
}
bool CGrannyModelInstance::CreateDeviceObjects()
{
__CreateDynamicVertexBuffer();
return true;
}
void CGrannyModelInstance::DestroyDeviceObjects()
{
__DestroyDynamicVertexBuffer();
}
void CGrannyModelInstance::__Initialize()
{
if (m_pModel)
{
m_pModel->Release();
}
m_pModel = NULL;
mc_pParentInstance = NULL;
m_iParentBoneIndex = 0;
m_pgrnModelInstance = NULL;
// WORK
m_pgrnWorldPoseReal = NULL;
// END_OF_WORK
// TEST
// m_pgrnWorldPose = NULL;
m_ppkSkeletonInst = NULL;
// END_OF_TEST
m_meshMatrices = NULL;
m_pgrnCtrl = NULL;
m_pgrnAni = NULL;
m_dwOldUpdateFrame=0;
}
CGrannyModelInstance::CGrannyModelInstance()
{
m_pModel = NULL;
__Initialize();
}
CGrannyModelInstance::~CGrannyModelInstance()
{
Clear();
}
CDynamicPool<CGrannyModelInstance> CGrannyModelInstance::ms_kPool;
CGrannyModelInstance* CGrannyModelInstance::New()
{
return ms_kPool.Alloc();
}
void CGrannyModelInstance::Delete(CGrannyModelInstance* pkInst)
{
pkInst->Clear();
ms_kPool.Free(pkInst);
}
void CGrannyModelInstance::DestroySystem()
{
ms_kPool.Destroy();
}

View File

@ -0,0 +1,202 @@
#pragma once
//#define CACHE_DEFORMED_VERTEX
#include "../eterlib/GrpImage.h"
#include "../eterlib/GrpCollisionObject.h"
#include "Model.h"
#include "Motion.h"
class CGrannyModelInstance : public CGraphicCollisionObject
{
public:
enum
{
ANIFPS_MIN = 30,
ANIFPS_MAX = 120,
};
public:
static void DestroySystem();
static CGrannyModelInstance* New();
static void Delete(CGrannyModelInstance* pkInst);
static CDynamicPool<CGrannyModelInstance> ms_kPool;
public:
struct FCreateDeviceObjects
{
void operator() (CGrannyModelInstance * pModelInstance)
{pModelInstance->CreateDeviceObjects();}
};
struct FDestroyDeviceObjects
{
void operator() (CGrannyModelInstance * pModelInstance)
{pModelInstance->DestroyDeviceObjects();}
};
public:
CGrannyModelInstance();
virtual ~CGrannyModelInstance();
bool IsEmpty();
void Clear();
bool CreateDeviceObjects();
void DestroyDeviceObjects();
// Update & Render
void Update(DWORD dwAniFPS);
void UpdateLocalTime(float fElapsedTime);
void UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed);
void UpdateSkeleton(const D3DXMATRIX * c_pWorldMatrix, float fLocalTime);
void DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix);
void Deform(const D3DXMATRIX * c_pWorldMatrix);
// FIXME : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> 2<><32><EFBFBD><EFBFBD> <20>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̱⿡ <20>̷<EFBFBD>
// <20>Ҿ<EFBFBD><D2BE><EFBFBD><EFBFBD><EFBFBD> <20><>Ű<EFBFBD><C5B0><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD>) + (ȿ<><C8BF><EFBFBD><EFBFBD> <20>ؽ<EFBFBD><D8BD><EFBFBD>)
// <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. - [levites]
// NOTE : <20><><EFBFBD>ο<EFBFBD> if<69><66><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ű<EFBFBD><C5B0> <20><><EFBFBD>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>Լ<EFBFBD> <20><> <20><>ü<EFBFBD><C3BC> <20>и<EFBFBD>
// <20><>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E9BFA1><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. - [levites]
// NOTE : <20>ǹ<EFBFBD><C7B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OneTexture. ij<><C4B3><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> TwoTexture.
void RenderWithOneTexture();
void RenderWithTwoTexture();
void BlendRenderWithOneTexture();
void BlendRenderWithTwoTexture();
void RenderWithoutTexture();
// Model
CGrannyModel* GetModel();
void SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage);
void SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData);
void SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower);
void SetMainModelPointer(CGrannyModel* pkModel, CGraphicVertexBuffer* pkSharedDefromableVertexBuffer);
void SetLinkedModelPointer(CGrannyModel* pkModel, CGraphicVertexBuffer* pkSharedDefromableVertexBuffer, CGrannyModelInstance** ppkSkeletonInst);
// Motion
void SetMotionPointer(const CGrannyMotion* pMotion, float blendTime=0.0f, int loopCount=0, float speedRatio=1.0f);
void ChangeMotionPointer(const CGrannyMotion* pMotion, int loopCount=0, float speedRatio=1.0f);
void SetMotionAtEnd();
bool IsMotionPlaying();
void CopyMotion(CGrannyModelInstance * pModelInstance, bool bIsFreeSourceControl=false);
// Time
void SetLocalTime(float fLocalTime);
int ResetLocalTime();
float GetLocalTime();
float GetNextTime();
// WORK
DWORD GetDeformableVertexCount();
DWORD GetVertexCount();
// END_OF_WORK
// Bone & Attaching
const float * GetBoneMatrixPointer(int iBone) const;
const float * GetCompositeBoneMatrixPointer(int iBone) const;
bool GetMeshMatrixPointer(int iMesh, const D3DXMATRIX ** c_ppMatrix) const;
bool GetBoneIndexByName(const char * c_szBoneName, int * pBoneIndex) const;
void SetParentModelInstance(const CGrannyModelInstance* c_pParentModelInstance, const char * c_szBoneName);
void SetParentModelInstance(const CGrannyModelInstance* c_pParentModelInstance, int iBone);
// Collision Detection
bool Intersect(const D3DXMATRIX * c_pMatrix, float * pu, float * pv, float * pt);
void MakeBoundBox(TBoundBox* pBoundBox, const float* mat, const float* OBBMin, const float* OBBMax, D3DXVECTOR3* vtMin, D3DXVECTOR3* vtMax);
void GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3* vtMax);
// Reload Texture
void ReloadTexture();
protected:
void __Initialize();
void __DestroyModelInstance();
void __DestroyMeshMatrices();
void __DestroyDynamicVertexBuffer();
void __CreateModelInstance();
void __CreateMeshMatrices();
void __CreateDynamicVertexBuffer();
// WORK
void __DestroyWorldPose();
void __CreateWorldPose(CGrannyModelInstance* pkSrcModelInst);
bool __CreateMeshBindingVector(CGrannyModelInstance* pkDstModelInst);
void __DestroyMeshBindingVector();
int* __GetMeshBoneIndices(unsigned int iMeshBinding) const;
bool __IsDeformableVertexBuffer();
void __SetSharedDeformableVertexBuffer(CGraphicVertexBuffer* pkSharedDeformableVertexBuffer);
IDirect3DVertexBuffer8* __GetDeformableD3DVertexBufferPtr();
CGraphicVertexBuffer& __GetDeformableVertexBufferRef();
granny_world_pose* __GetWorldPosePtr() const;
// END_OF_WORK
// Update & Render
void UpdateWorldPose();
void UpdateWorldMatrices(const D3DXMATRIX * c_pWorldMatrix);
void DeformPNTVertices(void * pvDest);
void RenderMeshNodeListWithOneTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType);
void RenderMeshNodeListWithTwoTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType);
void RenderMeshNodeListWithoutTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType);
protected:
// Static Data
CGrannyModel * m_pModel;
// Granny Data
granny_model_instance * m_pgrnModelInstance;
//granny_world_pose * m_pgrnWorldPose; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
granny_control * m_pgrnCtrl;
granny_animation * m_pgrnAni;
// Meshes' Transform Data
D3DXMATRIX * m_meshMatrices;
// Attaching Data
const CGrannyModelInstance * mc_pParentInstance;
int m_iParentBoneIndex;
// Game Data
float m_fLocalTime;
float m_fSecondsElapsed;
DWORD m_dwOldUpdateFrame;
CGrannyMaterialPalette m_kMtrlPal;
// WORK
granny_world_pose* m_pgrnWorldPoseReal; // <20><><EFBFBD><EFBFBD> <20>޸𸮴<DEB8> <20><><EFBFBD><20>Ҵ<EFBFBD>
std::vector<granny_mesh_binding*> m_vct_pgrnMeshBinding;
// Dynamic Vertex Buffer
CGraphicVertexBuffer* m_pkSharedDeformableVertexBuffer;
CGraphicVertexBuffer m_kLocalDeformableVertexBuffer;
bool m_isDeformableVertexBuffer;
// END_OF_WORK
// TEST
CGrannyModelInstance** m_ppkSkeletonInst;
// END_OF_TEST
#ifdef _TEST
D3DXMATRIX TEST_matWorld;
#endif
public:
bool HaveBlendThing() { return m_pModel->HaveBlendThing(); }
};

View File

@ -0,0 +1,267 @@
#include "Stdafx.h"
#include "ModelInstance.h"
#include "Model.h"
void CGrannyModelInstance::MakeBoundBox(TBoundBox* pBoundBox,
const float* mat,
const float* OBBMin,
const float* OBBMax,
D3DXVECTOR3* vtMin,
D3DXVECTOR3* vtMax)
{
pBoundBox->sx = OBBMin[0] * mat[0] + OBBMin[1] * mat[4] + OBBMin[2] * mat[8] + mat[12];
pBoundBox->sy = OBBMin[0] * mat[1] + OBBMin[1] * mat[5] + OBBMin[2] * mat[9] + mat[13];
pBoundBox->sz = OBBMin[0] * mat[2] + OBBMin[1] * mat[6] + OBBMin[2] * mat[10] + mat[14];
pBoundBox->ex = OBBMax[0] * mat[0] + OBBMax[1] * mat[4] + OBBMax[2] * mat[8] + mat[12];
pBoundBox->ey = OBBMax[0] * mat[1] + OBBMax[1] * mat[5] + OBBMax[2] * mat[9] + mat[13];
pBoundBox->ez = OBBMax[0] * mat[2] + OBBMax[1] * mat[6] + OBBMax[2] * mat[10] + mat[14];
vtMin->x = min(vtMin->x, pBoundBox->sx);
vtMin->x = min(vtMin->x, pBoundBox->ex);
vtMin->y = min(vtMin->y, pBoundBox->sy);
vtMin->y = min(vtMin->y, pBoundBox->ey);
vtMin->z = min(vtMin->z, pBoundBox->sz);
vtMin->z = min(vtMin->z, pBoundBox->ez);
vtMax->x = max(vtMax->x, pBoundBox->sx);
vtMax->x = max(vtMax->x, pBoundBox->ex);
vtMax->y = max(vtMax->y, pBoundBox->sy);
vtMax->y = max(vtMax->y, pBoundBox->ey);
vtMax->z = max(vtMax->z, pBoundBox->sz);
vtMax->z = max(vtMax->z, pBoundBox->ez);
}
bool CGrannyModelInstance::Intersect(const D3DXMATRIX * c_pMatrix,
float * /*pu*/, float * /*pv*/, float * pt)
{
if (!m_pgrnModelInstance)
return false;
float u, v, t;
bool ret = false;
*pt = 100000000.0f;
float max = 10000000.0f;
D3DXVECTOR3 vtMin, vtMax;
vtMin.x = vtMin.y = vtMin.z = max;
vtMax.x = vtMax.y = vtMax.z = -max;
static stl_stack_pool<TBoundBox> s_boundBoxPool(1024);
s_boundBoxPool.clear();
int meshCount = m_pModel->GetMeshCount();
for (int m = 0; m < meshCount; ++m)
{
//const CGrannyMesh * pMesh = m_pModel->GetMeshPointer(m);
const granny_mesh * pgrnMesh = m_pModel->GetGrannyModelPointer()->MeshBindings[m].Mesh;
for (int b = 0; b < pgrnMesh->BoneBindingCount; ++b)
{
const granny_bone_binding& rgrnBoneBinding = pgrnMesh->BoneBindings[b];
TBoundBox * pBoundBox = s_boundBoxPool.alloc();
// WORK
float * Transform = GrannyGetWorldPose4x4(__GetWorldPosePtr(), __GetMeshBoneIndices(m)[b]);
// END_OF_WORK
MakeBoundBox(pBoundBox,
Transform,
rgrnBoneBinding.OBBMin,
rgrnBoneBinding.OBBMax,
&vtMin,
&vtMax);
pBoundBox->meshIndex = m;
pBoundBox->boneIndex = b;
}
}
if (!IntersectCube(c_pMatrix,
vtMin.x, vtMin.y, vtMin.z,
vtMax.x, vtMax.y, vtMax.z,
ms_vtPickRayOrig, ms_vtPickRayDir,
&u, &v, &t))
{
return ret;
}
return true;
/*
TBoundBox* boundBoxs = s_boundBoxPool.base();
for (int i = 0; i < s_boundBoxPool.size(); ++i)
{
TBoundBox& rcurBoundBox=boundBoxs[i];
if (!IntersectBoundBox(c_pMatrix, rcurBoundBox, &u, &v, &t))
continue;
granny_matrix_4x4* pgrnMatCompositeBuffer = GrannyGetWorldPoseComposite4x4Array(m_pgrnWorldPose);
const CGrannyMesh* c_pMesh = m_pModel->GetMeshPointer(rcurBoundBox.meshIndex);
const granny_mesh* c_pgrnMesh = c_pMesh->GetGrannyMeshPointer();
if (!GrannyMeshIsRigid(c_pgrnMesh))
{
//continue;
ret = true;
}
else
{
D3DXMATRIX matMesh;
int* toBoneIndices = c_pMesh->GetBoneIndices();
D3DXMatrixMultiply(&matMesh, (D3DXMATRIX*) pgrnMatCompositeBuffer[toBoneIndices[0]], c_pMatrix);
granny_tri_material_group* pgrnTriGroups = GrannyGetMeshTriangleGroups(c_pgrnMesh);
int mtrlCount = c_pMesh->GetGrannyMeshPointer()->MaterialBindingCount;
int vtxCount = GrannyGetMeshVertexCount(c_pgrnMesh);
int groupCount = GrannyGetMeshTriangleGroupCount(c_pgrnMesh);
TIndex* modelIndices;
TPNTVertex* modelVertices;
if (m_pModel->LockVertices((void**)&modelIndices, (void**)&modelVertices))
{
TIndex* meshIndices = modelIndices + c_pMesh->GetIndexBasePosition();
TPNTVertex* meshVertices = modelVertices + c_pMesh->GetVertexBasePosition();
for (int i = 0; i < groupCount; ++i)
{
granny_tri_material_group& rgrnTriGroup = pgrnTriGroups[i];
if (rgrnTriGroup.MaterialIndex < 0 || rgrnTriGroup.MaterialIndex >= mtrlCount)
continue;
if (IntersectMesh(&matMesh,
meshVertices,
sizeof(TPNTVertex),
vtxCount,
meshIndices,
GrannyGetMeshIndexCount(c_pgrnMesh),
ms_vtPickRayOrig,
ms_vtPickRayDir,
&u, &v, &t))
{
ret = true;
break;
}
}
m_pModel->UnlockVertices();
}
}
if (ret)
{
*pu = u;
*pv = v;
*pt = -t;
if (c_szModelName)
{
if (!strncmp(c_pgrnMesh->Name, c_szModelName, strlen(c_szModelName)))
return ret;
ret = false;
continue;
}
return ret;
}
}
return (ret);
*/
}
#include "../EterBase/Timer.h"
void CGrannyModelInstance::GetBoundBox(D3DXVECTOR3* vtMin, D3DXVECTOR3* vtMax)
{
if (!m_pgrnModelInstance)
return;
TBoundBox BoundBox;
vtMin->x = vtMin->y = vtMin->z = +100000.0f;
vtMax->x = vtMax->y = vtMax->z = -100000.0f;
int meshCount = m_pModel->GetMeshCount();
for (int m = 0; m < meshCount; ++m)
{
//const CGrannyMesh* pMesh = m_pModel->GetMeshPointer(m);
const granny_mesh* pgrnMesh = m_pModel->GetGrannyModelPointer()->MeshBindings[m].Mesh;
// WORK
int* boneIndices = __GetMeshBoneIndices(m);
// END_OF_WORK
for (int b = 0; b < pgrnMesh->BoneBindingCount; ++b)
{
const granny_bone_binding& rgrnBoneBinding = pgrnMesh->BoneBindings[b];
MakeBoundBox(&BoundBox,
GrannyGetWorldPose4x4(__GetWorldPosePtr(), boneIndices[b]),
rgrnBoneBinding.OBBMin, rgrnBoneBinding.OBBMax, vtMin, vtMax);
}
}
}
bool CGrannyModelInstance::GetMeshMatrixPointer(int iMesh, const D3DXMATRIX ** c_ppMatrix) const
{
if (!m_pgrnModelInstance)
return false;
int meshCount = m_pModel->GetMeshCount();
if (meshCount <= 0)
return false;
// WORK
//const CGrannyMesh * pMesh = m_pModel->GetMeshPointer(iMesh);
*c_ppMatrix = (D3DXMATRIX *)GrannyGetWorldPose4x4(__GetWorldPosePtr(), __GetMeshBoneIndices(iMesh)[0]);
// END_OF_WORK
return true;
}
/*
void CGraphicThingInstance::DrawBoundBox()
{
if (!mc_pMeshVector)
return;
if (!m_pgrnWorldPose)
return;
D3DXVECTOR3 vtMin;
D3DXVECTOR3 vtMax;
SetDiffuseColor(0.0f, 1.0f, 0.0f);
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20>ڽ<EFBFBD>
//GetBoundBox(&vtMin, &vtMax);
//DrawLineCube(vtMin.x, vtMin.y, vtMin.z, vtMax.x, vtMax.y, vtMax.z);
//const CThing::TMeshVector& rmeshVector=mc_pModel->meshVector;
ms_lpd3dMatStack->LoadMatrix(&m_Matrix);
for (size_t m=0; m<mc_pMeshVector->size(); ++m)
{
const CThing::TMesh& rmesh=mc_pMeshVector->at(m);
for (int b=0; b<rmesh.pgrnMesh->BoneBindingCount; ++b)
{
granny_bone_binding& rgrnBoneBinding=rmesh.pgrnMesh->BoneBindings[b];
int* toBoneIndices=GrannyGetMeshBindingToBoneIndices(rmesh.pgrnMeshBinding);
D3DXMATRIX* pmat=(D3DXMATRIX*)GrannyGetWorldPose4x4(m_pgrnWorldPose, toBoneIndices[b]);
D3DXVec3TransformCoord(&vtMin, &D3DXVECTOR3(rgrnBoneBinding.OBBMin), pmat);
D3DXVec3TransformCoord(&vtMax, &D3DXVECTOR3(rgrnBoneBinding.OBBMax), pmat);
DrawLineCube(vtMin.x, vtMin.y, vtMin.z, vtMax.x, vtMax.y, vtMax.z);
}
}
}
*/

View File

@ -0,0 +1,300 @@
#include "StdAfx.h"
#include "ModelInstance.h"
#include "Model.h"
void CGrannyModelInstance::Clear()
{
m_kMtrlPal.Clear();
DestroyDeviceObjects();
// WORK
__DestroyMeshBindingVector();
// END_OF_WORK
__DestroyMeshMatrices();
__DestroyModelInstance();
__DestroyWorldPose();
__Initialize();
}
void CGrannyModelInstance::SetMainModelPointer(CGrannyModel* pModel, CGraphicVertexBuffer* pkSharedDeformableVertexBuffer)
{
SetLinkedModelPointer(pModel, pkSharedDeformableVertexBuffer, NULL);
}
void CGrannyModelInstance::SetLinkedModelPointer(CGrannyModel* pkModel, CGraphicVertexBuffer* pkSharedDeformableVertexBuffer, CGrannyModelInstance** ppkSkeletonInst)
{
Clear();
if (m_pModel)
m_pModel->Release();
m_pModel = pkModel;
m_pModel->AddReference();
if (pkSharedDeformableVertexBuffer)
__SetSharedDeformableVertexBuffer(pkSharedDeformableVertexBuffer);
else
__CreateDynamicVertexBuffer();
__CreateModelInstance();
// WORK
if (ppkSkeletonInst && *ppkSkeletonInst)
{
m_ppkSkeletonInst = ppkSkeletonInst;
__CreateWorldPose(*ppkSkeletonInst);
__CreateMeshBindingVector(*ppkSkeletonInst);
}
else
{
__CreateWorldPose(NULL);
__CreateMeshBindingVector(NULL);
}
// END_OF_WORK
__CreateMeshMatrices();
ResetLocalTime();
m_kMtrlPal.Copy(pkModel->GetMaterialPalette());
}
// WORK
granny_world_pose* CGrannyModelInstance::__GetWorldPosePtr() const
{
if (m_pgrnWorldPoseReal)
return m_pgrnWorldPoseReal;
if (m_ppkSkeletonInst && *m_ppkSkeletonInst)
return (*m_ppkSkeletonInst)->m_pgrnWorldPoseReal;
assert(m_ppkSkeletonInst!=NULL && "__GetWorldPosePtr - NO HAVE SKELETON");
return NULL;
}
int* CGrannyModelInstance::__GetMeshBoneIndices(unsigned int iMeshBinding) const
{
assert(iMeshBinding<m_vct_pgrnMeshBinding.size());
return GrannyGetMeshBindingToBoneIndices(m_vct_pgrnMeshBinding[iMeshBinding]);
}
bool CGrannyModelInstance::__CreateMeshBindingVector(CGrannyModelInstance* pkDstModelInst)
{
assert(m_vct_pgrnMeshBinding.empty());
if (!m_pModel)
return false;
granny_model* pgrnModel = m_pModel->GetGrannyModelPointer();
if (!pgrnModel)
return false;
granny_skeleton* pgrnDstSkeleton = pgrnModel->Skeleton;
if (pkDstModelInst && pkDstModelInst->m_pModel && pkDstModelInst->m_pModel->GetGrannyModelPointer())
pgrnDstSkeleton = pkDstModelInst->m_pModel->GetGrannyModelPointer()->Skeleton;
m_vct_pgrnMeshBinding.reserve(pgrnModel->MeshBindingCount);
granny_int32 iMeshBinding;
for (iMeshBinding = 0; iMeshBinding != pgrnModel->MeshBindingCount; ++iMeshBinding)
m_vct_pgrnMeshBinding.push_back(GrannyNewMeshBinding(pgrnModel->MeshBindings[iMeshBinding].Mesh, pgrnModel->Skeleton, pgrnDstSkeleton));
return true;
}
void CGrannyModelInstance::__DestroyMeshBindingVector()
{
std::for_each(m_vct_pgrnMeshBinding.begin(), m_vct_pgrnMeshBinding.end(), GrannyFreeMeshBinding);
m_vct_pgrnMeshBinding.clear();
}
// END_OF_WORK
void CGrannyModelInstance::__CreateWorldPose(CGrannyModelInstance* pkSkeletonInst)
{
assert(m_pgrnModelInstance != NULL);
assert(m_pgrnWorldPoseReal == NULL);
// WORK
if (pkSkeletonInst)
return;
// END_OF_WORK
granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance);
// WORK
m_pgrnWorldPoseReal = GrannyNewWorldPose(pgrnSkeleton->BoneCount);
// END_OF_WORK
}
void CGrannyModelInstance::__DestroyWorldPose()
{
if (!m_pgrnWorldPoseReal)
return;
GrannyFreeWorldPose(m_pgrnWorldPoseReal);
m_pgrnWorldPoseReal = NULL;
}
void CGrannyModelInstance::__CreateModelInstance()
{
assert(m_pModel != NULL);
assert(m_pgrnModelInstance == NULL);
const granny_model * pgrnModel = m_pModel->GetGrannyModelPointer();
m_pgrnModelInstance = GrannyInstantiateModel(pgrnModel);
}
void CGrannyModelInstance::__DestroyModelInstance()
{
if (!m_pgrnModelInstance)
return;
GrannyFreeModelInstance(m_pgrnModelInstance);
m_pgrnModelInstance = NULL;
}
void CGrannyModelInstance::__CreateMeshMatrices()
{
assert(m_pModel != NULL);
if (m_pModel->GetMeshCount() <= 0) // <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><>޶<EFBFBD> <20><><EFBFBD><EFBFBD>) <20>𵨵<EFBFBD> <20><>Ȥ <20>ִ<EFBFBD>..
return;
int meshCount = m_pModel->GetMeshCount();
m_meshMatrices = new D3DXMATRIX[meshCount];
}
void CGrannyModelInstance::__DestroyMeshMatrices()
{
if (!m_meshMatrices)
return;
delete [] m_meshMatrices;
m_meshMatrices = NULL;
}
DWORD CGrannyModelInstance::GetDeformableVertexCount()
{
if (!m_pModel)
return 0;
return m_pModel->GetDeformVertexCount();
}
DWORD CGrannyModelInstance::GetVertexCount()
{
if (!m_pModel)
return 0;
return m_pModel->GetVertexCount();
}
// WORK
void CGrannyModelInstance::__SetSharedDeformableVertexBuffer(CGraphicVertexBuffer* pkSharedDeformableVertexBuffer)
{
m_pkSharedDeformableVertexBuffer = pkSharedDeformableVertexBuffer;
}
bool CGrannyModelInstance::__IsDeformableVertexBuffer()
{
if (m_pkSharedDeformableVertexBuffer)
return true;
return m_kLocalDeformableVertexBuffer.IsEmpty();
}
IDirect3DVertexBuffer8* CGrannyModelInstance::__GetDeformableD3DVertexBufferPtr()
{
return __GetDeformableVertexBufferRef().GetD3DVertexBuffer();
}
CGraphicVertexBuffer& CGrannyModelInstance::__GetDeformableVertexBufferRef()
{
if (m_pkSharedDeformableVertexBuffer)
return *m_pkSharedDeformableVertexBuffer;
return m_kLocalDeformableVertexBuffer;
}
void CGrannyModelInstance::__CreateDynamicVertexBuffer()
{
assert(m_pModel != NULL);
assert(m_kLocalDeformableVertexBuffer.IsEmpty());
int vtxCount = m_pModel->GetDeformVertexCount();
if (0 != vtxCount)
{
if (!m_kLocalDeformableVertexBuffer.Create(vtxCount,
D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
//D3DUSAGE_DYNAMIC, D3DPOOL_SYSTEMMEM
D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED
))
return;
}
}
void CGrannyModelInstance::__DestroyDynamicVertexBuffer()
{
m_kLocalDeformableVertexBuffer.Destroy();
m_pkSharedDeformableVertexBuffer = NULL;
}
// END_OF_WORK
bool CGrannyModelInstance::GetBoneIndexByName(const char * c_szBoneName, int * pBoneIndex) const
{
assert(m_pgrnModelInstance != NULL);
granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance);
if (!GrannyFindBoneByName(pgrnSkeleton, c_szBoneName, pBoneIndex))
return false;
return true;
}
const float * CGrannyModelInstance::GetBoneMatrixPointer(int iBone) const
{
const float* bones = GrannyGetWorldPose4x4(__GetWorldPosePtr(), iBone);
if (!bones)
{
granny_model* pModel = m_pModel->GetGrannyModelPointer();
//TraceError("GrannyModelInstance(%s).GetBoneMatrixPointer(boneIndex(%d)).NOT_FOUND_BONE", pModel->Name, iBone);
return NULL;
}
return bones;
}
const float * CGrannyModelInstance::GetCompositeBoneMatrixPointer(int iBone) const
{
// NOTE : GrannyGetWorldPose4x4<78><34> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.. <20>׷<EFBFBD><D7B7>ϰ<EFBFBD> <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD>
// GrannyGetWorldPose4x4<78><34> <20><><EFBFBD><EFBFBD> matrix <20><><EFBFBD>Ҹ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return GrannyGetWorldPoseComposite4x4(__GetWorldPosePtr(), iBone);
}
void CGrannyModelInstance::ReloadTexture()
{
assert("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - CGrannyModelInstance::ReloadTexture()");
/*
assert(m_pModel != NULL);
const CGrannyMaterialPalette & c_rGrannyMaterialPalette = m_pModel->GetMaterialPalette();
DWORD dwMaterialCount = c_rGrannyMaterialPalette.GetMaterialCount();
for (DWORD dwMtrIndex = 0; dwMtrIndex < dwMaterialCount; ++dwMtrIndex)
{
const CGrannyMaterial & c_rGrannyMaterial = c_rGrannyMaterialPalette.GetMaterialRef(dwMtrIndex);
CGraphicImage * pImageStage0 = c_rGrannyMaterial.GetImagePointer(0);
if (pImageStage0)
pImageStage0->Reload();
CGraphicImage * pImageStage1 = c_rGrannyMaterial.GetImagePointer(1);
if (pImageStage1)
pImageStage1->Reload();
}
*/
}

View File

@ -0,0 +1,148 @@
#include "StdAfx.h"
#include "ModelInstance.h"
#include "Model.h"
void CGrannyModelInstance::CopyMotion(CGrannyModelInstance * pModelInstance, bool bIsFreeSourceControl)
{
if (!pModelInstance->IsMotionPlaying())
return;
if (m_pgrnCtrl)
GrannyFreeControl(m_pgrnCtrl);
float localTime = GetLocalTime();
m_pgrnAni = pModelInstance->m_pgrnAni;
m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, m_pgrnModelInstance);
if (!m_pgrnCtrl)
return;
GrannySetControlSpeed(m_pgrnCtrl, GrannyGetControlSpeed(pModelInstance->m_pgrnCtrl));
GrannySetControlLoopCount(m_pgrnCtrl, GrannyGetControlLoopCount(pModelInstance->m_pgrnCtrl));
GrannySetControlEaseIn(m_pgrnCtrl, true);
GrannySetControlEaseOut(m_pgrnCtrl, false);
GrannySetControlRawLocalClock(m_pgrnCtrl, GrannyGetControlRawLocalClock(pModelInstance->m_pgrnCtrl));
GrannyFreeControlOnceUnused(m_pgrnCtrl);
if (bIsFreeSourceControl)
{
GrannyFreeControl(pModelInstance->m_pgrnCtrl);
pModelInstance->m_pgrnCtrl = NULL;
}
}
bool CGrannyModelInstance::IsMotionPlaying()
{
if (!m_pgrnCtrl)
return false;
if (GrannyControlIsComplete(m_pgrnCtrl))
return false;
return true;
}
void CGrannyModelInstance::SetMotionPointer(const CGrannyMotion * pMotion, float blendTime, int loopCount, float speedRatio)
{
// TEST
if (!m_pgrnWorldPoseReal)
return;
// END_OF_TEST
granny_model_instance * pgrnModelInstance = m_pgrnModelInstance;
if (!pgrnModelInstance)
return;
float localTime = GetLocalTime();
bool isFirst=false;
if (m_pgrnCtrl)
{
//float durationLeft = GrannyGetControlDurationLeft(m_pgrnCtrl);
//float easeOutTime = (blendTime < durationLeft) ? blendTime : durationLeft;
//float oldCtrlFinishTime = GrannyEaseControlOut(m_pgrnCtrl, blendTime); //easeOutTime);
GrannySetControlEaseOutCurve(m_pgrnCtrl, localTime, localTime + blendTime, 1.0f, 1.0f, 0.0f, 0.0f);
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, true);
//Tracef("easeOut %f\n", easeOutTime);
GrannyCompleteControlAt(m_pgrnCtrl, localTime + blendTime);
//GrannyCompleteControlAt(m_pgrnCtrl, oldCtrlFinishTime);
//GrannyCompleteControlAt(m_pgrnCtrl, localTime);
GrannyFreeControlIfComplete(m_pgrnCtrl);
}
else
{
isFirst=true;
}
m_pgrnAni = pMotion->GetGrannyAnimationPointer();
m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, pgrnModelInstance);
if (!m_pgrnCtrl)
return;
GrannySetControlSpeed(m_pgrnCtrl, speedRatio);
GrannySetControlLoopCount(m_pgrnCtrl, loopCount);
if (isFirst)
{
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, false);
}
else
{
GrannySetControlEaseIn(m_pgrnCtrl, true);
GrannySetControlEaseOut(m_pgrnCtrl, false);
if (blendTime > 0.0f)
GrannySetControlEaseInCurve(m_pgrnCtrl, localTime, localTime + blendTime, 0.0f, 0.0f, 1.0f, 1.0f);
}
//GrannyEaseControlIn(m_pgrnCtrl, blendTime, false);
GrannyFreeControlOnceUnused(m_pgrnCtrl);
//Tracef("easeIn %f\n", blendTime);
}
void CGrannyModelInstance::ChangeMotionPointer(const CGrannyMotion* pMotion, int loopCount, float speedRatio)
{
granny_model_instance * pgrnModelInstance = m_pgrnModelInstance;
if (!pgrnModelInstance)
return;
// <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20>պκ<D5BA><CEBA><EFBFBD> <20><>ŵ <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> LocalTime <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. - [levites]
float fSkipTime = 0.3f;
float localTime = GetLocalTime() - fSkipTime;
if (m_pgrnCtrl)
{
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, false);
GrannyCompleteControlAt(m_pgrnCtrl, localTime);
GrannyFreeControlIfComplete(m_pgrnCtrl);
}
m_pgrnAni = pMotion->GetGrannyAnimationPointer();
m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, pgrnModelInstance);
if (!m_pgrnCtrl)
return;
GrannySetControlSpeed(m_pgrnCtrl, speedRatio);
GrannySetControlLoopCount(m_pgrnCtrl, loopCount);
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, false);
GrannyFreeControlOnceUnused(m_pgrnCtrl);
}
void CGrannyModelInstance::SetMotionAtEnd()
{
if (!m_pgrnCtrl)
return;
//Tracef("%f\n", endingTime);
float endingTime = GrannyGetControlLocalDuration(m_pgrnCtrl);
GrannySetControlRawLocalClock(m_pgrnCtrl, endingTime);
}

View File

@ -0,0 +1,407 @@
#include "StdAfx.h"
#include "../eterlib/StateManager.h"
#include "ModelInstance.h"
#include "Model.h"
#ifdef _TEST
#include "../eterlib/GrpScreen.h"
void Granny_RenderBoxBones(const granny_skeleton* pkGrnSkeleton, const granny_world_pose* pkGrnWorldPose, const D3DXMATRIX& matBase)
{
D3DXMATRIX matWorld;
CScreen screen;
for (int iBone = 0; iBone != pkGrnSkeleton->BoneCount; ++iBone)
{
const granny_bone& rkGrnBone = pkGrnSkeleton->Bones[iBone];
const D3DXMATRIX* c_matBone=(const D3DXMATRIX*)GrannyGetWorldPose4x4(pkGrnWorldPose, iBone);
D3DXMatrixMultiply(&matWorld, c_matBone, &matBase);
STATEMANAGER.SetTransform(D3DTS_WORLD, &matWorld);
screen.RenderBox3d(-5.0f, -5.0f, -5.0f, 5.0f, 5.0f, 5.0f);
}
}
#endif
void CGrannyModelInstance::DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix)
{
if (IsEmpty())
return;
// DELETED
//m_pgrnWorldPose = m_pgrnWorldPoseReal;
///////////////////////////////
UpdateWorldPose();
UpdateWorldMatrices(c_pWorldMatrix);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
//// Render
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// With One Texture
void CGrannyModelInstance::RenderWithOneTexture()
{
// FIXME : Deform, Render, BlendRender<65><72> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> - [levites]
if (IsEmpty())
return;
#ifdef _TEST
Granny_RenderBoxBones(GrannyGetSourceSkeleton(m_pgrnModelInstance), m_pgrnWorldPose, TEST_matWorld);
if (GetAsyncKeyState('P'))
Tracef("render %x", m_pgrnModelInstance);
return;
#endif
STATEMANAGER.SetVertexShader(ms_pntVS);
// WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr();
// END_OF_WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer();
if (lpd3dDeformPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT);
}
if (lpd3dRigidPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT);
}
}
void CGrannyModelInstance::BlendRenderWithOneTexture()
{
if (IsEmpty())
return;
// WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr();
// END_OF_WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer();
STATEMANAGER.SetVertexShader(ms_pntVS);
if (lpd3dDeformPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT);
}
if (lpd3dRigidPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_BLEND_PNT);
}
}
// With Two Texture
void CGrannyModelInstance::RenderWithTwoTexture()
{
// FIXME : Deform, Render, BlendRender<65><72> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> - [levites]
if (IsEmpty())
return;
STATEMANAGER.SetVertexShader(ms_pntVS);
// WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr();
// END_OF_WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer();
if (lpd3dDeformPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT);
}
if (lpd3dRigidPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT);
}
}
void CGrannyModelInstance::BlendRenderWithTwoTexture()
{
if (IsEmpty())
return;
// WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr();
// END_OF_WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer();
STATEMANAGER.SetVertexShader(ms_pntVS);
if (lpd3dDeformPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT);
}
if (lpd3dRigidPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_BLEND_PNT);
}
}
void CGrannyModelInstance::RenderWithoutTexture()
{
if (IsEmpty())
return;
STATEMANAGER.SetVertexShader(ms_pntVS);
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTexture(1, NULL);
// WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr();
// END_OF_WORK
LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer();
if (lpd3dDeformPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT);
RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT);
}
if (lpd3dRigidPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT);
RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_BLEND_PNT);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
//// Render Mesh List
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// With One Texture
void CGrannyModelInstance::RenderMeshNodeListWithOneTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType)
{
assert(m_pModel != NULL);
LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer();
assert(lpd3dIdxBuf != NULL);
const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType);
while (pMeshNode)
{
const CGrannyMesh * pMesh = pMeshNode->pMesh;
int vtxMeshBasePos = pMesh->GetVertexBasePosition();
STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos);
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]);
/////
const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType);
int vtxCount = pMesh->GetVertexCount();
while (pTriGroupNode)
{
ms_faceCount += pTriGroupNode->triCount;
CGrannyMaterial& rkMtrl=m_kMtrlPal.GetMaterialRef(pTriGroupNode->mtrlIndex);
rkMtrl.ApplyRenderState();
STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount);
rkMtrl.RestoreRenderState();
pTriGroupNode = pTriGroupNode->pNextTriGroupNode;
}
/////
pMeshNode = pMeshNode->pNextMeshNode;
}
}
// With Two Texture
void CGrannyModelInstance::RenderMeshNodeListWithTwoTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType)
{
assert(m_pModel != NULL);
LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer();
assert(lpd3dIdxBuf != NULL);
const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType);
while (pMeshNode)
{
const CGrannyMesh * pMesh = pMeshNode->pMesh;
int vtxMeshBasePos = pMesh->GetVertexBasePosition();
STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos);
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]);
/////
const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType);
int vtxCount = pMesh->GetVertexCount();
while (pTriGroupNode)
{
ms_faceCount += pTriGroupNode->triCount;
const CGrannyMaterial& rkMtrl=m_kMtrlPal.GetMaterialRef(pTriGroupNode->mtrlIndex);
STATEMANAGER.SetTexture(0, rkMtrl.GetD3DTexture(0));
STATEMANAGER.SetTexture(1, rkMtrl.GetD3DTexture(1));
STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount);
pTriGroupNode = pTriGroupNode->pNextTriGroupNode;
}
/////
pMeshNode = pMeshNode->pNextMeshNode;
}
}
// Without Texture
void CGrannyModelInstance::RenderMeshNodeListWithoutTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType)
{
assert(m_pModel != NULL);
LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer();
assert(lpd3dIdxBuf != NULL);
const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType);
while (pMeshNode)
{
const CGrannyMesh * pMesh = pMeshNode->pMesh;
int vtxMeshBasePos = pMesh->GetVertexBasePosition();
STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos);
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]);
/////
const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType);
int vtxCount = pMesh->GetVertexCount();
while (pTriGroupNode)
{
ms_faceCount += pTriGroupNode->triCount;
STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount);
pTriGroupNode = pTriGroupNode->pNextTriGroupNode;
}
/////
pMeshNode = pMeshNode->pNextMeshNode;
}
}
/*
void CGrannyModelInstance::RenderMeshNodeList(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType)
{
assert(m_pModel != NULL);
LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer();
assert(lpd3dIdxBuf != NULL);
const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType);
while (pMeshNode)
{
const CGrannyMesh * pMesh = pMeshNode->pMesh;
int vtxMeshBasePos = pMesh->GetVertexBasePosition();
STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos);
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]);
/////
const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType);
int vtxCount = pMesh->GetVertexCount();
while (pTriGroupNode)
{
ms_faceCount += pTriGroupNode->triCount;
STATEMANAGER.SetTexture(0, pTriGroupNode->lpd3dTextures[0]);
if (pTriGroupNode->lpd3dTextures[1])
STATEMANAGER.SetTexture(1, pTriGroupNode->lpd3dTextures[1]);
else
{
STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
STATEMANAGER.SetTexture(1, m_FogInstance.GetTexturePointer()->GetD3DTexture());
D3DXMATRIX mat;
memset(&mat, 0, sizeof(D3DXMATRIX));
mat._31 = -0.001f;
mat._41 = -7.0f;
mat._42 = 0.5f;
STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &mat);
}
STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount);
if (!pTriGroupNode->lpd3dTextures[1])
{
STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
}
pTriGroupNode = pTriGroupNode->pNextTriGroupNode;
}
/////
pMeshNode = pMeshNode->pNextMeshNode;
}
}
void CGrannyModelInstance::RenderToShadowMap()
{
if (IsEmpty())
return;
STATEMANAGER.SetVertexShader(ms_pntVS);
// LPDIRECT3DVERTEXBUFFER8 lpd3dDynamicPNTVtxBuf = m_dynamicPNTVtxBuf.GetD3DVertexBuffer();
LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = m_dynamicPNTVtxBuf.GetD3DVertexBuffer();
LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer();
// STATEMANAGER.SaveRenderState(D3DRS_ALPHATESTENABLE, TRUE);
// STATEMANAGER.SaveRenderState(D3DRS_ALPHAREF, 0);
// STATEMANAGER.SaveRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL);
//
// if (lpd3dDynamicPNTVtxBuf)
// {
// STATEMANAGER.SetStreamSource(0, lpd3dDynamicPNTVtxBuf, sizeof(TPNTVertex));
// RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT);
// }
//
// STATEMANAGER.RestoreRenderState(D3DRS_ALPHATESTENABLE);
// STATEMANAGER.RestoreRenderState(D3DRS_ALPHAREF);
// STATEMANAGER.RestoreRenderState(D3DRS_ALPHAFUNC);
if (lpd3dDeformPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT);
}
if (lpd3dRigidPNTVtxBuf)
{
STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex));
RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT);
}
}
*/

View File

@ -0,0 +1,206 @@
#include "StdAfx.h"
#include "../eterbase/Debug.h"
#include "ModelInstance.h"
#include "Model.h"
void CGrannyModelInstance::Update(DWORD dwAniFPS)
{
if (!dwAniFPS)
return;
const DWORD c_dwCurUpdateFrame = (DWORD) (GetLocalTime() * ANIFPS_MAX);
const DWORD ANIFPS_STEP = ANIFPS_MAX/dwAniFPS;
if (c_dwCurUpdateFrame>ANIFPS_STEP && c_dwCurUpdateFrame/ANIFPS_STEP==m_dwOldUpdateFrame/ANIFPS_STEP)
return;
m_dwOldUpdateFrame=c_dwCurUpdateFrame;
//DWORD t1=timeGetTime();
GrannySetModelClock(m_pgrnModelInstance, GetLocalTime());
//DWORD t2=timeGetTime();
#ifdef __PERFORMANCE_CHECKER__
{
static FILE* fp=fopen("perf_grn_setmodelclock.txt", "w");
if (t2-t1>3)
{
fprintf(fp, "%f:%x:- GrannySetModelClock(time=%f) = %dms\n", timeGetTime()/1000.0f, this, GetLocalTime(), t2-t1);
fflush(fp);
}
}
#endif
}
void CGrannyModelInstance::UpdateLocalTime(float fElapsedTime)
{
m_fSecondsElapsed = fElapsedTime;
m_fLocalTime += fElapsedTime;
}
void CGrannyModelInstance::UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed)
{
if (!m_pgrnModelInstance)
{
TraceError("CGrannyModelIstance::UpdateTransform - m_pgrnModelInstance = NULL");
return;
}
GrannyUpdateModelMatrix(m_pgrnModelInstance, fSecondsElapsed, (const float *) pMatrix, (float *) pMatrix);
//Tracef("%f %f %f",pMatrix->_41,pMatrix->_42,pMatrix->_43);
}
void CGrannyModelInstance::Deform(const D3DXMATRIX * c_pWorldMatrix)
{
if (IsEmpty())
return;
// DELETED
//m_pgrnWorldPose = m_pgrnWorldPoseReal;
/////////////////////////////////////////////
UpdateWorldPose();
UpdateWorldMatrices(c_pWorldMatrix);
if (m_pModel->CanDeformPNTVertices())
{
// WORK
CGraphicVertexBuffer& rkDeformableVertexBuffer = __GetDeformableVertexBufferRef();
TPNTVertex* pntVertices;
if (rkDeformableVertexBuffer.LockRange(m_pModel->GetDeformVertexCount(), (void **)&pntVertices))
{
DeformPNTVertices(pntVertices);
rkDeformableVertexBuffer.Unlock();
}
else
{
TraceError("GRANNY DEFORM DYNAMIC BUFFER LOCK ERROR");
}
// END_OF_WORK
}
}
//////////////////////////////////////////////////////
class CGrannyLocalPose
{
public:
CGrannyLocalPose()
{
m_pgrnLocalPose = NULL;
m_boneCount = 0;
}
virtual ~CGrannyLocalPose()
{
if (m_pgrnLocalPose)
GrannyFreeLocalPose(m_pgrnLocalPose);
}
granny_local_pose * Get(int boneCount)
{
if (m_pgrnLocalPose)
{
if (m_boneCount >= boneCount)
return m_pgrnLocalPose;
GrannyFreeLocalPose(m_pgrnLocalPose);
}
m_boneCount = boneCount;
m_pgrnLocalPose = GrannyNewLocalPose(m_boneCount);
return m_pgrnLocalPose;
}
private:
granny_local_pose * m_pgrnLocalPose;
int m_boneCount;
};
//////////////////////////////////////////////////////
void CGrannyModelInstance::UpdateSkeleton(const D3DXMATRIX * c_pWorldMatrix, float /*fLocalTime*/)
{
// DELETED
//m_pgrnWorldPose = m_pgrnWorldPoseReal;
///////////////////////////////////////////
UpdateWorldPose();
UpdateWorldMatrices(c_pWorldMatrix);
}
void CGrannyModelInstance::UpdateWorldPose()
{
// WEP = m_iParentBoneIndex != 0 -> UpdateWorldPose(O)
// LOD = UpdateWorldPose(O)
// Hair = UpdateWorldPose(X)
if (m_ppkSkeletonInst)
if (*m_ppkSkeletonInst!=this)
return;
static CGrannyLocalPose s_SharedLocalPose;
granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance);
granny_local_pose * pgrnLocalPose = s_SharedLocalPose.Get(pgrnSkeleton->BoneCount);
const float * pAttachBoneMatrix = (mc_pParentInstance) ? mc_pParentInstance->GetBoneMatrixPointer(m_iParentBoneIndex) : NULL;
GrannySampleModelAnimationsAccelerated(m_pgrnModelInstance, pgrnSkeleton->BoneCount, pAttachBoneMatrix, pgrnLocalPose, __GetWorldPosePtr());
/*
GrannySampleModelAnimations(m_pgrnModelInstance, 0, pgrnSkeleton->BoneCount, pgrnLocalPose);
GrannyBuildWorldPose(pgrnSkeleton, 0, pgrnSkeleton->BoneCount, pgrnLocalPose, pAttachBoneMatrix, m_pgrnWorldPose);
*/
GrannyFreeCompletedModelControls(m_pgrnModelInstance);
}
void CGrannyModelInstance::UpdateWorldMatrices(const D3DXMATRIX* c_pWorldMatrix)
{
// NO_MESH_BUG_FIX
if (!m_meshMatrices)
return;
// END_OF_NO_MESH_BUG_FIX
assert(m_pModel != NULL);
assert(ms_lpd3dMatStack != NULL);
int meshCount = m_pModel->GetMeshCount();
granny_matrix_4x4 * pgrnMatCompositeBuffer = GrannyGetWorldPoseComposite4x4Array(__GetWorldPosePtr());
D3DXMATRIX * boneMatrices = (D3DXMATRIX *) pgrnMatCompositeBuffer;
for (int i = 0; i < meshCount; ++i)
{
D3DXMATRIX & rWorldMatrix = m_meshMatrices[i];
const CGrannyMesh * pMesh = m_pModel->GetMeshPointer(i);
// WORK
int * boneIndices = __GetMeshBoneIndices(i);
// END_OF_WORK
if (pMesh->CanDeformPNTVertices())
{
rWorldMatrix = *c_pWorldMatrix;
}
else
{
int iBone = *boneIndices;
D3DXMatrixMultiply(&rWorldMatrix, &boneMatrices[iBone], c_pWorldMatrix);
}
}
#ifdef _TEST
TEST_matWorld = *c_pWorldMatrix;
#endif
}
void CGrannyModelInstance::DeformPNTVertices(void * pvDest)
{
assert(m_pModel != NULL);
assert(m_pModel->CanDeformPNTVertices());
// WORK
m_pModel->DeformPNTVertices(pvDest, (D3DXMATRIX *) GrannyGetWorldPoseComposite4x4Array(__GetWorldPosePtr()), m_vct_pgrnMeshBinding);
// END_OF_WORK
}

70
src/EterGrnLib/Motion.cpp Normal file
View File

@ -0,0 +1,70 @@
#include "StdAfx.h"
#include "Motion.h"
CGrannyMotion::CGrannyMotion()
{
Initialize();
}
CGrannyMotion::~CGrannyMotion()
{
Destroy();
}
bool CGrannyMotion::IsEmpty()
{
return m_pgrnAni ? false : true;
}
void CGrannyMotion::Destroy()
{
Initialize();
}
void CGrannyMotion::Initialize()
{
m_pgrnAni = NULL;
}
bool CGrannyMotion::BindGrannyAnimation(granny_animation * pgrnAni)
{
assert(IsEmpty());
m_pgrnAni = pgrnAni;
return true;
}
granny_animation* CGrannyMotion::GetGrannyAnimationPointer() const
{
return m_pgrnAni;
}
const char * CGrannyMotion::GetName() const
{
return m_pgrnAni->Name;
}
float CGrannyMotion::GetDuration() const
{
return m_pgrnAni->Duration;
}
void CGrannyMotion::GetTextTrack(const char * c_szTextTrackName, int * pCount, float * pArray) const
{
if (m_pgrnAni->TrackGroupCount != 1)
{
// assert(!"CGrannyMotion::GetTextTrack - TrackCount is not 1");
}
granny_track_group * pTrack = m_pgrnAni->TrackGroups[0];
for (int i = 0; i < pTrack->TextTrackCount; ++i)
{
granny_text_track & rTextTrack = pTrack->TextTracks[i];
for (int j = 0; j < rTextTrack.EntryCount; ++j)
if (!stricmp(c_szTextTrackName, rTextTrack.Entries[j].Text))
pArray[(*pCount)++] = rTextTrack.Entries[j].TimeStamp;
}
}

25
src/EterGrnLib/Motion.h Normal file
View File

@ -0,0 +1,25 @@
#pragma once
class CGrannyMotion
{
public:
CGrannyMotion();
virtual ~CGrannyMotion();
bool IsEmpty();
void Destroy();
bool BindGrannyAnimation(granny_animation* pgrnAni);
granny_animation * GetGrannyAnimationPointer() const;
const char * GetName() const;
float GetDuration() const;
void GetTextTrack(const char * c_szTextTrackName, int * pCount, float * pArray) const;
protected:
void Initialize();
protected:
granny_animation * m_pgrnAni;
};

View File

@ -0,0 +1,2 @@
#include "stdafx.h"

22
src/EterGrnLib/StdAfx.h Normal file
View File

@ -0,0 +1,22 @@
#pragma once
#pragma warning(disable:4786) // character 255 <20>Ѿ<D1BE>°<EFBFBD> <20><><EFBFBD><EFBFBD>
//#include <crtdbg.h>
#include <granny.h>
#include "../eterBase/Utils.h"
#include "../eterBase/Debug.h"
#include "../eterBase/Stl.h"
#include "Util.h"
// Armadillo nanomite protection
#if !defined(NANOBEGIN) && !defined(NANOEND)
#ifdef _DEBUG
#define NANOBEGIN
#define NANOEND
#else
#include <armadillo/SecuredSections.h>
#endif
#endif

242
src/EterGrnLib/Thing.cpp Normal file
View File

@ -0,0 +1,242 @@
#include "StdAfx.h"
#include "../eterbase/Debug.h"
#include "Thing.h"
#include "ThingInstance.h"
CGraphicThing::CGraphicThing(const char* c_szFileName) : CResource(c_szFileName)
{
Initialize();
}
CGraphicThing::~CGraphicThing()
{
//OnClear();
Clear();
}
void CGraphicThing::Initialize()
{
m_pgrnFile = NULL;
m_pgrnFileInfo = NULL;
m_pgrnAni = NULL;
m_models = NULL;
m_motions = NULL;
}
void CGraphicThing::OnClear()
{
if (m_motions)
delete [] m_motions;
if (m_models)
delete [] m_models;
if (m_pgrnFile)
GrannyFreeFile(m_pgrnFile);
Initialize();
}
CGraphicThing::TType CGraphicThing::Type()
{
static TType s_type = StringToType("CGraphicThing");
return s_type;
}
bool CGraphicThing::OnIsEmpty() const
{
return m_pgrnFile ? false : true;
}
bool CGraphicThing::OnIsType(TType type)
{
if (CGraphicThing::Type() == type)
return true;
return CResource::OnIsType(type);
}
bool CGraphicThing::CreateDeviceObjects()
{
if (!m_pgrnFileInfo)
return true;
for (int m = 0; m < m_pgrnFileInfo->ModelCount; ++m)
{
CGrannyModel & rModel = m_models[m];
rModel.CreateDeviceObjects();
}
return true;
}
void CGraphicThing::DestroyDeviceObjects()
{
if (!m_pgrnFileInfo)
return;
for (int m = 0; m < m_pgrnFileInfo->ModelCount; ++m)
{
CGrannyModel & rModel = m_models[m];
rModel.DestroyDeviceObjects();
}
}
bool CGraphicThing::CheckModelIndex(int iModel) const
{
if (!m_pgrnFileInfo)
{
Tracef("m_pgrnFileInfo == NULL: %s\n", GetFileName());
return false;
}
assert(m_pgrnFileInfo != NULL);
if (iModel < 0)
return false;
if (iModel >= m_pgrnFileInfo->ModelCount)
return false;
return true;
}
bool CGraphicThing::CheckMotionIndex(int iMotion) const
{
// Temporary
if (!m_pgrnFileInfo)
return false;
// Temporary
assert(m_pgrnFileInfo != NULL);
if (iMotion < 0)
return false;
if (iMotion >= m_pgrnFileInfo->AnimationCount)
return false;
return true;
}
CGrannyModel * CGraphicThing::GetModelPointer(int iModel)
{
assert(CheckModelIndex(iModel));
assert(m_models != NULL);
return m_models + iModel;
}
CGrannyMotion * CGraphicThing::GetMotionPointer(int iMotion)
{
assert(CheckMotionIndex(iMotion));
if (iMotion >= m_pgrnFileInfo->AnimationCount)
return NULL;
assert(m_motions != NULL);
return (m_motions + iMotion);
}
int CGraphicThing::GetModelCount() const
{
if (!m_pgrnFileInfo)
return 0;
return (m_pgrnFileInfo->ModelCount);
}
int CGraphicThing::GetMotionCount() const
{
if (!m_pgrnFileInfo)
return 0;
return (m_pgrnFileInfo->AnimationCount);
}
bool CGraphicThing::OnLoad(int iSize, const void * c_pvBuf)
{
if (!c_pvBuf)
return false;
m_pgrnFile = GrannyReadEntireFileFromMemory(iSize, (void *) c_pvBuf);
if (!m_pgrnFile)
return false;
m_pgrnFileInfo = GrannyGetFileInfo(m_pgrnFile);
if (!m_pgrnFileInfo)
return false;
LoadModels();
LoadMotions();
return true;
}
// SUPPORT_LOCAL_TEXTURE
static std::string gs_modelLocalPath;
const std::string& GetModelLocalPath()
{
return gs_modelLocalPath;
}
// END_OF_SUPPORT_LOCAL_TEXTURE
bool CGraphicThing::LoadModels()
{
assert(m_pgrnFile != NULL);
assert(m_models == NULL);
if (m_pgrnFileInfo->ModelCount <= 0)
return false;
// SUPPORT_LOCAL_TEXTURE
const std::string& fileName = GetFileNameString();
//char localPath[256] = "";
if (fileName.length() > 2 && fileName[1] != ':')
{
int sepPos = fileName.rfind('\\');
gs_modelLocalPath.assign(fileName, 0, sepPos+1);
}
// END_OF_SUPPORT_LOCAL_TEXTURE
int modelCount = m_pgrnFileInfo->ModelCount;
m_models = new CGrannyModel[modelCount];
for (int m = 0; m < modelCount; ++m)
{
CGrannyModel & rModel = m_models[m];
granny_model * pgrnModel = m_pgrnFileInfo->Models[m];
if (!rModel.CreateFromGrannyModelPointer(pgrnModel))
return false;
}
GrannyFreeFileSection(m_pgrnFile, GrannyStandardRigidVertexSection);
GrannyFreeFileSection(m_pgrnFile, GrannyStandardRigidIndexSection);
GrannyFreeFileSection(m_pgrnFile, GrannyStandardDeformableIndexSection);
GrannyFreeFileSection(m_pgrnFile, GrannyStandardTextureSection);
return true;
}
bool CGraphicThing::LoadMotions()
{
assert(m_pgrnFile != NULL);
assert(m_motions == NULL);
if (m_pgrnFileInfo->AnimationCount <= 0)
return false;
int motionCount = m_pgrnFileInfo->AnimationCount;
m_motions = new CGrannyMotion[motionCount];
for (int m = 0; m < motionCount; ++m)
if (!m_motions[m].BindGrannyAnimation(m_pgrnFileInfo->Animations[m]))
return false;
return true;
}

49
src/EterGrnLib/Thing.h Normal file
View File

@ -0,0 +1,49 @@
#pragma once
#include "Model.h"
#include "Motion.h"
class CGraphicThing : public CResource
{
public:
typedef CRef<CGraphicThing> TRef;
public:
static CGraphicThing::TType Type();
public:
CGraphicThing(const char * c_szFileName);
virtual ~CGraphicThing();
virtual bool CreateDeviceObjects();
virtual void DestroyDeviceObjects();
bool CheckModelIndex(int iModel) const;
CGrannyModel * GetModelPointer(int iModel);
int GetModelCount() const;
bool CheckMotionIndex(int iMotion) const;
CGrannyMotion * GetMotionPointer(int iMotion);
int GetMotionCount() const;
protected:
void Initialize();
bool LoadModels();
bool LoadMotions();
protected:
bool OnLoad(int iSize, const void* c_pvBuf);
void OnClear();
bool OnIsEmpty() const;
bool OnIsType(TType type);
protected:
granny_file * m_pgrnFile;
granny_file_info * m_pgrnFileInfo;
granny_animation * m_pgrnAni;
CGrannyModel * m_models;
CGrannyMotion * m_motions;
};

View File

@ -0,0 +1,967 @@
#include "StdAfx.h"
#include "../eterbase/Debug.h"
#include "../eterlib/Camera.h"
#include "../eterBase/Timer.h"
#include "ThingInstance.h"
#include "Thing.h"
#include "ModelInstance.h"
CDynamicPool<CGraphicThingInstance> CGraphicThingInstance::ms_kPool;
CGraphicThing* CGraphicThingInstance::GetBaseThingPtr()
{
if (m_modelThingSetVector.empty())
return NULL;
TModelThingSet& rkModelThingSet=m_modelThingSetVector[0];
if (rkModelThingSet.m_pLODThingRefVector.empty())
return NULL;
CGraphicThing::TRef* proThing=rkModelThingSet.m_pLODThingRefVector[0];
if (!proThing)
return NULL;
CGraphicThing::TRef roThing=*proThing;
return roThing.GetPointer();
}
bool CGraphicThingInstance::LessRenderOrder(CGraphicThingInstance* pkThingInst)
{
return (GetBaseThingPtr()<pkThingInst->GetBaseThingPtr());
}
void CGraphicThingInstance::CreateSystem(UINT uCapacity)
{
ms_kPool.Create(uCapacity);
}
void CGraphicThingInstance::DestroySystem()
{
ms_kPool.Destroy();
}
CGraphicThingInstance* CGraphicThingInstance::New()
{
return ms_kPool.Alloc();
}
void CGraphicThingInstance::Delete(CGraphicThingInstance* pkThingInst)
{
pkThingInst->Clear();
ms_kPool.Free(pkThingInst);
}
void CGraphicThingInstance::SetMotionAtEnd()
{
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), std::void_mem_fun(&CGrannyLODController::SetMotionAtEnd));
}
bool CGraphicThingInstance::Picking(const D3DXVECTOR3 & v, const D3DXVECTOR3 & dir, float & out_x, float & out_y)
{
if (!m_pHeightAttributeInstance)
return false;
return m_pHeightAttributeInstance->Picking(v,dir,out_x,out_y);
}
void CGraphicThingInstance::OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector)
{
assert(pscdVector);
CStaticCollisionDataVector::const_iterator it;
for(it = pscdVector->begin();it!=pscdVector->end();++it)
{
AddCollision(&(*it),&GetTransform());
}
}
void CGraphicThingInstance::OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance)
{
assert(pAttributeInstance);
SetHeightInstance(pAttributeInstance);
}
bool CGraphicThingInstance::OnGetObjectHeight(float fX, float fY, float * pfHeight)
{
if (m_pHeightAttributeInstance && m_pHeightAttributeInstance->GetHeight(fX, fY, pfHeight))
return true;
return false;
}
void CGraphicThingInstance::BuildBoundingSphere()
{
D3DXVECTOR3 v3Min, v3Max;
GetBoundBox(0, &v3Min, &v3Max);
m_v3Center = (v3Min + v3Max) * 0.5f;
D3DXVECTOR3 vDelta = (v3Max - v3Min);
m_fRadius = D3DXVec3Length(&vDelta) * 0.5f + 50.0f; // extra length for attached objects
}
bool CGraphicThingInstance::GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius)
{
if (m_fRadius <= 0)
{
BuildBoundingSphere();
fRadius = m_fRadius;
v3Center = m_v3Center;
}
else
{
fRadius = m_fRadius;
v3Center = m_v3Center;
}
D3DXVec3TransformCoord(&v3Center, &v3Center, &GetTransform());
return true;
}
void CGraphicThingInstance::BuildBoundingAABB()
{
D3DXVECTOR3 v3Min, v3Max;
GetBoundBox(0, &v3Min, &v3Max);
m_v3Center = (v3Min + v3Max) * 0.5f;
m_v3Min = v3Min;
m_v3Max = v3Max;
}
bool CGraphicThingInstance::GetBoundingAABB(D3DXVECTOR3 & v3Min, D3DXVECTOR3 & v3Max)
{
BuildBoundingAABB();
v3Min = m_v3Min;
v3Max = m_v3Max;
D3DXVec3TransformCoord(&m_v3Center, &m_v3Center, &GetTransform());
return true;
}
void CGraphicThingInstance::CalculateBBox()
{
GetBoundBox(&m_v3BBoxMin, &m_v3BBoxMax);
m_v4TBBox[0] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f);
m_v4TBBox[1] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f);
m_v4TBBox[2] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f);
m_v4TBBox[3] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f);
m_v4TBBox[4] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f);
m_v4TBBox[5] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f);
m_v4TBBox[6] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f);
m_v4TBBox[7] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f);
const D3DXMATRIX & c_rmatTransform = GetTransform();
for (DWORD i = 0; i < 8; ++i)
{
D3DXVec4Transform(&m_v4TBBox[i], &m_v4TBBox[i], &c_rmatTransform);
if (0 == i)
{
m_v3TBBoxMin.x = m_v4TBBox[i].x;
m_v3TBBoxMin.y = m_v4TBBox[i].y;
m_v3TBBoxMin.z = m_v4TBBox[i].z;
m_v3TBBoxMax.x = m_v4TBBox[i].x;
m_v3TBBoxMax.y = m_v4TBBox[i].y;
m_v3TBBoxMax.z = m_v4TBBox[i].z;
}
else
{
if (m_v3TBBoxMin.x > m_v4TBBox[i].x)
m_v3TBBoxMin.x = m_v4TBBox[i].x;
if (m_v3TBBoxMax.x < m_v4TBBox[i].x)
m_v3TBBoxMax.x = m_v4TBBox[i].x;
if (m_v3TBBoxMin.y > m_v4TBBox[i].y)
m_v3TBBoxMin.y = m_v4TBBox[i].y;
if (m_v3TBBoxMax.y < m_v4TBBox[i].y)
m_v3TBBoxMax.y = m_v4TBBox[i].y;
if (m_v3TBBoxMin.z > m_v4TBBox[i].z)
m_v3TBBoxMin.z = m_v4TBBox[i].z;
if (m_v3TBBoxMax.z < m_v4TBBox[i].z)
m_v3TBBoxMax.z = m_v4TBBox[i].z;
}
}
}
bool CGraphicThingInstance::CreateDeviceObjects()
{
CGrannyLODController::FCreateDeviceObjects createDeviceObjects;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), createDeviceObjects);
return true;
}
void CGraphicThingInstance::DestroyDeviceObjects()
{
CGrannyLODController::FDestroyDeviceObjects destroyDeviceObjects;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), destroyDeviceObjects);
}
bool CGraphicThingInstance::CheckModelInstanceIndex(int iModelInstance)
{
if (iModelInstance < 0)
return false;
int max = m_LODControllerVector.size();
if (iModelInstance >= max)
return false;
return true;
}
bool CGraphicThingInstance::CheckModelThingIndex(int iModelThing)
{
if (iModelThing < 0)
return false;
int max = m_modelThingSetVector.size();
if (iModelThing >= max)
return false;
return true;
}
bool CGraphicThingInstance::CheckMotionThingIndex(DWORD dwMotionKey)
{
std::map<DWORD, CGraphicThing::TRef *>::iterator itor = m_roMotionThingMap.find(dwMotionKey);
if (m_roMotionThingMap.end() == itor)
return false;
return true;
}
bool CGraphicThingInstance::GetMotionThingPointer(DWORD dwKey, CGraphicThing ** ppMotion)
{
if (!CheckMotionThingIndex(dwKey))
return false;
*ppMotion = m_roMotionThingMap[dwKey]->GetPointer();
return true;
}
bool CGraphicThingInstance::IsMotionThing()
{
return !m_roMotionThingMap.empty();
}
void CGraphicThingInstance::ReserveModelInstance(int iCount)
{
stl_wipe(m_LODControllerVector);
for (int i = 0; i < iCount; ++i)
{
CGrannyLODController * pInstance = new CGrannyLODController;
m_LODControllerVector.push_back(pInstance);
}
}
void CGraphicThingInstance::ReserveModelThing(int iCount)
{
m_modelThingSetVector.resize(iCount);
}
bool CGraphicThingInstance::FindBoneIndex(int iModelInstance, const char* c_szBoneName, int* iRetBone)
{
assert(CheckModelInstanceIndex(iModelInstance));
CGrannyModelInstance * pModelInstance = m_LODControllerVector[iModelInstance]->GetModelInstance();
if (!pModelInstance)
return false;
return pModelInstance->GetBoneIndexByName(c_szBoneName, iRetBone);
}
void CGraphicThingInstance::AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, int iSrcModelInstance)
{
if (!CheckModelInstanceIndex(iSrcModelInstance))
{
TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
return;
}
if (!CheckModelInstanceIndex(iDstModelInstance))
{
TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
return;
}
CGrannyLODController * pSrcLODController = m_LODControllerVector[iSrcModelInstance];
CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance];
pDstLODController->AttachModelInstance(pSrcLODController, c_szBoneName);
}
void CGraphicThingInstance::AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, CGraphicThingInstance & rSrcInstance, int iSrcModelInstance)
{
if (!CheckModelInstanceIndex(iDstModelInstance))
{
TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
return;
}
if (!rSrcInstance.CheckModelInstanceIndex(iSrcModelInstance))
{
TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
return;
}
CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance];
CGrannyLODController * pSrcLODController = rSrcInstance.m_LODControllerVector[iSrcModelInstance];
pDstLODController->AttachModelInstance(pSrcLODController, c_szBoneName);
}
void CGraphicThingInstance::DetachModelInstance(int iDstModelInstance, CGraphicThingInstance & rSrcInstance, int iSrcModelInstance)
{
if (!CheckModelInstanceIndex(iDstModelInstance))
{
TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, iSrcModelInstance=%d)", iDstModelInstance, iSrcModelInstance);
return;
}
if (!rSrcInstance.CheckModelInstanceIndex(iSrcModelInstance))
{
TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, iSrcModelInstance=%d)", iDstModelInstance, iSrcModelInstance);
return;
}
CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance];
CGrannyLODController * pSrcLODController = rSrcInstance.m_LODControllerVector[iSrcModelInstance];
pDstLODController->DetachModelInstance(pSrcLODController);
}
bool CGraphicThingInstance::GetBonePosition(int iModelIndex, int iBoneIndex, float * pfx, float * pfy, float * pfz)
{
assert(CheckModelInstanceIndex(iModelIndex));
CGrannyModelInstance * pModelInstance = m_LODControllerVector[iModelIndex]->GetModelInstance();
if (!pModelInstance)
return false;
const float * pfMatrix = pModelInstance->GetBoneMatrixPointer(iBoneIndex);
*pfx = pfMatrix[12];
*pfy = pfMatrix[13];
*pfz = pfMatrix[14];
return true;
}
//iSkelInstance <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD> Link(<28><><EFBFBD><EFBFBD> <20>ٴ°<D9B4>)<29><>Ű<EFBFBD><C5B0>,
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD> attach(<28><>ǥ<EFBFBD><C7A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD>) <20>˴ϴ<CBB4>.
bool CGraphicThingInstance::SetModelInstance(int iDstModelInstance, int iSrcModelThing, int iSrcModel,int iSkelInstance)
{
if (!CheckModelInstanceIndex(iDstModelInstance))
{
TraceError("CGraphicThingInstance::SetModelInstance(iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iDstModelInstance, iSrcModelThing, iSrcModel);
return false;
}
if (!CheckModelThingIndex(iSrcModelThing))
{
TraceError("CGraphicThingInstance::SetModelInstance(iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iDstModelInstance, iSrcModelThing, iSrcModel);
return false;
}
CGrannyLODController * pController = m_LODControllerVector[iDstModelInstance];
if (!pController)
return false;
// HAIR_LINK
CGrannyLODController * pSkelController = NULL;
if (iSkelInstance != DONTUSEVALUE)
{
if (!CheckModelInstanceIndex(iSkelInstance))
{
TraceError("CGraphicThingInstance::SetModelInstanceByOtherSkeletonInstance(iSkelInstance=%d, iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iSkelInstance, iDstModelInstance, iSrcModelThing, iSrcModel);
return false;
}
pSkelController = m_LODControllerVector[iSkelInstance];
if (!pSkelController)
return false;
}
// END_OF_HAIR_LINK
TModelThingSet & rModelThingSet = m_modelThingSetVector[iSrcModelThing];
pController->Clear();
for (DWORD i = 0; i < rModelThingSet.m_pLODThingRefVector.size(); ++i)
{
if (rModelThingSet.m_pLODThingRefVector[i]->IsNull())
return false;
pController->AddModel(rModelThingSet.m_pLODThingRefVector[i]->GetPointer(), iSrcModel, pSkelController);
}
return true;
}
void CGraphicThingInstance::SetMaterialImagePointer(UINT ePart, const char* c_szImageName, CGraphicImage* pImage)
{
if (ePart>=m_LODControllerVector.size())
{
TraceError("CGraphicThingInstance::SetMaterialImagePointer(ePart(%d)<uPartCount(%d), c_szImageName=%s, pImage=%s) - ePart OUT OF RANGE",
ePart, m_LODControllerVector.size(), c_szImageName, pImage->GetFileName());
return;
}
if (!m_LODControllerVector[ePart])
{
TraceError("CGraphicThingInstance::SetMaterialImagePointer(ePart(%d), c_szImageName=%s, pImage=%s) - ePart Data is NULL",
ePart, m_LODControllerVector.size(), c_szImageName, pImage->GetFileName());
return;
}
m_LODControllerVector[ePart]->SetMaterialImagePointer(c_szImageName, pImage);
}
void CGraphicThingInstance::SetMaterialData(UINT ePart, const char* c_szImageName, SMaterialData kMaterialData)
{
if (ePart>=m_LODControllerVector.size())
{
TraceError("CGraphicThingInstance::SetMaterialData(ePart(%d)<uPartCount(%d)) - ePart OUT OF RANGE",
ePart, m_LODControllerVector.size());
return;
}
if (!m_LODControllerVector[ePart])
{
TraceError("CGraphicThingInstance::SetMaterialData(ePart(%d)) - ePart Data is NULL",
ePart, m_LODControllerVector.size());
return;
}
m_LODControllerVector[ePart]->SetMaterialData(c_szImageName, kMaterialData);
}
void CGraphicThingInstance::SetSpecularInfo(UINT ePart, const char* c_szMtrlName, BOOL bEnable, float fPower)
{
if (ePart>=m_LODControllerVector.size())
{
TraceError("CGraphicThingInstance::SetSpecularInfo(ePart(%d)<uPartCount(%d)) - ePart OUT OF RANGE",
ePart, m_LODControllerVector.size());
return;
}
if (!m_LODControllerVector[ePart])
{
TraceError("CGraphicThingInstance::SetSpecularInfo(ePart(%d)) - ePart Data is NULL",
ePart, m_LODControllerVector.size());
return;
}
m_LODControllerVector[ePart]->SetSpecularInfo(c_szMtrlName, bEnable, fPower);
}
bool CGraphicThingInstance::SetMotion(DWORD dwMotionKey, float blendTime, int loopCount, float speedRatio)
{
if (!CheckMotionThingIndex(dwMotionKey))
return false;
std::map<DWORD, CGraphicThing::TRef *>::iterator itor = m_roMotionThingMap.find(dwMotionKey);
CGraphicThing::TRef * proMotionThing = itor->second;
CGraphicThing * pMotionThing = proMotionThing->GetPointer();
if (!pMotionThing)
return false;
if (!pMotionThing->CheckMotionIndex(0))
return false;
CGrannyLODController::FSetMotionPointer SetMotionPointer;
SetMotionPointer.m_pMotion = pMotionThing->GetMotionPointer(0);
SetMotionPointer.m_blendTime = blendTime;
SetMotionPointer.m_loopCount = loopCount;
SetMotionPointer.m_speedRatio = speedRatio;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), SetMotionPointer);
return true;
}
bool CGraphicThingInstance::ChangeMotion(DWORD dwMotionKey, int loopCount, float speedRatio)
{
if (!CheckMotionThingIndex(dwMotionKey))
return false;
std::map<DWORD, CGraphicThing::TRef *>::iterator itor = m_roMotionThingMap.find(dwMotionKey);
CGraphicThing::TRef * proMotionThing = itor->second;
CGraphicThing * pMotionThing = proMotionThing->GetPointer();
if (!pMotionThing)
return false;
if (!pMotionThing->CheckMotionIndex(0))
return false;
CGrannyLODController::FChangeMotionPointer ChangeMotionPointer;
ChangeMotionPointer.m_pMotion = pMotionThing->GetMotionPointer(0);
ChangeMotionPointer.m_loopCount = loopCount;
ChangeMotionPointer.m_speedRatio = speedRatio;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), ChangeMotionPointer);
return true;
}
void CGraphicThingInstance::SetEndStopMotion()
{
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), CGrannyLODController::FEndStopMotionPointer());
}
void CGraphicThingInstance::RegisterModelThing(int iModelThing, CGraphicThing * pModelThing)
{
if (!CheckModelThingIndex(iModelThing))
{
TraceError("CGraphicThingInstance::RegisterModelThing(iModelThing=%d, pModelThing=%s)\n", iModelThing, pModelThing->GetFileName());
return;
}
m_modelThingSetVector[iModelThing].Clear();
if (pModelThing)
RegisterLODThing(iModelThing, pModelThing);
}
void CGraphicThingInstance::RegisterLODThing(int iModelThing, CGraphicThing * pModelThing)
{
assert(CheckModelThingIndex(iModelThing));
CGraphicThing::TRef * pModelRef = new CGraphicThing::TRef;
pModelRef->SetPointer(pModelThing);
m_modelThingSetVector[iModelThing].m_pLODThingRefVector.push_back(pModelRef);
}
void CGraphicThingInstance::RegisterMotionThing(DWORD dwMotionKey, CGraphicThing* pMotionThing)
{
CGraphicThing::TRef * pMotionRef = new CGraphicThing::TRef;
pMotionRef->SetPointer(pMotionThing);
m_roMotionThingMap.insert(std::map<DWORD, CGraphicThing::TRef *>::value_type(dwMotionKey, pMotionRef));
}
void CGraphicThingInstance::ResetLocalTime()
{
//m_clockLast = GrannyGetSystemSeconds();
m_fLastLocalTime = 0.0f;
m_fLocalTime = 0.0f;
CGrannyLODController::FResetLocalTime resetLocalTime;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), resetLocalTime);
}
/*
void CGraphicThingInstance::SetMotionSpeed(float fRate)
{
m_fMotionTimeSpeed = fRate;
}
*/
void CGraphicThingInstance::InsertDelay(float fDelay)
{
m_fDelay = fDelay;
}
float CGraphicThingInstance::GetLastLocalTime()
{
return m_fLastLocalTime;
}
float CGraphicThingInstance::GetLocalTime()
{
return m_fLocalTime;
}
float CGraphicThingInstance::GetSecondElapsed()
{
return m_fSecondElapsed;
}
float CGraphicThingInstance::GetAverageSecondElapsed()
{
return m_fAverageSecondElapsed;
}
bool CGraphicThingInstance::Intersect(float* pu, float* pv, float* pt)
{
if (!CGraphicObjectInstance::isShow())
return false;
if (!m_bUpdated)
return false;
if (m_LODControllerVector.empty())
{
//TraceError("CGraphicThingInstance::Intersect - m_LODControllerVector is empty");
return false;
}
return m_LODControllerVector[0]->Intersect(&GetTransform(), pu, pv, pt);
}
void CGraphicThingInstance::GetBoundBox(D3DXVECTOR3* vtMin, D3DXVECTOR3* vtMax)
{
vtMin->x = vtMin->y = vtMin->z = 100000.0f;
vtMax->x = vtMax->y = vtMax->z = -100000.0f;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), CGrannyLODController::FBoundBox(vtMin, vtMax));
}
BOOL CGraphicThingInstance::GetBoundBox(DWORD dwModelInstanceIndex, D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
{
if (!CheckModelInstanceIndex(dwModelInstanceIndex))
return FALSE;
vtMin->x = vtMin->y = vtMin->z = 100000.0f;
vtMax->x = vtMax->y = vtMax->z = -100000.0f;
CGrannyLODController * pController = m_LODControllerVector[dwModelInstanceIndex];
if (!pController->isModelInstance())
return FALSE;
CGrannyModelInstance * pModelInstance = pController->GetModelInstance();
pModelInstance->GetBoundBox(vtMin, vtMax);
return TRUE;
}
BOOL CGraphicThingInstance::GetBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix)
{
if (!CheckModelInstanceIndex(dwModelInstanceIndex))
return FALSE;
CGrannyModelInstance * pModelInstance = m_LODControllerVector[dwModelInstanceIndex]->GetModelInstance();
if (!pModelInstance)
return FALSE;
*ppMatrix = (D3DXMATRIX *)pModelInstance->GetBoneMatrixPointer(dwBoneIndex);
if (!*ppMatrix)
return FALSE;
return TRUE;
}
BOOL CGraphicThingInstance::GetCompositeBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix)
{
if (!CheckModelInstanceIndex(dwModelInstanceIndex))
return FALSE;
CGrannyModelInstance * pModelInstance = m_LODControllerVector[dwModelInstanceIndex]->GetModelInstance();
if (!pModelInstance)
{
//TraceError("CGraphicThingInstance::GetCompositeBoneMatrix(dwModelInstanceIndex=%d, dwBoneIndex=%d, D3DXMATRIX ** ppMatrix)", dwModelInstanceIndex, dwBoneIndex);
return FALSE;
}
*ppMatrix = (D3DXMATRIX *)pModelInstance->GetCompositeBoneMatrixPointer(dwBoneIndex);
return TRUE;
}
void CGraphicThingInstance::UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed, int iModelInstanceIndex)
{
//TraceError("%s",GetBaseThingPtr()->GetFileName());
int nLODCount=m_LODControllerVector.size();
if (iModelInstanceIndex>=nLODCount)
{
//TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d)",
// fSecondsElapsed, iModelInstanceIndex, nLODCount);
return;
}
CGrannyLODController* pkLODCtrl=m_LODControllerVector[iModelInstanceIndex];
if (!pkLODCtrl)
{
//TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d) - m_LODControllerVector[iModelInstanceIndex] == NULL",
// fSecondsElapsed, iModelInstanceIndex, nLODCount);
return;
}
CGrannyModelInstance * pModelInstance = pkLODCtrl->GetModelInstance();
if (!pModelInstance)
{
/* TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d) - pkLODCtrl->GetModelInstance() == NULL",
fSecondsElapsed, iModelInstanceIndex, nLODCount);*/
return;
}
pModelInstance->UpdateTransform(pMatrix, fSecondsElapsed);
}
void CGraphicThingInstance::DeformAll()
{
m_bUpdated = true;
CGrannyLODController::FDeformAll deform;
deform.mc_pWorldMatrix = &m_worldMatrix;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), deform);
}
void CGraphicThingInstance::DeformNoSkin()
{
m_bUpdated = true;
std::vector<CGrannyLODController*>::iterator i;
for (i=m_LODControllerVector.begin(); i!=m_LODControllerVector.end(); ++i)
{
CGrannyLODController* pkLOD=*i;
if (pkLOD->isModelInstance())
pkLOD->DeformNoSkin(&m_worldMatrix);
}
}
void CGraphicThingInstance::OnDeform()
{
m_bUpdated = true;
CGrannyLODController::FDeform deform;
deform.mc_pWorldMatrix = &m_worldMatrix;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), deform);
}
void CGraphicThingInstance::__SetLocalTime(float fLocalTime)
{
m_fLastLocalTime = m_fLocalTime;
m_fLocalTime = fLocalTime;
CGrannyLODController::FSetLocalTime SetLocalTime;
SetLocalTime.fLocalTime = fLocalTime;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), SetLocalTime);
}
void CGraphicThingInstance::UpdateLODLevel()
{
CCamera * pcurCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pcurCamera)
{
TraceError("CGraphicThingInstance::UpdateLODLevel - GetCurrentCamera() == NULL");
return;
}
const D3DXVECTOR3 & c_rv3TargetPosition = pcurCamera->GetTarget();
const D3DXVECTOR3 & c_rv3CameraPosition = pcurCamera->GetEye();
const D3DXVECTOR3 & c_v3Position = GetPosition();
// NOTE : <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD> <20><><EFBFBD>꿡 z<><7A> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. - [levites]
CGrannyLODController::FUpdateLODLevel update;
update.fDistanceFromCenter = sqrtf((c_rv3TargetPosition.x - c_v3Position.x) * (c_rv3TargetPosition.x - c_v3Position.x) +
(c_rv3TargetPosition.y - c_v3Position.y) * (c_rv3TargetPosition.y - c_v3Position.y));
update.fDistanceFromCamera = sqrtf((c_rv3CameraPosition.x - c_v3Position.x) * (c_rv3CameraPosition.x - c_v3Position.x) +
(c_rv3CameraPosition.y - c_v3Position.y) * (c_rv3CameraPosition.y - c_v3Position.y) +
(c_rv3CameraPosition.z - c_v3Position.z) * (c_rv3CameraPosition.z - c_v3Position.z));
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), update);
}
void CGraphicThingInstance::UpdateTime()
{
//granny_system_clock clockNow = GrannyGetSystemSeconds();
//m_fSecondElapsed = GrannyGetSecondsElapsed(&m_clockLast, &clockNow) * m_fMotionTimeSpeed;
//DWORD t1=ELTimer_GetMSec();
m_fSecondElapsed=CTimer::Instance().GetElapsedSecond();
if (m_fDelay > m_fSecondElapsed)
{
m_fDelay -= m_fSecondElapsed;
m_fSecondElapsed = 0.0f;
}
else
{
m_fSecondElapsed -= m_fDelay;
m_fDelay = 0.0f;
}
m_fLastLocalTime = m_fLocalTime;
m_fLocalTime += m_fSecondElapsed;
m_fAverageSecondElapsed = m_fAverageSecondElapsed + (m_fSecondElapsed - m_fAverageSecondElapsed) / 4.0f;
//m_clockLast = clockNow;
CGrannyLODController::FUpdateTime update;
update.fElapsedTime = m_fSecondElapsed;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), update);
}
void CGraphicThingInstance::OnUpdate()
{
#ifdef __PERFORMANCE_CHECKER__
DWORD t1=timeGetTime();
#endif
UpdateLODLevel();
#ifdef __PERFORMANCE_CHECKER__
DWORD t2=timeGetTime();
#endif
UpdateTime();
#ifdef __PERFORMANCE_CHECKER__
DWORD t3=timeGetTime();
#endif
#ifdef __PERFORMANCE_CHECKER__
{
static FILE* fp=fopen("perf_thing_onupdate.txt", "w");
if (t3-t1>3)
{
fprintf(fp, "GTU.Total %d (Time %f)\n",
t3-t1, ELTimer_GetMSec()/1000.0f);
fprintf(fp, "GTU.CAL %d\n", t2-t1);
fprintf(fp, "GTU.UP %d\n", t3-t2);
fprintf(fp, "-------------------------------- \n");
fflush(fp);
}
fflush(fp);
}
#endif
}
void CGraphicThingInstance::OnRender()
{
RenderWithOneTexture();
}
void CGraphicThingInstance::OnBlendRender()
{
BlendRenderWithOneTexture();
}
void CGraphicThingInstance::RenderWithOneTexture()
{
//assert(m_bUpdated);
if (!m_bUpdated)
return;
CGrannyLODController::FRenderWithOneTexture render;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), render);
}
void CGraphicThingInstance::BlendRenderWithOneTexture()
{
//assert(m_bUpdated);
if (!m_bUpdated)
return;
CGrannyLODController::FBlendRenderWithOneTexture blendRender;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), blendRender);
}
void CGraphicThingInstance::RenderWithTwoTexture()
{
//assert(m_bUpdated);
if (!m_bUpdated)
return;
CGrannyLODController::FRenderWithTwoTexture render;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), render);
}
void CGraphicThingInstance::BlendRenderWithTwoTexture()
{
//assert(m_bUpdated);
if (!m_bUpdated)
return;
CGrannyLODController::FRenderWithTwoTexture blendRender;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), blendRender);
}
void CGraphicThingInstance::OnRenderToShadowMap()
{
if (!m_bUpdated)
return;
CGrannyLODController::FRenderToShadowMap RenderToShadowMap;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderToShadowMap);
}
void CGraphicThingInstance::OnRenderShadow()
{
CGrannyLODController::FRenderShadow RenderShadow;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderShadow);
}
void CGraphicThingInstance::OnRenderPCBlocker()
{
CGrannyLODController::FRenderWithOneTexture RenderPCBlocker;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderPCBlocker);
}
DWORD CGraphicThingInstance::GetLODControllerCount() const
{
return m_LODControllerVector.size();
}
CGrannyLODController * CGraphicThingInstance::GetLODControllerPointer(DWORD dwModelIndex) const
{
assert(dwModelIndex < m_LODControllerVector.size());
return m_LODControllerVector[dwModelIndex];
}
CGrannyLODController * CGraphicThingInstance::GetLODControllerPointer(DWORD dwModelIndex)
{
assert(dwModelIndex < m_LODControllerVector.size());
return m_LODControllerVector[dwModelIndex];
}
BYTE CGraphicThingInstance::GetLODLevel(DWORD dwModelInstance)
{
assert(dwModelInstance < m_LODControllerVector.size());
return (m_LODControllerVector[dwModelInstance]->GetLODLevel());
}
float CGraphicThingInstance::GetHeight()
{
if (m_LODControllerVector.empty())
return 0.0f;
CGrannyModelInstance * pModelInstance = m_LODControllerVector[0]->GetModelInstance();
if (!pModelInstance)
return 0.0f;
D3DXVECTOR3 vtMin, vtMax;
pModelInstance->GetBoundBox(&vtMin, &vtMax);
return fabs(vtMin.z - vtMax.z);
}
void CGraphicThingInstance::ReloadTexture()
{
CGrannyLODController::FReloadTexture ReloadTexture;
std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), ReloadTexture);
}
bool CGraphicThingInstance::HaveBlendThing()
{
for (int i = 0; i < m_LODControllerVector.size(); i++)
{
if (m_LODControllerVector[i]->HaveBlendThing())
return true;
}
return false;
}
void CGraphicThingInstance::OnClear()
{
stl_wipe(m_LODControllerVector);
stl_wipe_second(m_roMotionThingMap);
for (DWORD d = 0; d < m_modelThingSetVector.size(); ++d)
m_modelThingSetVector[d].Clear();
}
void CGraphicThingInstance::OnInitialize()
{
m_bUpdated = false;
m_fLastLocalTime = 0.0f;
m_fLocalTime = 0.0f;
m_fDelay = 0.0;
m_fSecondElapsed = 0.0f;
m_fAverageSecondElapsed = 0.03f;
m_fRadius = -1.0f;
m_v3Center = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
ResetLocalTime();
}
CGraphicThingInstance::CGraphicThingInstance()
{
Initialize();
}
CGraphicThingInstance::~CGraphicThingInstance()
{
}

View File

@ -0,0 +1,158 @@
#pragma once
#include "../eterbase/Stl.h"
#include "../eterlib/GrpObjectInstance.h"
#include "../eterlib/GrpShadowTexture.h"
#include "LODController.h"
const int DONTUSEVALUE = -1;
class CGraphicThingInstance : public CGraphicObjectInstance
{
public:
typedef struct SModelThingSet
{
void Clear()
{
stl_wipe(m_pLODThingRefVector);
}
std::vector<CGraphicThing::TRef *> m_pLODThingRefVector;
} TModelThingSet;
public:
enum
{
ID = THING_OBJECT
};
int GetType() const { return ID; }
CGraphicThingInstance();
virtual ~CGraphicThingInstance();
void DeformNoSkin();
void UpdateLODLevel();
void UpdateTime();
void DeformAll(); // <20><><EFBFBD><EFBFBD> LOD <20><><EFBFBD><EFBFBD>
bool LessRenderOrder(CGraphicThingInstance* pkThingInst);
bool Picking(const D3DXVECTOR3 & v, const D3DXVECTOR3 & dir, float & out_x, float & out_y);
void OnInitialize();
bool CreateDeviceObjects();
void DestroyDeviceObjects();
void ReserveModelInstance(int iCount);
void ReserveModelThing(int iCount);
bool CheckModelInstanceIndex(int iModelInstance);
bool CheckModelThingIndex(int iModelThing);
bool CheckMotionThingIndex(DWORD dwMotionKey);
bool GetMotionThingPointer(DWORD dwKey, CGraphicThing ** ppMotion);
bool IsMotionThing();
void RegisterModelThing(int iModelThing, CGraphicThing * pModelThing);
void RegisterLODThing(int iModelThing, CGraphicThing * pModelThing);
void RegisterMotionThing(DWORD dwMotionKey, CGraphicThing * pMotionThing);
bool SetModelInstance(int iDstModelInstance, int iSrcModelThing, int iSrcModel,int iSkelInstance = DONTUSEVALUE);
void SetEndStopMotion();
void SetMotionAtEnd();
void AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, int iSrcModelInstance);
void AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, CGraphicThingInstance & rsrcInstance, int iSrcModelInstance);
void DetachModelInstance(int iDstModelInstance, CGraphicThingInstance & rSrcInstance, int SrcModelInstance);
bool FindBoneIndex(int iModelInstance, const char* c_szBoneName, int * iRetBone);
bool GetBonePosition(int iModelIndex, int iBoneIndex, float * pfx, float * pfy, float * pfz);
void ResetLocalTime();
void InsertDelay(float fDelay);
void SetMaterialImagePointer(UINT ePart, const char* c_szImageName, CGraphicImage* pImage);
void SetMaterialData(UINT ePart, const char* c_szImageName, SMaterialData kMaterialData);
void SetSpecularInfo(UINT ePart, const char* c_szMtrlName, BOOL bEnable, float fPower);
void __SetLocalTime(float fLocalTime); // Only Used by Tools
float GetLastLocalTime();
float GetLocalTime();
float GetSecondElapsed();
float GetAverageSecondElapsed();
BYTE GetLODLevel(DWORD dwModelInstance);
float GetHeight();
void RenderWithOneTexture();
void RenderWithTwoTexture();
void BlendRenderWithOneTexture();
void BlendRenderWithTwoTexture();
DWORD GetLODControllerCount() const;
CGrannyLODController * GetLODControllerPointer(DWORD dwModelIndex) const;
CGrannyLODController * GetLODControllerPointer(DWORD dwModelIndex);
void ReloadTexture();
public:
CGraphicThing* GetBaseThingPtr();
bool SetMotion(DWORD dwMotionKey, float blendTime = 0.0f, int loopCount = 0, float speedRatio=1.0f);
bool ChangeMotion(DWORD dwMotionKey, int loopCount = 0, float speedRatio=1.0f);
bool Intersect(float * pu, float * pv, float * pt);
void GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax);
BOOL GetBoundBox(DWORD dwModelInstanceIndex, D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax);
BOOL GetBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix);
BOOL GetCompositeBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix);
void UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed = 0.0f, int iModelInstanceIndex = 0);
void ProjectShadow(const CGraphicShadowTexture & c_rShadowTexture);
public:
void BuildBoundingSphere();
void BuildBoundingAABB();
virtual void CalculateBBox();
virtual bool GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius);
virtual bool GetBoundingAABB(D3DXVECTOR3 & v3Min, D3DXVECTOR3 & v3Max);
protected:
void OnClear();
void OnDeform();
void OnUpdate();
void OnRender();
void OnBlendRender();
void OnRenderToShadowMap();
void OnRenderShadow();
void OnRenderPCBlocker();
protected:
bool m_bUpdated;
float m_fLastLocalTime;
float m_fLocalTime;
float m_fDelay;
float m_fSecondElapsed;
float m_fAverageSecondElapsed;
float m_fRadius;
D3DXVECTOR3 m_v3Center;
D3DXVECTOR3 m_v3Min, m_v3Max;
std::vector<CGrannyLODController *> m_LODControllerVector;
std::vector<TModelThingSet> m_modelThingSetVector;
std::map<DWORD, CGraphicThing::TRef *> m_roMotionThingMap;
protected:
virtual void OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector);
virtual void OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance);
virtual bool OnGetObjectHeight(float fX, float fY, float * pfHeight);
public:
static void CreateSystem(UINT uCapacity);
static void DestroySystem();
static CGraphicThingInstance* New();
static void Delete(CGraphicThingInstance* pkInst);
static CDynamicPool<CGraphicThingInstance> ms_kPool;
bool HaveBlendThing();
};

55
src/EterGrnLib/Util.cpp Normal file
View File

@ -0,0 +1,55 @@
#include "StdAfx.h"
#include "Util.h"
/*
bool GrannyMeshGetTextureAnimation(granny_mesh* pgrnMesh, float* puVelocity, float* pvVelocity)
{
static granny_data_type_definition s_UVType[] =
{
{GrannyInt32Member, "UV Animation Flag"},
{GrannyInt32Member, "X Velocity"},
{GrannyInt32Member, "Y Velocity"},
{GrannyEndMember}
};
typedef struct SUVData
{
granny_int32 UVAnimationFlag;
granny_int32 xVelocity;
granny_int32 yVelocity;
} TUVData;
TUVData UVData;
granny_variant& rExtendedData = pgrnMesh->ExtendedData;
GrannyConvertSingleObject(rExtendedData.Type, rExtendedData.Object, s_UVType, &UVData);
*puVelocity = float(UVData.xVelocity) / 100000.0f;
*pvVelocity = float(UVData.yVelocity) / 100000.0f;
return UVData.UVAnimationFlag ? true : false;
}
*/
/*
bool GrannyMeshIsTextureAnimation(granny_mesh* pgrnMesh)
{
if (GrannyMeshIsRigid(pgrnMesh))
{
float xVelocity, yVelocity;
if (GrannyMeshGetTextureAnimation(pgrnMesh, &xVelocity, &yVelocity))
return true;
}
return false;
}
*/
bool GrannyMeshIsDeform(granny_mesh* pgrnMesh)
{
if (GrannyMeshIsRigid(pgrnMesh))
return false;
return true;
}

16
src/EterGrnLib/Util.h Normal file
View File

@ -0,0 +1,16 @@
#pragma once
// bool GrannyMeshGetTextureAnimation(granny_mesh* pgrnMesh, float* puVelocity, float* pvVelocity);
// bool GrannyMeshIsTextureAnimation(granny_mesh* pgrnMesh);
bool GrannyMeshIsDeform(granny_mesh* pgrnMesh);
class CGraphicImage;
struct SMaterialData
{
CGraphicImage * pImage;
float fSpecularPower;
BOOL isSpecularEnable;
BYTE bSphereMapIndex;
};