From 9f448afade02a06d6e0981ba7121ef2af84d4795 Mon Sep 17 00:00:00 2001 From: Byurrer <byurrer@mail.ru> Date: Fri, 19 Jan 2018 19:08:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=B0=D0=B9=D1=82=D1=8B,=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D1=8B=D0=BD=D0=B5=20=D0=B4=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BD=D1=8B=20=D0=B2=20=D1=85=D0=B8=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=85,=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BB=20=D1=85=D0=B8=D0=B4=D0=B5=D1=80=D1=8B=20?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=83=D1=8E?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20=D0=B2=20=D0=B3=D1=80=D0=B0=D1=84=D1=8F=D0=B4=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proj/SkyXEngine/vs2013/SkyXEngine.sln | 16 +- proj/SkyXEngine/vs2013/SkyXEngine.vcxproj | 6 +- proj/sxae/vs2013/sxae.vcxproj | 7 +- proj/sxaigrid/vs2013/sxaigrid.vcxproj | 6 +- proj/sxanim/vs2013/sxanim.vcxproj | 6 +- proj/sxconsole/vs2013/sxconsole.vcxproj | 3 +- proj/sxcore/vs2013/sxcore.vcxproj | 6 +- proj/sxdecals/vs2013/sxdecals.vcxproj | 9 +- proj/sxgame/vs2013/sxgame.vcxproj | 9 +- proj/sxgcore/vs2013/sxgcore.vcxproj | 6 +- proj/sxgeom/vs2013/sxgeom.vcxproj | 6 +- proj/sxguiwinapi/vs2013/sxguiwinapi.vcxproj | 3 +- proj/sxinput/vs2013/sxinput.vcxproj | 6 +- proj/sxlevel/vs2013/sxlevel.vcxproj | 4 +- .../vs2013/sxleveleditor.vcxproj | 6 +- .../vs2013/sxmaterialeditor.vcxproj | 4 +- proj/sxmtllight/vs2013/sxmtllight.vcxproj | 6 +- proj/sxparticles/vs2013/sxparticles.vcxproj | 6 +- .../vs2013/sxparticleseditor.vcxproj | 4 +- proj/sxphysics/vs2013/sxphysics.vcxproj | 7 +- proj/sxpp/vs2013/sxpp.vcxproj | 6 +- proj/sxrender/vs2013/sxrender.vcxproj | 5 +- proj/sxrender/vs2013/sxrender_d.dll | Bin 0 -> 733696 bytes proj/sxscore/vs2013/sxscore.vcxproj | 6 +- source/GRegisterIndex.h | 10 +- source/SkyXEngine.h | 6 +- source/SkyXEngine_Build/SkyXEngine_Build.cpp | 6 +- source/aigrid/aigrid.cpp | 61 +- source/aigrid/aigrid.h | 10 +- source/aigrid/sxaigrid.cpp | 11 +- source/aigrid/sxaigrid.h | 6 +- source/aigrid/sxaigrid_dll.cpp | 7 +- source/anim/ModelFile.h | 10 +- source/anim/animated.cpp | 33 +- source/anim/animated.h | 12 +- source/anim/sxanim.h | 6 +- source/anim/sxanim_dll.cpp | 14 +- source/core/Config.cpp | 9 +- source/core/Config.h | 10 +- source/core/File.h | 5 + source/core/Task.cpp | 5 + source/core/Task.h | 10 +- source/core/TaskManager.cpp | 8 +- source/core/TaskManager.h | 10 +- source/core/concmd.cpp | 5 + source/core/concmd.h | 9 +- source/core/cvars.cpp | 17 +- source/core/cvars.h | 9 +- source/core/file.cpp | 5 + source/core/sxcore.cpp | 20 +- source/core/sxcore.h | 11 +- source/core/sxcore_dll.cpp | 6 +- source/core/time.cpp | 5 + source/core/time.h | 8 +- source/decals/DecalManager.cpp | 16 +- source/decals/DecalManager.h | 10 +- source/decals/sxdecals.h | 8 +- source/decals/sxdecals_dll.cpp | 16 +- source/editors_utils/axes_helper.cpp | 5 + source/editors_utils/axes_helper.h | 9 +- source/game/BaseAmmo.cpp | 6 + source/game/BaseAmmo.h | 11 +- source/game/BaseAmmoBox.cpp | 6 + source/game/BaseAmmoBox.h | 11 +- source/game/BaseAnimating.cpp | 10 +- source/game/BaseAnimating.h | 10 +- source/game/BaseCharacter.cpp | 5 + source/game/BaseCharacter.h | 10 +- source/game/BaseEntity.cpp | 6 + source/game/BaseEntity.h | 10 +- source/game/BaseHandle.cpp | 6 + source/game/BaseHandle.h | 11 +- source/game/BaseItem.cpp | 6 + source/game/BaseItem.h | 11 +- source/game/BaseMag.cpp | 6 + source/game/BaseMag.h | 11 +- source/game/BasePistol.h | 11 +- source/game/BaseRiffle.cpp | 6 + source/game/BaseRiffle.h | 11 +- source/game/BaseScope.cpp | 6 + source/game/BaseScope.h | 11 +- source/game/BaseSilencer.cpp | 6 + source/game/BaseSilencer.h | 11 +- source/game/BaseSupply.cpp | 6 + source/game/BaseSupply.h | 11 +- source/game/BaseTool.cpp | 8 +- source/game/BaseTool.h | 11 +- source/game/BaseTrigger.cpp | 6 + source/game/BaseTrigger.h | 10 +- source/game/BaseWeapon.cpp | 5 + source/game/BaseWeapon.h | 11 +- source/game/BaseWeaponAddon.cpp | 6 + source/game/BaseWeaponAddon.h | 11 +- source/game/CrosshairManager.cpp | 17 +- source/game/CrosshairManager.h | 10 +- source/game/EntityFactory.cpp | 6 + source/game/EntityFactory.h | 10 +- source/game/EntityManager.cpp | 6 + source/game/EntityManager.h | 10 +- source/game/FuncTrain.cpp | 6 + source/game/FuncTrain.h | 11 +- source/game/GameData.cpp | 6 + source/game/GameData.h | 10 +- source/game/LightDirectional.cpp | 5 + source/game/LightDirectional.h | 6 +- source/game/LightPoint.cpp | 5 + source/game/LightPoint.h | 6 +- source/game/NPCBase.cpp | 5 + source/game/NPCBase.h | 11 +- source/game/NPCZombie.cpp | 5 + source/game/NPCZombie.h | 11 +- source/game/PathCorner.cpp | 6 + source/game/PathCorner.h | 10 +- source/game/Player.cpp | 6 + source/game/Player.h | 10 +- source/game/PlayerSpawn.cpp | 6 + source/game/PlayerSpawn.h | 10 +- source/game/PointCamera.cpp | 12 +- source/game/PointCamera.h | 10 +- source/game/PointEntity.cpp | 6 + source/game/PointEntity.h | 10 +- source/game/Ragdoll.cpp | 6 + source/game/Ragdoll.h | 10 +- source/game/SXbaseSnipe.h | 11 +- source/game/crosshair.cpp | 4 + source/game/crosshair.h | 10 +- source/game/proptable.cpp | 6 + source/game/proptable.h | 10 +- source/game/sxgame.h | 10 +- source/game/sxgame_dll.cpp | 18 +- source/gcore/CreatorTextures.cpp | 95 ++-- source/gcore/GeomOptimize.cpp | 5 + source/gcore/GeomOptimize.h | 5 + source/gcore/LoaderTextures.cpp | 39 +- source/gcore/LoaderTextures.h | 17 +- source/gcore/ModelFile.h | 10 +- source/gcore/bound.cpp | 538 +++++++++--------- source/gcore/bound.h | 44 +- source/gcore/camera.cpp | 266 +++++---- source/gcore/camera.h | 114 ++-- source/gcore/creatortextures.h | 6 +- source/gcore/loader_static.cpp | 259 ++++----- source/gcore/loader_static.h | 103 ++-- source/gcore/shader.cpp | 99 ++-- source/gcore/shader.h | 15 +- source/gcore/sky.cpp | 450 +++++++-------- source/gcore/sky.h | 152 ++--- source/gcore/sxgcore.cpp | 198 ++++--- source/gcore/sxgcore.h | 458 ++++++++------- source/gcore/sxgcore_dll.cpp | 7 +- source/gdefines.h | 32 +- source/geom/green.cpp | 175 +++--- source/geom/green.h | 27 +- source/geom/static_geom.cpp | 285 +++++----- source/geom/static_geom.h | 27 +- source/geom/sxgeom.cpp | 16 +- source/geom/sxgeom.h | 10 +- source/geom/sxgeom_dll.cpp | 7 +- source/input/input.cpp | 11 +- source/input/input.h | 9 +- source/input/sxinput.cpp | 12 +- source/input/sxinput.h | 6 +- source/input/sxinput_dll.cpp | 6 +- source/level/AmbientSounds.cpp | 5 + source/level/AmbientSounds.h | 5 + source/level/Weather.h | 13 +- source/level/level.cpp | 17 +- source/level/level.h | 6 +- source/level/sxlevel.cpp | 11 +- source/level/sxlevel.h | 6 +- source/level/sxlevel_dll.cpp | 6 +- source/level/weather.cpp | 19 +- source/mtllight/light.cpp | 25 +- source/mtllight/light.h | 16 +- source/mtllight/material.cpp | 43 +- source/mtllight/material.h | 17 +- source/mtllight/ml_data.cpp | 7 +- source/mtllight/ml_data.h | 7 +- source/mtllight/reflection.cpp | 13 +- source/mtllight/reflection.h | 11 +- source/mtllight/shadow.cpp | 42 +- source/mtllight/shadow.h | 5 + source/mtllight/sxmtllight.cpp | 12 +- source/mtllight/sxmtllight.h | 8 +- source/mtllight/sxmtllight_dll.cpp | 6 +- source/particles/PESet.cpp | 5 + source/particles/PESet.h | 9 +- source/particles/effect.cpp | 29 +- source/particles/effect.h | 27 +- source/particles/emitter.cpp | 13 +- source/particles/emitter.h | 12 +- source/particles/sxparticles.cpp | 15 +- source/particles/sxparticles.h | 10 +- source/particles/sxparticles_dll.cpp | 6 +- source/physics/PhyWorld.cpp | 8 +- source/physics/PhyWorld.h | 12 +- source/physics/sxphysics.h | 6 +- source/physics/sxphysics_dll.cpp | 14 +- source/pp/sxpp.cpp | 20 +- source/pp/sxpp.h | 8 +- source/pp/sxpp_dll.cpp | 7 +- source/render/camera_update.cpp | 19 +- source/render/camera_update.h | 10 +- source/render/editor/axes_static.cpp | 5 + source/render/editor/axes_static.h | 5 + source/render/editor/grid.cpp | 5 + source/render/editor/grid.h | 5 + source/render/gdata.cpp | 5 + source/render/gdata.h | 6 +- source/render/model_sim.cpp | 63 +- source/render/model_sim.h | 6 +- source/render/render_func.cpp | 31 +- source/render/render_func.h | 8 +- source/render/sxrender.cpp | 13 +- source/render/sxrender.h | 6 +- source/score/CallBackOgg.cpp | 5 + source/score/sound.cpp | 41 +- source/score/sound.h | 9 +- source/score/sxscore.cpp | 12 +- source/score/sxscore.h | 6 +- source/score/sxscore_dll.cpp | 7 +- source/skyxengine.cpp | 57 +- source/sxae/Camera.cpp | 6 + source/sxae/Camera.h | 10 +- source/sxae/EMessages.h | 10 +- source/sxae/Editor.cpp | 6 + source/sxae/Editor.h | 10 +- source/sxae/EditorTab.cpp | 5 + source/sxae/EditorTab.h | 10 +- source/sxae/TabActivities.cpp | 6 + source/sxae/TabActivities.h | 10 +- source/sxae/TabAnimation.cpp | 6 + source/sxae/TabAnimation.h | 10 +- source/sxae/TabAttachments.cpp | 6 + source/sxae/TabAttachments.h | 10 +- source/sxae/TabControllers.cpp | 6 + source/sxae/TabControllers.h | 10 +- source/sxae/TabFiles.cpp | 6 + source/sxae/TabFiles.h | 10 +- source/sxae/TabHitboxes.cpp | 6 + source/sxae/TabHitboxes.h | 10 +- source/sxae/TabManager.cpp | 6 + source/sxae/TabManager.h | 10 +- source/sxae/TabSkins.cpp | 6 + source/sxae/TabSkins.h | 10 +- source/sxae/Tools.cpp | 6 + source/sxae/Tools.h | 10 +- source/sxae/main.cpp | 5 + source/sxae/ui.cpp | 6 + source/sxconsole/ColorPrint.cpp | 6 + source/sxconsole/ColorPrint.h | 10 +- source/sxconsole/sxconsole.cpp | 6 + 252 files changed, 3357 insertions(+), 2356 deletions(-) create mode 100644 proj/sxrender/vs2013/sxrender_d.dll diff --git a/proj/SkyXEngine/vs2013/SkyXEngine.sln b/proj/SkyXEngine/vs2013/SkyXEngine.sln index aba385228..6f0809bc6 100644 --- a/proj/SkyXEngine/vs2013/SkyXEngine.sln +++ b/proj/SkyXEngine/vs2013/SkyXEngine.sln @@ -17,6 +17,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SkyXEngine", "SkyXEngine.vc {0C7E3DB7-005F-41E9-A570-868BCF959E91} = {0C7E3DB7-005F-41E9-A570-868BCF959E91} {120D29B8-D2D9-4B4E-8AC6-D951973B7398} = {120D29B8-D2D9-4B4E-8AC6-D951973B7398} {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE} = {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE} + {7F0ACED1-6E16-4DD3-800E-0C50150897C2} = {7F0ACED1-6E16-4DD3-800E-0C50150897C2} {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {AEECC2DB-C7C7-4089-9262-A69794DF834D} {56A8D7F7-B73C-4206-8038-83D8A169AA2F} = {56A8D7F7-B73C-4206-8038-83D8A169AA2F} EndProjectSection @@ -93,7 +94,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Bullet3OpenCL_clew", "..\.. EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxphysics", "..\..\sxphysics\vs2013\sxphysics.vcxproj", "{7C0C8205-BDD3-44A3-AA3A-7855C7EFC88E}" ProjectSection(ProjectDependencies) = postProject - {C1C1F046-C839-4602-AF70-923CDD237C1B} = {C1C1F046-C839-4602-AF70-923CDD237C1B} {46A17C83-2972-4C41-B67F-224640089085} = {46A17C83-2972-4C41-B67F-224640089085} {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} = {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} {F2DD3789-7BC9-D241-8C8D-2179933B30DD} = {F2DD3789-7BC9-D241-8C8D-2179933B30DD} @@ -110,6 +110,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LinearMath", "..\..\..\sdks EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxparticles", "..\..\sxparticles\vs2013\sxparticles.vcxproj", "{56A8D7F7-B73C-4206-8038-83D8A169AA2F}" ProjectSection(ProjectDependencies) = postProject + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} = {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {AEECC2DB-C7C7-4089-9262-A69794DF834D} EndProjectSection EndProject @@ -133,9 +134,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxgame", "..\..\sxgame\vs20 ProjectSection(ProjectDependencies) = postProject {7C0C8205-BDD3-44A3-AA3A-7855C7EFC88E} = {7C0C8205-BDD3-44A3-AA3A-7855C7EFC88E} {B9656841-7734-4D0B-8619-1BED5E2ED7AE} = {B9656841-7734-4D0B-8619-1BED5E2ED7AE} - {C1C1F046-C839-4602-AF70-923CDD237C1B} = {C1C1F046-C839-4602-AF70-923CDD237C1B} {709D8A7A-D3E0-4070-A493-EFDF7A8E9D73} = {709D8A7A-D3E0-4070-A493-EFDF7A8E9D73} - {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {AEECC2DB-C7C7-4089-9262-A69794DF834D} + {6A402480-C09B-4CBF-A6BD-115CE4BFF2D8} = {6A402480-C09B-4CBF-A6BD-115CE4BFF2D8} + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} = {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} + {3A5449A3-DCE7-4557-9C9F-DEEAFBAAC763} = {3A5449A3-DCE7-4557-9C9F-DEEAFBAAC763} + {120D29B8-D2D9-4B4E-8AC6-D951973B7398} = {120D29B8-D2D9-4B4E-8AC6-D951973B7398} {56A8D7F7-B73C-4206-8038-83D8A169AA2F} = {56A8D7F7-B73C-4206-8038-83D8A169AA2F} EndProjectSection EndProject @@ -167,6 +170,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxlevel", "..\..\sxlevel\vs EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxrender", "..\..\sxrender\vs2013\sxrender.vcxproj", "{7F0ACED1-6E16-4DD3-800E-0C50150897C2}" + ProjectSection(ProjectDependencies) = postProject + {B9656841-7734-4D0B-8619-1BED5E2ED7AE} = {B9656841-7734-4D0B-8619-1BED5E2ED7AE} + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} = {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} + {0C7E3DB7-005F-41E9-A570-868BCF959E91} = {0C7E3DB7-005F-41E9-A570-868BCF959E91} + {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE} = {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE} + {56A8D7F7-B73C-4206-8038-83D8A169AA2F} = {56A8D7F7-B73C-4206-8038-83D8A169AA2F} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/proj/SkyXEngine/vs2013/SkyXEngine.vcxproj b/proj/SkyXEngine/vs2013/SkyXEngine.vcxproj index 4c2971439..ef9a54c1b 100644 --- a/proj/SkyXEngine/vs2013/SkyXEngine.vcxproj +++ b/proj/SkyXEngine/vs2013/SkyXEngine.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../source;../../../sdks/bullet3/src;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include;../../../sdks/ogg/libvorbis/include/;../../../sdks/ogg/libogg/include/;</IncludePath> @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_GAME;SX_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_GAME;SX_EXE;%(PreprocessorDefinitions);SX_LIB_NAME="ENGINE"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -81,7 +81,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_GAME;SX_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_GAME;SX_EXE;%(PreprocessorDefinitions);SX_LIB_NAME="ENGINE"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxae/vs2013/sxae.vcxproj b/proj/sxae/vs2013/sxae.vcxproj index 07e39ec9c..b2c4dab61 100644 --- a/proj/sxae/vs2013/sxae.vcxproj +++ b/proj/sxae/vs2013/sxae.vcxproj @@ -57,7 +57,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;SX_EXE;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;SX_EXE;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);SX_LIB_NAME="AEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -78,17 +78,18 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;SX_EXE;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;SX_EXE;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);SX_LIB_NAME="AEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> + <GenerateDebugInformation>false</GenerateDebugInformation> <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> <IgnoreSpecificDefaultLibraries> </IgnoreSpecificDefaultLibraries> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/proj/sxaigrid/vs2013/sxaigrid.vcxproj b/proj/sxaigrid/vs2013/sxaigrid.vcxproj index 35254926e..5ef8eddc7 100644 --- a/proj/sxaigrid/vs2013/sxaigrid.vcxproj +++ b/proj/sxaigrid/vs2013/sxaigrid.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXAIGRID_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXAIGRID_EXPORTS;SX_DLL;SX_LIB_NAME="AIGRID";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -80,7 +80,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXAIGRID_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXAIGRID_EXPORTS;SX_LIB_NAME="AIGRID";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxanim/vs2013/sxanim.vcxproj b/proj/sxanim/vs2013/sxanim.vcxproj index b9c5cf2a6..87d4e7a17 100644 --- a/proj/sxanim/vs2013/sxanim.vcxproj +++ b/proj/sxanim/vs2013/sxanim.vcxproj @@ -41,7 +41,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>$(IncludePath);$(WindowsSdk_71A_IncludePath);../../../source;../../../sdks/dx9sdk/Include;</IncludePath> @@ -61,7 +61,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXANIM_EXPORTS;SX_DLL%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXANIM_EXPORTS;SX_LIB_NAME="ANIM";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -81,7 +81,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXANIM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXANIM_EXPORTS;SX_LIB_NAME="ANIM";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxconsole/vs2013/sxconsole.vcxproj b/proj/sxconsole/vs2013/sxconsole.vcxproj index 6ca9ed445..482210120 100644 --- a/proj/sxconsole/vs2013/sxconsole.vcxproj +++ b/proj/sxconsole/vs2013/sxconsole.vcxproj @@ -79,9 +79,10 @@ </ClCompile> <Link> <SubSystem>Console</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> + <GenerateDebugInformation>false</GenerateDebugInformation> <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/proj/sxcore/vs2013/sxcore.vcxproj b/proj/sxcore/vs2013/sxcore.vcxproj index fd0266995..34244c1dc 100644 --- a/proj/sxcore/vs2013/sxcore.vcxproj +++ b/proj/sxcore/vs2013/sxcore.vcxproj @@ -75,7 +75,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> <LibraryPath>../../../libs;$(LibraryPath);$(WindowsSDK_LibraryPath_x86);../../../sdks/dx9sdk/Lib</LibraryPath> @@ -95,7 +95,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;SXCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;SXCORE_EXPORTS;SX_DLL;SX_LIB_NAME="CORE";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -115,7 +115,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXCORE_EXPORTS;SX_DLL;SX_LIB_NAME="CORE";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxdecals/vs2013/sxdecals.vcxproj b/proj/sxdecals/vs2013/sxdecals.vcxproj index b1a178959..b4bd6708b 100644 --- a/proj/sxdecals/vs2013/sxdecals.vcxproj +++ b/proj/sxdecals/vs2013/sxdecals.vcxproj @@ -48,7 +48,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <IncludePath>../../../source;../../../sdks/bullet3/src;$(VC_IncludePath);$(WindowsSdk_71A_IncludePath);../../../sdks/dx9sdk/Include;</IncludePath> <LibraryPath>../../../sdks/dx9sdk/Lib;../../../sdks/bullet3/bin;../../../libs;$(VC_LibraryPath_x86);$(WindowsSdk_71A_LibraryPath_x86);</LibraryPath> @@ -66,7 +66,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXDECALS_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXDECALS_EXPORTS;SX_DLL;SX_LIB_NAME="DECALS";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -86,15 +86,16 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXDECALS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXDECALS_EXPORTS;SX_LIB_NAME="DECALS";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> + <GenerateDebugInformation>false</GenerateDebugInformation> <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> </Link> </ItemDefinitionGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/proj/sxgame/vs2013/sxgame.vcxproj b/proj/sxgame/vs2013/sxgame.vcxproj index 49968e552..5d98a16f4 100644 --- a/proj/sxgame/vs2013/sxgame.vcxproj +++ b/proj/sxgame/vs2013/sxgame.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <IncludePath>../../../source;../../../sdks/bullet3/src;$(VC_IncludePath);$(WindowsSdk_71A_IncludePath);;../../../sdks/dx9sdk/Include;</IncludePath> <LibraryPath>../../../libs;$(VC_LibraryPath_x86);$(WindowsSdk_71A_LibraryPath_x86);;../../../sdks/dx9sdk/Lib;</LibraryPath> @@ -58,7 +58,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>SXGAME_EXPORT=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXGAME_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>SXGAME_EXPORT=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXGAME_EXPORTS;SX_LIB_NAME="GAME";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -78,15 +78,16 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>SXGAME_EXPORT=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXGAME_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>SXGAME_EXPORT=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXGAME_EXPORTS;SX_LIB_NAME="GAME";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> + <GenerateDebugInformation>false</GenerateDebugInformation> <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/proj/sxgcore/vs2013/sxgcore.vcxproj b/proj/sxgcore/vs2013/sxgcore.vcxproj index 3fc121bae..d5e0ae703 100644 --- a/proj/sxgcore/vs2013/sxgcore.vcxproj +++ b/proj/sxgcore/vs2013/sxgcore.vcxproj @@ -41,7 +41,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>$(IncludePath);$(WindowsSdk_71A_IncludePath);../../../source;../../../sdks/dx9sdk/Include;</IncludePath> @@ -61,7 +61,7 @@ </PrecompiledHeader> <WarningLevel>Level1</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SGCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SGCORE_EXPORTS;SX_DLL;SX_LIB_NAME="GCORE";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -81,7 +81,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SGCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SGCORE_EXPORTS;SX_DLL;SX_LIB_NAME="GCORE";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxgeom/vs2013/sxgeom.vcxproj b/proj/sxgeom/vs2013/sxgeom.vcxproj index c49173779..95af52972 100644 --- a/proj/sxgeom/vs2013/sxgeom.vcxproj +++ b/proj/sxgeom/vs2013/sxgeom.vcxproj @@ -62,7 +62,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> @@ -82,7 +82,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXGEOM_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXGEOM_EXPORTS;SX_DLL;SX_LIB_NAME="GEOM";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -102,7 +102,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXGEOM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXGEOM_EXPORTS;SX_LIB_NAME="GEOM";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxguiwinapi/vs2013/sxguiwinapi.vcxproj b/proj/sxguiwinapi/vs2013/sxguiwinapi.vcxproj index 8561c371f..81dba1f16 100644 --- a/proj/sxguiwinapi/vs2013/sxguiwinapi.vcxproj +++ b/proj/sxguiwinapi/vs2013/sxguiwinapi.vcxproj @@ -145,7 +145,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../source;$(IncludePath)</IncludePath> @@ -195,6 +195,7 @@ <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> </Link> </ItemDefinitionGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/proj/sxinput/vs2013/sxinput.vcxproj b/proj/sxinput/vs2013/sxinput.vcxproj index 900a09aab..e6adf7499 100644 --- a/proj/sxinput/vs2013/sxinput.vcxproj +++ b/proj/sxinput/vs2013/sxinput.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXINPUT_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXINPUT_EXPORTS;SX_DLL;SX_LIB_NAME="INPUT";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -80,7 +80,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXINPUT_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXINPUT_EXPORTS;SX_DLL;SX_LIB_NAME="INPUT";%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxlevel/vs2013/sxlevel.vcxproj b/proj/sxlevel/vs2013/sxlevel.vcxproj index dbf9e8d07..334d962fe 100644 --- a/proj/sxlevel/vs2013/sxlevel.vcxproj +++ b/proj/sxlevel/vs2013/sxlevel.vcxproj @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXLEVEL_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXLEVEL_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="LEVEL"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -79,7 +79,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXLEVEL_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXLEVEL_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="LEVEL"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxleveleditor/vs2013/sxleveleditor.vcxproj b/proj/sxleveleditor/vs2013/sxleveleditor.vcxproj index 41fedee70..e5d12dfd4 100644 --- a/proj/sxleveleditor/vs2013/sxleveleditor.vcxproj +++ b/proj/sxleveleditor/vs2013/sxleveleditor.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../sdks/bullet3/src;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../source;../../../sdks/dx9sdk/Include;</IncludePath> <LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);../../../libs;../../../sdks/dx9sdk/lib;</LibraryPath> @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>TurnOffAllWarnings</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_LEVEL_EDITOR;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_LEVEL_EDITOR;%(PreprocessorDefinitions);SX_LIB_NAME="LEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> </ClCompile> <Link> @@ -78,7 +78,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_LEVEL_EDITOR;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_LEVEL_EDITOR;%(PreprocessorDefinitions);SX_LIB_NAME="LEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxmaterialeditor/vs2013/sxmaterialeditor.vcxproj b/proj/sxmaterialeditor/vs2013/sxmaterialeditor.vcxproj index bbf500d70..90a9a462f 100644 --- a/proj/sxmaterialeditor/vs2013/sxmaterialeditor.vcxproj +++ b/proj/sxmaterialeditor/vs2013/sxmaterialeditor.vcxproj @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>TurnOffAllWarnings</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_MATERIAL_EDITOR;SX_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_MATERIAL_EDITOR;SX_EXE;%(PreprocessorDefinitions);SX_LIB_NAME="MEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> </ClCompile> <Link> @@ -78,7 +78,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_MATERIAL_EDITOR;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_MATERIAL_EDITOR;%(PreprocessorDefinitions);SX_LIB_NAME="MEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxmtllight/vs2013/sxmtllight.vcxproj b/proj/sxmtllight/vs2013/sxmtllight.vcxproj index 862a03a0d..f32c0d568 100644 --- a/proj/sxmtllight/vs2013/sxmtllight.vcxproj +++ b/proj/sxmtllight/vs2013/sxmtllight.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXMTLLIGHT_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXMTLLIGHT_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="MTLLIGHT"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -80,7 +80,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXMTLLIGHT_EXPORTS;SX_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXMTLLIGHT_EXPORTS;SX_EXE;%(PreprocessorDefinitions);SX_LIB_NAME="MTLLIGHT"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxparticles/vs2013/sxparticles.vcxproj b/proj/sxparticles/vs2013/sxparticles.vcxproj index 838965423..08adde773 100644 --- a/proj/sxparticles/vs2013/sxparticles.vcxproj +++ b/proj/sxparticles/vs2013/sxparticles.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <IncludePath>../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> <LibraryPath>../../../libs;$(LibraryPath);$(WindowsSDK_LibraryPath_x86);../../../sdks/dx9sdk/Lib</LibraryPath> <SourcePath>../../../source;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);../../../sdks/dx9sdk/Include</SourcePath> @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXPARTICLES_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXPARTICLES_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="PARTICLES"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -80,7 +80,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXPARTICLES_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXPARTICLES_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="PARTICLES"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxparticleseditor/vs2013/sxparticleseditor.vcxproj b/proj/sxparticleseditor/vs2013/sxparticleseditor.vcxproj index 40e92ff7a..4061dcb57 100644 --- a/proj/sxparticleseditor/vs2013/sxparticleseditor.vcxproj +++ b/proj/sxparticleseditor/vs2013/sxparticleseditor.vcxproj @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level1</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_PARTICLES_EDITOR;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;SX_PARTICLES_EDITOR;%(PreprocessorDefinitions);SX_LIB_NAME="PEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> </ClCompile> <Link> @@ -78,7 +78,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_PARTICLES_EDITOR;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;SX_PARTICLES_EDITOR;%(PreprocessorDefinitions);SX_LIB_NAME="PEd"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxphysics/vs2013/sxphysics.vcxproj b/proj/sxphysics/vs2013/sxphysics.vcxproj index 3abf267a1..334ac37c2 100644 --- a/proj/sxphysics/vs2013/sxphysics.vcxproj +++ b/proj/sxphysics/vs2013/sxphysics.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <IncludePath>../../../source;../../../sdks/bullet3/src;$(VC_IncludePath);$(WindowsSdk_71A_IncludePath);../../../sdks/dx9sdk/Include;</IncludePath> <LibraryPath>../../../sdks/dx9sdk/Lib;../../../sdks/bullet3/bin;../../../libs;$(VC_LibraryPath_x86);$(WindowsSdk_71A_LibraryPath_x86);</LibraryPath> @@ -58,7 +58,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>BULLET_EXPORTS=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXPHYSICS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>BULLET_EXPORTS=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXPHYSICS_EXPORTS;%(PreprocessorDefinitions);SX_LIB_NAME="PHYSICS"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -78,7 +78,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>BULLET_EXPORTS=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXPHYSICS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>BULLET_EXPORTS=_declspec(dllexport);SX_DLL;WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXPHYSICS_EXPORTS;%(PreprocessorDefinitions);SX_LIB_NAME="PHYSICS"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> @@ -87,6 +87,7 @@ <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/proj/sxpp/vs2013/sxpp.vcxproj b/proj/sxpp/vs2013/sxpp.vcxproj index 77c5ed4e2..2279d7f2c 100644 --- a/proj/sxpp/vs2013/sxpp.vcxproj +++ b/proj/sxpp/vs2013/sxpp.vcxproj @@ -40,7 +40,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <IncludePath>../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> <LibraryPath>../../../libs;$(LibraryPath);$(WindowsSDK_LibraryPath_x86);../../../sdks/dx9sdk/Lib</LibraryPath> <SourcePath>../../../source;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);../../../sdks/dx9sdk/Include</SourcePath> @@ -61,7 +61,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXPP_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXPP_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="PP"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -81,7 +81,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXPP_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXPP_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="PP"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxrender/vs2013/sxrender.vcxproj b/proj/sxrender/vs2013/sxrender.vcxproj index 2d6dd9190..04f059f16 100644 --- a/proj/sxrender/vs2013/sxrender.vcxproj +++ b/proj/sxrender/vs2013/sxrender.vcxproj @@ -60,7 +60,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXRENDER_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXRENDER_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="RENDER"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -69,6 +69,7 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -79,7 +80,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXRENDER_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXRENDER_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="RENDER"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/proj/sxrender/vs2013/sxrender_d.dll b/proj/sxrender/vs2013/sxrender_d.dll new file mode 100644 index 0000000000000000000000000000000000000000..ab76cdcbadac486d17b0ff8b14a292ac44fa3f46 GIT binary patch literal 733696 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%0A71u?*5U#%b(eE4fY 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%0A&gxScU%uR2Lr901puU;NR}VX6gE+SQ$JB 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 literal 0 HcmV?d00001 diff --git a/proj/sxscore/vs2013/sxscore.vcxproj b/proj/sxscore/vs2013/sxscore.vcxproj index 2bc613f0a..fdc0b888f 100644 --- a/proj/sxscore/vs2013/sxscore.vcxproj +++ b/proj/sxscore/vs2013/sxscore.vcxproj @@ -50,7 +50,7 @@ </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> + <LinkIncremental>true</LinkIncremental> <OutDir>../../../build/</OutDir> <TargetName>$(ProjectName)_d</TargetName> <IncludePath>../../../sdks/ogg/libogg/include/;../../../sdks/ogg/libvorbis/include/;../../../source;$(VC_IncludePath);$(WindowsSDK_IncludePath);../../../sdks/dx9sdk/Include</IncludePath> @@ -70,7 +70,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXSCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;SXSCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="SCORE"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile> @@ -90,7 +90,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXSCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;SXSCORE_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="SCORE"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> diff --git a/source/GRegisterIndex.h b/source/GRegisterIndex.h index 48d69639f..2f6cff81b 100644 --- a/source/GRegisterIndex.h +++ b/source/GRegisterIndex.h @@ -1,16 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Зарезервированные (именованые) номера регистров */ -#ifndef __G_RI -#define __G_RI +#ifndef __G_RI_H +#define __G_RI_H /*! \name float4x4 register @{*/ diff --git a/source/SkyXEngine.h b/source/SkyXEngine.h index 0aea06100..36810e6f9 100644 --- a/source/SkyXEngine.h +++ b/source/SkyXEngine.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/SkyXEngine_Build/SkyXEngine_Build.cpp b/source/SkyXEngine_Build/SkyXEngine_Build.cpp index 50232fab6..af579d6be 100644 --- a/source/SkyXEngine_Build/SkyXEngine_Build.cpp +++ b/source/SkyXEngine_Build/SkyXEngine_Build.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define _CRT_SECURE_NO_WARNINGS diff --git a/source/aigrid/aigrid.cpp b/source/aigrid/aigrid.cpp index 16acec3c1..afc23a97b 100644 --- a/source/aigrid/aigrid.cpp +++ b/source/aigrid/aigrid.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "aigrid.h" void AIGrid::CorrectPosXZ(float3* pos) @@ -61,13 +66,13 @@ void AIGrid::GridSave(const char* path) { if (ArrQuads.size() <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: AI grid not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "AI grid not found\n"); return; } if (CountSplits <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: can not find path, because AI grid is not validate splits\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "can not find path, because AI grid is not validate splits\n"); return; } @@ -189,7 +194,7 @@ void AIGrid::GridLoad(const char* path) fclose(file); ReCreateBuffs(); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "sxaigrid: AI grid is loaded, count quads %d, count graph points %d\n", ArrQuads.size(), ArrGraphPointsIDs.size()); + LibReport(REPORT_MSG_LEVEL_NOTICE, "AI grid is loaded, count quads %d, count graph points %d\n", ArrQuads.size(), ArrGraphPointsIDs.size()); GridTestValidation(); } @@ -273,7 +278,7 @@ void AIGrid::BBCreate(const float3* center, const float3* param) { if (ArrBound.size() > 1) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: bound box already splitting, unresolved create"); + LibReport(REPORT_MSG_LEVEL_WARNING, "bound box already splitting, unresolved create"); return; } @@ -305,13 +310,13 @@ void AIGrid::BBSetDimensions(const float3* dim) { if (ArrBound.size() <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: bound box is not created"); + LibReport(REPORT_MSG_LEVEL_WARNING, "bound box is not created"); return; } if (ArrBound.size() > 1) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: bound box already splitting, unresolved set dimensions"); + LibReport(REPORT_MSG_LEVEL_WARNING, "bound box already splitting, unresolved set dimensions"); return; } @@ -347,7 +352,7 @@ void AIGrid::BBGetDimensions(float3* dim) const { if (ArrBound.size() <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: bound box is not created"); + LibReport(REPORT_MSG_LEVEL_WARNING, "bound box is not created"); return; } @@ -363,13 +368,13 @@ void AIGrid::BBSetPos(const float3* pos) { if (ArrBound.size() <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: bound box is not created"); + LibReport(REPORT_MSG_LEVEL_WARNING, "bound box is not created"); return; } if(ArrBound.size() > 1) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: bound box already splitting, unresolved set position"); + LibReport(REPORT_MSG_LEVEL_WARNING, "bound box already splitting, unresolved set position"); return; } @@ -399,7 +404,7 @@ void AIGrid::BBGetPos(float3* pos) const { if (ArrBound.size() <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: bound box is not created"); + LibReport(REPORT_MSG_LEVEL_WARNING, "bound box is not created"); return; } @@ -932,7 +937,7 @@ void AIGrid::GraphicsInit() if (!DXDevice) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "sxaigrid: %s - dx device is not init", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - dx device is not init", GEN_MSG_LOCATION); } D3DVERTEXELEMENT9 InstanceAIQuad[] = @@ -949,7 +954,7 @@ void AIGrid::GraphicsInit() DXDevice->CreateVertexDeclaration(InstanceAIQuad, &AIQuadDecl); - Tex_AIGrid = SGCore_LoadTexAddName("decal_aigrid1.dds", LoadTexType::ltt_const); + Tex_AIGrid = SGCore_LoadTexAddName("decal_aigrid1.dds", LOAD_TEXTURE_TYPE_CONST); IDVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "aigrid_quad.vs", "aigrid_quad.vs", SHADER_CHECKDOUBLE_PATH); IDPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "aigrid_quad.ps", "aigrid_quad.ps", SHADER_CHECKDOUBLE_PATH); @@ -1106,7 +1111,7 @@ void AIGrid::GridGenerate() { if (ArrQuads.size() <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: it is necessary one quad in AI grid"); + LibReport(REPORT_MSG_LEVEL_WARNING, "it is necessary one quad in AI grid"); return; } @@ -1147,7 +1152,7 @@ void AIGrid::GridGenerate() ArrQuadsCheck.clear(); } - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "sxaigrid: AI grid generated, all count = %d, gen count = %d, count time = %d mlsec\n", ArrQuads.size(), ArrQuads.size() - oldsizegrid, GetTickCount() - ttime); + LibReport(REPORT_MSG_LEVEL_NOTICE, "AI grid generated, all count = %d, gen count = %d, count time = %d mlsec\n", ArrQuads.size(), ArrQuads.size() - oldsizegrid, GetTickCount() - ttime); CountSplits = 0; ReCreateBuffs(); @@ -1157,7 +1162,7 @@ void AIGrid::GraphPointGenerate() { if (ArrQuads.size() <= 1) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: AI grid not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "AI grid not found\n"); return; } @@ -1189,7 +1194,7 @@ void AIGrid::GraphPointGenerate() if (ArrGraphPointsIDs.size() > 0) { memset(&(ArrCostGPIDs[0]), -1, ArrCostGPIDs.size() * sizeof(int32_t)); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "sxaigrid: graph points is generated, count %d\n", ArrGraphPointsIDs.size()); + LibReport(REPORT_MSG_LEVEL_NOTICE, "graph points is generated, count %d\n", ArrGraphPointsIDs.size()); } } @@ -2104,7 +2109,7 @@ void AIGrid::GridTestValidation() { if (ArrQuads.size() <= 1 || ArrBound.size() <= 1) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: AI grid is not created, unresolved validation\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "AI grid is not created, unresolved validation\n"); return; } @@ -2173,7 +2178,7 @@ void AIGrid::GridTestValidation() } //} - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "sxaigrid: AI grid is validation, deleted quads %d, count splits %d\n", oldcountquads - ArrQuads.size(), CountSplits); + LibReport(REPORT_MSG_LEVEL_NOTICE, "AI grid is validation, deleted quads %d, count splits %d\n", oldcountquads - ArrQuads.size(), CountSplits); } UINT AIGrid::GridGetCountSplits() @@ -2224,7 +2229,7 @@ void AIGrid::RenderQuads(const ISXFrustum * frustum, const float3 * viewpos, flo bound = ArrBound[i]; center = (bound->min + bound->max) * 0.5f; radius = SMVector3Length(center - bound->max); - if (frustum->SphereInFrustum(¢er, radius)) + if (frustum->sphereInFrustum(¢er, radius)) { for (int k = 0, kl = bound->ArrIdsQuads.size(); k < kl; ++k) { @@ -2637,7 +2642,7 @@ ID AIGrid::GraphPointGetNear(ID beginq, ID endq) { if (ArrQuads.size() <= 1) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: AI grid not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "AI grid not found\n"); return -1; } @@ -2646,25 +2651,25 @@ ID AIGrid::GraphPointGetNear(ID beginq, ID endq) if (CountSplits == 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: can not find path, because AI grid is not validate splits\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "can not find path, because AI grid is not validate splits\n"); return -1; } if (ArrQuads[beginq]->IdSplit != ArrQuads[endq]->IdSplit) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: quads in different splits, path not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "quads in different splits, path not found\n"); return -1; } if (beginq == endq) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: beginq == endq, path not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "beginq == endq, path not found\n"); return -1; } if (ArrGraphPointsIDs.size() == 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: graph points not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "graph points not found\n"); return -1; } @@ -2717,7 +2722,7 @@ bool AIGrid::GridFindPath(ID beginq, ID endq) { if (ArrQuads.size() <= 1) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: AI grid not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "AI grid not found\n"); return false; } @@ -2726,19 +2731,19 @@ bool AIGrid::GridFindPath(ID beginq, ID endq) if (CountSplits == 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: can not find path, because AI grid is not validate splits\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "can not find path, because AI grid is not validate splits\n"); return false; } if (ArrQuads[beginq]->IdSplit != ArrQuads[endq]->IdSplit) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: quads in different splits, path not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "quads in different splits, path not found\n"); return false; } if (beginq == endq) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxaigrid: beginq == endq, path not found\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "beginq == endq, path not found\n"); return false; } diff --git a/source/aigrid/aigrid.h b/source/aigrid/aigrid.h index d9d92275e..9193ec82f 100644 --- a/source/aigrid/aigrid.h +++ b/source/aigrid/aigrid.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __AIGRID_H #define __AIGRID_H @@ -7,13 +12,12 @@ #include <common/memalloc.h> #define SM_D3D_CONVERSIONS -#include <common\SXMath.h> +#include <common/SXMath.h> #include "sxaigrid.h" -extern report_func g_fnReportf; extern g_aiquad_phy_navigate AIQuadPhyNavigate; -#define AIGRID_QUAD_PRECOND(id,retval) if (id < 0 || ArrQuads.size() <= id) {g_fnReportf(REPORT_MSG_LEVEL_ERROR, " %s - unresolved index '%d' of quad, sxaigrid", GEN_MSG_LOCATION, id); return retval;} +#define AIGRID_QUAD_PRECOND(id,retval) if (id < 0 || ArrQuads.size() <= id) {LibReport(REPORT_MSG_LEVEL_ERROR, " %s - unresolved index '%d' of quad, sxaigrid", GEN_MSG_LOCATION, id); return retval;} #define toint100(fnum) (int32_t)((fnum + 0.0001f) * 100) diff --git a/source/aigrid/sxaigrid.cpp b/source/aigrid/sxaigrid.cpp index 9d262c9e5..ae2e1834e 100644 --- a/source/aigrid/sxaigrid.cpp +++ b/source/aigrid/sxaigrid.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "sxaigrid.h" #include "aigrid.h" @@ -18,7 +23,7 @@ g_aiquad_phy_navigate AIQuadPhyNavigate = QuadPhyNavigate; AIGrid* ObjAIGrid = 0; -#define AIG_PRECOND(retval) if(!ObjAIGrid){g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxaigrid is not init", GEN_MSG_LOCATION); return retval;} +#define AIG_PRECOND(retval) if(!ObjAIGrid){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxaigrid is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -42,7 +47,7 @@ SX_LIB_API void SAIG_0Create(const char* name, bool use_graphics, bool is_unic) if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, sxaigrid", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); } else { @@ -59,7 +64,7 @@ SX_LIB_API void SAIG_0Create(const char* name, bool use_graphics, bool is_unic) } } else - g_fnReportf(-1, "%s - not init argument [name], sxaigrid", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SAIG_AKill() diff --git a/source/aigrid/sxaigrid.h b/source/aigrid/sxaigrid.h index 7a8bf662e..f1c2dec5e 100644 --- a/source/aigrid/sxaigrid.h +++ b/source/aigrid/sxaigrid.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/aigrid/sxaigrid_dll.cpp b/source/aigrid/sxaigrid_dll.cpp index 40901c2f9..a34ff74f6 100644 --- a/source/aigrid/sxaigrid_dll.cpp +++ b/source/aigrid/sxaigrid_dll.cpp @@ -1,10 +1,9 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ -#pragma once #include <windows.h> BOOL APIENTRY DllMain(HMODULE hModule, diff --git a/source/anim/ModelFile.h b/source/anim/ModelFile.h index 9d87deb40..20f6645a7 100644 --- a/source/anim/ModelFile.h +++ b/source/anim/ModelFile.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -14,8 +14,8 @@ See the license in LICENSE @{ */ -#ifndef _ModelFileAnim_H_ -#define _ModelFileAnim_H_ +#ifndef __MODELFILE_H +#define __MODELFILE_H #include <common/sxtypes.h> #include <common/SXMath.h> diff --git a/source/anim/animated.cpp b/source/anim/animated.cpp index c7de1b11a..47b08aa5b 100644 --- a/source/anim/animated.cpp +++ b/source/anim/animated.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "animated.h" #include <cstdlib> #include <cstdio> @@ -49,14 +54,14 @@ void ModelFile::Load(const char * name) FILE * fp = fopen(name, "rb"); if(!fp) { - reportf(REPORT_MSG_LEVEL_ERROR, "Unable to open \"%s\"\n", name); + LibReport(REPORT_MSG_LEVEL_ERROR, "Unable to open \"%s\"\n", name); } fread(&m_hdr, sizeof(ModelHeader), 1, fp); if(m_hdr.Magick != SX_MODEL_MAGICK) { - reportf(REPORT_MSG_LEVEL_ERROR, "Corrupt model \"%s\"\n", name); + LibReport(REPORT_MSG_LEVEL_ERROR, "Corrupt model \"%s\"\n", name); fclose(fp); return; } @@ -69,7 +74,7 @@ void ModelFile::Load(const char * name) fclose(fp); return; } - reportf(REPORT_MSG_LEVEL_ERROR, "Invalid version %d file \"%s\"\n", m_hdr.iVersion, name); + LibReport(REPORT_MSG_LEVEL_ERROR, "Invalid version %d file \"%s\"\n", m_hdr.iVersion, name); fclose(fp); return; } @@ -225,21 +230,21 @@ void ModelFile::Load6(const char * name) FILE * fp = fopen(name, "rb"); if(!fp) { - reportf(REPORT_MSG_LEVEL_ERROR, "Unable to open \"%s\"\n", name); + LibReport(REPORT_MSG_LEVEL_ERROR, "Unable to open \"%s\"\n", name); } fread(&m_hdr, sizeof(ModelHeader), 1, fp); if(m_hdr.Magick != SX_MODEL_MAGICK) { - reportf(REPORT_MSG_LEVEL_ERROR, "Corrupt model \"%s\"\n", name); + LibReport(REPORT_MSG_LEVEL_ERROR, "Corrupt model \"%s\"\n", name); fclose(fp); return; } if(m_hdr.iVersion != SX_MODEL_VERSION_OLD) { - reportf(REPORT_MSG_LEVEL_ERROR, "Invalid version %d file \"%s\"\n", m_hdr.iVersion, name); + LibReport(REPORT_MSG_LEVEL_ERROR, "Invalid version %d file \"%s\"\n", m_hdr.iVersion, name); fclose(fp); return; } @@ -821,7 +826,7 @@ void ModelFile::BuildMeshBuffers() if(j == 0) { - m_pBoundBox->CalcBound(m_ppVertexBuffer[0], iStartVertex, vsize); + m_pBoundBox->calcBound(m_ppVertexBuffer[0], iStartVertex, vsize); } } @@ -1647,12 +1652,12 @@ void Animation::play(const char * name, UINT iFadeTime, UINT slot, bool bReplace } if(slot >= BLEND_MAX) { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to play animation \"%s\" Invalid slot %d, max valid slot is %d\n", name, slot, BLEND_MAX - 1); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to play animation \"%s\" Invalid slot %d, max valid slot is %d\n", name, slot, BLEND_MAX - 1); return; } if(!m_mSeqIds.KeyExists(name)) { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to play animation \"%s\"\n", name); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to play animation \"%s\"\n", name); return; } UINT sid = m_mSeqIds[name]; @@ -1999,7 +2004,7 @@ void Animation::assembly() ++sCur; --i; //report error - reportf(REPORT_MSG_LEVEL_WARNING, "Skeleton hierarchy incompatible"); + LibReport(REPORT_MSG_LEVEL_WARNING, "Skeleton hierarchy incompatible"); break; } } @@ -2440,7 +2445,7 @@ void AnimationManager::setVertexDeclaration(MODEL_VERTEX_TYPE nDecl) { if(nDecl >= MVT_SIZE) { - reportf(REPORT_MSG_LEVEL_ERROR, "Unknown vertex declaration %d in AnimationManager::setVertexDeclaration()\n", nDecl); + LibReport(REPORT_MSG_LEVEL_ERROR, "Unknown vertex declaration %d in AnimationManager::setVertexDeclaration()\n", nDecl); return; } m_pd3dDevice->SetVertexDeclaration(pVertexDeclaration[nDecl]); @@ -2473,7 +2478,7 @@ void AnimationManager::update(int thread) { if(thread >= m_iThreadNum) { - reportf(REPORT_MSG_LEVEL_WARNING, "Requested thread %d but only %d threads allowed\n", thread, m_iThreadNum); + LibReport(REPORT_MSG_LEVEL_WARNING, "Requested thread %d but only %d threads allowed\n", thread, m_iThreadNum); return; } for(uint32_t i = thread, l = m_pAnimatedList.size(); i < l; i += m_iThreadNum) @@ -2508,7 +2513,7 @@ void AnimationManager::computeVis(const ISXFrustum * frustum, const float3 * vie for(uint32_t i = 0, l = m_pAnimatedList.size(); i < l; ++i) { pAnim = m_pAnimatedList[i]; - pAnim->getBound()->GetSphere(&jcenter, &jradius.x); + pAnim->getBound()->getSphere(&jcenter, &jradius.x); m = pAnim->getWorldTM(); m._11 = SMVector3Length(float3(m._11, m._21, m._31)); @@ -2519,7 +2524,7 @@ void AnimationManager::computeVis(const ISXFrustum * frustum, const float3 * vie m._41 = m._42 = m._43 = 0.0f; jradius = SMVector3Transform(jradius, m); - pAnim->m_vIsVisibleFor[id_arr] = frustum->SphereInFrustum(&jcenter, jradius.x); + pAnim->m_vIsVisibleFor[id_arr] = frustum->sphereInFrustum(&jcenter, jradius.x); } } diff --git a/source/anim/animated.h b/source/anim/animated.h index 16c0f3b78..22a50c8cf 100644 --- a/source/anim/animated.h +++ b/source/anim/animated.h @@ -1,5 +1,11 @@ -#ifndef _ANIMATED_H_ -#define _ANIMATED_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __ANIMATED_H +#define __ANIMATED_H #include "ModelFile.h" @@ -20,8 +26,6 @@ #include "sxanim.h" -extern report_func reportf; - class Animation; class AnimationManager; class ISXBound; diff --git a/source/anim/sxanim.h b/source/anim/sxanim.h index 69a0422ab..ee094dae3 100644 --- a/source/anim/sxanim.h +++ b/source/anim/sxanim.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/anim/sxanim_dll.cpp b/source/anim/sxanim_dll.cpp index b519ba7ce..442acbabb 100644 --- a/source/anim/sxanim_dll.cpp +++ b/source/anim/sxanim_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define WIN32_LEAN_AND_MEAN #include <windows.h> @@ -13,10 +13,10 @@ See the license in LICENSE #if !defined(DEF_STD_REPORT) #define DEF_STD_REPORT -report_func reportf = DefReport; +report_func g_fnReportf = DefReport; #endif -#define SA_PRECOND(ret) if(!g_mgr){reportf(REPORT_MSG_LEVEL_ERROR, "%s - sxanim is not init", GEN_MSG_LOCATION);return ret;} +#define SA_PRECOND(ret) if(!g_mgr){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxanim is not init", GEN_MSG_LOCATION);return ret;} BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, @@ -40,7 +40,7 @@ SX_LIB_API void SXAnim_0Create() { if(g_mgr) { - reportf(-1, "%s - sxanim double init", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxanim double init", GEN_MSG_LOCATION); return; } g_mgr = new AnimationManager(SGCore_GetDXDevice()); @@ -102,5 +102,5 @@ SX_LIB_API void SXAnim_ModelsDelArrForCom(ID id_arr) SX_LIB_API void SXAnim_Dbg_Set(report_func rf) { - reportf = rf; + g_fnReportf = rf; } diff --git a/source/core/Config.cpp b/source/core/Config.cpp index 876016798..be2502a13 100644 --- a/source/core/Config.cpp +++ b/source/core/Config.cpp @@ -1,6 +1,11 @@ -#include <common\\AssotiativeArray.h> -#include <common\\String.cpp> +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include <common/AssotiativeArray.h> +#include <common/String.cpp> #include "Config.h" /* diff --git a/source/core/Config.h b/source/core/Config.h index ad830a91d..c9af4da1c 100644 --- a/source/core/Config.h +++ b/source/core/Config.h @@ -1,6 +1,12 @@ -#ifndef LOADER_CONFIG_H -#define LOADER_CONFIG_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __LOADER_CONFIG_H +#define __LOADER_CONFIG_H #include "sxcore.h" #include <gdefines.h> diff --git a/source/core/File.h b/source/core/File.h index 5fcc73d98..40adcd7b9 100644 --- a/source/core/File.h +++ b/source/core/File.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __FILE_H #define __FILE_H diff --git a/source/core/Task.cpp b/source/core/Task.cpp index f61b8437d..3ae652736 100644 --- a/source/core/Task.cpp +++ b/source/core/Task.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "task.h" CTask::CTask(THREAD_UPDATE_FUNCTION func,unsigned int flags) :m_iTaskFlags(flags) diff --git a/source/core/Task.h b/source/core/Task.h index 180ce2ab8..d9d8c2dc4 100644 --- a/source/core/Task.h +++ b/source/core/Task.h @@ -1,5 +1,11 @@ -#ifndef _CTask_H_ -#define _CTask_H_ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TASK_H +#define __TASK_H #include "sxcore.h" #include <memory> diff --git a/source/core/TaskManager.cpp b/source/core/TaskManager.cpp index 24bfcbefc..a47b67198 100644 --- a/source/core/TaskManager.cpp +++ b/source/core/TaskManager.cpp @@ -1,4 +1,10 @@ -#include <core\taskManager.h> + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include <core/taskManager.h> #if defined(_WINDOWS) void SetThreadName(DWORD dwThreadID, const char* threadName) diff --git a/source/core/TaskManager.h b/source/core/TaskManager.h index e573e618f..7b27a37b8 100644 --- a/source/core/TaskManager.h +++ b/source/core/TaskManager.h @@ -1,5 +1,11 @@ -#ifndef _SXTaskManager_H_ -#define _SXTaskManager_H_ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TASK_MANAGER_H +#define __TASK_MANAGER_H #include <memory> #include <thread> diff --git a/source/core/concmd.cpp b/source/core/concmd.cpp index 061566999..0505613bf 100644 --- a/source/core/concmd.cpp +++ b/source/core/concmd.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "concmd.h" //#define WIN32_LEAN_AND_MEAN diff --git a/source/core/concmd.h b/source/core/concmd.h index 845eaa90d..5d972ff64 100644 --- a/source/core/concmd.h +++ b/source/core/concmd.h @@ -1,6 +1,11 @@ -#ifndef SXCONCMD_H -#define SXCONCMD_H +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __CONCMD_H +#define __CONCMD_H #include "sxcore.h" #include <common/AssotiativeArray.h> diff --git a/source/core/cvars.cpp b/source/core/cvars.cpp index 0a46bac5e..90f5185c1 100644 --- a/source/core/cvars.cpp +++ b/source/core/cvars.cpp @@ -1,16 +1,19 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "cvars.h" AssotiativeArray<String, CVar> g_mCVars; AssotiativeArray<String, CVarPtr> g_mCVarPtrs; -extern report_func g_fnReportf; - SX_LIB_API void Core_0RegisterCVarString(const char * name, const char * value, const char * desc, int flags) { if(g_mCVars.KeyExists(name)) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); + LibReport(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); return; } @@ -39,7 +42,7 @@ SX_LIB_API void Core_0RegisterCVarInt(const char * name, int value, const char * { if(g_mCVars.KeyExists(name)) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); + LibReport(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); return; } @@ -65,7 +68,7 @@ SX_LIB_API void Core_0RegisterCVarFloat(const char * name, float value, const ch { if(g_mCVars.KeyExists(name)) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); + LibReport(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); return; } @@ -90,7 +93,7 @@ SX_LIB_API void Core_0RegisterCVarBool(const char * name, bool value, const char { if(g_mCVars.KeyExists(name)) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); + LibReport(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); return; } @@ -116,7 +119,7 @@ SX_LIB_API void Core_0RegisterCVarPointer(const char * name, UINT_PTR value) { if(g_mCVarPtrs.KeyExists(name)) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); + LibReport(REPORT_MSG_LEVEL_WARNING, "CVar '%s' already registered. Skipping.\n", name); return; } diff --git a/source/core/cvars.h b/source/core/cvars.h index 6e61d7576..4249d5d9c 100644 --- a/source/core/cvars.h +++ b/source/core/cvars.h @@ -1,6 +1,11 @@ -#ifndef SXCVARS_H -#define SXCVARS_H +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __CVARS_H +#define __CVARS_H #include "sxcore.h" #include <common/AssotiativeArray.h> diff --git a/source/core/file.cpp b/source/core/file.cpp index 0d18ac4b4..6f17f64e6 100644 --- a/source/core/file.cpp +++ b/source/core/file.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "File.h" CFile::CFile() diff --git a/source/core/sxcore.cpp b/source/core/sxcore.cpp index 06b81a614..81c9cdb7c 100644 --- a/source/core/sxcore.cpp +++ b/source/core/sxcore.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define CORE_VERSION 1 @@ -33,7 +33,7 @@ report_func g_fnReportf = DefReport; CTaskManager* g_pTaskManager = 0; -#define SXCORE_PRECOND(retval) if(!g_pTaskManager){g_fnReportf(REPORT_MSG_LEVEL_ERROR, "[SCORE]: %s - sxcore is not init", GEN_MSG_LOCATION); return retval;} +#define SXCORE_PRECOND(retval) if(!g_pTaskManager){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxcore is not init", GEN_MSG_LOCATION); return retval;} //************************************************************************** @@ -47,12 +47,12 @@ String g_aGRegistersString[CORE_REGISTRY_SIZE]; #define CORE_REGUSTRY_PRE_COND_ID(id,stdval) \ if (!(id >= 0 && id < CORE_REGISTRY_SIZE))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - unresolved index '%d' of access for registry", SX_LIB_NAME, GEN_MSG_LOCATION, id); return stdval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s: %s - unresolved index '%d' of access for registry", SX_LIB_NAME, GEN_MSG_LOCATION, id); return stdval; } //************************************************************************** CTimeManager* g_pTimers = 0; -#define CORE_TIME_PRECOND(retval) if(!g_pTimers){g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - sxcore is not init", SX_LIB_NAME, GEN_MSG_LOCATION); return retval;} +#define CORE_TIME_PRECOND(retval) if(!g_pTimers){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxcore is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -154,7 +154,7 @@ void Core_0Create(const char* name, bool is_unic) if(GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "[SCORE]: %s - none unic name, score", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); return; } } @@ -164,10 +164,10 @@ void Core_0Create(const char* name, bool is_unic) g_pTaskManager = new CTaskManager(); g_pTimers = new CTimeManager(); - //g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "[SCORE]: is init\n"); + //LibReport(REPORT_MSG_LEVEL_NOTICE, "is init\n"); } else - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "[SCORE]: %s - not init argument [name], score", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } void Core_AKill() @@ -186,7 +186,7 @@ void Core_AGetName(char* name) if(name) strcpy(name, g_szCoreName); else - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "[SCORE]: %s - invalid argument", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - invalid argument", GEN_MSG_LOCATION); } //########################################################################## diff --git a/source/core/sxcore.h b/source/core/sxcore.h index 058632084..07400a220 100644 --- a/source/core/sxcore.h +++ b/source/core/sxcore.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -19,9 +19,6 @@ See the license in LICENSE #include <fstream> #include <gdefines.h> -//! имя библиотеки -#define SX_LIB_NAME COLOR_BG_WHITE COLOR_GREEN "CORE" COLOR_RESET - #undef SX_LIB_API #define SX_LIB_API extern "C" __declspec (dllexport) @@ -30,7 +27,7 @@ See the license in LICENSE #include <tlhelp32.h> #define SM_D3D_CONVERSIONS -#include <common\sxmath.h> +#include <common/sxmath.h> //! тип функции для обработки в менеджере задач typedef void(*THREAD_UPDATE_FUNCTION)(); diff --git a/source/core/sxcore_dll.cpp b/source/core/sxcore_dll.cpp index 3083cfd69..5a6ed8653 100644 --- a/source/core/sxcore_dll.cpp +++ b/source/core/sxcore_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define WIN32_LEAN_AND_MEAN #include <windows.h> diff --git a/source/core/time.cpp b/source/core/time.cpp index e9662a7a7..46ab60e2a 100644 --- a/source/core/time.cpp +++ b/source/core/time.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Time.h" CTimeManager::CTimeManager() diff --git a/source/core/time.h b/source/core/time.h index 613bb4ee1..f91bc1fd2 100644 --- a/source/core/time.h +++ b/source/core/time.h @@ -1,9 +1,13 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __TIME_H #define __TIME_H #include <gdefines.h> -extern report_func g_fnReportf; #include <common/Array.h> @@ -14,7 +18,7 @@ typedef std::chrono::system_clock::time_point time_point; #define TIMEMANAGER_PRECOND_ID(id,stdval) \ if (!(id >= 0 && id < m_aTimes.size()))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - time manager: unresolved index of access '%d'", SX_LIB_NAME, GEN_MSG_LOCATION, id); return stdval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - time manager: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; } class CTimeManager { diff --git a/source/decals/DecalManager.cpp b/source/decals/DecalManager.cpp index 6d9c91b04..d5e3833bc 100644 --- a/source/decals/DecalManager.cpp +++ b/source/decals/DecalManager.cpp @@ -1,11 +1,15 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include <core/sxcore.h> #include <gcore/sxgcore.h> #include <physics/sxphysics.h> #include "DecalManager.h" -extern report_func reportf; - // Array<float3_t> g_dbgDraw; // float4 spherePos; @@ -35,12 +39,12 @@ DecalManager::DecalManager(): { if(id < 0 || id >= DECAL_TYPE_LAST) { - reportf(REPORT_MSG_LEVEL_WARNING, "Incorrect decal type id '%s'\n", sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Incorrect decal type id '%s'\n", sect); } } else { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to read decal id '%s'\n", sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to read decal id '%s'\n", sect); continue; } const char * tex; @@ -50,14 +54,14 @@ DecalManager::DecalManager(): } else { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to read decal tex '%s'\n", sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to read decal tex '%s'\n", sect); continue; } if(config->keyExists(sect, "base_scale")) { if(!sscanf(config->getKey(sect, "base_scale"), "%f", &m_DecalTypes[id].m_fBaseScale)) { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to read decal base_scale '%s'\n", sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to read decal base_scale '%s'\n", sect); m_DecalTypes[id].m_fBaseScale = 1.0f; } } diff --git a/source/decals/DecalManager.h b/source/decals/DecalManager.h index 3944f24be..f150cc1da 100644 --- a/source/decals/DecalManager.h +++ b/source/decals/DecalManager.h @@ -1,5 +1,11 @@ -#ifndef _DecalManager_H_ -#define _DecalManager_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __DECAL_MANAGER_H +#define __DECAL_MANAGER_H #include <gdefines.h> #include <common/SXMath.h> diff --git a/source/decals/sxdecals.h b/source/decals/sxdecals.h index bd7529eba..a2690ff35 100644 --- a/source/decals/sxdecals.h +++ b/source/decals/sxdecals.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -28,7 +28,7 @@ See the license in LICENSE #undef SX_LIB_API #define SX_LIB_API extern "C" __declspec (dllimport) -#include <mtllight\\sxmtllight.h> +#include <mtllight/sxmtllight.h> #ifdef SX_DLL #undef SX_LIB_API diff --git a/source/decals/sxdecals_dll.cpp b/source/decals/sxdecals_dll.cpp index 2b077d2f2..e5df4a408 100644 --- a/source/decals/sxdecals_dll.cpp +++ b/source/decals/sxdecals_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define WIN32_LEAN_AND_MEAN #include <windows.h> @@ -24,12 +24,12 @@ See the license in LICENSE #if !defined(DEF_STD_REPORT) #define DEF_STD_REPORT -report_func reportf = DefReport; +report_func g_fnReportf = DefReport; #endif DecalManager * g_pMgr = NULL; -#define SP_PRECOND(ret) if(!g_pMgr){reportf(-1, "%s - sxdecals is not init", GEN_MSG_LOCATION);return ret;} +#define SP_PRECOND(ret) if(!g_pMgr){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxdecals is not init", GEN_MSG_LOCATION);return ret;} BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, @@ -51,7 +51,7 @@ SX_LIB_API void SXDecals_0Create() { if(g_pMgr) { - reportf(-1, "%s - sxdecals double init", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxdecals double init", GEN_MSG_LOCATION); return; } Core_SetOutPtr(); @@ -78,7 +78,7 @@ SX_LIB_API void SXDecals_Sync() SX_LIB_API void SXDecals_Dbg_Set(report_func rf) { - reportf = rf; + g_fnReportf = rf; } SX_LIB_API void SXDecals_Render() @@ -92,7 +92,7 @@ SX_LIB_API void SXDecals_ShootDecal(DECAL_TYPE type, const float3 & fWorldPos, c SP_PRECOND(_VOID); if(type == DECAL_TYPE_CUSTOM) { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to use DECAL_TYPE_CUSTOM with SXDecals_ShootDecal\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to use DECAL_TYPE_CUSTOM with SXDecals_ShootDecal\n"); return; } g_pMgr->shootDecal(type, fWorldPos, 0, 0, 0, 1.0f, 0, &normal); diff --git a/source/editors_utils/axes_helper.cpp b/source/editors_utils/axes_helper.cpp index 6618e6035..30b3f1069 100644 --- a/source/editors_utils/axes_helper.cpp +++ b/source/editors_utils/axes_helper.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "axes_helper.h" AxesHelper::AxesHelper() diff --git a/source/editors_utils/axes_helper.h b/source/editors_utils/axes_helper.h index 7521b323b..561d46735 100644 --- a/source/editors_utils/axes_helper.h +++ b/source/editors_utils/axes_helper.h @@ -1,6 +1,11 @@ -#ifndef axes_helper_h -#define axes_helper_h +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __AXES_HELPER_H +#define __AXES_HELPER_H #include <windows.h> #include <common/sxtypes.h> diff --git a/source/game/BaseAmmo.cpp b/source/game/BaseAmmo.cpp index 49de3f3b7..aaa93334c 100644 --- a/source/game/BaseAmmo.cpp +++ b/source/game/BaseAmmo.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseAmmo.h" /*! \skydocent base_ammo diff --git a/source/game/BaseAmmo.h b/source/game/BaseAmmo.h index 1ffa8be98..cb706c3bb 100644 --- a/source/game/BaseAmmo.h +++ b/source/game/BaseAmmo.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Патроны */ -#ifndef _CBaseAmmo_H_ -#define _CBaseAmmo_H_ +#ifndef __BASE_AMMO_H +#define __BASE_AMMO_H #include "BaseSupply.h" diff --git a/source/game/BaseAmmoBox.cpp b/source/game/BaseAmmoBox.cpp index 5be0609c3..fd883bf2d 100644 --- a/source/game/BaseAmmoBox.cpp +++ b/source/game/BaseAmmoBox.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseAmmoBox.h" /*! \skydocent base_ammobox diff --git a/source/game/BaseAmmoBox.h b/source/game/BaseAmmoBox.h index db3f28fd6..c0420d883 100644 --- a/source/game/BaseAmmoBox.h +++ b/source/game/BaseAmmoBox.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Аммобокс */ -#ifndef _CBaseAmmoBox_H_ -#define _CBaseAmmoBox_H_ +#ifndef __BASE_AMMO_BOX_H +#define __BASE_AMMO_BOX_H #include "BaseItem.h" diff --git a/source/game/BaseAnimating.cpp b/source/game/BaseAnimating.cpp index 84c15d366..2b4c0ec1e 100644 --- a/source/game/BaseAnimating.cpp +++ b/source/game/BaseAnimating.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseAnimating.h" #include "gcore/sxgcore.h" @@ -37,7 +43,7 @@ void CBaseAnimating::getMinMax(float3 * min, float3 * max) if (m_pAnimPlayer) { const ISXBound * bound = m_pAnimPlayer->getBound(); - bound->GetMinMax(min, max); + bound->getMinMax(min, max); } } @@ -46,7 +52,7 @@ void CBaseAnimating::getSphere(float3 * center, float * radius) if(m_pAnimPlayer) { const ISXBound * bound = m_pAnimPlayer->getBound(); - bound->GetSphere(center, radius); + bound->getSphere(center, radius); } } diff --git a/source/game/BaseAnimating.h b/source/game/BaseAnimating.h index 58f339125..289d4e76e 100644 --- a/source/game/BaseAnimating.h +++ b/source/game/BaseAnimating.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -14,8 +14,8 @@ See the license in LICENSE @{ */ -#ifndef _CBaseAnimating_H_ -#define _CBaseAnimating_H_ +#ifndef __BASE_ANIMATING_H +#define __BASE_ANIMATING_H #include "BaseEntity.h" #include <anim/sxanim.h> diff --git a/source/game/BaseCharacter.cpp b/source/game/BaseCharacter.cpp index 0ee51d3d0..3508cbb84 100644 --- a/source/game/BaseCharacter.cpp +++ b/source/game/BaseCharacter.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseCharacter.h" #include "GameData.h" #include "BaseTool.h" diff --git a/source/game/BaseCharacter.h b/source/game/BaseCharacter.h index 51609b515..75009b222 100644 --- a/source/game/BaseCharacter.h +++ b/source/game/BaseCharacter.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -13,8 +13,8 @@ See the license in LICENSE @{ */ -#ifndef _CBaseCharacter_H_ -#define _CBaseCharacter_H_ +#ifndef __BASE_CHARACTER_H +#define __BASE_CHARACTER_H #include "BaseAnimating.h" #include "LightDirectional.h" diff --git a/source/game/BaseEntity.cpp b/source/game/BaseEntity.cpp index a8f3613c1..40ddce8f2 100644 --- a/source/game/BaseEntity.cpp +++ b/source/game/BaseEntity.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include <stdio.h> #include "BaseEntity.h" diff --git a/source/game/BaseEntity.h b/source/game/BaseEntity.h index d926c8b9e..30a24e916 100644 --- a/source/game/BaseEntity.h +++ b/source/game/BaseEntity.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -15,8 +15,8 @@ See the license in LICENSE @{ */ -#ifndef _CBaseEntity_H_ -#define _CBaseEntity_H_ +#ifndef __BASE_ENTITY_H +#define __BASE_ENTITY_H #include <gdefines.h> #include <common/SXMath.h> diff --git a/source/game/BaseHandle.cpp b/source/game/BaseHandle.cpp index efb909328..ab4abe1a7 100644 --- a/source/game/BaseHandle.cpp +++ b/source/game/BaseHandle.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseHandle.h" /*! \skydocent base_handle diff --git a/source/game/BaseHandle.h b/source/game/BaseHandle.h index c9a074a56..398a5ebb3 100644 --- a/source/game/BaseHandle.h +++ b/source/game/BaseHandle.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Ручки */ -#ifndef _BaseHandle_H_ -#define _BaseHandle_H_ +#ifndef __BASE_HANDLE_H +#define __BASE_HANDLE_H #include "BaseWeaponAddon.h" diff --git a/source/game/BaseItem.cpp b/source/game/BaseItem.cpp index 513e651f9..572fc8414 100644 --- a/source/game/BaseItem.cpp +++ b/source/game/BaseItem.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseItem.h" /*! \skydocent base_item diff --git a/source/game/BaseItem.h b/source/game/BaseItem.h index dbe03a4d1..41578c679 100644 --- a/source/game/BaseItem.h +++ b/source/game/BaseItem.h @@ -1,7 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -13,8 +14,8 @@ See the license in LICENSE @{ */ -#ifndef _CBaseItem_H_ -#define _CBaseItem_H_ +#ifndef __BASE_ITEM_H +#define __BASE_ITEM_H #include "BaseAnimating.h" diff --git a/source/game/BaseMag.cpp b/source/game/BaseMag.cpp index b39261340..89a969c8f 100644 --- a/source/game/BaseMag.cpp +++ b/source/game/BaseMag.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseMag.h" /*! \skydocent base_mag diff --git a/source/game/BaseMag.h b/source/game/BaseMag.h index b252f743d..aae2f46e1 100644 --- a/source/game/BaseMag.h +++ b/source/game/BaseMag.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Магазины */ -#ifndef _BaseMag_H_ -#define _BaseMag_H_ +#ifndef __BASE_MAG_H +#define __BASE_MAG_H #include "BaseWeaponAddon.h" diff --git a/source/game/BasePistol.h b/source/game/BasePistol.h index 4cb5683d6..e8f0c76ca 100644 --- a/source/game/BasePistol.h +++ b/source/game/BasePistol.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Пистолеты */ -#ifndef _CBasePistol_H_ -#define _CBasePistol_H_ +#ifndef __BASE_PISTOL_H +#define __BASE_PISTOL_H /*! Пистолеты \ingroup cbaseitem diff --git a/source/game/BaseRiffle.cpp b/source/game/BaseRiffle.cpp index 7a60a011d..5ed27da46 100644 --- a/source/game/BaseRiffle.cpp +++ b/source/game/BaseRiffle.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseRiffle.h" /*! \skydocent base_riffle diff --git a/source/game/BaseRiffle.h b/source/game/BaseRiffle.h index 8be69ac53..dc9d1bbcb 100644 --- a/source/game/BaseRiffle.h +++ b/source/game/BaseRiffle.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Винтовки */ -#ifndef _CBaseRiffle_H_ -#define _CBaseRiffle_H_ +#ifndef __BASE_RIFFLE_H +#define __BASE_RIFFLE_H #include "BaseWeapon.h" diff --git a/source/game/BaseScope.cpp b/source/game/BaseScope.cpp index 26e8b012e..05539b6b2 100644 --- a/source/game/BaseScope.cpp +++ b/source/game/BaseScope.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseScope.h" /*! \skydocent base_scope diff --git a/source/game/BaseScope.h b/source/game/BaseScope.h index f581e5da9..5981a58cb 100644 --- a/source/game/BaseScope.h +++ b/source/game/BaseScope.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Прицелы */ -#ifndef _BaseScope_H_ -#define _BaseScope_H_ +#ifndef __BASE_SCOPE_H +#define __BASE_SCOPE_H #include "BaseWeaponAddon.h" diff --git a/source/game/BaseSilencer.cpp b/source/game/BaseSilencer.cpp index e73175def..946fb6590 100644 --- a/source/game/BaseSilencer.cpp +++ b/source/game/BaseSilencer.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseSilencer.h" /*! \skydocent base_silencer diff --git a/source/game/BaseSilencer.h b/source/game/BaseSilencer.h index 3eeb73e44..a57cb8ac2 100644 --- a/source/game/BaseSilencer.h +++ b/source/game/BaseSilencer.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Глушители */ -#ifndef _BaseSilencer_H_ -#define _BaseSilencer_H_ +#ifndef __BASE_SILENCER_H +#define __BASE_SILENCER_H #include "BaseWeaponAddon.h" diff --git a/source/game/BaseSupply.cpp b/source/game/BaseSupply.cpp index e205da0e0..9583ea598 100644 --- a/source/game/BaseSupply.cpp +++ b/source/game/BaseSupply.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseSupply.h" /*! \skydocent base_supply diff --git a/source/game/BaseSupply.h b/source/game/BaseSupply.h index 7b25b940b..e95af1a0a 100644 --- a/source/game/BaseSupply.h +++ b/source/game/BaseSupply.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Базовый класс припаса */ -#ifndef _CBaseSupply_H_ -#define _CBaseSupply_H_ +#ifndef __BASE_SUPPLY_H +#define __BASE_SUPPLY_H #include "BaseItem.h" diff --git a/source/game/BaseTool.cpp b/source/game/BaseTool.cpp index f319ab176..13eab5f92 100644 --- a/source/game/BaseTool.cpp +++ b/source/game/BaseTool.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseTool.h" #include <particles/sxparticles.h> @@ -265,7 +271,7 @@ void CBaseTool::_rezoom() m_qSlotRotResult = SMquaternionSlerp(m_qSlotRot, m_qSlotRotAim, m_fZoomProgress); if(m_pOwner) { - ((CPlayer*)m_pOwner)->getCamera()->getCamera()->SetFOV(SMToRadian(vlerp(*r_default_fov, *r_default_fov - 10.0f, m_fZoomProgress))); + ((CPlayer*)m_pOwner)->getCamera()->getCamera()->setFOV(SMToRadian(vlerp(*r_default_fov, *r_default_fov - 10.0f, m_fZoomProgress))); } } diff --git a/source/game/BaseTool.h b/source/game/BaseTool.h index b443fe1a8..18b2e0cf6 100644 --- a/source/game/BaseTool.h +++ b/source/game/BaseTool.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Базовый класс инструмента */ -#ifndef _CBaseTool_H_ -#define _CBaseTool_H_ +#ifndef __BASE_TOOL_H +#define __BASE_TOOL_H #include "BaseItem.h" #include <score/sxscore.h> diff --git a/source/game/BaseTrigger.cpp b/source/game/BaseTrigger.cpp index 7b7d8a894..b73b78ddb 100644 --- a/source/game/BaseTrigger.cpp +++ b/source/game/BaseTrigger.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include <gcore/sxgcore.h> #include "BaseTrigger.h" diff --git a/source/game/BaseTrigger.h b/source/game/BaseTrigger.h index be7e9c5d5..722df46cf 100644 --- a/source/game/BaseTrigger.h +++ b/source/game/BaseTrigger.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -14,8 +14,8 @@ See the license in LICENSE @{ */ -#ifndef _BaseTrigger_H_ -#define _BaseTrigger_H_ +#ifndef __BASE_TRIGGER_H +#define __BASE_TRIGGER_H #include "BaseAnimating.h" diff --git a/source/game/BaseWeapon.cpp b/source/game/BaseWeapon.cpp index c69fa94b8..9dc7dd01e 100644 --- a/source/game/BaseWeapon.cpp +++ b/source/game/BaseWeapon.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include <particles/sxparticles.h> #include "BaseWeapon.h" #include "Player.h" diff --git a/source/game/BaseWeapon.h b/source/game/BaseWeapon.h index 91ae59b8b..0092c51a2 100644 --- a/source/game/BaseWeapon.h +++ b/source/game/BaseWeapon.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Базовый класс оружия */ -#ifndef _CBaseWeapon_H_ -#define _CBaseWeapon_H_ +#ifndef __BASE_WEAPON_H +#define __BASE_WEAPON_H #include "BaseTool.h" diff --git a/source/game/BaseWeaponAddon.cpp b/source/game/BaseWeaponAddon.cpp index 26fe086f9..03e94db9f 100644 --- a/source/game/BaseWeaponAddon.cpp +++ b/source/game/BaseWeaponAddon.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "BaseWeaponAddon.h" /*! \skydocent base_wpn_addon diff --git a/source/game/BaseWeaponAddon.h b/source/game/BaseWeaponAddon.h index 6521d8abc..5d3922b21 100644 --- a/source/game/BaseWeaponAddon.h +++ b/source/game/BaseWeaponAddon.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Навесы */ -#ifndef _BaseWeaponAddon_H_ -#define _BaseWeaponAddon_H_ +#ifndef __BASE_WEAPON_ADDON_H +#define __BASE_WEAPON_ADDON_H #include "BaseItem.h" diff --git a/source/game/CrosshairManager.cpp b/source/game/CrosshairManager.cpp index 3275b81a1..8f7c5d774 100644 --- a/source/game/CrosshairManager.cpp +++ b/source/game/CrosshairManager.cpp @@ -1,11 +1,14 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "CrosshairManager.h" AssotiativeArray<AAString, ID> CCrosshairManager::m_mIndex; Array<CCrosshairManager::CrosshairDesc> CCrosshairManager::m_vCrosshairList; -extern report_func reportf; - void CCrosshairManager::loadCrosshair(ID id, CCrosshair * pCCrosshair) { if(id < 0 || id >= (ID)m_vCrosshairList.size()) @@ -79,7 +82,7 @@ void CCrosshairManager::loadConfig(const char * szFile) } else { - reportf(REPORT_MSG_LEVEL_WARNING, "Unknown CCrosshair style '%s' for '%s'\n", str, sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unknown CCrosshair style '%s' for '%s'\n", str, sect); continue; } @@ -87,11 +90,11 @@ void CCrosshairManager::loadConfig(const char * szFile) if(config->keyExists(sect, "tex")) { tex = config->getKey(sect, "tex"); - cd.idTexture = SGCore_LoadTexAddName(tex, ltt_const); + cd.idTexture = SGCore_LoadTexAddName(tex, LOAD_TEXTURE_TYPE_CONST); } else { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to read CCrosshair tex '%s'\n", sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to read CCrosshair tex '%s'\n", sect); continue; } int x, y; @@ -101,7 +104,7 @@ void CCrosshairManager::loadConfig(const char * szFile) } else { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to read CCrosshair tex_offset '%s'. Expected format: '[x,y]'\n", sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to read CCrosshair tex_offset '%s'. Expected format: '[x,y]'\n", sect); continue; } if(config->keyExists(sect, "tex_size") && sscanf(config->getKey(sect, "tex_size"), "[%d,%d]", &x, &y) == 2) @@ -110,7 +113,7 @@ void CCrosshairManager::loadConfig(const char * szFile) } else { - reportf(REPORT_MSG_LEVEL_WARNING, "Unable to read CCrosshair tex_size '%s'. Expected format: '[x,y]'\n", sect); + LibReport(REPORT_MSG_LEVEL_WARNING, "Unable to read CCrosshair tex_size '%s'. Expected format: '[x,y]'\n", sect); continue; } AAString aas; diff --git a/source/game/CrosshairManager.h b/source/game/CrosshairManager.h index 62a775e0c..dfa6f6a54 100644 --- a/source/game/CrosshairManager.h +++ b/source/game/CrosshairManager.h @@ -1,5 +1,11 @@ -#ifndef _CROSSHAIRMANAGER_H -#define _CROSSHAIRMANAGER_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __CROSSHAIRMANAGER_H +#define __CROSSHAIRMANAGER_H #include "sxgame.h" #include <common/AssotiativeArray.h> diff --git a/source/game/EntityFactory.cpp b/source/game/EntityFactory.cpp index c0be706e3..c0310ad3b 100644 --- a/source/game/EntityFactory.cpp +++ b/source/game/EntityFactory.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "EntityFactory.h" #include "BaseEntity.h" diff --git a/source/game/EntityFactory.h b/source/game/EntityFactory.h index 2ba5cd228..b0b4352cf 100644 --- a/source/game/EntityFactory.h +++ b/source/game/EntityFactory.h @@ -1,5 +1,11 @@ -#ifndef _CEntityFactory_H_ -#define _CEntityFactory_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __ENTITY_FACTORY_H +#define __ENTITY_FACTORY_H #include <gdefines.h> #include <common/AssotiativeArray.h> diff --git a/source/game/EntityManager.cpp b/source/game/EntityManager.cpp index dd55b14b9..a69774623 100644 --- a/source/game/EntityManager.cpp +++ b/source/game/EntityManager.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "EntityManager.h" #include "BaseEntity.h" diff --git a/source/game/EntityManager.h b/source/game/EntityManager.h index 34671f774..5cf8ef147 100644 --- a/source/game/EntityManager.h +++ b/source/game/EntityManager.h @@ -1,5 +1,11 @@ -#ifndef _ENTITY_MANAGER_H_ -#define _ENTITY_MANAGER_H_ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __ENTITY_MANAGER_H +#define __ENTITY_MANAGER_H /*! \file */ diff --git a/source/game/FuncTrain.cpp b/source/game/FuncTrain.cpp index 4b238b016..3672ead80 100644 --- a/source/game/FuncTrain.cpp +++ b/source/game/FuncTrain.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "FuncTrain.h" #include "PathCorner.h" diff --git a/source/game/FuncTrain.h b/source/game/FuncTrain.h index 57d1b32ce..da64b30dc 100644 --- a/source/game/FuncTrain.h +++ b/source/game/FuncTrain.h @@ -1,14 +1,15 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Поезда класс */ -#ifndef _CFuncTrain_H_ -#define _CFuncTrain_H_ +#ifndef __FUNC_TRAIN_H +#define __FUNC_TRAIN_H #include "PointEntity.h" diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp index 14237499e..7e8544891 100644 --- a/source/game/GameData.cpp +++ b/source/game/GameData.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "GameData.h" #include "CrosshairManager.h" diff --git a/source/game/GameData.h b/source/game/GameData.h index 4f557c624..49c6f46a4 100644 --- a/source/game/GameData.h +++ b/source/game/GameData.h @@ -1,5 +1,11 @@ -#ifndef _GameData_H_ -#define _GameData_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __GAME_DATA_H +#define __GAME_DATA_H #include "Player.h" diff --git a/source/game/LightDirectional.cpp b/source/game/LightDirectional.cpp index 3bc2bfe14..4905d416a 100644 --- a/source/game/LightDirectional.cpp +++ b/source/game/LightDirectional.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "LightDirectional.h" #include <mtllight/sxmtllight.h> diff --git a/source/game/LightDirectional.h b/source/game/LightDirectional.h index a40201e11..67be62334 100644 --- a/source/game/LightDirectional.h +++ b/source/game/LightDirectional.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/game/LightPoint.cpp b/source/game/LightPoint.cpp index 6bd55bbaa..28af8acca 100644 --- a/source/game/LightPoint.cpp +++ b/source/game/LightPoint.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "LightPoint.h" #include <mtllight/sxmtllight.h> diff --git a/source/game/LightPoint.h b/source/game/LightPoint.h index ed7ecd223..c740e151b 100644 --- a/source/game/LightPoint.h +++ b/source/game/LightPoint.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/game/NPCBase.cpp b/source/game/NPCBase.cpp index c2c35a64c..52090fdbe 100644 --- a/source/game/NPCBase.cpp +++ b/source/game/NPCBase.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "NPCBase.h" /*! \skydocent npc_base diff --git a/source/game/NPCBase.h b/source/game/NPCBase.h index 5697f8d50..965376810 100644 --- a/source/game/NPCBase.h +++ b/source/game/NPCBase.h @@ -1,7 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -12,8 +13,8 @@ See the license in LICENSE @{ */ -#ifndef __NPCBASE_H_ -#define __NPCBASE_H_ +#ifndef __NPCBASE_H +#define __NPCBASE_H #include "BaseAnimating.h" #include <aigrid/sxaigrid.h> diff --git a/source/game/NPCZombie.cpp b/source/game/NPCZombie.cpp index 8cbd269b7..d4ccd413c 100644 --- a/source/game/NPCZombie.cpp +++ b/source/game/NPCZombie.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "NPCZombie.h" #include "score/sxscore.h" diff --git a/source/game/NPCZombie.h b/source/game/NPCZombie.h index 6e2fda4a6..853f9d758 100644 --- a/source/game/NPCZombie.h +++ b/source/game/NPCZombie.h @@ -1,7 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -12,8 +13,8 @@ See the license in LICENSE @{ */ -#ifndef _NPCZombie_H_ -#define _NPCZombie_H_ +#ifndef __NPCZOMBIE_H +#define __NPCZOMBIE_H #include "NPCBase.h" diff --git a/source/game/PathCorner.cpp b/source/game/PathCorner.cpp index 04127ad6c..6330ef102 100644 --- a/source/game/PathCorner.cpp +++ b/source/game/PathCorner.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "PathCorner.h" /*! \skydocent path_corner diff --git a/source/game/PathCorner.h b/source/game/PathCorner.h index 4841a8624..12339fac9 100644 --- a/source/game/PathCorner.h +++ b/source/game/PathCorner.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -13,8 +13,8 @@ See the license in LICENSE @{ */ -#ifndef _CPathCorner_H_ -#define _CPathCorner_H_ +#ifndef __PATH_CORNER_H +#define __PATH_CORNER_H #include "PointEntity.h" diff --git a/source/game/Player.cpp b/source/game/Player.cpp index 295d999ff..f34cf7be3 100644 --- a/source/game/Player.cpp +++ b/source/game/Player.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include <input/sxinput.h> #include <mtllight/sxmtllight.h> #include "Player.h" diff --git a/source/game/Player.h b/source/game/Player.h index 4491cb904..cdb7b0789 100644 --- a/source/game/Player.h +++ b/source/game/Player.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -13,8 +13,8 @@ See the license in LICENSE @{ */ -#ifndef _CPlayer_H_ -#define _CPlayer_H_ +#ifndef __PLAYER_H +#define __PLAYER_H #include "BaseCharacter.h" #include "PointCamera.h" diff --git a/source/game/PlayerSpawn.cpp b/source/game/PlayerSpawn.cpp index 088b72a8a..fccc1d26d 100644 --- a/source/game/PlayerSpawn.cpp +++ b/source/game/PlayerSpawn.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "PlayerSpawn.h" /*! \skydocent info_player_spawn diff --git a/source/game/PlayerSpawn.h b/source/game/PlayerSpawn.h index 1f8c48438..987fe93d5 100644 --- a/source/game/PlayerSpawn.h +++ b/source/game/PlayerSpawn.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -13,8 +13,8 @@ See the license in LICENSE @{ */ -#ifndef _CPlayerSpawn_H_ -#define _CPlayerSpawn_H_ +#ifndef __PLAYER_SPAWN_H +#define __PLAYER_SPAWN_H #include "PointEntity.h" diff --git a/source/game/PointCamera.cpp b/source/game/PointCamera.cpp index 46a5c8418..8aa714eae 100644 --- a/source/game/PointCamera.cpp +++ b/source/game/PointCamera.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "PointCamera.h" /*! \skydocent point_camera @@ -15,7 +21,7 @@ CPointCamera::CPointCamera(CEntityManager * pMgr): { const float * r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); m_pSXC = SGCore_CrCamera(); - m_pSXC->SetFOV(SMToRadian(*r_default_fov)); + m_pSXC->setFOV(SMToRadian(*r_default_fov)); } CPointCamera::~CPointCamera() @@ -32,6 +38,6 @@ void CPointCamera::onSync() { BaseClass::onSync(); - m_pSXC->SetPosition(&(float3)m_vPosition); - m_pSXC->SetOrientation(m_vOrientation); + m_pSXC->setPosition(&(float3)m_vPosition); + m_pSXC->setOrientation(&m_vOrientation); } diff --git a/source/game/PointCamera.h b/source/game/PointCamera.h index c699dcf13..f8682e810 100644 --- a/source/game/PointCamera.h +++ b/source/game/PointCamera.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -13,8 +13,8 @@ See the license in LICENSE @{ */ -#ifndef _CPointCamera_H_ -#define _CPointCamera_H_ +#ifndef __POINT_CAMERA_H +#define __POINT_CAMERA_H #include <gcore/sxgcore.h> diff --git a/source/game/PointEntity.cpp b/source/game/PointEntity.cpp index 59b384966..91583ea83 100644 --- a/source/game/PointEntity.cpp +++ b/source/game/PointEntity.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "PointEntity.h" /*! \skydocent base_point diff --git a/source/game/PointEntity.h b/source/game/PointEntity.h index 685e375bd..34829fe79 100644 --- a/source/game/PointEntity.h +++ b/source/game/PointEntity.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -16,8 +16,8 @@ See the license in LICENSE //! \defgroup clight Свет -#ifndef _CPointEntity_H_ -#define _CPointEntity_H_ +#ifndef __POINT_ENTITY_H +#define __POINT_ENTITY_H #include "BaseEntity.h" diff --git a/source/game/Ragdoll.cpp b/source/game/Ragdoll.cpp index e192f0280..a93eff945 100644 --- a/source/game/Ragdoll.cpp +++ b/source/game/Ragdoll.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Ragdoll.h" CRagdoll::CRagdoll(IAnimPlayer *pAnimPlayer) diff --git a/source/game/Ragdoll.h b/source/game/Ragdoll.h index ccccae7e1..ee9893df6 100644 --- a/source/game/Ragdoll.h +++ b/source/game/Ragdoll.h @@ -1,5 +1,11 @@ -#ifndef _Ragdoll_H_ -#define _Ragdoll_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __RAGDOLL_H +#define __RAGDOLL_H #include "sxgame.h" #include <anim/sxanim.h> diff --git a/source/game/SXbaseSnipe.h b/source/game/SXbaseSnipe.h index e7c983d51..2a766ce68 100644 --- a/source/game/SXbaseSnipe.h +++ b/source/game/SXbaseSnipe.h @@ -1,15 +1,16 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file Снайперские */ -#ifndef _SXbaseSnipe_H_ -#define _SXbaseSnipe_H_ +#ifndef __BASE_SNIPE_H +#define __BASE_SNIPE_H #include "BaseWeapon.h" diff --git a/source/game/crosshair.cpp b/source/game/crosshair.cpp index 645773dfc..1d1308c98 100644 --- a/source/game/crosshair.cpp +++ b/source/game/crosshair.cpp @@ -1,4 +1,8 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ #include "crosshair.h" #include <common/SXMath.h> diff --git a/source/game/crosshair.h b/source/game/crosshair.h index baf95f337..60a7ba3dd 100644 --- a/source/game/crosshair.h +++ b/source/game/crosshair.h @@ -1,5 +1,11 @@ -#ifndef _crosshair_H_ -#define _crosshair_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __CROSSHAIR_H +#define __CROSSHAIR_H //#include <gdefines.h> #include "sxgame.h" diff --git a/source/game/proptable.cpp b/source/game/proptable.cpp index 72461ca83..f7dae97f8 100644 --- a/source/game/proptable.cpp +++ b/source/game/proptable.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include <cstdarg> #include <memory> diff --git a/source/game/proptable.h b/source/game/proptable.h index d1d409e58..d6f015920 100644 --- a/source/game/proptable.h +++ b/source/game/proptable.h @@ -1,5 +1,11 @@ -#ifndef _PROPTABLE_H_ -#define _PROPTABLE_H_ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __PROPTABLE_H +#define __PROPTABLE_H #include <common/SXmath.h> diff --git a/source/game/sxgame.h b/source/game/sxgame.h index 78270cb20..e8104bdb4 100644 --- a/source/game/sxgame.h +++ b/source/game/sxgame.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -149,8 +149,8 @@ See the license in LICENSE @{ */ -#ifndef _SXGAME_H_ -#define _SXGAME_H_ +#ifndef __SXGAME_H +#define __SXGAME_H #ifndef SXGAME_EXPORT #define SXGAME_EXPORT _declspec(dllimport) diff --git a/source/game/sxgame_dll.cpp b/source/game/sxgame_dll.cpp index e71fa4d6b..637fd1bc5 100644 --- a/source/game/sxgame_dll.cpp +++ b/source/game/sxgame_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define WIN32_LEAN_AND_MEAN #include <windows.h> @@ -27,7 +27,7 @@ See the license in LICENSE # pragma comment(lib, "sxanim_d.lib") # pragma comment(lib, "sxparticles_d.lib") # pragma comment(lib, "sxscore_d.lib") -# pragma comment(lib, "sxpp_d.lib") +//# pragma comment(lib, "sxpp_d.lib") # pragma comment(lib, "sxaigrid_d.lib") #else # pragma comment(lib, "sxcore.lib") @@ -38,20 +38,20 @@ See the license in LICENSE # pragma comment(lib, "sxanim.lib") # pragma comment(lib, "sxparticles.lib") # pragma comment(lib, "sxscore.lib") -# pragma comment(lib, "sxpp.lib") +//# pragma comment(lib, "sxpp.lib") # pragma comment(lib, "sxaigrid.lib") #endif #if !defined(DEF_STD_REPORT) #define DEF_STD_REPORT -report_func reportf = DefReport; +report_func g_fnReportf = DefReport; #endif GameData * g_pGameData = NULL; ID3DXMesh* g_pFigureBox = 0; -#define SG_PRECOND(ret) if(!g_pGameData){reportf(-1, "%s - sxgame is not init", GEN_MSG_LOCATION);return ret;} +#define SG_PRECOND(ret) if(!g_pGameData){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxgame is not init", GEN_MSG_LOCATION);return ret;} BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, @@ -106,7 +106,7 @@ SX_LIB_API void SXGame_0Create() { if(g_pGameData) { - reportf(-1, "%s - sxgame double init", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxgame double init", GEN_MSG_LOCATION); return; } Core_SetOutPtr(); @@ -160,7 +160,7 @@ SX_LIB_API void SXGame_RenderHUD() SX_LIB_API void SXGame_Dbg_Set(report_func rf) { - reportf = rf; + g_fnReportf = rf; } SX_LIB_API void SXGame_LoadEnts(const char * file) diff --git a/source/gcore/CreatorTextures.cpp b/source/gcore/CreatorTextures.cpp index 392236f6a..ca354ad88 100644 --- a/source/gcore/CreatorTextures.cpp +++ b/source/gcore/CreatorTextures.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "creatortextures.h" CreatorTextures::CreatorTextures() @@ -54,89 +59,89 @@ ID CreatorTextures::Add(UINT width, UINT height, UINT levels, DWORD usage, D3DFO } /*if(!isadd) - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "sgcore: render target[%s] is created, id = %d\n", name, id);*/ + LibReport(REPORT_MSG_LEVEL_NOTICE, "render target[%s] is created, id = %d\n", name, id);*/ if (isadd) - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "[SGCORE]: render target[%s] is not created\n", name); + LibReport(REPORT_MSG_LEVEL_NOTICE, "render target[%s] is not created\n", name); return id; } void CreatorTextures::Delete(const char* text) { - for(int i=0;i<Arr.size();i++) + for (int i = 0; i<Arr.size(); i++) + { + if (strcmp(text, Arr[i]->Name) == 0) { - if(strcmp(text,Arr[i]->Name) == 0) - { - Arr[i]->Texture->Release(); - Arr[i]->Texture = 0; - sprintf(Arr[i]->Name,"%s",""); - } + Arr[i]->Texture->Release(); + Arr[i]->Texture = 0; + sprintf(Arr[i]->Name, "%s", ""); } + } } void CreatorTextures::Delete(ID num) { - if(num < Arr.size()) - { - Arr[num]->Texture->Release(); - Arr[num]->Texture = 0; - sprintf(Arr[num]->Name,"%s",""); - } + if (num < Arr.size()) + { + Arr[num]->Texture->Release(); + Arr[num]->Texture = 0; + sprintf(Arr[num]->Name, "%s", ""); + } } ID CreatorTextures::GetNum(const char* text) { - for(DWORD i=0;i<Arr.size();i++) + for (DWORD i = 0; i<Arr.size(); i++) + { + if (strcmp(text, Arr[i]->Name) == 0) { - if(strcmp(text,Arr[i]->Name) == 0) - { - return i; - } + return i; } - return(-1); + } + return(-1); } void CreatorTextures::OnLostDevice() { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sgcore: release render targets ...\n"); - for(DWORD i=0;i<Arr.size();i++) + LibReport(REPORT_MSG_LEVEL_WARNING, "release render targets ...\n"); + for(DWORD i=0;i<Arr.size();i++) + { + CreatedTexture* tmpct = Arr[i]; + if(Arr[i] /*&& Arr[i]->Name[0] != 0*/) { - CreatedTexture* tmpct = Arr[i]; - if(Arr[i] /*&& Arr[i]->Name[0] != 0*/) - { - mem_release_del(Arr[i]->Texture); - } + mem_release_del(Arr[i]->Texture); } - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "sgcore: release render targets success\n"); + } + LibReport(REPORT_MSG_LEVEL_NOTICE, "release render targets success\n"); } void CreatorTextures::OnResetDevice() { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sgcore: reset render targets ...\n"); - for(int i=0;i<Arr.size();i++) + LibReport(REPORT_MSG_LEVEL_WARNING, "reset render targets ...\n"); + for(int i=0;i<Arr.size();i++) + { + if(Arr[i]/*->Name[0] != 0*/) { - if(Arr[i]/*->Name[0] != 0*/) - { - if(Arr[i]->CoefFullScreen > 0.001f) - g_pDXDevice->CreateTexture(g_oD3DAPP.BackBufferWidth * Arr[i]->CoefFullScreen, g_oD3DAPP.BackBufferHeight * Arr[i]->CoefFullScreen, Arr[i]->Level, Arr[i]->Desc.Usage, Arr[i]->Desc.Format, Arr[i]->Desc.Pool, &(Arr[i]->Texture), NULL); - else - g_pDXDevice->CreateTexture(Arr[i]->Desc.Width, Arr[i]->Desc.Height, Arr[i]->Level, Arr[i]->Desc.Usage, Arr[i]->Desc.Format, Arr[i]->Desc.Pool, &(Arr[i]->Texture), NULL); - } + if(Arr[i]->CoefFullScreen > 0.001f) + g_pDXDevice->CreateTexture(g_oD3DAPP.BackBufferWidth * Arr[i]->CoefFullScreen, g_oD3DAPP.BackBufferHeight * Arr[i]->CoefFullScreen, Arr[i]->Level, Arr[i]->Desc.Usage, Arr[i]->Desc.Format, Arr[i]->Desc.Pool, &(Arr[i]->Texture), NULL); + else + g_pDXDevice->CreateTexture(Arr[i]->Desc.Width, Arr[i]->Desc.Height, Arr[i]->Level, Arr[i]->Desc.Usage, Arr[i]->Desc.Format, Arr[i]->Desc.Pool, &(Arr[i]->Texture), NULL); } - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "sgcore: reset render targets success\n"); + } + LibReport(REPORT_MSG_LEVEL_NOTICE, "reset render targets success\n"); } IDirect3DTexture9* CreatorTextures::GetTexture(const char* text) { - for(int i=0;i<Arr.size();i++) + for(int i=0;i<Arr.size();i++) + { + if(strcmp(text,Arr[i]->Name) == 0) { - if(strcmp(text,Arr[i]->Name) == 0) - { - return Arr[i]->Texture; - } + return Arr[i]->Texture; } - return(NULL); + } + return(NULL); } IDirect3DTexture9* CreatorTextures::GetTexture(ID num) diff --git a/source/gcore/GeomOptimize.cpp b/source/gcore/GeomOptimize.cpp index 489fbba95..799844a3b 100644 --- a/source/gcore/GeomOptimize.cpp +++ b/source/gcore/GeomOptimize.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "GeomOptimize.h" void OptimizeIndecesInSubsetUint16(uint16_t* ib, uint16_t numFaces, uint16_t numVerts) diff --git a/source/gcore/GeomOptimize.h b/source/gcore/GeomOptimize.h index 231783707..6f00153b4 100644 --- a/source/gcore/GeomOptimize.h +++ b/source/gcore/GeomOptimize.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __GEOM_OPTIMIZE_H #define __GEOM_OPTIMIZE_H diff --git a/source/gcore/LoaderTextures.cpp b/source/gcore/LoaderTextures.cpp index e725a720a..9af887772 100644 --- a/source/gcore/LoaderTextures.cpp +++ b/source/gcore/LoaderTextures.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "LoaderTextures.h" LoaderTextures::LoaderTextures() @@ -43,7 +48,7 @@ bool LoaderTextures::FileExists(const char* name) if (!IsTruePath) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - wrong texture name [%s]!!!", SX_LIB_NAME, GEN_MSG_LOCATION, name); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", GEN_MSG_LOCATION, name); return false; } @@ -58,7 +63,7 @@ void LoaderTextures::ClearLoaded() { for (int k = 0; k < Arr[i]->ArrTex.size(); ++k) { - if (Arr[i]->ArrTex[k]->type == LoadTexType::ltt_load) + if (Arr[i]->ArrTex[k]->type == LOAD_TEXTURE_TYPE_LOAD) { mem_release_del(ArrTextures[Arr[i]->ArrTex[k]->id]->tex); ++tmpcountdel; @@ -101,7 +106,7 @@ void LoaderTextures::Delete(ID id) } } -ID LoaderTextures::AddName(const char* name, LoadTexType type, ID* iddir, ID* idname) +ID LoaderTextures::AddName(const char* name, LOAD_TEXTURE_TYPE type, ID* iddir, ID* idname) { char tmp_path[SXGC_LOADTEX_MAX_SIZE_DIR];//����� char tmp_name[SXGC_LOADTEX_MAX_SIZE_NAME];//���� ��� ������� � ����������� @@ -122,7 +127,7 @@ ID LoaderTextures::AddName(const char* name, LoadTexType type, ID* iddir, ID* id if(!IsTruePath) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - wrong texture name [%s]!!!", SX_LIB_NAME, GEN_MSG_LOCATION, name); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", GEN_MSG_LOCATION, name); } int tmpkey = -1; //���������� � ������� ������ ���� �� ������� � ������� ���������� @@ -192,8 +197,8 @@ ID LoaderTextures::AddName(const char* name, LoadTexType type, ID* iddir, ID* id } //���� ��� �������� ��������������� - if (type == LoadTexType::ltt_self) - type = LoadTexType::ltt_load; + if (type == LOAD_TEXTURE_TYPE_SELF) + type = LOAD_TEXTURE_TYPE_LOAD; Arr[tmpkey]->ArrTex.push_back(new TLPath::TLTex(id, tmp_name, type)); @@ -203,7 +208,7 @@ ID LoaderTextures::AddName(const char* name, LoadTexType type, ID* iddir, ID* id ArrTextures[id]->name = name; ArrTextures[id]->IDDir = tmpkey; - if (type != LoadTexType::ltt_custom) + if (type != LOAD_TEXTURE_TYPE_CUSTOM) ArrIDsLoad.push_back(id); } @@ -257,7 +262,7 @@ void LoaderTextures::GetName(ID id, char* name) ID LoaderTextures::Create(const char* name, IDirect3DTexture9* tex) { ID tmpkey, tmpKeyName; - ID id = this->AddName(name, LoadTexType::ltt_custom, &tmpkey, &tmpKeyName); + ID id = this->AddName(name, LOAD_TEXTURE_TYPE_CUSTOM, &tmpkey, &tmpKeyName); ArrTextures[id]->tex = tex; return id; } @@ -266,16 +271,16 @@ void LoaderTextures::Update(ID id) { if(id < ArrTextures.size()) { - Update(ArrTextures[id]->name.c_str(), LoadTexType::ltt_self); + Update(ArrTextures[id]->name.c_str(), LOAD_TEXTURE_TYPE_SELF); } } -ID LoaderTextures::Update(const char* name, LoadTexType type) +ID LoaderTextures::Update(const char* name, LOAD_TEXTURE_TYPE type) { ID tmpkey, tmpKeyName; ID id = AddName(name, type, &tmpkey, &tmpKeyName); - //g_fnReportf(0,"update texture [%s] ...",name); + //LibReport(0,"update texture [%s] ...",name); char tmpPath[SXGC_LOADTEX_MAX_SIZE_FULLPATH]; sprintf(tmpPath, "%s%s%s%s%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), Arr[tmpkey]->Path.c_str(), "\\", Arr[tmpkey]->Path.c_str(), "_", Arr[tmpkey]->ArrTex[tmpKeyName]->name.c_str()); @@ -295,12 +300,12 @@ ID LoaderTextures::Update(const char* name, LoadTexType type) ) ) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - not found texture [%s]", SX_LIB_NAME, GEN_MSG_LOCATION, tmpPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not found texture [%s]", GEN_MSG_LOCATION, tmpPath); } else { ArrTextures[Arr[tmpkey]->ArrTex[tmpKeyName]->id]->tex = tex; - //g_fnReportf(0, "is ok\n"); + //LibReport(0, "is ok\n"); } return id; @@ -310,7 +315,7 @@ void LoaderTextures::LoadTextures() { if (ArrIDsLoad.size() <= 0) return; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: load textures ...\n", SX_LIB_NAME); + LibReport(REPORT_MSG_LEVEL_NOTICE, "load textures ...\n"); char tmpPath[SXGC_LOADTEX_MAX_SIZE_FULLPATH]; ID tmpiddir; @@ -336,18 +341,18 @@ void LoaderTextures::LoadTextures() ))) { ArrTextures[ArrIDsLoad[i]]->tex = 0; - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: - not found [%s]\n", SX_LIB_NAME, ArrTextures[ArrIDsLoad[i]]->name.c_str()); + LibReport(REPORT_MSG_LEVEL_WARNING, " not found [%s]\n", ArrTextures[ArrIDsLoad[i]]->name.c_str()); } else { ArrTextures[ArrIDsLoad[i]]->tex = tex; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " texture id [%d], [%s]\n", ArrIDsLoad[i], ArrTextures[ArrIDsLoad[i]]->name.c_str()); + LibReport(REPORT_MSG_LEVEL_NOTICE, " texture id [%d], [%s]\n", ArrIDsLoad[i], ArrTextures[ArrIDsLoad[i]]->name.c_str()); ++iCountLoaded; } } ArrIDsLoad.clear(); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: all loaded textures [%d]\n", SX_LIB_NAME, ArrTextures.size()); + LibReport(REPORT_MSG_LEVEL_NOTICE, "all loaded textures [%d]\n", ArrTextures.size()); } IDirect3DTexture9* LoaderTextures::GetTexture(ID id) diff --git a/source/gcore/LoaderTextures.h b/source/gcore/LoaderTextures.h index 63f6050d5..a33cef978 100644 --- a/source/gcore/LoaderTextures.h +++ b/source/gcore/LoaderTextures.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __LOADERTEXTURES_H #define __LOADERTEXTURES_H @@ -8,7 +13,7 @@ #include <common/String.h> #include "sxgcore.h" -extern report_func g_fnReportf; +void LibReport(int iLevel, const char *szFormat, ...); extern IDirect3DDevice9 *g_pDXDevice; extern D3DPRESENT_PARAMETERS g_oD3DAPP; @@ -24,12 +29,12 @@ public: void Delete(ID id); //������� �������� id - ID AddName(const char* name, LoadTexType type, ID* iddir = 0, ID* idname = 0); //��������� ��� ��������, ������ �������� �� ��� ID (��������� � �������) + ID AddName(const char* name, LOAD_TEXTURE_TYPE type, ID* iddir = 0, ID* idname = 0); //��������� ��� ��������, ������ �������� �� ��� ID (��������� � �������) ID GetID(const char* name); //�������� id �� ����� void GetName(ID id, char* name);//�������� ��� �� id ID Create(const char* name, IDirect3DTexture9* tex); //������� ����� ��� �������� tex - ID Update(const char* name, LoadTexType type); //������������� �������� name + ID Update(const char* name, LOAD_TEXTURE_TYPE type); //������������� �������� name void Update(ID id); void LoadTextures(); //�������� ���� ������� ������������ � ������� @@ -54,12 +59,12 @@ private: struct TLTex { - TLTex(){ id = -1; type = LoadTexType::ltt_load; } - TLTex(ID _id, const char* _name, LoadTexType _type){ id = _id; name = _name; type = _type; } + TLTex(){ id = -1; type = LOAD_TEXTURE_TYPE_LOAD; } + TLTex(ID _id, const char* _name, LOAD_TEXTURE_TYPE _type){ id = _id; name = _name; type = _type; } ID id; String name; - LoadTexType type; + LOAD_TEXTURE_TYPE type; }; Array<TLTex*> ArrTex; diff --git a/source/gcore/ModelFile.h b/source/gcore/ModelFile.h index b9540a03c..c0f6b5afd 100644 --- a/source/gcore/ModelFile.h +++ b/source/gcore/ModelFile.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -14,8 +14,8 @@ See the license in LICENSE @{ */ -#ifndef _ModelFile_H_ -#define _ModelFile_H_ +#ifndef __MODEL_FILE_H +#define __MODEL_FILE_H #define SX_MODEL_VERSION_OLD 6 /*!< Старая версия файла модели (для совместимости) */ #define SX_MODEL_VERSION 7 /*!< Актуальная версия файла модели */ diff --git a/source/gcore/bound.cpp b/source/gcore/bound.cpp index 409839ae9..751bf1c43 100644 --- a/source/gcore/bound.cpp +++ b/source/gcore/bound.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Bound.h" void CreateCone(float fTopRadius, float fBottomRadius, float fHeight, ID3DXMesh ** ppMesh, IDirect3DDevice9 * pDevice,UINT iSideCount) @@ -80,6 +85,8 @@ void CreateCone(float fTopRadius, float fBottomRadius, float fHeight, ID3DXMesh mem_delete(pVertices); } +//########################################################################## + void ComputeBoundingBox(IDirect3DVertexBuffer9* vertex_buffer,ISXBound** bound,DWORD count_vert,DWORD bytepervert) { float3_t *V = 0; @@ -119,7 +126,7 @@ void ComputeBoundingBox(IDirect3DVertexBuffer9* vertex_buffer,ISXBound** bound,D vertex_buffer->Unlock(); } - (*bound)->SetMinMax(&float3(Min),&float3(Max)); + (*bound)->setMinMax(&float3(Min),&float3(Max)); } void ComputeBoundingBox2(IDirect3DVertexBuffer9* vertex_buffer,ISXBound* bound,DWORD count_vert,DWORD bytepervert) @@ -169,148 +176,15 @@ void ComputeBoundingBox2(IDirect3DVertexBuffer9* vertex_buffer,ISXBound* bound,D Max.y /= 100.f; Max.z /= 100.f; - bound->SetMinMax(&float3(Min),&float3(Max)); -} - - -////////////////////////////////// - -bool InPosition2D(float3* min,float3* max,float3* pos) -{ - if((max->x >= pos->x && min->x <= pos->x) && (max->z >= pos->z && min->z <= pos->z)) - return true; - else if( - (long(max->x * 1000) >= long(pos->x * 1000) && long(min->x * 1000) <= long(pos->x * 1000)) - && - (long(max->z * 1000) >= long(pos->z * 1000) && long(min->z * 1000) <= long(pos->z * 1000)) - ) - return true; - else - return false; -} - -bool InPositionAbs2D(float3* min,float3* max,float3* pos) -{ - if((max->x > pos->x && min->x < pos->x) && (max->z > pos->z && min->z < pos->z)) - return true; - else - return false; -} - - -int CountPositionPoints2D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) -{ - int Count = 0; - - if(InPosition2D(min,max,p1)) - Count++; - if(InPosition2D(min,max,p2)) - Count++; - if(InPosition2D(min,max,p3)) - Count++; - - return Count; -} - -int CountPositionPointsAbs2D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) -{ - int Count = 0; - - if(InPositionAbs2D(min,max,p1)) - Count++; - if(InPositionAbs2D(min,max,p2)) - Count++; - if(InPositionAbs2D(min,max,p3)) - Count++; - - return Count; + bound->setMinMax(&float3(Min),&float3(Max)); } - -bool InPositionPoints2D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) +void ComputeBoundingBoxArr8(ISXBound* bound, ISXBound** bound_arr) { - if(CountPositionPointsAbs2D(min,max,p1,p2,p3) >= 1) - return true; - else if(CountPositionPoints2D(min,max,p1,p2,p3) >= 2) - return true; - else - return false; -} - -/////////////////////////////////// - -bool InPosition3D(float3* min,float3* max,float3* pos) -{ - if((max->x >= pos->x && min->x <= pos->x) && (max->y >= pos->y && min->y <= pos->y) && (max->z >= pos->z && min->z <= pos->z)) - return true; - else if( - (long(max->x * 1000) >= long(pos->x * 1000) && long(min->x * 1000) <= long(pos->x * 1000)) - && - (long(max->y * 1000) >= long(pos->y * 1000) && long(min->y * 1000) <= long(pos->y * 1000)) - && - (long(max->z * 1000) >= long(pos->z * 1000) && long(min->z * 1000) <= long(pos->z * 1000)) - ) - return true; - else - return false; -} - -bool InPositionAbs3D(float3* min,float3* max,float3* pos) -{ - if((max->x > pos->x && min->x < pos->x) && (max->y > pos->y && min->y < pos->y) && (max->z > pos->z && min->z < pos->z)) - return true; - else - return false; -} - - -int CountPositionPoints3D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) -{ - int Count = 0; - - if(InPosition3D(min,max,p1)) - Count++; - if(InPosition3D(min,max,p2)) - Count++; - if(InPosition3D(min,max,p3)) - Count++; - - return Count; -} - -int CountPositionPointsAbs3D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) -{ - int Count = 0; - - if(InPositionAbs3D(min,max,p1)) - Count++; - if(InPositionAbs3D(min,max,p2)) - Count++; - if(InPositionAbs3D(min,max,p3)) - Count++; - - return Count; -} - - -bool InPositionPoints3D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) -{ - if(CountPositionPointsAbs3D(min,max,p1,p2,p3) >= 1) - return true; - else if(CountPositionPoints3D(min,max,p1,p2,p3) >= 2) - return true; - else - return false; -} - -//////////////////// - -void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) -{ - float3 tmpMin2,tmpMax2; - float3 tmpMin,tmpMax; - bound->GetMinMax(&tmpMin2,&tmpMax2); - bound->GetMinMax(&tmpMin,&tmpMax); + float3 tmpMin2, tmpMax2; + float3 tmpMin, tmpMax; + bound->getMinMax(&tmpMin2, &tmpMax2); + bound->getMinMax(&tmpMin, &tmpMax); float x = (tmpMax.x + tmpMin.x) * 0.5; float y = (tmpMax.y + tmpMin.y) * 0.5; @@ -329,13 +203,13 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.y = dist_y; tmpMax2.z = dist_z; - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(dist_x,dist_y,dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(dist_x, dist_y, dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(dist_x,dist_y,dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(dist_x, dist_y, dist_z); - (bound_arr[0])->SetMinMax(&tmpMin2,&tmpMax2); + (bound_arr[0])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -346,13 +220,13 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.y = dist_y; tmpMax2.z = dist_z; - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(-dist_x,dist_y,dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(-dist_x, dist_y, dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(-dist_x,dist_y,dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(-dist_x, dist_y, dist_z); - (bound_arr[1])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[1])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -364,13 +238,13 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.z = dist_z; //bound->GetMinMax(&tmpMin2,&tmpMax2); - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(dist_x,dist_y,-dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(dist_x, dist_y, -dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(dist_x,dist_y,-dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(dist_x, dist_y, -dist_z); - (bound_arr[2])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[2])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -382,16 +256,16 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.z = dist_z; //bound->GetMinMax(&tmpMin2,&tmpMax2); - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(-dist_x,dist_y,-dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(-dist_x, dist_y, -dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(-dist_x,dist_y,-dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(-dist_x, dist_y, -dist_z); + + (bound_arr[3])->setMinMax(&tmpMin2, &tmpMax2); - (bound_arr[3])->SetMinMax(&tmpMin2, &tmpMax2); - tmpMin2.x = -dist_x; tmpMin2.y = -dist_y; tmpMin2.z = -dist_z; @@ -400,13 +274,13 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.y = dist_y; tmpMax2.z = dist_z; - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(dist_x,-dist_y,dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(dist_x, -dist_y, dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(dist_x,-dist_y,dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(dist_x, -dist_y, dist_z); - (bound_arr[4])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[4])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -417,13 +291,13 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.y = dist_y; tmpMax2.z = dist_z; - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(-dist_x,-dist_y,dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(-dist_x, -dist_y, dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(-dist_x,-dist_y,dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(-dist_x, -dist_y, dist_z); - (bound_arr[5])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[5])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -435,13 +309,13 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.z = dist_z; //bound->GetMinMax(&tmpMin2,&tmpMax2); - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(dist_x,-dist_y,-dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(dist_x, -dist_y, -dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(dist_x,-dist_y,-dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(dist_x, -dist_y, -dist_z); - (bound_arr[6])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[6])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -453,21 +327,21 @@ void ComputeBoundingBoxArr8(ISXBound* bound,ISXBound** bound_arr) tmpMax2.z = dist_z; //bound->GetMinMax(&tmpMin2,&tmpMax2); - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(-dist_x,-dist_y,-dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(-dist_x, -dist_y, -dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(-dist_x,-dist_y,-dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(-dist_x, -dist_y, -dist_z); - (bound_arr[7])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[7])->setMinMax(&tmpMin2, &tmpMax2); } -void ComputeBoundingBoxArr4(ISXBound* bound,ISXBound** bound_arr) +void ComputeBoundingBoxArr4(ISXBound* bound, ISXBound** bound_arr) { - float3 tmpMin2,tmpMax2; - float3 tmpMin,tmpMax; - bound->GetMinMax(&tmpMin2,&tmpMax2); - bound->GetMinMax(&tmpMin,&tmpMax); + float3 tmpMin2, tmpMax2; + float3 tmpMin, tmpMax; + bound->getMinMax(&tmpMin2, &tmpMax2); + bound->getMinMax(&tmpMin, &tmpMax); float x = (tmpMax.x + tmpMin.x) * 0.5; float y = (tmpMax.y + tmpMin.y) * 0.5; @@ -486,13 +360,13 @@ void ComputeBoundingBoxArr4(ISXBound* bound,ISXBound** bound_arr) tmpMax2.y = dist_y; tmpMax2.z = dist_z; - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(dist_x,0,dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(dist_x, 0, dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(dist_x,0,dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(dist_x, 0, dist_z); - (bound_arr[0])->SetMinMax(&tmpMin2,&tmpMax2); + (bound_arr[0])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -503,13 +377,13 @@ void ComputeBoundingBoxArr4(ISXBound* bound,ISXBound** bound_arr) tmpMax2.y = dist_y; tmpMax2.z = dist_z; - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(-dist_x,0,dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(-dist_x, 0, dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(-dist_x,0,dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(-dist_x, 0, dist_z); - (bound_arr[1])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[1])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -521,13 +395,13 @@ void ComputeBoundingBoxArr4(ISXBound* bound,ISXBound** bound_arr) tmpMax2.z = dist_z; //bound->GetMinMax(&tmpMin2,&tmpMax2); - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(dist_x,0,-dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(dist_x, 0, -dist_z); - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(dist_x,0,-dist_z); + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(dist_x, 0, -dist_z); - (bound_arr[2])->SetMinMax(&tmpMin2, &tmpMax2); + (bound_arr[2])->setMinMax(&tmpMin2, &tmpMax2); tmpMin2.x = -dist_x; @@ -539,17 +413,146 @@ void ComputeBoundingBoxArr4(ISXBound* bound,ISXBound** bound_arr) tmpMax2.z = dist_z; //bound->GetMinMax(&tmpMin2,&tmpMax2); - tmpMin2 += float3(x,y,z); - tmpMin2 += float3(-dist_x,0,-dist_z); + tmpMin2 += float3(x, y, z); + tmpMin2 += float3(-dist_x, 0, -dist_z); + + tmpMax2 += float3(x, y, z); + tmpMax2 += float3(-dist_x, 0, -dist_z); + + (bound_arr[3])->setMinMax(&tmpMin2, &tmpMax2); +} + +//########################################################################## + +bool InPosition2D(float3* min,float3* max,float3* pos) +{ + if((max->x >= pos->x && min->x <= pos->x) && (max->z >= pos->z && min->z <= pos->z)) + return true; + else if( + (long(max->x * 1000) >= long(pos->x * 1000) && long(min->x * 1000) <= long(pos->x * 1000)) + && + (long(max->z * 1000) >= long(pos->z * 1000) && long(min->z * 1000) <= long(pos->z * 1000)) + ) + return true; + else + return false; +} + +bool InPositionAbs2D(float3* min,float3* max,float3* pos) +{ + if((max->x > pos->x && min->x < pos->x) && (max->z > pos->z && min->z < pos->z)) + return true; + else + return false; +} + + +int CountPositionPoints2D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) +{ + int Count = 0; + + if(InPosition2D(min,max,p1)) + Count++; + if(InPosition2D(min,max,p2)) + Count++; + if(InPosition2D(min,max,p3)) + Count++; + + return Count; +} + +int CountPositionPointsAbs2D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) +{ + int Count = 0; + + if(InPositionAbs2D(min,max,p1)) + Count++; + if(InPositionAbs2D(min,max,p2)) + Count++; + if(InPositionAbs2D(min,max,p3)) + Count++; + + return Count; +} - tmpMax2 += float3(x,y,z); - tmpMax2 += float3(-dist_x,0,-dist_z); - (bound_arr[3])->SetMinMax(&tmpMin2, &tmpMax2); +bool InPositionPoints2D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) +{ + if(CountPositionPointsAbs2D(min,max,p1,p2,p3) >= 1) + return true; + else if(CountPositionPoints2D(min,max,p1,p2,p3) >= 2) + return true; + else + return false; } -//////////////////// +//************************************************************************** +bool InPosition3D(float3* min,float3* max,float3* pos) +{ + if((max->x >= pos->x && min->x <= pos->x) && (max->y >= pos->y && min->y <= pos->y) && (max->z >= pos->z && min->z <= pos->z)) + return true; + else if( + (long(max->x * 1000) >= long(pos->x * 1000) && long(min->x * 1000) <= long(pos->x * 1000)) + && + (long(max->y * 1000) >= long(pos->y * 1000) && long(min->y * 1000) <= long(pos->y * 1000)) + && + (long(max->z * 1000) >= long(pos->z * 1000) && long(min->z * 1000) <= long(pos->z * 1000)) + ) + return true; + else + return false; +} + +bool InPositionAbs3D(float3* min,float3* max,float3* pos) +{ + if((max->x > pos->x && min->x < pos->x) && (max->y > pos->y && min->y < pos->y) && (max->z > pos->z && min->z < pos->z)) + return true; + else + return false; +} + + +int CountPositionPoints3D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) +{ + int Count = 0; + + if(InPosition3D(min,max,p1)) + Count++; + if(InPosition3D(min,max,p2)) + Count++; + if(InPosition3D(min,max,p3)) + Count++; + + return Count; +} + +int CountPositionPointsAbs3D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) +{ + int Count = 0; + + if(InPositionAbs3D(min,max,p1)) + Count++; + if(InPositionAbs3D(min,max,p2)) + Count++; + if(InPositionAbs3D(min,max,p3)) + Count++; + + return Count; +} + + +bool InPositionPoints3D(float3* min,float3* max,float3* p1,float3* p2,float3* p3) +{ + if(CountPositionPointsAbs3D(min,max,p1,p2,p3) >= 1) + return true; + else if(CountPositionPoints3D(min,max,p1,p2,p3) >= 2) + return true; + else + return false; +} + +//########################################################################## void CreateBoundingBoxMesh(float3* min, float3* max, ID3DXMesh** bbmesh, IDirect3DDevice9* device) { @@ -581,76 +584,75 @@ void CreateBoundingBoxMesh(float3* min, float3* max, ID3DXMesh** bbmesh, IDirect (*bbmesh)->UnlockVertexBuffer(); } +//########################################################################## - - -float4x4* SXTransObject::CalcWorld() +float4x4* CSXTransObject::calcWorld() { - World = SMMatrixScaling(Scale) * /*Rotation.GetMatrix()*/SMMatrixRotationX(Rotation.x) * SMMatrixRotationY(Rotation.y) * SMMatrixRotationZ(Rotation.z) * SMMatrixTranslation(Position); - return &World; + m_mWorld = SMMatrixScaling(m_vScale) * /*Rotation.GetMatrix()*/SMMatrixRotationX(m_vRotation.x) * SMMatrixRotationY(m_vRotation.y) * SMMatrixRotationZ(m_vRotation.z) * SMMatrixTranslation(m_vPosition); + return &m_mWorld; } -//// +//########################################################################## -void SXBound::CalcBound(IDirect3DVertexBuffer9* vertex_buffer, DWORD count_vert, DWORD bytepervert) +void CSXBound::calcBound(IDirect3DVertexBuffer9* vertex_buffer, DWORD count_vert, DWORD bytepervert) { BYTE *V = 0; HRESULT hr = 0; - if (vertex_buffer && SUCCEEDED(vertex_buffer->Lock(0, 0, (void **)&V, 0))) - { - float3_t tmppos = *(float3_t*)((char*)(V) + bytepervert * 0); - Max = tmppos; - Min = tmppos; + if (vertex_buffer && SUCCEEDED(vertex_buffer->Lock(0, 0, (void **)&V, 0))) + { + float3_t tmppos = *(float3_t*)((char*)(V)+bytepervert * 0); + m_vMax = tmppos; + m_vMin = tmppos; - for(DWORD i=0;i<count_vert;i++) - { - float3_t pos = *(float3_t*)((char*)(V) + bytepervert * i); + for (DWORD i = 0; i<count_vert; i++) + { + float3_t pos = *(float3_t*)((char*)(V)+bytepervert * i); - if(pos.x > Max.x) - Max.x = pos.x; + if (pos.x > m_vMax.x) + m_vMax.x = pos.x; - if(pos.y > Max.y) - Max.y = pos.y; + if (pos.y > m_vMax.y) + m_vMax.y = pos.y; - if(pos.z > Max.z) - Max.z = pos.z; + if (pos.z > m_vMax.z) + m_vMax.z = pos.z; - if(pos.x < Min.x) - Min.x = pos.x; + if (pos.x < m_vMin.x) + m_vMin.x = pos.x; - if(pos.y < Min.y) - Min.y = pos.y; + if (pos.y < m_vMin.y) + m_vMin.y = pos.y; - if(pos.z < Min.z) - Min.z = pos.z; - } - vertex_buffer->Unlock(); + if (pos.z < m_vMin.z) + m_vMin.z = pos.z; } + vertex_buffer->Unlock(); + } - Center = (Min + Max) * 0.5f; - Radius = SMVector3Length(Center-Max); + m_vCenter = (m_vMin + m_vMax) * 0.5f; + m_fRadius = SMVector3Length(m_vCenter - m_vMax); } -float4x4* SXBound::CalcWorldAndTrans() +float4x4* CSXBound::calcWorldAndTrans() { - CalcWorld(); + calcWorld(); - Max = SMVector3Transform(Max, World); - Min = SMVector3Transform(Min, World); + m_vMax = SMVector3Transform(m_vMax, m_mWorld); + m_vMin = SMVector3Transform(m_vMin, m_mWorld); - Center = (Min + Max) * 0.5f; + m_vCenter = (m_vMin + m_vMax) * 0.5f; - Radius = SMVector3Length(Center - Max); - return &World; + m_fRadius = SMVector3Length(m_vCenter - m_vMax); + return &m_mWorld; } -void SXBound::GetPosBBScreen(SXPosBBScreen *res, float3* campos, float3* sizemapdepth, float4x4* mat) +void CSXBound::getPosBBScreen(SXPosBBScreen *res, float3* campos, float3* sizemapdepth, float4x4* mat) { float3 max,min; - max = Max; - min = Min; + max = m_vMax; + min = m_vMin; float2 mins,maxs,minmaxdepth; @@ -827,50 +829,50 @@ void SXBound::GetPosBBScreen(SXPosBBScreen *res, float3* campos, float3* sizemap res->IsIn = true;*/ } -void SXBound::SetMinMax(float3* min, float3* max) +void CSXBound::setMinMax(const float3* min, const float3* max) { - Min = *min; - Max = *max; + m_vMin = *min; + m_vMax = *max; /*float3 vec = (Max - Min) * 0.5f; Radius = sqrt(vec.x * vec.x + vec.y * vec.y + vec.x * vec.z);*/ - Center = (Min + Max) * 0.5f; - Radius = SMVector3Length(Center - Max); + m_vCenter = (m_vMin + m_vMax) * 0.5f; + m_fRadius = SMVector3Length(m_vCenter - m_vMax); }; -void SXBound::GetMinMax(float3* min, float3* max) const +void CSXBound::getMinMax(float3* min, float3* max) const { - *min = Min; *max = Max; + *min = m_vMin; *max = m_vMax; }; -void SXBound::SetSphere(float3* center, float* radius) +void CSXBound::setSphere(const float3* center, float radius) { - Center = *center; - Radius = *radius; + m_vCenter = *center; + m_fRadius = radius; - Min = Center - float3(Radius, Radius, Radius); - Max = Center + float3(Radius, Radius, Radius); + m_vMin = m_vCenter - float3(m_fRadius, m_fRadius, m_fRadius); + m_vMax = m_vCenter + float3(m_fRadius, m_fRadius, m_fRadius); }; -void SXBound::GetSphere(float3* center, float* radius) const +void CSXBound::getSphere(float3* center, float* radius) const { - *center = Center; - *radius = Radius; + *center = m_vCenter; + *radius = m_fRadius; }; -bool SXBound::IsPointInSphere(float3* point) const +bool CSXBound::isPointInSphere(const float3* point) const { - float distsqr = SMVector3Dot(Center - *point); - if (distsqr <= Radius*Radius) + float distsqr = SMVector3Dot(m_vCenter - *point); + if (distsqr <= m_fRadius*m_fRadius) return true; else return false; } -bool SXBound::IsPointInBox(float3* point) const +bool CSXBound::isPointInBox(const float3* point) const { - if (point->x >= Min.x && point->y >= Min.y && point->z >= Min.z && point->x <= Max.x && point->y <= Max.y && point->z <= Max.z) + if (point->x >= m_vMin.x && point->y >= m_vMin.y && point->z >= m_vMin.z && point->x <= m_vMax.x && point->y <= m_vMax.y && point->z <= m_vMax.z) return true; else return false; diff --git a/source/gcore/bound.h b/source/gcore/bound.h index 527ae1aed..7cd66b7d1 100644 --- a/source/gcore/bound.h +++ b/source/gcore/bound.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __BOUND_H #define __BOUND_H @@ -32,16 +37,16 @@ void CreateBoundingBoxMesh(float3* min, float3* max, ID3DXMesh** bbmesh, IDirect //������� ������ � ����������� ��������� //��� ����������� ������������� ���������� ������� ���������� �������/�������/������� ����� ���� CalculateWorld -struct SXTransObject : public virtual ISXTransObject +struct CSXTransObject : public virtual ISXTransObject { - SXTransObject(){}; - ~SXTransObject(){}; + CSXTransObject(){}; + ~CSXTransObject(){}; void Release(){ mem_del(this); }; SX_ALIGNED_OP_MEM - float4x4* CalcWorld(); + float4x4* calcWorld(); }; #define TRANSFORM_COORD_SCREEN2(point,sizemapdepth)\ @@ -57,31 +62,38 @@ struct SXTransObject : public virtual ISXTransObject //��� �������� �������� � ��������� ���������� ������� CalculateBound //SetMinMax, GetMinMax �� ������ CalculateWorldAndTrans ���������� �������������������� ������ //�������� ������ ���������� Bound � Object �������� CalculateWorldAndTrans -class SXBound : public SXTransObject, public virtual ISXBound +class CSXBound : public CSXTransObject, public virtual ISXBound { public: - SXBound(){}; - ~SXBound(){}; + CSXBound(){}; + ~CSXBound(){}; void Release(){ mem_del(this); }; SX_ALIGNED_OP_MEM - void CalcBound(IDirect3DVertexBuffer9* vertex_buffer, DWORD count_vert, DWORD bytepervert); + void calcBound(IDirect3DVertexBuffer9* vertex_buffer, DWORD count_vert, DWORD bytepervert); //������� �������� ������� ������� � ������������� �������� � ��������� - float4x4* CalcWorldAndTrans(); + float4x4* calcWorldAndTrans(); + + void getPosBBScreen(SXPosBBScreen *res, float3* campos, float3* sizemapdepth, float4x4* mat); + + void setMinMax(const float3* min, const float3* max); + void getMinMax(float3* min, float3* max) const; - void GetPosBBScreen(SXPosBBScreen *res, float3* campos, float3* sizemapdepth, float4x4* mat); + void setSphere(const float3* center, float radius); + void getSphere(float3* center, float* radius) const; - void SetMinMax(float3* min, float3* max); - void GetMinMax(float3* min, float3* max) const; + bool isPointInSphere(const float3* point) const; + bool isPointInBox(const float3* point) const; - void SetSphere(float3* center, float* radius); - void GetSphere(float3* center, float* radius) const; +protected: + float3 m_vMin; + float3 m_vMax; - bool IsPointInSphere(float3* point) const; - bool IsPointInBox(float3* point) const; + float3 m_vCenter; + float m_fRadius; }; #endif \ No newline at end of file diff --git a/source/gcore/camera.cpp b/source/gcore/camera.cpp index 02a921ebb..e2e4fc50c 100644 --- a/source/gcore/camera.cpp +++ b/source/gcore/camera.cpp @@ -1,60 +1,74 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "camera.h" -Frustum::Frustum() +CFrustum::CFrustum() { - + m_aPoints[0] = float3(0, 0, 0); + m_aPoints[1] = float3(0, 0, 0); + m_aPoints[2] = float3(0, 0, 0); + m_aPoints[3] = float3(0, 0, 0); + m_aPoints[4] = float3(0, 0, 0); + m_aPoints[5] = float3(0, 0, 0); + m_aPoints[6] = float3(0, 0, 0); + m_aPoints[7] = float3(0, 0, 0); + + m_vCenter = float3(0, 0, 0); } -Frustum::~Frustum() +CFrustum::~CFrustum() { } -void Frustum::Update(const float4x4* view,const float4x4* proj) +void CFrustum::update(const float4x4* view,const float4x4* proj) { float4x4 matComb = SMMatrixMultiply(*view, *proj); - ArrFrustumPlane[0].Normal.x = matComb._14 - matComb._11; - ArrFrustumPlane[0].Normal.y = matComb._24 - matComb._21; - ArrFrustumPlane[0].Normal.z = matComb._34 - matComb._31; - ArrFrustumPlane[0].Distance = matComb._44 - matComb._41; + m_aFrustumPlanes[0].m_vNormal.x = matComb._14 - matComb._11; + m_aFrustumPlanes[0].m_vNormal.y = matComb._24 - matComb._21; + m_aFrustumPlanes[0].m_vNormal.z = matComb._34 - matComb._31; + m_aFrustumPlanes[0].m_fDistance = matComb._44 - matComb._41; - ArrFrustumPlane[1].Normal.x = matComb._14 + matComb._11; - ArrFrustumPlane[1].Normal.y = matComb._24 + matComb._21; - ArrFrustumPlane[1].Normal.z = matComb._34 + matComb._31; - ArrFrustumPlane[1].Distance = matComb._44 + matComb._41; - - ArrFrustumPlane[2].Normal.x = matComb._14 + matComb._12; - ArrFrustumPlane[2].Normal.y = matComb._24 + matComb._22; - ArrFrustumPlane[2].Normal.z = matComb._34 + matComb._32; - ArrFrustumPlane[2].Distance = matComb._44 + matComb._42; - - ArrFrustumPlane[3].Normal.x = matComb._14 - matComb._12; - ArrFrustumPlane[3].Normal.y = matComb._24 - matComb._22; - ArrFrustumPlane[3].Normal.z = matComb._34 - matComb._32; - ArrFrustumPlane[3].Distance = matComb._44 - matComb._42; - - ArrFrustumPlane[4].Normal.x = matComb._14 - matComb._13; - ArrFrustumPlane[4].Normal.y = matComb._24 - matComb._23; - ArrFrustumPlane[4].Normal.z = matComb._34 - matComb._33; - ArrFrustumPlane[4].Distance = matComb._44 - matComb._43; - - ArrFrustumPlane[5].Normal.x = matComb._14 + matComb._13; - ArrFrustumPlane[5].Normal.y = matComb._24 + matComb._23; - ArrFrustumPlane[5].Normal.z = matComb._34 + matComb._33; - ArrFrustumPlane[5].Distance = matComb._44 + matComb._43; + m_aFrustumPlanes[1].m_vNormal.x = matComb._14 + matComb._11; + m_aFrustumPlanes[1].m_vNormal.y = matComb._24 + matComb._21; + m_aFrustumPlanes[1].m_vNormal.z = matComb._34 + matComb._31; + m_aFrustumPlanes[1].m_fDistance = matComb._44 + matComb._41; + + m_aFrustumPlanes[2].m_vNormal.x = matComb._14 + matComb._12; + m_aFrustumPlanes[2].m_vNormal.y = matComb._24 + matComb._22; + m_aFrustumPlanes[2].m_vNormal.z = matComb._34 + matComb._32; + m_aFrustumPlanes[2].m_fDistance = matComb._44 + matComb._42; + + m_aFrustumPlanes[3].m_vNormal.x = matComb._14 - matComb._12; + m_aFrustumPlanes[3].m_vNormal.y = matComb._24 - matComb._22; + m_aFrustumPlanes[3].m_vNormal.z = matComb._34 - matComb._32; + m_aFrustumPlanes[3].m_fDistance = matComb._44 - matComb._42; + + m_aFrustumPlanes[4].m_vNormal.x = matComb._14 - matComb._13; + m_aFrustumPlanes[4].m_vNormal.y = matComb._24 - matComb._23; + m_aFrustumPlanes[4].m_vNormal.z = matComb._34 - matComb._33; + m_aFrustumPlanes[4].m_fDistance = matComb._44 - matComb._43; + + m_aFrustumPlanes[5].m_vNormal.x = matComb._14 + matComb._13; + m_aFrustumPlanes[5].m_vNormal.y = matComb._24 + matComb._23; + m_aFrustumPlanes[5].m_vNormal.z = matComb._34 + matComb._33; + m_aFrustumPlanes[5].m_fDistance = matComb._44 + matComb._43; //������������ ���������� for (int i = 0; i < 6; ++i) - ArrFrustumPlane[i].Normalize(); + m_aFrustumPlanes[i].normalize(); } -bool Frustum::PointInFrustum(const float3 *point) +bool CFrustum::pointInFrustum(const float3 *point) const { for (int i=0; i<6; i++) { - float tmp = ArrFrustumPlane[i].Normal.x*(point->x) + ArrFrustumPlane[i].Normal.y*(point->y) + ArrFrustumPlane[i].Normal.z*(point->z) + ArrFrustumPlane[i].Distance; + float tmp = m_aFrustumPlanes[i].m_vNormal.x*(point->x) + m_aFrustumPlanes[i].m_vNormal.y*(point->y) + m_aFrustumPlanes[i].m_vNormal.z*(point->z) + m_aFrustumPlanes[i].m_fDistance; if(long(tmp * 1000.0f) <= long(0 * 1000.0f)) { return false; @@ -63,99 +77,124 @@ bool Frustum::PointInFrustum(const float3 *point) return true; } -bool Frustum::PolyInFrustum(const float3* p1,const float3* p2,const float3* p3) +bool CFrustum::polyInFrustum(const float3* p1, const float3* p2, const float3* p3) const { - if(PointInFrustum(p1) || PointInFrustum(p2) || PointInFrustum(p3)) + if(pointInFrustum(p1) || pointInFrustum(p2) || pointInFrustum(p3)) return true; return false; } -bool Frustum::PolyInFrustumAbs(const float3* p1,const float3* p2,const float3* p3) +bool CFrustum::polyInFrustumAbs(const float3* p1, const float3* p2, const float3* p3) const { - if(PointInFrustum(p1) && PointInFrustum(p2) && PointInFrustum(p3)) + if(pointInFrustum(p1) && pointInFrustum(p2) && pointInFrustum(p3)) return true; return false; } -bool Frustum::SphereInFrustum(const float3 *point, float radius) const +bool CFrustum::sphereInFrustum(const float3 *point, float radius) const { for (int i=0; i<6; ++i) { - if (ArrFrustumPlane[i].Normal.x*point->x + ArrFrustumPlane[i].Normal.y*point->y + ArrFrustumPlane[i].Normal.z*point->z + ArrFrustumPlane[i].Distance <= -radius) + if (m_aFrustumPlanes[i].m_vNormal.x*point->x + m_aFrustumPlanes[i].m_vNormal.y*point->y + m_aFrustumPlanes[i].m_vNormal.z*point->z + m_aFrustumPlanes[i].m_fDistance <= -radius) return false; } return true; } -bool Frustum::SphereInFrustumAbs(const float3 *point, float radius) +bool CFrustum::sphereInFrustumAbs(const float3 *point, float radius) const { for (int i=0; i<6; i++) { - if (ArrFrustumPlane[i].Normal.x*point->x + ArrFrustumPlane[i].Normal.y*point->y + ArrFrustumPlane[i].Normal.z*point->z + ArrFrustumPlane[i].Distance > -radius) + if (m_aFrustumPlanes[i].m_vNormal.x*point->x + m_aFrustumPlanes[i].m_vNormal.y*point->y + m_aFrustumPlanes[i].m_vNormal.z*point->z + m_aFrustumPlanes[i].m_fDistance > -radius) return false; } return true; } -bool Frustum::BoxInFrustum(float3* min,float3* max) +bool CFrustum::boxInFrustum(float3* min, float3* max) const { for ( register int p = 0; p < 6; p++ ) { - if( ArrFrustumPlane[p].Normal.x * (min->x) + ArrFrustumPlane[p].Normal.y * (min->y) + ArrFrustumPlane[p].Normal.z * (min->z) + ArrFrustumPlane[p].Distance > 0 ) continue; - - if( ArrFrustumPlane[p].Normal.x * (min->x) + ArrFrustumPlane[p].Normal.y * (min->y) + ArrFrustumPlane[p].Normal.z * (max->z) + ArrFrustumPlane[p].Distance > 0 ) continue; - if( ArrFrustumPlane[p].Normal.x * (min->x) + ArrFrustumPlane[p].Normal.y * (max->y) + ArrFrustumPlane[p].Normal.z * (max->z) + ArrFrustumPlane[p].Distance > 0 ) continue; - if( ArrFrustumPlane[p].Normal.x * (max->x) + ArrFrustumPlane[p].Normal.y * (max->y) + ArrFrustumPlane[p].Normal.z * (max->z) + ArrFrustumPlane[p].Distance > 0 ) continue; - if( ArrFrustumPlane[p].Normal.x * (max->x) + ArrFrustumPlane[p].Normal.y * (min->y) + ArrFrustumPlane[p].Normal.z * (min->z) + ArrFrustumPlane[p].Distance > 0 ) continue; - if( ArrFrustumPlane[p].Normal.x * (max->x) + ArrFrustumPlane[p].Normal.y * (max->y) + ArrFrustumPlane[p].Normal.z * (min->z) + ArrFrustumPlane[p].Distance > 0 ) continue; - if( ArrFrustumPlane[p].Normal.x * (max->x) + ArrFrustumPlane[p].Normal.y * (min->y) + ArrFrustumPlane[p].Normal.z * (max->z) + ArrFrustumPlane[p].Distance > 0 ) continue; - if( ArrFrustumPlane[p].Normal.x * (min->x) + ArrFrustumPlane[p].Normal.y * (max->y) + ArrFrustumPlane[p].Normal.z * (min->z) + ArrFrustumPlane[p].Distance > 0 ) continue; + if( m_aFrustumPlanes[p].m_vNormal.x * (min->x) + m_aFrustumPlanes[p].m_vNormal.y * (min->y) + m_aFrustumPlanes[p].m_vNormal.z * (min->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; + + if( m_aFrustumPlanes[p].m_vNormal.x * (min->x) + m_aFrustumPlanes[p].m_vNormal.y * (min->y) + m_aFrustumPlanes[p].m_vNormal.z * (max->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; + if( m_aFrustumPlanes[p].m_vNormal.x * (min->x) + m_aFrustumPlanes[p].m_vNormal.y * (max->y) + m_aFrustumPlanes[p].m_vNormal.z * (max->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; + if( m_aFrustumPlanes[p].m_vNormal.x * (max->x) + m_aFrustumPlanes[p].m_vNormal.y * (max->y) + m_aFrustumPlanes[p].m_vNormal.z * (max->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; + if( m_aFrustumPlanes[p].m_vNormal.x * (max->x) + m_aFrustumPlanes[p].m_vNormal.y * (min->y) + m_aFrustumPlanes[p].m_vNormal.z * (min->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; + if( m_aFrustumPlanes[p].m_vNormal.x * (max->x) + m_aFrustumPlanes[p].m_vNormal.y * (max->y) + m_aFrustumPlanes[p].m_vNormal.z * (min->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; + if( m_aFrustumPlanes[p].m_vNormal.x * (max->x) + m_aFrustumPlanes[p].m_vNormal.y * (min->y) + m_aFrustumPlanes[p].m_vNormal.z * (max->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; + if( m_aFrustumPlanes[p].m_vNormal.x * (min->x) + m_aFrustumPlanes[p].m_vNormal.y * (max->y) + m_aFrustumPlanes[p].m_vNormal.z * (min->z) + m_aFrustumPlanes[p].m_fDistance > 0 ) continue; return false; } return true; } -///////////////////////// -Camera::Camera() +float3 CFrustum::getPoint(int iNumPoint) const +{ + if (iNumPoint >= 0 && iNumPoint < 8) + return m_aPoints[iNumPoint]; + + return float3(0, 0, 0); +} + +float3 CFrustum::getCenter() const +{ + return m_vCenter; +} + +void CFrustum::setPoint(int iNumPoint, const float3 *pPoint) +{ + if (iNumPoint >= 0 && iNumPoint < 8) + m_aPoints[iNumPoint] = *pPoint; +} + +void CFrustum::setCenter(const float3 *pCenter) +{ + m_vCenter = *pCenter; +} + +//########################################################################## + +CCamera::CCamera() { - Position = float3(0.0f, 0.0f, 0.0f); - Right = float3(1.0f, 0.0f, 0.0f); - Up = float3(0.0f, 1.0f, 0.0f); - Look = float3(0.0f, 0.0f, 1.0f); + m_vPosition = float3(0.0f, 0.0f, 0.0f); + m_vRight = float3(1.0f, 0.0f, 0.0f); + m_vUp = float3(0.0f, 1.0f, 0.0f); + m_vLook = float3(0.0f, 0.0f, 1.0f); - ObjFrustum = new Frustum(); + m_oFrustum = CFrustum(); m_vPitchYawRoll = float3_t(0, 0, 0); } -Camera::~Camera () +CCamera::~CCamera () { - mem_delete(ObjFrustum); + } -inline void Camera::PosLeftRight(float units) +void CCamera::posLeftRight(float units) { - Position += float3(Right.x, 0.0f, Right.z) * units; - LastVal.x = units; + m_vPosition += float3(m_vRight.x, 0.0f, m_vRight.z) * units; + //LastVal.x = units; } -inline void Camera::PosUpDown(float units) +void CCamera::posUpDown(float units) { - Position.y += Up.y * units; + m_vPosition.y += m_vUp.y * units; } -inline void Camera::PosFrontBack(float units) +void CCamera::posFrontBack(float units) { - Position += float3(Look.x, 0.0f, Look.z) * units; - LastVal.z = units; + m_vPosition += float3(m_vLook.x, 0.0f, m_vLook.z) * units; + //LastVal.z = units; } -inline void Camera::RotUpDown(float angle) +void CCamera::rotUpDown(float angle) { m_vPitchYawRoll.x -= angle; if(m_vPitchYawRoll.x > SM_PIDIV2) @@ -167,10 +206,10 @@ inline void Camera::RotUpDown(float angle) m_vPitchYawRoll.x = -SM_PIDIV2; } - UpdateView(); + updateView(); } -inline void Camera::RotRightLeft(float angle) +void CCamera::rotRightLeft(float angle) { m_vPitchYawRoll.y -= angle; while(m_vPitchYawRoll.y < 0.0f) @@ -182,105 +221,116 @@ inline void Camera::RotRightLeft(float angle) m_vPitchYawRoll.y -= SM_2PI; } - UpdateView(); + updateView(); } -inline void Camera::Roll(float angle) +void CCamera::roll(float angle) { m_vPitchYawRoll.z -= angle; - UpdateView(); + updateView(); } -inline void Camera::UpdateView() +void CCamera::updateView() { SMQuaternion q = SMQuaternion(m_vPitchYawRoll.x, 'x') * SMQuaternion(m_vPitchYawRoll.y, 'y') * SMQuaternion(m_vPitchYawRoll.z, 'z'); - Right = q * float3(1.0f, 0.0f, 0.0f); - Up = q * float3(0.0f, 1.0f, 0.0f); - Look = q * float3(0.0f, 0.0f, 1.0f); + m_vRight = q * float3(1.0f, 0.0f, 0.0f); + m_vUp = q * float3(0.0f, 1.0f, 0.0f); + m_vLook = q * float3(0.0f, 0.0f, 1.0f); } -inline void Camera::SetOrientation(const SMQuaternion & q) +void CCamera::setOrientation(const SMQuaternion *q) { - m_vPitchYawRoll = SMMatrixToEuler(q.GetMatrix()); + m_vPitchYawRoll = SMMatrixToEuler(q->GetMatrix()); - Right = q * float3(1.0f, 0.0f, 0.0f); - Up = q * float3(0.0f, 1.0f, 0.0f); - Look = q * float3(0.0f, 0.0f, 1.0f); + m_vRight = (*q) * float3(1.0f, 0.0f, 0.0f); + m_vUp = (*q) * float3(0.0f, 1.0f, 0.0f); + m_vLook = (*q) * float3(0.0f, 0.0f, 1.0f); } -inline void Camera::GetViewMatrix(float4x4* view_matrix) +void CCamera::getViewMatrix(float4x4* view_matrix) { - *view_matrix = SMMatrixLookToLH(Position, Look, Up); + m_mView = SMMatrixLookToLH(m_vPosition, m_vLook, m_vUp); + *view_matrix = m_mView;// SMMatrixLookToLH(m_vPosition, m_vLook, m_vUp); } -inline void Camera::GetPosition(float3* pos) +void CCamera::getPosition(float3* pos) const { - *pos = Position; + *pos = m_vPosition; } -inline void Camera::SetPosition(float3* pos) +void CCamera::setPosition(const float3* pos) { - Position = *pos; + m_vPosition = *pos; } -inline void Camera::GetDirection(float3* dir) +void CCamera::getDirection(float3* dir) const { - + *dir = m_vLook; } -inline void Camera::SetDirection(float3* dir) +/*void CCamera::setDirection(const float3* dir) { - -} + m_vLook = *dir; +}*/ -inline void Camera::GetRight(float3* right) +void CCamera::getRight(float3* right) const { - *right = Right; + *right = m_vRight; } -inline void Camera::GetUp(float3* up) +void CCamera::getUp(float3* up) const { - *up = Up; + *up = m_vUp; } -inline void Camera::GetLook(float3* look) +void CCamera::getLook(float3* look) const { - *look = Look; + *look = m_vLook; } -inline void Camera::GetRotation(float3* rot) +void CCamera::getRotation(float3* rot) const { *rot = m_vPitchYawRoll; } -inline float Camera::GetRotationX() +float CCamera::getRotationX() const { return m_vPitchYawRoll.x; } -inline float Camera::GetRotationY() +float CCamera::getRotationY() const { return m_vPitchYawRoll.y; } -inline float Camera::GetRotationZ() +float CCamera::getRotationZ() const { return m_vPitchYawRoll.z; } -inline void Camera::SetFOV(float fov) +void CCamera::setFOV(float fov) { m_fFOV = fov; } -inline float Camera::GetFOV() +float CCamera::getFOV() const { return(m_fFOV); } + +void CCamera::updateFrustum(const float4x4 *pProjection) +{ + m_oFrustum.update(&m_mView, pProjection); +} + +const ISXFrustum* CCamera::getFrustum() +{ + return &m_oFrustum; +} \ No newline at end of file diff --git a/source/gcore/camera.h b/source/gcore/camera.h index 173ae37c5..be7842ec5 100644 --- a/source/gcore/camera.h +++ b/source/gcore/camera.h @@ -1,69 +1,107 @@ -#ifndef _CAMERA_H_ -#define _CAMERA_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __CAMERA_H +#define __CAMERA_H #include "sxgcore.h" //����� ����������� ������� -class Frustum : public virtual ISXFrustum +class CFrustum : public virtual ISXFrustum { public: - Frustum(); - ~Frustum(); + CFrustum(); + ~CFrustum(); void Release(){ mem_del(this); } SX_ALIGNED_OP_MEM - void Update(const float4x4* view,const float4x4* proj); + void update(const float4x4 *pView,const float4x4 *pProj); - bool PointInFrustum(const float3 *point); - bool PolyInFrustum(const float3* p1,const float3* p2,const float3* p3); - bool PolyInFrustumAbs(const float3* p1,const float3* p2,const float3* p3); + bool pointInFrustum(const float3 *pPoint) const; + bool polyInFrustum(const float3 *pPount1, const float3 *pPount2, const float3 *pPount3) const; + bool polyInFrustumAbs(const float3 *pPount1, const float3 *pPount2, const float3 *pPount3) const; - bool SphereInFrustum(const float3 *point, float radius) const; + bool sphereInFrustum(const float3 *pPount, float fRadius) const; + + bool sphereInFrustumAbs(const float3 *pPount, float fRadius) const; + bool boxInFrustum(float3 *pMin, float3 *pMax) const; + - bool SphereInFrustumAbs(const float3 *point, float radius); - bool BoxInFrustum(float3* min,float3* max); + float3 getPoint(int iNumPoint) const; + float3 getCenter() const; + void setPoint(int iNumPoint, const float3 *pPoint); + void setCenter(const float3 *pCenter); + +private: + + CSXFrustumPlane m_aFrustumPlanes[6]; + + float3 m_aPoints[8]; + float3 m_vCenter; }; -///////////////////// -class Camera : public virtual ISXCamera +//************************************************************************** + +class CCamera : public virtual ISXCamera { public: - Camera (); - ~Camera (); + CCamera (); + ~CCamera (); void Release(){ mem_del(this); } SX_ALIGNED_OP_MEM - void PosLeftRight(float units); //�����/������ - void PosUpDown(float units); //�����/���� - void PosFrontBack(float units); //������/����� + void posLeftRight(float fUnits);//�����/������ + void posUpDown(float fUnits); //�����/���� + void posFrontBack(float fUnits);//������/����� - void RotUpDown(float angle); //�������� �����/���� - void RotRightLeft(float angle); //�������� ������/����� - void Roll(float angle); //���� - void SetOrientation(const SMQuaternion & q); + void rotUpDown(float fAngle); //�������� �����/���� + void rotRightLeft(float fAngle);//�������� ������/����� + void roll(float fAngle); //���� + void setOrientation(const SMQuaternion *pQuaternion); - void GetViewMatrix(float4x4* view_matrix);//�������� ������� ���� + void getViewMatrix(float4x4 *pMatrix);//�������� ������� ���� - void GetPosition(float3* pos); - void SetPosition(float3* pos); + void getPosition(float3 *pPos) const; + void setPosition(const float3 *pPos); - void GetDirection(float3* dir); - void SetDirection(float3* dir); + void getDirection(float3 *pDir) const; + //void setDirection(const float3 *pDir); - void GetRight(float3* right); - void GetUp(float3* up); - void GetLook(float3* look); - void GetRotation(float3* rot); + void getRight(float3 *pRight) const; + void getUp(float3 *pUp) const; + void getLook(float3 *pLook) const; + void getRotation(float3 *pRot) const; + + float getRotationX() const; + float getRotationY() const; + float getRotationZ() const; + + void setFOV(float fFOV); + float getFOV() const; + + void updateView(); + + void updateFrustum(const float4x4 *pmProjection); + const ISXFrustum* getFrustum(); + +protected: + CFrustum m_oFrustum; //!< ������� ���� ������ + + float3 m_vRight; + float3 m_vUp; + float3 m_vLook; + + float3 m_vPosition; - float GetRotationX(); - float GetRotationY(); - float GetRotationZ(); + float3_t m_vPitchYawRoll; - void SetFOV(float fov); - float GetFOV(); + float4x4 m_mView; - void UpdateView(); + float m_fFOV; }; #endif diff --git a/source/gcore/creatortextures.h b/source/gcore/creatortextures.h index 0a6e947eb..9a3934639 100644 --- a/source/gcore/creatortextures.h +++ b/source/gcore/creatortextures.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __CREATORTEXTURES_H #define __CREATORTEXTURES_H @@ -7,7 +12,6 @@ #include <d3d9.h> #include <common/array.h> -extern report_func g_fnReportf; extern IDirect3DDevice9 *g_pDXDevice; extern D3DPRESENT_PARAMETERS g_oD3DAPP; diff --git a/source/gcore/loader_static.cpp b/source/gcore/loader_static.cpp index ad5ea9521..7764729b0 100644 --- a/source/gcore/loader_static.cpp +++ b/source/gcore/loader_static.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "loader_static.h" ISXDataStaticModel* SGCore_StaticModelCr() @@ -15,7 +20,7 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) { if (!data) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - �an not initialize a null pointer 'data', load model '%s'\n", SX_LIB_NAME, GEN_MSG_LOCATION, file); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - �an not initialize a null pointer 'data', load model '%s'\n", GEN_MSG_LOCATION, file); return; } @@ -23,7 +28,7 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) FILE * pf = fopen(file, "rb"); if (!pf) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - unable to open model file '%s'\n", SX_LIB_NAME, GEN_MSG_LOCATION, file); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - unable to open model file '%s'\n", GEN_MSG_LOCATION, file); return; } @@ -33,26 +38,26 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) if (header.Magick != SX_MODEL_MAGICK) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - unsupported file type '%s'\n", SX_LIB_NAME, GEN_MSG_LOCATION, file); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - unsupported file type '%s'\n", GEN_MSG_LOCATION, file); fclose(pf); return; } if (!(header.iVersion == SX_MODEL_VERSION_OLD || header.iVersion == SX_MODEL_VERSION)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - unsupported file '%s' version %d'\n", SX_LIB_NAME, GEN_MSG_LOCATION, header.iVersion, file); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - unsupported file '%s' version %d'\n", GEN_MSG_LOCATION, header.iVersion, file); fclose(pf); return; } if (header.iVersion == SX_MODEL_VERSION_OLD) { - (*data)->ArrTextures = NULL; + (*data)->m_ppTextures = NULL; Array<String> tex; if (header.iMaterialsOffset) { fseek(pf, header.iMaterialsOffset, SEEK_SET); - (*data)->ArrTextures = new char*[header.iMaterialCount]; + (*data)->m_ppTextures = new char*[header.iMaterialCount]; for (int i = 0; i < header.iMaterialCount; i++) { char c; @@ -72,11 +77,11 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) fread(&lh.iSubMeshCount, sizeof(int), 1, pf); lh.pSubLODmeshes = new ModelLoDSubset[lh.iSubMeshCount]; - (*data)->SubsetCount = lh.iSubMeshCount; - (*data)->StartIndex = new UINT[lh.iSubMeshCount]; - (*data)->IndexCount = new UINT[lh.iSubMeshCount]; - (*data)->StartVertex = new UINT[lh.iSubMeshCount]; - (*data)->VertexCount = new UINT[lh.iSubMeshCount]; + (*data)->m_uiSubsetCount = lh.iSubMeshCount; + (*data)->m_pStartIndex = new UINT[lh.iSubMeshCount]; + (*data)->m_pIndexCount = new UINT[lh.iSubMeshCount]; + (*data)->m_pStartVertex = new UINT[lh.iSubMeshCount]; + (*data)->m_pVertexCount = new UINT[lh.iSubMeshCount]; int iVC = 0; for (int i = 0; i < lh.iSubMeshCount; i++) { @@ -90,8 +95,8 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) iVC += lh.pSubLODmeshes[i].iVectexCount; - (*data)->ArrTextures[i] = new char[tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1]; - memcpy((*data)->ArrTextures[i], tex[lh.pSubLODmeshes[i].iMaterialID].c_str(), (tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1) * sizeof(char)); + (*data)->m_ppTextures[i] = new char[tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1]; + memcpy((*data)->m_ppTextures[i], tex[lh.pSubLODmeshes[i].iMaterialID].c_str(), (tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1) * sizeof(char)); } UINT iStartIndex = 0; @@ -99,10 +104,10 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) for (int i = 0; i < lh.iSubMeshCount; i++) { - (*data)->StartIndex[i] = iStartIndex; - (*data)->StartVertex[i] = iStartVertex; - (*data)->IndexCount[i] = lh.pSubLODmeshes[i].iIndexCount; - (*data)->VertexCount[i] = lh.pSubLODmeshes[i].iVectexCount; + (*data)->m_pStartIndex[i] = iStartIndex; + (*data)->m_pStartVertex[i] = iStartVertex; + (*data)->m_pIndexCount[i] = lh.pSubLODmeshes[i].iIndexCount; + (*data)->m_pVertexCount[i] = lh.pSubLODmeshes[i].iVectexCount; lh.pSubLODmeshes[i].iStartIndex = iStartIndex; lh.pSubLODmeshes[i].iStartVertex = iStartVertex; @@ -126,11 +131,11 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) memcpy(pVertices + lh.pSubLODmeshes[i].iStartVertex, lh.pSubLODmeshes[i].pVertices, sizeof(vertex_animated_ex)* lh.pSubLODmeshes[i].iVectexCount); } - (*data)->AllVertexCount = iStartVertex; - g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* iStartVertex, NULL, NULL, D3DPOOL_MANAGED, &(*data)->VertexBuffer, 0); + (*data)->m_uiAllVertexCount = iStartVertex; + g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* iStartVertex, NULL, NULL, D3DPOOL_MANAGED, &(*data)->m_pVertexBuffer, 0); //(*data)->ArrVertBuf = new vertex_static[iStartVertex]; vertex_static * pData; - if (!FAILED((*data)->VertexBuffer->Lock(0, sizeof(vertex_static)* iStartVertex, (void**)&pData, 0))) + if (!FAILED((*data)->m_pVertexBuffer->Lock(0, sizeof(vertex_static)* iStartVertex, (void**)&pData, 0))) { for (DWORD i = 0; i < lh.iSubMeshCount; i++) { @@ -140,18 +145,18 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) //memcpy((*data)->ArrVertBuf + lh.pSubLODmeshes[i].iStartVertex + k, pVertices + lh.pSubLODmeshes[i].iStartVertex + k, sizeof(vertex_static)); } } - (*data)->VertexBuffer->Unlock(); + (*data)->m_pVertexBuffer->Unlock(); } - (*data)->AllIndexCount = iStartIndex; + (*data)->m_uiAllIndexCount = iStartIndex; DWORD tmpCountIndecex = 0; - g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* iStartIndex, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &(*data)->IndexBuffer, 0); + g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* iStartIndex, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &(*data)->m_pIndexBuffer, 0); //(*data)->ArrIndBuf = new UINT[iStartIndex]; - if (!FAILED((*data)->IndexBuffer->Lock(0, sizeof(UINT)* iStartIndex, (void**)&pData, 0))) + if (!FAILED((*data)->m_pIndexBuffer->Lock(0, sizeof(UINT)* iStartIndex, (void**)&pData, 0))) { memcpy(pData, pIndices, sizeof(UINT)* iStartIndex); //memcpy((*data)->ArrIndBuf, pIndices, sizeof(UINT)* iStartIndex); - (*data)->IndexBuffer->Unlock(); + (*data)->m_pIndexBuffer->Unlock(); } for (int i = 0; i < lh.iSubMeshCount; i++) @@ -167,12 +172,12 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) } else if (header.iVersion == SX_MODEL_VERSION) { - (*data)->ArrTextures = NULL; + (*data)->m_ppTextures = NULL; Array<String> tex; if (header.iMaterialsOffset) { fseek(pf, header.iMaterialsOffset, SEEK_SET); - (*data)->ArrTextures = new char*[header.iMaterialCount]; + (*data)->m_ppTextures = new char*[header.iMaterialCount]; for (int i = 0; i < header.iMaterialCount; i++) { char c[MODEL_MAX_NAME]; @@ -212,11 +217,11 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) } } - (*data)->SubsetCount = m_pLods[0].iSubMeshCount; - (*data)->StartIndex = new UINT[m_pLods[0].iSubMeshCount]; - (*data)->IndexCount = new UINT[m_pLods[0].iSubMeshCount]; - (*data)->StartVertex = new UINT[m_pLods[0].iSubMeshCount]; - (*data)->VertexCount = new UINT[m_pLods[0].iSubMeshCount]; + (*data)->m_uiSubsetCount = m_pLods[0].iSubMeshCount; + (*data)->m_pStartIndex = new UINT[m_pLods[0].iSubMeshCount]; + (*data)->m_pIndexCount = new UINT[m_pLods[0].iSubMeshCount]; + (*data)->m_pStartVertex = new UINT[m_pLods[0].iSubMeshCount]; + (*data)->m_pVertexCount = new UINT[m_pLods[0].iSubMeshCount]; UINT iStartIndex = 0; UINT iStartVertex = 0; @@ -224,10 +229,10 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) for (int i = 0; i < lh.iSubMeshCount; i++) { - (*data)->StartIndex[i] = iStartIndex; - (*data)->StartVertex[i] = iStartVertex; - (*data)->IndexCount[i] = lh.pSubLODmeshes[i].iIndexCount; - (*data)->VertexCount[i] = lh.pSubLODmeshes[i].iVectexCount; + (*data)->m_pStartIndex[i] = iStartIndex; + (*data)->m_pStartVertex[i] = iStartVertex; + (*data)->m_pIndexCount[i] = lh.pSubLODmeshes[i].iIndexCount; + (*data)->m_pVertexCount[i] = lh.pSubLODmeshes[i].iVectexCount; lh.pSubLODmeshes[i].iStartIndex = iStartIndex; lh.pSubLODmeshes[i].iStartVertex = iStartVertex; @@ -239,8 +244,8 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) iStartIndex += lh.pSubLODmeshes[i].iIndexCount; iStartVertex += lh.pSubLODmeshes[i].iVectexCount; - (*data)->ArrTextures[i] = new char[tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1]; - memcpy((*data)->ArrTextures[i], tex[lh.pSubLODmeshes[i].iMaterialID].c_str(), (tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1) * sizeof(char)); + (*data)->m_ppTextures[i] = new char[tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1]; + memcpy((*data)->m_ppTextures[i], tex[lh.pSubLODmeshes[i].iMaterialID].c_str(), (tex[lh.pSubLODmeshes[i].iMaterialID].length() + 1) * sizeof(char)); } UINT * pIndices = new UINT[iStartIndex]; @@ -252,26 +257,26 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) memcpy(pVertices + lh.pSubLODmeshes[i].iStartVertex, lh.pSubLODmeshes[i].pVertices, sizeof(vertex_static)* lh.pSubLODmeshes[i].iVectexCount); } - (*data)->AllVertexCount = iStartVertex; - g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* iStartVertex, NULL, NULL, D3DPOOL_MANAGED, &(*data)->VertexBuffer, 0); + (*data)->m_uiAllVertexCount = iStartVertex; + g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* iStartVertex, NULL, NULL, D3DPOOL_MANAGED, &(*data)->m_pVertexBuffer, 0); //(*data)->ArrVertBuf = new vertex_static[iStartVertex]; vertex_static * pData; - if (!FAILED((*data)->VertexBuffer->Lock(0, sizeof(vertex_static)* iStartVertex, (void**)&pData, 0))) + if (!FAILED((*data)->m_pVertexBuffer->Lock(0, sizeof(vertex_static)* iStartVertex, (void**)&pData, 0))) { memcpy(pData, pVertices, sizeof(vertex_static)* iStartVertex); //memcpy((*data)->ArrVertBuf, pVertices, sizeof(vertex_static)* iStartVertex); - (*data)->VertexBuffer->Unlock(); + (*data)->m_pVertexBuffer->Unlock(); } - (*data)->AllIndexCount = iStartIndex; - g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* iStartIndex, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &(*data)->IndexBuffer, 0); + (*data)->m_uiAllIndexCount = iStartIndex; + g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* iStartIndex, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &(*data)->m_pIndexBuffer, 0); //(*data)->ArrIndBuf = new UINT[iStartIndex]; - if (!FAILED((*data)->IndexBuffer->Lock(0, sizeof(UINT)* iStartIndex, (void**)&pData, 0))) + if (!FAILED((*data)->m_pIndexBuffer->Lock(0, sizeof(UINT)* iStartIndex, (void**)&pData, 0))) { memcpy(pData, pIndices, sizeof(UINT)* iStartIndex); //memcpy((*data)->ArrIndBuf, pIndices, sizeof(UINT)* iStartIndex); - (*data)->IndexBuffer->Unlock(); + (*data)->m_pIndexBuffer->Unlock(); } @@ -295,17 +300,17 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) //���������� �������� //{{ DataStaticModel* tmpmodel = new DataStaticModel(); - tmpmodel->SubsetCount = 0; - tmpmodel->ArrTextures = new char*[(*data)->SubsetCount]; - memset(tmpmodel->ArrTextures, 0, (*data)->SubsetCount * sizeof(char)); + tmpmodel->m_uiSubsetCount = 0; + tmpmodel->m_ppTextures = new char*[(*data)->m_uiSubsetCount]; + memset(tmpmodel->m_ppTextures, 0, (*data)->m_uiSubsetCount * sizeof(char)); - vertex_static* ArrVertBuf = new vertex_static[(*data)->AllVertexCount]; - UINT* ArrIndBuf = new UINT[(*data)->AllIndexCount]; + vertex_static* ArrVertBuf = new vertex_static[(*data)->m_uiAllVertexCount]; + UINT* ArrIndBuf = new UINT[(*data)->m_uiAllIndexCount]; - tmpmodel->StartIndex = new UINT[(*data)->SubsetCount]; - tmpmodel->StartVertex = new UINT[(*data)->SubsetCount]; - tmpmodel->IndexCount = new UINT[(*data)->SubsetCount]; - tmpmodel->VertexCount = new UINT[(*data)->SubsetCount]; + tmpmodel->m_pStartIndex = new UINT[(*data)->m_uiSubsetCount]; + tmpmodel->m_pStartVertex = new UINT[(*data)->m_uiSubsetCount]; + tmpmodel->m_pIndexCount = new UINT[(*data)->m_uiSubsetCount]; + tmpmodel->m_pVertexCount = new UINT[(*data)->m_uiSubsetCount]; long startindex = 0; long startvertex = 0; @@ -316,117 +321,117 @@ void SGCore_StaticModelLoad(const char * file, ISXDataStaticModel** data) vertex_static* pVert; UINT* pInd; - (*data)->VertexBuffer->Lock(0, 0, (void**)&pVert, 0); + (*data)->m_pVertexBuffer->Lock(0, 0, (void**)&pVert, 0); - (*data)->IndexBuffer->Lock(0, 0, (void**)&pInd, 0); + (*data)->m_pIndexBuffer->Lock(0, 0, (void**)&pInd, 0); - for (long i = 0; i < (*data)->SubsetCount; ++i) + for (long i = 0; i < (*data)->m_uiSubsetCount; ++i) { - if ((*data)->ArrTextures[i][0] == 0) + if ((*data)->m_ppTextures[i][0] == 0) continue; - tmpmodel->ArrTextures[tmpmodel->SubsetCount] = new char[strlen((*data)->ArrTextures[i]) + 1]; - strcpy(tmpmodel->ArrTextures[tmpmodel->SubsetCount], (*data)->ArrTextures[i]); + tmpmodel->m_ppTextures[tmpmodel->m_uiSubsetCount] = new char[strlen((*data)->m_ppTextures[i]) + 1]; + strcpy(tmpmodel->m_ppTextures[tmpmodel->m_uiSubsetCount], (*data)->m_ppTextures[i]); startvertex = countvertex; startindex = countindex; - tmpmodel->StartIndex[tmpmodel->SubsetCount] = startindex; - tmpmodel->StartVertex[tmpmodel->SubsetCount] = startvertex; + tmpmodel->m_pStartIndex[tmpmodel->m_uiSubsetCount] = startindex; + tmpmodel->m_pStartVertex[tmpmodel->m_uiSubsetCount] = startvertex; - memcpy(ArrVertBuf + startvertex, pVert + (*data)->StartVertex[i], sizeof(vertex_static)* (*data)->VertexCount[i]); - memcpy(ArrIndBuf + startindex, pInd + (*data)->StartIndex[i], sizeof(UINT)* (*data)->IndexCount[i]); + memcpy(ArrVertBuf + startvertex, pVert + (*data)->m_pStartVertex[i], sizeof(vertex_static)* (*data)->m_pVertexCount[i]); + memcpy(ArrIndBuf + startindex, pInd + (*data)->m_pStartIndex[i], sizeof(UINT)* (*data)->m_pIndexCount[i]); - for (long j = 0; j < (*data)->IndexCount[i]; ++j) + for (long j = 0; j < (*data)->m_pIndexCount[i]; ++j) { - ArrIndBuf[countindex + j] = countvertex + (pInd[(*data)->StartIndex[i] + j] - (*data)->StartVertex[i]); + ArrIndBuf[countindex + j] = countvertex + (pInd[(*data)->m_pStartIndex[i] + j] - (*data)->m_pStartVertex[i]); } - countvertex += (*data)->VertexCount[i]; - countindex += (*data)->IndexCount[i]; + countvertex += (*data)->m_pVertexCount[i]; + countindex += (*data)->m_pIndexCount[i]; - for (long k = i + 1; k < (*data)->SubsetCount; ++k) + for (long k = i + 1; k < (*data)->m_uiSubsetCount; ++k) { - if (strcmp((*data)->ArrTextures[i], (*data)->ArrTextures[k]) == 0) + if (strcmp((*data)->m_ppTextures[i], (*data)->m_ppTextures[k]) == 0) { - (*data)->ArrTextures[k][0] = 0; - memcpy(ArrVertBuf + countvertex, pVert + (*data)->StartVertex[k], sizeof(vertex_static)* (*data)->VertexCount[k]); + (*data)->m_ppTextures[k][0] = 0; + memcpy(ArrVertBuf + countvertex, pVert + (*data)->m_pStartVertex[k], sizeof(vertex_static)* (*data)->m_pVertexCount[k]); - memcpy(ArrIndBuf + countindex, pInd + (*data)->StartIndex[k], sizeof(UINT)* (*data)->IndexCount[k]); + memcpy(ArrIndBuf + countindex, pInd + (*data)->m_pStartIndex[k], sizeof(UINT)* (*data)->m_pIndexCount[k]); - for (long j = 0; j < (*data)->IndexCount[k]; ++j) + for (long j = 0; j < (*data)->m_pIndexCount[k]; ++j) { - ArrIndBuf[countindex + j] = countvertex + (pInd[(*data)->StartIndex[k] + j] - (*data)->StartVertex[k]); + ArrIndBuf[countindex + j] = countvertex + (pInd[(*data)->m_pStartIndex[k] + j] - (*data)->m_pStartVertex[k]); } - countvertex += (*data)->VertexCount[k]; - countindex += (*data)->IndexCount[k]; + countvertex += (*data)->m_pVertexCount[k]; + countindex += (*data)->m_pIndexCount[k]; } } - tmpmodel->VertexCount[tmpmodel->SubsetCount] = countvertex - startvertex; - tmpmodel->IndexCount[tmpmodel->SubsetCount] = countindex - startindex; + tmpmodel->m_pVertexCount[tmpmodel->m_uiSubsetCount] = countvertex - startvertex; + tmpmodel->m_pIndexCount[tmpmodel->m_uiSubsetCount] = countindex - startindex; - ++tmpmodel->SubsetCount; + ++tmpmodel->m_uiSubsetCount; } - (*data)->VertexBuffer->Unlock(); - (*data)->IndexBuffer->Unlock(); + (*data)->m_pVertexBuffer->Unlock(); + (*data)->m_pIndexBuffer->Unlock(); - tmpmodel->AllIndexCount = countindex; - tmpmodel->AllVertexCount = countvertex; + tmpmodel->m_uiAllIndexCount = countindex; + tmpmodel->m_uiAllVertexCount = countvertex; - g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* countvertex, NULL, NULL, D3DPOOL_MANAGED, &tmpmodel->VertexBuffer, 0); + g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* countvertex, NULL, NULL, D3DPOOL_MANAGED, &tmpmodel->m_pVertexBuffer, 0); vertex_static * pData; - if (!FAILED(tmpmodel->VertexBuffer->Lock(0, sizeof(vertex_static)* countvertex, (void**)&pData, 0))) + if (!FAILED(tmpmodel->m_pVertexBuffer->Lock(0, sizeof(vertex_static)* countvertex, (void**)&pData, 0))) { memcpy(pData, ArrVertBuf, sizeof(vertex_static)* countvertex); float3_t tmppos = pData[0].Pos; - tmpmodel->BBMax = tmppos; - tmpmodel->BBMin = tmppos; + tmpmodel->m_vBBMax = tmppos; + tmpmodel->m_vBBMin = tmppos; float3_t pos; for (long i = 0; i<countvertex; i++) { pos = pData[i].Pos; - if (pos.x > tmpmodel->BBMax.x) - tmpmodel->BBMax.x = pos.x; + if (pos.x > tmpmodel->m_vBBMax.x) + tmpmodel->m_vBBMax.x = pos.x; - if (pos.y > tmpmodel->BBMax.y) - tmpmodel->BBMax.y = pos.y; + if (pos.y > tmpmodel->m_vBBMax.y) + tmpmodel->m_vBBMax.y = pos.y; - if (pos.z > tmpmodel->BBMax.z) - tmpmodel->BBMax.z = pos.z; + if (pos.z > tmpmodel->m_vBBMax.z) + tmpmodel->m_vBBMax.z = pos.z; - if (pos.x < tmpmodel->BBMin.x) - tmpmodel->BBMin.x = pos.x; + if (pos.x < tmpmodel->m_vBBMin.x) + tmpmodel->m_vBBMin.x = pos.x; - if (pos.y < tmpmodel->BBMin.y) - tmpmodel->BBMin.y = pos.y; + if (pos.y < tmpmodel->m_vBBMin.y) + tmpmodel->m_vBBMin.y = pos.y; - if (pos.z < tmpmodel->BBMin.z) - tmpmodel->BBMin.z = pos.z; + if (pos.z < tmpmodel->m_vBBMin.z) + tmpmodel->m_vBBMin.z = pos.z; } - float3 Center = (tmpmodel->BBMin + tmpmodel->BBMax) * 0.5f; - tmpmodel->BSphere.x = Center.x; - tmpmodel->BSphere.y = Center.y; - tmpmodel->BSphere.z = Center.z; - tmpmodel->BSphere.w = SMVector3Length(Center - tmpmodel->BBMax); + float3 Center = (tmpmodel->m_vBBMin + tmpmodel->m_vBBMax) * 0.5f; + tmpmodel->m_vBSphere.x = Center.x; + tmpmodel->m_vBSphere.y = Center.y; + tmpmodel->m_vBSphere.z = Center.z; + tmpmodel->m_vBSphere.w = SMVector3Length(Center - tmpmodel->m_vBBMax); - tmpmodel->VertexBuffer->Unlock(); + tmpmodel->m_pVertexBuffer->Unlock(); } - g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* countindex, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &tmpmodel->IndexBuffer, 0); + g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* countindex, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &tmpmodel->m_pIndexBuffer, 0); - if (!FAILED(tmpmodel->IndexBuffer->Lock(0, sizeof(UINT)* countindex, (void**)&pData, 0))) + if (!FAILED(tmpmodel->m_pIndexBuffer->Lock(0, sizeof(UINT)* countindex, (void**)&pData, 0))) { memcpy(pData, ArrIndBuf, sizeof(UINT)* countindex); - tmpmodel->IndexBuffer->Unlock(); + tmpmodel->m_pIndexBuffer->Unlock(); } mem_release_del((*data)); @@ -448,7 +453,7 @@ void SGCore_StaticModelSave(const char * file, DataStaticModel** data) if (!pF) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "unable to open model file '%s'\n", file); + LibReport(REPORT_MSG_LEVEL_ERROR, "unable to open model file '%s'\n", file); return; } @@ -456,7 +461,7 @@ void SGCore_StaticModelSave(const char * file, DataStaticModel** data) hdr.iBoneCount = 1; hdr.iFlags = MODEL_FLAG_COMPILED | MODEL_FLAG_STATIC; - hdr.iMaterialCount = (*data)->SubsetCount; + hdr.iMaterialCount = (*data)->m_uiSubsetCount; hdr.iSkinCount = 1; hdr.iVersion = SX_MODEL_VERSION_OLD; @@ -465,7 +470,7 @@ void SGCore_StaticModelSave(const char * file, DataStaticModel** data) UINT iMaterialsSize = 0; for (UINT i = 0; i < hdr.iMaterialCount; i++) { - iMaterialsSize += strlen((*data)->ArrTextures[i]) + 1; + iMaterialsSize += strlen((*data)->m_ppTextures[i]) + 1; } hdr.iBonesOffset = 0; @@ -476,8 +481,8 @@ void SGCore_StaticModelSave(const char * file, DataStaticModel** data) iLodSize += sizeof(int); for (int i = 0; i < hdr.iMaterialCount; i++) { - iLodSize += sizeof(vertex_animated_ex)* (*data)->VertexCount[i]; - iLodSize += sizeof(UINT)* (*data)->IndexCount[i]; + iLodSize += sizeof(vertex_animated_ex)* (*data)->m_pVertexCount[i]; + iLodSize += sizeof(UINT)* (*data)->m_pIndexCount[i]; iLodSize += sizeof(int)* 3; } @@ -487,29 +492,29 @@ void SGCore_StaticModelSave(const char * file, DataStaticModel** data) fwrite(&hdr, sizeof(hdr), 1, pF); for (UINT i = 0; i < hdr.iMaterialCount; i++) { - fwrite((*data)->ArrTextures[i], 1, strlen((*data)->ArrTextures[i]) + 1, pF); + fwrite((*data)->m_ppTextures[i], 1, strlen((*data)->m_ppTextures[i]) + 1, pF); } int smc = hdr.iMaterialCount; fwrite(&smc, sizeof(int), 1, pF); vertex_animated_ex * pVB; UINT * pIB; - (*data)->VertexBuffer->Lock(0, 0, (void**)&pVB, 0); - (*data)->IndexBuffer->Lock(0, 0, (void**)&pIB, 0); + (*data)->m_pVertexBuffer->Lock(0, 0, (void**)&pVB, 0); + (*data)->m_pIndexBuffer->Lock(0, 0, (void**)&pIB, 0); UINT iVC = 0; UINT iIC = 0; for (int i = 0; i < hdr.iMaterialCount; i++) { fwrite(&i, sizeof(int), 1, pF); - fwrite(&(*data)->VertexCount[i], sizeof(int), 1, pF); - fwrite(&(*data)->IndexCount[i], sizeof(int), 1, pF); + fwrite(&(*data)->m_pVertexCount[i], sizeof(int), 1, pF); + fwrite(&(*data)->m_pIndexCount[i], sizeof(int), 1, pF); - fwrite(pVB + iVC, sizeof(vertex_animated_ex), (*data)->VertexCount[i], pF); - fwrite(pIB + iIC, sizeof(UINT), (*data)->IndexCount[i], pF); - iVC += (*data)->VertexCount[i]; - iIC += (*data)->IndexCount[i]; + fwrite(pVB + iVC, sizeof(vertex_animated_ex), (*data)->m_pVertexCount[i], pF); + fwrite(pIB + iIC, sizeof(UINT), (*data)->m_pIndexCount[i], pF); + iVC += (*data)->m_pVertexCount[i]; + iIC += (*data)->m_pIndexCount[i]; } - (*data)->VertexBuffer->Unlock(); - (*data)->IndexBuffer->Unlock(); + (*data)->m_pVertexBuffer->Unlock(); + (*data)->m_pIndexBuffer->Unlock(); fclose(pF); } @@ -530,7 +535,7 @@ void SGCore_StaticModelSave(const char * file, DataStaticModel** data) &Mesh)) ) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "failed loaded X mesh '%s'\n", pathx); + LibReport(REPORT_MSG_LEVEL_ERROR, "failed loaded X mesh '%s'\n", pathx); return; } diff --git a/source/gcore/loader_static.h b/source/gcore/loader_static.h index a38f155b3..3bbbeecdf 100644 --- a/source/gcore/loader_static.h +++ b/source/gcore/loader_static.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __LOADER_STATIC_H #define __LOADER_STATIC_H @@ -9,7 +14,6 @@ #include <common/Array.h> #include "sxgcore.h" -extern report_func g_fnReportf; extern IDirect3DDevice9 *g_pDXDevice; extern D3DPRESENT_PARAMETERS D3DAPP; extern IDirect3DVertexDeclaration9 *g_pStaticVertexDecl; @@ -18,101 +22,96 @@ struct DataStaticModel : public ISXDataStaticModel { DataStaticModel() { - VertexBuffer = 0; - IndexBuffer = 0; + m_pVertexBuffer = 0; + m_pIndexBuffer = 0; //ArrVertBuf = 0; //ArrIndBuf = 0; - SubsetCount = 0; - ArrTextures = 0; - StartIndex = 0; - IndexCount = 0; - StartVertex = 0; - VertexCount = 0; - AllIndexCount = 0; - AllVertexCount = 0; + m_uiSubsetCount = 0; + m_ppTextures = 0; + m_pStartIndex = 0; + m_pIndexCount = 0; + m_pStartVertex = 0; + m_pVertexCount = 0; + m_uiAllIndexCount = 0; + m_uiAllVertexCount = 0; } void Release(){ mem_del(this); } - ISXDataStaticModel* GetCopy() + ISXDataStaticModel* getCopy() { ISXDataStaticModel* nm = new DataStaticModel(); - nm->ArrTextures = new char*[SubsetCount]; - for (DWORD i = 0; i < SubsetCount; i++) + nm->m_ppTextures = new char*[m_uiSubsetCount]; + for (DWORD i = 0; i < m_uiSubsetCount; i++) { - nm->ArrTextures[i] = new char[strlen(ArrTextures[i]) + 1]; - sprintf(nm->ArrTextures[i], "%s", ArrTextures[i]); + nm->m_ppTextures[i] = new char[strlen(m_ppTextures[i]) + 1]; + sprintf(nm->m_ppTextures[i], "%s", m_ppTextures[i]); } - nm->SubsetCount = SubsetCount; - nm->StartIndex = new UINT[SubsetCount]; - memcpy(nm->StartIndex, StartIndex, sizeof(UINT)*SubsetCount); - nm->IndexCount = new UINT[SubsetCount]; - memcpy(nm->IndexCount, IndexCount, sizeof(UINT)*SubsetCount); - nm->StartVertex = new UINT[SubsetCount]; - memcpy(nm->StartVertex, StartVertex, sizeof(UINT)*SubsetCount); - nm->VertexCount = new UINT[SubsetCount]; - memcpy(nm->VertexCount, VertexCount, sizeof(UINT)*SubsetCount); + nm->m_uiSubsetCount = m_uiSubsetCount; + nm->m_pStartIndex = new UINT[m_uiSubsetCount]; + memcpy(nm->m_pStartIndex, m_pStartIndex, sizeof(UINT)*m_uiSubsetCount); + nm->m_pIndexCount = new UINT[m_uiSubsetCount]; + memcpy(nm->m_pIndexCount, m_pIndexCount, sizeof(UINT)*m_uiSubsetCount); + nm->m_pStartVertex = new UINT[m_uiSubsetCount]; + memcpy(nm->m_pStartVertex, m_pStartVertex, sizeof(UINT)*m_uiSubsetCount); + nm->m_pVertexCount = new UINT[m_uiSubsetCount]; + memcpy(nm->m_pVertexCount, m_pVertexCount, sizeof(UINT)*m_uiSubsetCount); DWORD tmpvert = 0; DWORD tmpind = 0; - for (DWORD i = 0; i < SubsetCount; i++) + for (DWORD i = 0; i < m_uiSubsetCount; i++) { - tmpvert += nm->VertexCount[i]; - tmpind += nm->IndexCount[i]; + tmpvert += nm->m_pVertexCount[i]; + tmpind += nm->m_pIndexCount[i]; } - g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* tmpvert, NULL, NULL, D3DPOOL_MANAGED, &nm->VertexBuffer, 0); + g_pDXDevice->CreateVertexBuffer(sizeof(vertex_static)* tmpvert, NULL, NULL, D3DPOOL_MANAGED, &nm->m_pVertexBuffer, 0); //nm->ArrVertBuf = new vertex_static[tmpvert]; vertex_static * dstData, *srcData; - nm->VertexBuffer->Lock(0, 0, (void**)&dstData, 0); - VertexBuffer->Lock(0, 0, (void**)&srcData, 0); + nm->m_pVertexBuffer->Lock(0, 0, (void**)&dstData, 0); + m_pVertexBuffer->Lock(0, 0, (void**)&srcData, 0); memcpy(dstData, srcData, sizeof(vertex_static)* tmpvert); //memcpy(nm->ArrVertBuf, srcData, sizeof(vertex_static)* tmpvert); - nm->VertexBuffer->Unlock(); - VertexBuffer->Unlock(); + nm->m_pVertexBuffer->Unlock(); + m_pVertexBuffer->Unlock(); - g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* tmpind, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &nm->IndexBuffer, 0); + g_pDXDevice->CreateIndexBuffer(sizeof(UINT)* tmpind, NULL, D3DFMT_INDEX32, D3DPOOL_MANAGED, &nm->m_pIndexBuffer, 0); //nm->ArrIndBuf = new UINT[tmpind]; - nm->IndexBuffer->Lock(0, 0, (void**)&dstData, 0); - IndexBuffer->Lock(0, 0, (void**)&srcData, 0); + nm->m_pIndexBuffer->Lock(0, 0, (void**)&dstData, 0); + m_pIndexBuffer->Lock(0, 0, (void**)&srcData, 0); memcpy(dstData, srcData, sizeof(UINT)* tmpind); //memcpy(nm->ArrIndBuf, srcData, sizeof(UINT)* tmpind); - nm->IndexBuffer->Unlock(); - IndexBuffer->Unlock(); + nm->m_pIndexBuffer->Unlock(); + m_pIndexBuffer->Unlock(); return nm; } DataStaticModel::~DataStaticModel() { - mem_release_del(VertexBuffer); - mem_release_del(IndexBuffer); + mem_release_del(m_pVertexBuffer); + mem_release_del(m_pIndexBuffer); - for (DWORD i = 0; i < SubsetCount; ++i) + for (DWORD i = 0; i < m_uiSubsetCount; ++i) { - mem_delete_a(ArrTextures[i]); + mem_delete_a(m_ppTextures[i]); } //mem_delete_a(ArrVertBuf); //mem_delete_a(ArrIndBuf); - mem_delete_a(ArrTextures); - mem_delete_a(StartIndex); - mem_delete_a(IndexCount); - mem_delete_a(StartVertex); - mem_delete_a(VertexCount); + mem_delete_a(m_ppTextures); + mem_delete_a(m_pStartIndex); + mem_delete_a(m_pIndexCount); + mem_delete_a(m_pStartVertex); + mem_delete_a(m_pVertexCount); } }; - -/////////// - - - #endif \ No newline at end of file diff --git a/source/gcore/shader.cpp b/source/gcore/shader.cpp index 945f0c85a..e81b4e176 100644 --- a/source/gcore/shader.cpp +++ b/source/gcore/shader.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "shader.h" CShaderFileCache* CreateShaderFileCacheFormShader(CShader *pShader) @@ -219,7 +224,7 @@ void LoadVertexShader(const char *szPath, CShaderVS *pShader, D3DXMACRO *aMacro) ); if (FAILED(hr)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - error creating vertex shader [%s]\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error creating vertex shader [%s]\n", GEN_MSG_LOCATION, szPath); return; } @@ -248,14 +253,14 @@ void LoadVertexShader(const char *szPath, CShaderVS *pShader, D3DXMACRO *aMacro) if (pBufError && pBufShader == 0) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - failed to load vertex shader [%s], msg: %s\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath, (char*)pBufError->GetBufferPointer()); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed to load vertex shader [%s], msg: %s\n", GEN_MSG_LOCATION, szPath, (char*)pBufError->GetBufferPointer()); return; } //!!!���������������� if (FAILED(hr)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - download function vertex shader fails, path [%s]\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - download function vertex shader fails, path [%s]\n", GEN_MSG_LOCATION, szPath); return; } @@ -266,7 +271,7 @@ void LoadVertexShader(const char *szPath, CShaderVS *pShader, D3DXMACRO *aMacro) if (FAILED(hr)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - error creating vertex shader [%s]\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error creating vertex shader [%s]\n", GEN_MSG_LOCATION, szPath); return; } @@ -275,7 +280,7 @@ void LoadVertexShader(const char *szPath, CShaderVS *pShader, D3DXMACRO *aMacro) if (desc.Constants > SXGC_SHADER_VAR_MAX_COUNT) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - error, count variable in vertex shader [%s] more standart [%d]\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath, SXGC_SHADER_VAR_MAX_COUNT); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error, count variable in vertex shader [%s] more standart [%d]\n", GEN_MSG_LOCATION, szPath, SXGC_SHADER_VAR_MAX_COUNT); return; } @@ -336,7 +341,7 @@ void LoadPixelShader(const char *szPath, CShaderPS *pShader,D3DXMACRO *aMacro) ); if (FAILED(hr)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - error creating pixel shader [%s]", SX_LIB_NAME, GEN_MSG_LOCATION, szPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error creating pixel shader [%s]", GEN_MSG_LOCATION, szPath); return; } @@ -365,14 +370,14 @@ void LoadPixelShader(const char *szPath, CShaderPS *pShader,D3DXMACRO *aMacro) if (pBufError && pBufShader == 0) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - failed to load pixel shader [%s], msg: %s\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath, (char*)pBufError->GetBufferPointer()); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed to load pixel shader [%s], msg: %s\n", GEN_MSG_LOCATION, szPath, (char*)pBufError->GetBufferPointer()); return; } //!!!���������������� if (FAILED(hr)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - download function pixel shader fails, path [%s]\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - download function pixel shader fails, path [%s]\n", GEN_MSG_LOCATION, szPath); return; } @@ -383,7 +388,7 @@ void LoadPixelShader(const char *szPath, CShaderPS *pShader,D3DXMACRO *aMacro) if (FAILED(hr)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - error creating pixel shader [%s]\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error creating pixel shader [%s]\n", GEN_MSG_LOCATION, szPath); return; } @@ -392,7 +397,7 @@ void LoadPixelShader(const char *szPath, CShaderPS *pShader,D3DXMACRO *aMacro) if (desc.Constants > SXGC_SHADER_VAR_MAX_COUNT) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - error, count variable in pixel shader [%s] more standart [%d]\n", SX_LIB_NAME, GEN_MSG_LOCATION, szPath, SXGC_SHADER_VAR_MAX_COUNT); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error, count variable in pixel shader [%s] more standart [%d]\n", GEN_MSG_LOCATION, szPath, SXGC_SHADER_VAR_MAX_COUNT); return; } @@ -444,25 +449,25 @@ CShaderManager::~CShaderManager() void CShaderManager::reloadAll() { - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: reload shaders ...\n", SX_LIB_NAME); + LibReport(REPORT_MSG_LEVEL_NOTICE, "reload shaders ...\n"); for (int i = 0; i<m_aVS.size(); i++) { CShaderVS *pShader = m_aVS[i]; LoadVertexShader(pShader->m_szPath, pShader, pShader->m_aMacros); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " VS id [%d], file [%s], name [%s], \n", i, pShader->m_szPath, pShader->m_szName); + LibReport(REPORT_MSG_LEVEL_NOTICE, " VS id [%d], file [%s], name [%s], \n", i, pShader->m_szPath, pShader->m_szName); } - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " -------\n"); + LibReport(REPORT_MSG_LEVEL_NOTICE, " -------\n"); for (int i = 0; i<m_aPS.size(); i++) { CShaderPS *pShader = m_aPS[i]; LoadPixelShader(m_aPS[i]->m_szPath, m_aPS[i], m_aPS[i]->m_aMacros); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " PS id [%d], file[%s], name[%s], \n", i, pShader->m_szPath, pShader->m_szName); + LibReport(REPORT_MSG_LEVEL_NOTICE, " PS id [%d], file[%s], name[%s], \n", i, pShader->m_szPath, pShader->m_szName); } - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: all reloaded shaders\n", SX_LIB_NAME); + LibReport(REPORT_MSG_LEVEL_NOTICE, "all reloaded shaders\n"); } ID CShaderManager::existsPath(SHADER_TYPE type, const char *szPath) @@ -490,7 +495,7 @@ ID CShaderManager::existsName(SHADER_TYPE type_shader, const char *szName) { if (!isValidateTypeName(type_shader, szName)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - name of shader [%s] is invalid", SX_LIB_NAME, GEN_MSG_LOCATION, szName); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - name of shader [%s] is invalid", GEN_MSG_LOCATION, szName); return -1; } @@ -542,7 +547,7 @@ ID CShaderManager::preLoad(SHADER_TYPE type, const char *szPath, const char *szN { if (!isValidateTypeName(type, szName)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - name of shader [%s] is invalid", SX_LIB_NAME, GEN_MSG_LOCATION, szName); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - name of shader [%s] is invalid", GEN_MSG_LOCATION, szName); return -1; } @@ -611,37 +616,37 @@ void CShaderManager::allLoad() if (m_aVS.size() == m_iLastAllLoadVS || m_aPS.size() == m_iLastAllLoadPS) return; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: load shaders ...\n", SX_LIB_NAME); + LibReport(REPORT_MSG_LEVEL_NOTICE, "load shaders ...\n"); for (int i = 0, il = m_aVS.size(); i < il; ++i) { CShaderVS *pShader = m_aVS[i]; LoadVertexShader(pShader->m_szPath, pShader, pShader->m_aMacros); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " VS id [%d], file [%s], name [%s], \n", i, pShader->m_szPath, pShader->m_szName); + LibReport(REPORT_MSG_LEVEL_NOTICE, " VS id [%d], file [%s], name [%s], \n", i, pShader->m_szPath, pShader->m_szName); } - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " -------\n"); + LibReport(REPORT_MSG_LEVEL_NOTICE, " -------\n"); for (int i = 0, il = m_aPS.size(); i < il; ++i) { CShaderPS *pShader = m_aPS[i]; LoadPixelShader(pShader->m_szPath, pShader, pShader->m_aMacros); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " PS id [%d], file[%s], name[%s], \n", i, pShader->m_szPath, pShader->m_szName); + LibReport(REPORT_MSG_LEVEL_NOTICE, " PS id [%d], file[%s], name[%s], \n", i, pShader->m_szPath, pShader->m_szName); } m_iLastAllLoadVS = m_aVS.size(); m_iLastAllLoadPS = m_aPS.size(); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: all loaded shaders\n", SX_LIB_NAME); + LibReport(REPORT_MSG_LEVEL_NOTICE, "all loaded shaders\n"); } void CShaderManager::update(SHADER_TYPE type_shader, const char *szName) { if (!isValidateTypeName(type_shader, szName)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - name of shader [%s] is invalid", SX_LIB_NAME, GEN_MSG_LOCATION, szName); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - name of shader [%s] is invalid", GEN_MSG_LOCATION, szName); return; } @@ -674,9 +679,9 @@ void CShaderManager::update(SHADER_TYPE type_shader, const char *szName) } if (!isUpdate) - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - shader [%s] is not detected", SX_LIB_NAME, GEN_MSG_LOCATION, szName); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - shader [%s] is not detected", GEN_MSG_LOCATION, szName); /*else - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: shader [%s] is update", SX_LIB_NAME, name);*/ + LibReport(REPORT_MSG_LEVEL_NOTICE, "shader [%s] is update", name);*/ } void CShaderManager::update(SHADER_TYPE type_shader, ID id) @@ -704,16 +709,16 @@ void CShaderManager::update(SHADER_TYPE type_shader, ID id) } if (!isUpdate) - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - shader_id [%s] is not detected", SX_LIB_NAME, GEN_MSG_LOCATION, id); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - shader_id [%s] is not detected", GEN_MSG_LOCATION, id); /*else - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "%s: shader [%s] is update", SX_LIB_NAME, m_aPS[id]->m_szName);*/ + LibReport(REPORT_MSG_LEVEL_NOTICE, "shader [%s] is update", m_aPS[id]->m_szName);*/ } ID CShaderManager::getID(SHADER_TYPE type_shader, const char *szName) { if (!isValidateTypeName(type_shader, szName)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - name of shader [%s] is invalid", SX_LIB_NAME, GEN_MSG_LOCATION, szName); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - name of shader [%s] is invalid", GEN_MSG_LOCATION, szName); return -1; } @@ -744,7 +749,7 @@ void CShaderManager::bind(SHADER_TYPE type_shader, const char *szName) { if (!isValidateTypeName(type_shader, szName)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - name of shader [%s] is invalid", SX_LIB_NAME, GEN_MSG_LOCATION, szName); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - name of shader [%s] is invalid", GEN_MSG_LOCATION, szName); return; } @@ -775,7 +780,7 @@ void CShaderManager::bind(SHADER_TYPE type_shader, const char *szName) } if (!isbind) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: shader not bind, type [%d], name [%s]\n", SX_LIB_NAME, type_shader, szName); + LibReport(REPORT_MSG_LEVEL_WARNING, "shader not bind, type [%d], name [%s]\n", type_shader, szName); } void CShaderManager::bind(SHADER_TYPE type_shader, ID idShader) @@ -799,7 +804,7 @@ void CShaderManager::bind(SHADER_TYPE type_shader, ID idShader) } if (!isBind) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: shader not bind, type [%d], id [%d]\n", SX_LIB_NAME, type_shader, idShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "shader not bind, type [%d], id [%d]\n", type_shader, idShader); } void CShaderManager::unbind() @@ -813,7 +818,7 @@ void CShaderManager::setValueRegisterF(SHADER_TYPE type_shader, const char *szNa { if (!isValidateTypeName(type_shader, szNameShader)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - name of shader [%s] is invalid", SX_LIB_NAME, GEN_MSG_LOCATION, szNameShader); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - name of shader [%s] is invalid", GEN_MSG_LOCATION, szNameShader); return; } @@ -844,9 +849,9 @@ void CShaderManager::setValueRegisterF(SHADER_TYPE type_shader, const char *szNa else { if (num_shader == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set vertex shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set vertex shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", szNameVar, type_shader, szNameShader); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set vertex shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set vertex shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", szNameVar, type_shader, szNameShader); } } else if (type_shader == SHADER_TYPE_PIXEL) @@ -876,9 +881,9 @@ void CShaderManager::setValueRegisterF(SHADER_TYPE type_shader, const char *szNa else { if (num_shader == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set pixel shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set pixel shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", szNameVar, type_shader, szNameShader); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set pixel shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set pixel shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", szNameVar, type_shader, szNameShader); } } } @@ -903,7 +908,7 @@ void CShaderManager::setValueRegisterF(SHADER_TYPE type_shader, ID idShader, con if (idShader != -1 && num_var != -1) g_pDXDevice->SetVertexShaderConstantF(m_aVS[idShader]->m_aVarDesc[num_var].RegisterIndex, (float*)pData, (iCountFloat4 == 0 ? m_aVS[idShader]->m_aVarDesc[num_var].RegisterCount : iCountFloat4)); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set vertex shader constant [%s] is failed, constant not found, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, idShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set vertex shader constant [%s] is failed, constant not found, type [%d], id [%d]\n", szNameVar, type_shader, idShader); } else if (type_shader == SHADER_TYPE_PIXEL) { @@ -921,18 +926,18 @@ void CShaderManager::setValueRegisterF(SHADER_TYPE type_shader, ID idShader, con if (idShader != -1 && num_var != -1) g_pDXDevice->SetPixelShaderConstantF(m_aPS[idShader]->m_aVarDesc[num_var].RegisterIndex, (float*)pData, (iCountFloat4 == 0 ? m_aPS[idShader]->m_aVarDesc[num_var].RegisterCount : iCountFloat4)); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set pixel shader constant [%s] is failed, constant not found, type [%d], name [%s]\n", SX_LIB_NAME, szNameVar, type_shader, m_aPS[idShader]->m_szPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "set pixel shader constant [%s] is failed, constant not found, type [%d], name [%s]\n", szNameVar, type_shader, m_aPS[idShader]->m_szPath); } } else - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set shader constant [%s] is failed, shader not validate, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, idShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set shader constant [%s] is failed, shader not validate, type [%d], id [%d]\n", szNameVar, type_shader, idShader); } void CShaderManager::setValueRegisterI(SHADER_TYPE type_shader, const char *szNameShader, const char *szNameVar, void *pData, int iCountInt4) { if (!isValidateTypeName(type_shader, szNameShader)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - name of shader [%s] is invalid", SX_LIB_NAME, GEN_MSG_LOCATION, szNameShader); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - name of shader [%s] is invalid", GEN_MSG_LOCATION, szNameShader); return; } @@ -963,9 +968,9 @@ void CShaderManager::setValueRegisterI(SHADER_TYPE type_shader, const char *szNa else { if (num_shader == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set vertex shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set vertex shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", szNameVar, type_shader, szNameShader); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set vertex shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set vertex shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", szNameVar, type_shader, szNameShader); } } else if (type_shader == SHADER_TYPE_PIXEL) @@ -995,9 +1000,9 @@ void CShaderManager::setValueRegisterI(SHADER_TYPE type_shader, const char *szNa else { if (num_shader == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set pixel shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set pixel shader constant [%s] is failed, shader not found, type [%d], id [%d]\n", szNameVar, type_shader, szNameShader); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set pixel shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", SX_LIB_NAME, szNameVar, type_shader, szNameShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set pixel shader constant [%s] is failed, constant not found, shader info: type [%d], id [%d], name [%s]\n", szNameVar, type_shader, szNameShader); } } } @@ -1022,7 +1027,7 @@ void CShaderManager::setValueRegisterI(SHADER_TYPE type_shader, ID idShader, con if (idShader != -1 && num_var != -1) g_pDXDevice->SetVertexShaderConstantI(m_aVS[idShader]->m_aVarDesc[num_var].RegisterIndex, (int*)pData, (iCountInt4 == 0 ? m_aVS[idShader]->m_aVarDesc[num_var].RegisterCount : iCountInt4)); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set vertex shader constant [%s] is failed, constant not found, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, idShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set vertex shader constant [%s] is failed, constant not found, type [%d], id [%d]\n", szNameVar, type_shader, idShader); } else if (type_shader == SHADER_TYPE_PIXEL) { @@ -1040,11 +1045,11 @@ void CShaderManager::setValueRegisterI(SHADER_TYPE type_shader, ID idShader, con if (idShader != -1 && num_var != -1) g_pDXDevice->SetPixelShaderConstantI(m_aPS[idShader]->m_aVarDesc[num_var].RegisterIndex, (int*)pData, (iCountInt4 == 0 ? m_aPS[idShader]->m_aVarDesc[num_var].RegisterCount : iCountInt4)); else if (num_var == -1) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set pixel shader constant [%s] is failed, constant not found, type [%d], name [%s]\n", SX_LIB_NAME, szNameVar, type_shader, m_aPS[idShader]->m_szPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "set pixel shader constant [%s] is failed, constant not found, type [%d], name [%s]\n", szNameVar, type_shader, m_aPS[idShader]->m_szPath); } } else - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: set shader constant [%s] is failed, shader not validate, type [%d], id [%d]\n", SX_LIB_NAME, szNameVar, type_shader, idShader); + LibReport(REPORT_MSG_LEVEL_WARNING, "set shader constant [%s] is failed, shader not validate, type [%d], id [%d]\n", szNameVar, type_shader, idShader); } diff --git a/source/gcore/shader.h b/source/gcore/shader.h index bcc5c7390..b3f10bfe2 100644 --- a/source/gcore/shader.h +++ b/source/gcore/shader.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __SHADER_H #define __SHADER_H @@ -13,7 +18,6 @@ #include <common/String.h> #include "sxgcore.h" -extern report_func g_fnReportf; extern IDirect3DDevice9 *g_pDXDevice; extern D3DPRESENT_PARAMETERS g_oD3DAPP; @@ -208,11 +212,12 @@ public: void getName(SHADER_TYPE type, ID idShader, char *szName); protected: - Array<CShaderVS*> m_aVS; - Array<CShaderPS*> m_aPS; - int m_iLastAllLoadVS; - int m_iLastAllLoadPS; + Array<CShaderVS*> m_aVS; //!< ������� vs �������� + Array<CShaderPS*> m_aPS; //!< ������� ps �������� + + int m_iLastAllLoadVS; //! ����� ���������� ����������� vs ��������, � �������� ���� + int m_iLastAllLoadPS; //! ����� ���������� ����������� ps ��������, � �������� ���� }; #endif \ No newline at end of file diff --git a/source/gcore/sky.cpp b/source/gcore/sky.cpp index 22a120564..bf211490c 100644 --- a/source/gcore/sky.cpp +++ b/source/gcore/sky.cpp @@ -1,10 +1,15 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "sky.h" -SkyBox::SkyBox() +CSkyBox::CSkyBox() { - TexActive[0] = 0; - TexSecond[0] = 0; + m_szTexActive[0] = 0; + m_szTexSecond[0] = 0; D3DVERTEXELEMENT9 layoutskybox[] = { @@ -13,20 +18,20 @@ SkyBox::SkyBox() D3DDECL_END() }; - g_pDXDevice->CreateVertexDeclaration(layoutskybox, &VertexDeclarationSkyBox); + g_pDXDevice->CreateVertexDeclaration(layoutskybox, &m_pVertexDeclarationSkyBox); - VS_RenderSkyBox = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "sky_box.vs", "sky_box.vs", SHADER_CHECKDOUBLE_NAME); - PS_RenderSkyBox = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "sky_box.ps", "sky_box.ps", SHADER_CHECKDOUBLE_NAME); + m_idVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "sky_box.vs", "sky_box.vs", SHADER_CHECKDOUBLE_NAME); + m_idPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "sky_box.ps", "sky_box.ps", SHADER_CHECKDOUBLE_NAME); - Color = float4(0,0,0,0); - RotaionY = 0.f; - MatRotation = SMMatrixIdentity(); + m_vColor = float4(0, 0, 0, 0); + m_fRotaionY = 0.f; + m_mMatRotation = SMMatrixIdentity(); g_pDXDevice->CreateVertexBuffer( - 8 * sizeof(SkyBoxVertex), + 8 * sizeof(CSkyBoxVertex), 0, 0, D3DPOOL_MANAGED, - &Vertices, + &m_pVertices, 0 ); @@ -35,7 +40,7 @@ SkyBox::SkyBox() 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, - &Indeces, + &m_pIndeces, 0); float X = 1.0f * 200; @@ -43,21 +48,21 @@ SkyBox::SkyBox() float Z = 1.0f * 200; float tmpy = 45; - SkyBoxVertex* tmpVertices; - Vertices->Lock(0, 0, (void**)&tmpVertices, 0); + CSkyBoxVertex* tmpVertices; + m_pVertices->Lock(0, 0, (void**)&tmpVertices, 0); - tmpVertices[0] = SkyBoxVertex( X, Y-tmpy, Z, 1.0f, 1.0f, 1.0f); - tmpVertices[1] = SkyBoxVertex(-X, Y-tmpy, Z,-1.0f, 1.0f, 1.0f); - tmpVertices[2] = SkyBoxVertex( X, -tmpy, Z, 1.0f,-1.0f, 1.0f); + tmpVertices[0] = CSkyBoxVertex( X, Y-tmpy, Z, 1.0f, 1.0f, 1.0f); + tmpVertices[1] = CSkyBoxVertex(-X, Y-tmpy, Z,-1.0f, 1.0f, 1.0f); + tmpVertices[2] = CSkyBoxVertex( X, -tmpy, Z, 1.0f,-1.0f, 1.0f); - tmpVertices[3] = SkyBoxVertex( X, Y-tmpy,-Z, 1.0f, 1.0f,-1.0f); - tmpVertices[4] = SkyBoxVertex(-X, -tmpy, Z,-1.0f,-1.0f, 1.0f); - tmpVertices[5] = SkyBoxVertex( X, -tmpy,-Z, 1.0f,-1.0f,-1.0f); + tmpVertices[3] = CSkyBoxVertex( X, Y-tmpy,-Z, 1.0f, 1.0f,-1.0f); + tmpVertices[4] = CSkyBoxVertex(-X, -tmpy, Z,-1.0f,-1.0f, 1.0f); + tmpVertices[5] = CSkyBoxVertex( X, -tmpy,-Z, 1.0f,-1.0f,-1.0f); - tmpVertices[6] = SkyBoxVertex(-X, Y-tmpy,-Z,-1.0f, 1.0f,-1.0f); - tmpVertices[7] = SkyBoxVertex(-X, -tmpy,-Z,-1.0f,-1.0f,-1.0f); + tmpVertices[6] = CSkyBoxVertex(-X, Y-tmpy,-Z,-1.0f, 1.0f,-1.0f); + tmpVertices[7] = CSkyBoxVertex(-X, -tmpy,-Z,-1.0f,-1.0f,-1.0f); - Vertices->Unlock(); + m_pVertices->Unlock(); WORD indices_tmp[] = @@ -82,110 +87,110 @@ SkyBox::SkyBox() }; WORD* indices = 0; - Indeces->Lock(0, 0, (void**)&indices, 0); + m_pIndeces->Lock(0, 0, (void**)&indices, 0); memcpy(indices,indices_tmp,36 * sizeof(WORD)); - Indeces->Unlock(); + m_pIndeces->Unlock(); - Tex = 0; - Tex2 = 0; + m_pTexture = 0; + m_pTexture2 = 0; - BFChange = false; - BFChangeMainTex = false; - FactorBlend = 0.0f; + m_isChange = false; + m_isChangeMainTex = false; + m_fFactorBlend = 0.0f; }; -SkyBox::~SkyBox() +CSkyBox::~CSkyBox() { - mem_release_del(Vertices); - mem_release_del(Indeces); + mem_release_del(m_pVertices); + mem_release_del(m_pIndeces); - mem_release_del(Tex); - mem_release_del(Tex2); + mem_release_del(m_pTexture); + mem_release_del(m_pTexture2); - mem_release_del(VertexDeclarationSkyBox); + mem_release_del(m_pVertexDeclarationSkyBox); } -void SkyBox::LoadTextures(const char *texture) +void CSkyBox::loadTextures(const char *texture) { - mem_release_del(Tex); + mem_release_del(m_pTexture); if (!texture) { - mem_release_del(Tex2); + mem_release_del(m_pTexture2); - BFChange = false; - BFChangeMainTex = false; - FactorBlend = 0.0f; + m_isChange = false; + m_isChangeMainTex = false; + m_fFactorBlend = 0.0f; return; } char tmppath[1024]; sprintf(tmppath, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), texture); - if (FAILED(D3DXCreateCubeTextureFromFile(g_pDXDevice, tmppath, &Tex))) + if (FAILED(D3DXCreateCubeTextureFromFile(g_pDXDevice, tmppath, &m_pTexture))) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - failed load cube texture '%s'", SX_LIB_NAME, GEN_MSG_LOCATION, tmppath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed load cube texture '%s'", GEN_MSG_LOCATION, tmppath); } } -bool SkyBox::IsLoadTex() +bool CSkyBox::isLoadTex() { - return (Tex != 0 || Tex2 != 0); + return (m_pTexture != 0 || m_pTexture2 != 0); } -void SkyBox::ChangeTexture(const char *texture) +void CSkyBox::changeTexture(const char *texture) { - mem_release_del((BFChangeMainTex ? Tex : Tex2)); + mem_release_del((m_isChangeMainTex ? m_pTexture : m_pTexture2)); char tmpsb1[1024]; sprintf(tmpsb1, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), texture); - if(!FAILED(D3DXCreateCubeTextureFromFile(g_pDXDevice,tmpsb1,(BFChangeMainTex ? &Tex : &Tex2)))) - BFChange = true; + if (!FAILED(D3DXCreateCubeTextureFromFile(g_pDXDevice, tmpsb1, (m_isChangeMainTex ? &m_pTexture : &m_pTexture2)))) + m_isChange = true; else { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - failed load cube texture '%s'", SX_LIB_NAME, GEN_MSG_LOCATION, tmpsb1); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed load cube texture '%s'", GEN_MSG_LOCATION, tmpsb1); } } -void SkyBox::GetActiveTexture(char *texture) +void CSkyBox::getActiveTexture(char *texture) { if (texture) - strcpy(texture, TexActive); + strcpy(texture, m_szTexActive); } -void SkyBox::GetSecondTexture(char *texture) +void CSkyBox::getSecondTexture(char *texture) { if (texture) - strcpy(texture, TexSecond); + strcpy(texture, m_szTexSecond); } -void SkyBox::SetRotation(float angle) +void CSkyBox::setRotation(float angle) { - RotaionY = angle; - MatRotation = SMMatrixRotationY(RotaionY); + m_fRotaionY = angle; + m_mMatRotation = SMMatrixRotationY(m_fRotaionY); } -float SkyBox::GetRotation() +float CSkyBox::getRotation() { - return RotaionY; + return m_fRotaionY; } -void SkyBox::SetColor(float4_t* color) +void CSkyBox::setColor(const float4_t* color) { - Color = *color; + m_vColor = *color; } -void SkyBox::GetColor(float4_t* color) +void CSkyBox::getColor(float4_t* color) { - *color = Color; + *color = m_vColor; } -void SkyBox::Render(float timeDelta,float3* pos,bool is_shadow) +void CSkyBox::render(float timeDelta, const float3* pos,bool is_shadow) { - if(BFChange) - FactorBlend += timeDelta * 0.001f * 0.2f; + if (m_isChange) + m_fFactorBlend += timeDelta * 0.001f * 0.2f; - float4x4 World = MatRotation * SMMatrixTranslation(pos->x, pos->y, pos->z); + float4x4 World = m_mMatRotation * SMMatrixTranslation(pos->x, pos->y, pos->z); //D3DXMATRIX tmpdxView, tmpdxProjection; //g_pDXDevice->GetTransform(D3DTS_PROJECTION, &tmpdxProjection); @@ -200,41 +205,41 @@ void SkyBox::Render(float timeDelta,float3* pos,bool is_shadow) WVP = SMMatrixTranspose(WVP); - if(BFChange && FactorBlend >= 1.0) - { - FactorBlend = 0.0; - BFChangeMainTex = !BFChangeMainTex; - BFChange = false; - } + if (m_isChange && m_fFactorBlend >= 1.0) + { + m_fFactorBlend = 0.0; + m_isChangeMainTex = !m_isChangeMainTex; + m_isChange = false; + } - if(BFChangeMainTex) - { - g_pDXDevice->SetTexture(0,Tex2); - g_pDXDevice->SetTexture(1,Tex); - } - else - { - g_pDXDevice->SetTexture(0,Tex); - g_pDXDevice->SetTexture(1,Tex2); - } + if (m_isChangeMainTex) + { + g_pDXDevice->SetTexture(0, m_pTexture2); + g_pDXDevice->SetTexture(1, m_pTexture); + } + else + { + g_pDXDevice->SetTexture(0, m_pTexture); + g_pDXDevice->SetTexture(1, m_pTexture2); + } - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, VS_RenderSkyBox, "WorldViewProjection", &WVP); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_RenderSkyBox, "Color", &Color); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_RenderSkyBox, "BlendFactor", &FactorBlend); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, VS_RenderSkyBox); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, PS_RenderSkyBox); + SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "WorldViewProjection", &WVP); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "Color", &m_vColor); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "BlendFactor", &m_fFactorBlend); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, m_idVS); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, m_idPS); - g_pDXDevice->SetStreamSource(0, Vertices, 0, sizeof(SkyBoxVertex)); - g_pDXDevice->SetIndices(Indeces); - g_pDXDevice->SetVertexDeclaration(VertexDeclarationSkyBox); + g_pDXDevice->SetStreamSource(0, m_pVertices, 0, sizeof(CSkyBoxVertex)); + g_pDXDevice->SetIndices(m_pIndeces); + g_pDXDevice->SetVertexDeclaration(m_pVertexDeclarationSkyBox); g_pDXDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12); SGCore_ShaderUnBind(); }; -///// +//########################################################################## -SkyClouds::SkyClouds() +CSkyClouds::CSkyClouds() { D3DVERTEXELEMENT9 layoutclouds[] = { @@ -243,24 +248,24 @@ SkyClouds::SkyClouds() D3DDECL_END() }; - g_pDXDevice->CreateVertexDeclaration(layoutclouds, &VertexDeclarationClouds); + g_pDXDevice->CreateVertexDeclaration(layoutclouds, &m_pVertexDeclarationClouds); - VS_RenderSkyClouds = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "sky_clouds.vs", "sky_clouds.vs", SHADER_CHECKDOUBLE_NAME); - PS_RenderSkyClouds = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "sky_clouds.ps", "sky_clouds.ps", SHADER_CHECKDOUBLE_NAME); + m_idVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "sky_clouds.vs", "sky_clouds.vs", SHADER_CHECKDOUBLE_NAME); + m_idPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "sky_clouds.ps", "sky_clouds.ps", SHADER_CHECKDOUBLE_NAME); D3DXMACRO Defines_SHADOW[] = { { "SHADOW", "" }, { 0, 0 } }; - PS_RenderSkyCloudsShadow = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "sky_clouds.ps", "sky_clouds_shadow.ps", SHADER_CHECKDOUBLE_NAME, Defines_SHADOW); + m_idPS_Shadow = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "sky_clouds.ps", "sky_clouds_shadow.ps", SHADER_CHECKDOUBLE_NAME, Defines_SHADOW); - RotaionY = 0; - Alpha = 1.f; - Color = float4_t(0,0,0,0); - MatRotation = SMMatrixIdentity(); + m_fRotaionY = 0; + m_fAlpha = 1.f; + m_vColor = float4_t(0, 0, 0, 0); + m_mMatRotation = SMMatrixIdentity(); g_pDXDevice->CreateVertexBuffer( - 4 * sizeof(SkyCloudsVertex), + 4 * sizeof(CSkyCloudsVertex), 0, 0, D3DPOOL_MANAGED, - &SkyCloudsVertices, + &m_pSkyCloudsVertices, 0 ); @@ -269,21 +274,21 @@ SkyClouds::SkyClouds() 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, - &SkyCloudsIndeces, + &m_pSkyCloudsIndeces, 0); float X = 800; float Y = 0; float Z = 800; - SkyCloudsVertices->Lock(0, 0, (void**)&Vertices, 0); + m_pSkyCloudsVertices->Lock(0, 0, (void**)&m_pVertices, 0); - Vertices[3] = SkyCloudsVertex(-X, Y, -Z, 0.0f, 2.0f); - Vertices[2] = SkyCloudsVertex(-X, Y, Z, 0.0f, 0.0f); - Vertices[1] = SkyCloudsVertex( X, Y, Z, 2.0f,0.0f); - Vertices[0] = SkyCloudsVertex( X, Y, -Z, 2.0f, 2.0f); + m_pVertices[3] = CSkyCloudsVertex(-X, Y, -Z, 0.0f, 2.0f); + m_pVertices[2] = CSkyCloudsVertex(-X, Y, Z, 0.0f, 0.0f); + m_pVertices[1] = CSkyCloudsVertex(X, Y, Z, 2.0f, 0.0f); + m_pVertices[0] = CSkyCloudsVertex(X, Y, -Z, 2.0f, 2.0f); - SkyCloudsVertices->Unlock(); + m_pSkyCloudsVertices->Unlock(); WORD indices_tmp[] = @@ -294,211 +299,206 @@ SkyClouds::SkyClouds() WORD* indices = 0; - SkyCloudsIndeces->Lock(0, 0, (void**)&indices, 0); + m_pSkyCloudsIndeces->Lock(0, 0, (void**)&indices, 0); memcpy(indices,indices_tmp,6 * sizeof(WORD)); - SkyCloudsIndeces->Unlock(); + m_pSkyCloudsIndeces->Unlock(); - Bias = 0.f; - Speed = 0.01f; + m_fBias = 0.f; + m_fSpeed = 0.01f; - SkyCloudsTex = 0; - SkyCloudsTex2 = 0; + m_pSkyCloudsTex = 0; + m_pSkyCloudsTex2 = 0; - BFChange = false; - BFChangeMainTex = false; - FactorBlend = 0.0f; + m_isChange = false; + m_isChangeMainTex = false; + m_fFactorBlend = 0.0f; } -SkyClouds::~SkyClouds() +CSkyClouds::~CSkyClouds() { - mem_release_del(SkyCloudsTex); - mem_release_del(SkyCloudsTex2); + mem_release_del(m_pSkyCloudsTex); + mem_release_del(m_pSkyCloudsTex2); - mem_release_del(SkyCloudsVertices); - mem_release_del(SkyCloudsIndeces); + mem_release_del(m_pSkyCloudsVertices); + mem_release_del(m_pSkyCloudsIndeces); - mem_release_del(VertexDeclarationClouds); + mem_release_del(m_pVertexDeclarationClouds); } -void SkyClouds::ChangeTexture(const char *texture) +void CSkyClouds::changeTexture(const char *texture) { - mem_release_del((BFChangeMainTex ? SkyCloudsTex : SkyCloudsTex2)); + mem_release_del((m_isChangeMainTex ? m_pSkyCloudsTex : m_pSkyCloudsTex2)); char tmpsb1[1024]; sprintf(tmpsb1, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), texture); - if(!FAILED(D3DXCreateTextureFromFile(g_pDXDevice,tmpsb1,(BFChangeMainTex ? &SkyCloudsTex : &SkyCloudsTex2)))) - BFChange = true; + if (!FAILED(D3DXCreateTextureFromFile(g_pDXDevice, tmpsb1, (m_isChangeMainTex ? &m_pSkyCloudsTex : &m_pSkyCloudsTex2)))) + m_isChange = true; else { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - failed load texture '%s'", SX_LIB_NAME, GEN_MSG_LOCATION, tmpsb1); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed load texture '%s'", GEN_MSG_LOCATION, tmpsb1); } } -void SkyClouds::SetWidthHeightPos(float width,float height,float3* pos) +void CSkyClouds::setWidthHeightPos(float width,float height, const float3* pos) { - SkyCloudsVertices->Lock(0, 0, (void**)&Vertices, 0); + m_pSkyCloudsVertices->Lock(0, 0, (void**)&m_pVertices, 0); float X = pos->x + (width*0.5f); float Y = pos->y; float Z = pos->z + (height*0.5f); - WidthHeight.x = width; - WidthHeight.y = height; + m_vWidthHeight.x = width; + m_vWidthHeight.y = height; //float2_t tmpwh = float2_t(width*0.5f,height*0.5f); - Vertices[3] = SkyCloudsVertex(-X, Y, -Z, 0.0f, 2.0f); - Vertices[2] = SkyCloudsVertex(-X, Y, Z, 0.0f, 0.0f); - Vertices[1] = SkyCloudsVertex( X, Y, Z, 2.0f,0.0f); - Vertices[0] = SkyCloudsVertex( X, Y, -Z, 2.0f, 2.0f); + m_pVertices[3] = CSkyCloudsVertex(-X, Y, -Z, 0.0f, 2.0f); + m_pVertices[2] = CSkyCloudsVertex(-X, Y, Z, 0.0f, 0.0f); + m_pVertices[1] = CSkyCloudsVertex(X, Y, Z, 2.0f, 0.0f); + m_pVertices[0] = CSkyCloudsVertex(X, Y, -Z, 2.0f, 2.0f); - SkyCloudsVertices->Unlock(); + m_pSkyCloudsVertices->Unlock(); } -void SkyClouds::SetRotation(float angle) +void CSkyClouds::setRotation(float angle) { - RotaionY = angle; - MatRotation = SMMatrixRotationY(RotaionY); + m_fRotaionY = angle; + m_mMatRotation = SMMatrixRotationY(m_fRotaionY); } -float SkyClouds::GetRotation() +float CSkyClouds::getRotation() { - return RotaionY; + return m_fRotaionY; } -void SkyClouds::SetAlpha(float alpha) +void CSkyClouds::setAlpha(float alpha) { - Alpha = alpha; + m_fAlpha = alpha; } -float SkyClouds::GetAlpha() +float CSkyClouds::getAlpha() { - return Alpha; + return m_fAlpha; } -void SkyClouds::SetColor(float4_t* color) +void CSkyClouds::setColor(const float4_t* color) { - Color = *color; + m_vColor = *color; } -void SkyClouds::GetColor(float4_t* color) +void CSkyClouds::getColor(float4_t* color) { - *color = Color; + *color = m_vColor; } -void SkyClouds::SetSpeed(float speed) +void CSkyClouds::setSpeed(float speed) { - Speed = speed; + m_fSpeed = speed; } -float SkyClouds::GetSpeed() +float CSkyClouds::getSpeed() { - return Speed; + return m_fSpeed; } -void SkyClouds::LoadTextures(const char *texture) +void CSkyClouds::loadTextures(const char *texture) { - mem_release_del(SkyCloudsTex); + mem_release_del(m_pSkyCloudsTex); if (!texture) { - mem_release_del(SkyCloudsTex2); + mem_release_del(m_pSkyCloudsTex2); - BFChange = false; - BFChangeMainTex = false; - FactorBlend = 0.0f; + m_isChange = false; + m_isChangeMainTex = false; + m_fFactorBlend = 0.0f; return; } char tmppath[1024]; sprintf(tmppath, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), texture); - if (FAILED(D3DXCreateTextureFromFile(g_pDXDevice, tmppath, &SkyCloudsTex))) + if (FAILED(D3DXCreateTextureFromFile(g_pDXDevice, tmppath, &m_pSkyCloudsTex))) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - failed load texture '%s'", SX_LIB_NAME, GEN_MSG_LOCATION, tmppath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed load texture '%s'", GEN_MSG_LOCATION, tmppath); } } -bool SkyClouds::IsLoadTex() +bool CSkyClouds::isLoadTex() { - return (SkyCloudsTex != 0 || SkyCloudsTex2 != 0); + return (m_pSkyCloudsTex != 0 || m_pSkyCloudsTex2 != 0); } -void SkyClouds::Render(DWORD timeDelta,float3* pos,bool is_shadow) +void CSkyClouds::render(DWORD timeDelta, const float3* pos,bool is_shadow) { - if(BFChange) - FactorBlend += timeDelta * 0.001f * 0.2f; + if (m_isChange) + m_fFactorBlend += timeDelta * 0.001f * 0.2f; - Bias += timeDelta * 0.001f * Speed; + m_fBias += timeDelta * 0.001f * m_fSpeed; - if(Bias >= 2.f) - Bias = 0.f; + if (m_fBias >= 2.f) + m_fBias = 0.f; //float4x4 World = SMMatrixTranslation(Core::Data::ConstCurrentCameraPosition.x, Core::Data::ConstCurrentCameraPosition.y+50, Core::Data::ConstCurrentCameraPosition.z); //float4x4 World = SMMatrixTranslation(pos->x, pos->y+50, pos->z); float4x4 World = SMMatrixTranslation(0, pos->y, 0); - if(BFChange && FactorBlend >= 1.0) + if (m_isChange && m_fFactorBlend >= 1.0) { - FactorBlend = 0.0; - BFChangeMainTex = !BFChangeMainTex; - BFChange = false; + m_fFactorBlend = 0.0; + m_isChangeMainTex = !m_isChangeMainTex; + m_isChange = false; } - if(BFChangeMainTex) - { - g_pDXDevice->SetTexture(0,SkyCloudsTex2); - g_pDXDevice->SetTexture(1,SkyCloudsTex); - } - else - { - g_pDXDevice->SetTexture(0,SkyCloudsTex); - g_pDXDevice->SetTexture(1,SkyCloudsTex2); - } + if (m_isChangeMainTex) + { + g_pDXDevice->SetTexture(0, m_pSkyCloudsTex2); + g_pDXDevice->SetTexture(1, m_pSkyCloudsTex); + } + else + { + g_pDXDevice->SetTexture(0, m_pSkyCloudsTex); + g_pDXDevice->SetTexture(1, m_pSkyCloudsTex2); + } - if(!is_shadow) - { - /*D3DXMATRIX tmpdxView, tmpdxProjection; - g_pDXDevice->GetTransform(D3DTS_PROJECTION, &tmpdxProjection); - g_pDXDevice->GetTransform(D3DTS_VIEW, &tmpdxView);*/ - float4x4 View;// = float4x4(tmpdxView); - float4x4 Proj;// = float4x4(tmpdxProjection); + if(!is_shadow) + { + float4x4 View;// = float4x4(tmpdxView); + float4x4 Proj;// = float4x4(tmpdxProjection); - Core_RMatrixGet(G_RI_MATRIX_VIEW, &View); - Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &Proj); + Core_RMatrixGet(G_RI_MATRIX_VIEW, &View); + Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &Proj); - float4x4 WVP = (MatRotation * World) * View * Proj; + float4x4 WVP = (m_mMatRotation * World) * View * Proj; - WVP = SMMatrixTranspose(WVP); + WVP = SMMatrixTranspose(WVP); - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, VS_RenderSkyClouds, "WorldViewProjection", &WVP); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_RenderSkyClouds, "BlendFactorBias", &float2(FactorBlend, Bias)); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_RenderSkyClouds, "Color", &Color); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_RenderSkyClouds, "Alpha", &Alpha); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, VS_RenderSkyClouds); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, PS_RenderSkyClouds); - } - else - { - //D3DXMATRIX tmpdxViewProj; - //g_pDXDevice->GetTransform(D3DTS_WORLD1, &tmpdxViewProj); - float4x4 ViewProj;// = float4x4(tmpdxViewProj); - Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &ViewProj); - float4x4 WVP = (MatRotation * World) * ViewProj; - - WVP = SMMatrixTranspose(WVP); - - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, VS_RenderSkyClouds, "WorldViewProjection", &WVP); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_RenderSkyCloudsShadow, "BlendFactorBias", &float2(FactorBlend, Bias)); - //SGCore_ShaderSetVRF(1, PS_RenderSkyCloudsShadow, "Color", &Color); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_RenderSkyCloudsShadow, "Alpha", &Alpha); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, VS_RenderSkyClouds); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, PS_RenderSkyCloudsShadow); - } + SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "WorldViewProjection", &WVP); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "BlendFactorBias", &float2(m_fFactorBlend, m_fBias)); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "Color", &m_vColor); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "Alpha", &m_fAlpha); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, m_idVS); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, m_idPS); + } + else + { + float4x4 ViewProj;// = float4x4(tmpdxViewProj); + Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &ViewProj); + float4x4 WVP = (m_mMatRotation * World) * ViewProj; + + WVP = SMMatrixTranspose(WVP); + + SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "WorldViewProjection", &WVP); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS_Shadow, "BlendFactorBias", &float2(m_fFactorBlend, m_fBias)); + //SGCore_ShaderSetVRF(1, PS_RenderSkyCloudsShadow, "Color", &Color); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS_Shadow, "Alpha", &m_fAlpha); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, m_idVS); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, m_idPS_Shadow); + } - g_pDXDevice->SetStreamSource(0, SkyCloudsVertices, 0, sizeof(SkyCloudsVertex)); - g_pDXDevice->SetIndices(this->SkyCloudsIndeces); - g_pDXDevice->SetVertexDeclaration(VertexDeclarationClouds); + g_pDXDevice->SetStreamSource(0, m_pSkyCloudsVertices, 0, sizeof(CSkyCloudsVertex)); + g_pDXDevice->SetIndices(m_pSkyCloudsIndeces); + g_pDXDevice->SetVertexDeclaration(m_pVertexDeclarationClouds); g_pDXDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2); diff --git a/source/gcore/sky.h b/source/gcore/sky.h index a2805c8a1..0f273680b 100644 --- a/source/gcore/sky.h +++ b/source/gcore/sky.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __SKY_H #define __SKY_H @@ -8,13 +13,14 @@ #include <common/String.h> #include "sxgcore.h" -extern report_func g_fnReportf; extern IDirect3DDevice9 *g_pDXDevice; extern D3DPRESENT_PARAMETERS g_oD3DAPP; -struct SkyBoxVertex +//########################################################################## + +struct CSkyBoxVertex { - SkyBoxVertex(float x,float y,float z,float u,float v,float w) + CSkyBoxVertex(float x,float y,float z,float u,float v,float w) { _x = x; _y = y; _z = z; _u = u; _v = v; _w = w; } @@ -22,52 +28,55 @@ struct SkyBoxVertex float _u, _v, _w; }; -class SkyBox +//************************************************************************** + +class CSkyBox { public: - SkyBox(); - ~SkyBox(); - void LoadTextures(const char *texture); - bool IsLoadTex(); - void ChangeTexture(const char *texture); - void GetActiveTexture(char *texture); - void GetSecondTexture(char *texture); - void SetRotation(float angle); - float GetRotation(); - void SetColor(float4_t* color); - void GetColor(float4_t* color); - void Render(float timeDelta,float3* pos,bool is_shadow); + CSkyBox(); + ~CSkyBox(); + void loadTextures(const char *szTexture); + bool isLoadTex(); + void changeTexture(const char *szTexture); + void getActiveTexture(char *szTexture); + void getSecondTexture(char *szTexture); + void setRotation(float fAngle); + float getRotation(); + void setColor(const float4_t *pColor); + void getColor(float4_t *pColor); + void render(float timeDelta, const float3 *pPos,bool isShadow); SX_ALIGNED_OP_MEM protected: - IDirect3DVertexDeclaration9* VertexDeclarationSkyBox; + IDirect3DVertexDeclaration9* m_pVertexDeclarationSkyBox; - char TexActive[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; - char TexSecond[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; - float RotaionY; - float4x4 MatRotation; - float4_t Color; - float FactorBlend; - - bool BFChange; - bool BFChangeMainTex; - - IDirect3DCubeTexture9* Tex; - IDirect3DCubeTexture9* Tex2; - IDirect3DVertexBuffer9* Vertices; - IDirect3DIndexBuffer9* Indeces; - - ID VS_RenderSkyBox; - ID PS_RenderSkyBox; + char m_szTexActive[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; + char m_szTexSecond[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; + float m_fRotaionY; + float4x4 m_mMatRotation; + float4_t m_vColor; + float m_fFactorBlend; + + bool m_isChange; + bool m_isChangeMainTex; + + IDirect3DCubeTexture9 *m_pTexture; + IDirect3DCubeTexture9 *m_pTexture2; + IDirect3DVertexBuffer9 *m_pVertices; + IDirect3DIndexBuffer9 *m_pIndeces; + + ID m_idVS; + ID m_idPS; }; +//########################################################################## -struct SkyCloudsVertex +struct CSkyCloudsVertex { - SkyCloudsVertex(float x,float y,float z,float u,float v) + CSkyCloudsVertex(float x,float y,float z,float u,float v) { _x = x; _y = y; _z = z; _u = u; _v = v; } @@ -75,59 +84,60 @@ struct SkyCloudsVertex float _u, _v; }; +//************************************************************************** -class SkyClouds +class CSkyClouds { public: - SkyClouds(); - ~SkyClouds(); + CSkyClouds(); + ~CSkyClouds(); //���������� ��������� ������� //���� ������ ����������� ����, �� ���� ���� ������ ��������� ����� ���� ������� - void SetWidthHeightPos(float width,float height,float3* pos); - void LoadTextures(const char *texture); - bool IsLoadTex(); - void ChangeTexture(const char *texture); + void setWidthHeightPos(float iWidth,float iHeight, const float3 *pPos); + void loadTextures(const char *szTexture); + bool isLoadTex(); + void changeTexture(const char *szTexture); - void SetRotation(float angle); - float GetRotation(); - void SetAlpha(float alpha); - float GetAlpha(); - void SetColor(float4_t* color); - void GetColor(float4_t* color); + void setRotation(float fAngle); + float getRotation(); + void setAlpha(float fAngle); + float getAlpha(); + void setColor(const float4_t *pColor); + void getColor(float4_t *pColor); - void SetSpeed(float speed); - float GetSpeed(); + void setSpeed(float fSpeed); + float getSpeed(); - void Render(DWORD timeDetlta,float3* pos,bool is_shadow); + void render(DWORD timeDetlta, const float3 *pPos,bool isShadow); SX_ALIGNED_OP_MEM private: - IDirect3DVertexDeclaration9* VertexDeclarationClouds; - float Alpha; - float RotaionY; - float4x4 MatRotation; - float4_t Color; + IDirect3DVertexDeclaration9 *m_pVertexDeclarationClouds; + float m_fAlpha; + float m_fRotaionY; + float4x4 m_mMatRotation; + float4_t m_vColor; - float FactorBlend; - float2_t WidthHeight; - bool BFChange; - bool BFChangeMainTex; + float m_fFactorBlend; + float2_t m_vWidthHeight; + bool m_isChange; + bool m_isChangeMainTex; - float Speed; - float Bias; - SkyCloudsVertex* Vertices; - IDirect3DVertexBuffer9* SkyCloudsVertices; - IDirect3DIndexBuffer9* SkyCloudsIndeces; + float m_fSpeed; + float m_fBias; + CSkyCloudsVertex *m_pVertices; + IDirect3DVertexBuffer9 *m_pSkyCloudsVertices; + IDirect3DIndexBuffer9 *m_pSkyCloudsIndeces; - IDirect3DTexture9* SkyCloudsTex; - IDirect3DTexture9* SkyCloudsTex2; + IDirect3DTexture9 *m_pSkyCloudsTex; + IDirect3DTexture9 *m_pSkyCloudsTex2; - ID VS_RenderSkyClouds; - ID PS_RenderSkyClouds; + ID m_idVS; + ID m_idPS; - ID PS_RenderSkyCloudsShadow; + ID m_idPS_Shadow; }; #endif diff --git a/source/gcore/sxgcore.cpp b/source/gcore/sxgcore.cpp index 6a7b66c7d..6905957b6 100644 --- a/source/gcore/sxgcore.cpp +++ b/source/gcore/sxgcore.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #include "sxgcore.h" @@ -21,6 +21,16 @@ See the license in LICENSE report_func g_fnReportf = DefReport; #endif +/*inline void LibReport(int iLevel, const char *szFormat, ...) +{ + static char szStr[REPORT_MSG_MAX_LEN]; + szStr[0] = 0; + int iStrLen = sizeof(szStr); + format_str(szStr, szFormat); + + g_fnReportf(iLevel, SX_LIB_NAME, szStr); +}*/ + IDirect3DDevice9 *g_pDXDevice = 0; D3DPRESENT_PARAMETERS g_oD3DAPP; IDirect3D9 *g_pD3D9 = 0; @@ -43,7 +53,7 @@ void StdMtlSet(ID id, float4x4* world) ID StdMtlLoad(const char* name, int mtl_type) { - return SGCore_LoadTexAddName(name, LoadTexType::ltt_load); + return SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD); } int StdMtlGetSort(ID id) @@ -79,23 +89,23 @@ CShaderManager *g_pManagerShaders = 0; CreatorTextures *g_pManagerRenderTargets = 0; LoaderTextures *g_pManagerTextures = 0; ID3DXMesh *g_pScreenTexture = 0; -SkyBox *g_pSkyBox = 0; -SkyClouds *g_pSkyClouds = 0; +CSkyBox *g_pSkyBox = 0; +CSkyClouds *g_pSkyClouds = 0; -#define SG_PRECOND(retval) if(!g_pDXDevice){ g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - sxgcore is not init", SX_LIB_NAME, GEN_MSG_LOCATION); return retval;} -#define SG_PRECOND_SKY_BOX(retval) SG_PRECOND(retval _VOID); if(!g_pSkyBox){ g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - sky_box is not init", SX_LIB_NAME, GEN_MSG_LOCATION); return retval;} -#define SG_PRECOND_SKY_CLOUDS(retval) SG_PRECOND(retval _VOID); if(!g_pSkyClouds){ g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - sky_clouds is not init", SX_LIB_NAME, GEN_MSG_LOCATION); return retval;} +#define SG_PRECOND(retval) if(!g_pDXDevice){ LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxgcore is not init", GEN_MSG_LOCATION); return retval;} +#define SG_PRECOND_SKY_BOX(retval) SG_PRECOND(retval _VOID); if(!g_pSkyBox){ LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sky_box is not init", GEN_MSG_LOCATION); return retval;} +#define SG_PRECOND_SKY_CLOUDS(retval) SG_PRECOND(retval _VOID); if(!g_pSkyClouds){ LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sky_clouds is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## -void GCoreInit(HWND hwnd, int width, int heigth, bool windowed, DWORD create_device_flags) +void GCoreInit(HWND hWnd, int iWidth, int iHeigth, bool isWindowed, DWORD dwFlags) { g_pD3D9 = Direct3DCreate9(D3D_SDK_VERSION); if (!g_pD3D9) { - g_fnReportf(-1, "%s: %s - none detected d3d, sxgcore", SX_LIB_NAME, GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none detected d3d", GEN_MSG_LOCATION); return; } @@ -103,24 +113,24 @@ void GCoreInit(HWND hwnd, int width, int heigth, bool windowed, DWORD create_dev g_pD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); memset(&g_oD3DAPP, 0, sizeof(g_oD3DAPP)); - g_oD3DAPP.BackBufferWidth = width; - g_oD3DAPP.BackBufferHeight = heigth; + g_oD3DAPP.BackBufferWidth = iWidth; + g_oD3DAPP.BackBufferHeight = iHeigth; g_oD3DAPP.BackBufferFormat = D3DFMT_A8R8G8B8; g_oD3DAPP.BackBufferCount = 1; g_oD3DAPP.MultiSampleType = D3DMULTISAMPLE_NONE; g_oD3DAPP.MultiSampleQuality = 0; g_oD3DAPP.SwapEffect = D3DSWAPEFFECT_DISCARD; - g_oD3DAPP.hDeviceWindow = hwnd; - g_oD3DAPP.Windowed = windowed; + g_oD3DAPP.hDeviceWindow = hWnd; + g_oD3DAPP.Windowed = isWindowed; g_oD3DAPP.EnableAutoDepthStencil = true; g_oD3DAPP.AutoDepthStencilFormat = D3DFMT_D24S8; - g_oD3DAPP.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL | create_device_flags | D3DCREATE_MULTITHREADED; + g_oD3DAPP.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL | dwFlags | D3DCREATE_MULTITHREADED; g_oD3DAPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; g_oD3DAPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - if (FAILED(g_pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING | create_device_flags | D3DCREATE_MULTITHREADED, &g_oD3DAPP, &g_pDXDevice))) + if (FAILED(g_pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING | dwFlags | D3DCREATE_MULTITHREADED, &g_oD3DAPP, &g_pDXDevice))) { - g_fnReportf(-1, "%s: %s - failed initialized d3d, sxgcore", SX_LIB_NAME, GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed initialized d3d", GEN_MSG_LOCATION); return; } @@ -232,24 +242,24 @@ SX_LIB_API void SGCore_Dbg_Set(report_func rf) g_fnReportf = rf; } -SX_LIB_API void SGCore_0Create(const char* name, HWND hwnd, int width, int heigth, bool windowed, DWORD create_device_flags, bool is_unic) +SX_LIB_API void SGCore_0Create(const char *szName, HWND hWnd, int iWidth, int iHeigth, bool isWindowed, DWORD dwFlags, bool isUnic) { - if (name && strlen(name) > 1) + if (szName && strlen(szName) > 1) { - if (is_unic) + if (isUnic) { - HANDLE hMutex = CreateMutex(NULL, FALSE, name); + HANDLE hMutex = CreateMutex(NULL, FALSE, szName); if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - none unic name, sxgcore", SX_LIB_NAME, GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); return; } } - GCoreInit(hwnd, width, heigth, windowed, create_device_flags); + GCoreInit(hWnd, iWidth, iHeigth, isWindowed, dwFlags); } else - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s: %s - not init argument [name], sxgcore", SX_LIB_NAME, GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name], sxgcore", GEN_MSG_LOCATION); } SX_LIB_API const DEVMODE* SGCore_GetModes(int *iCount) @@ -284,14 +294,14 @@ SX_LIB_API IDirect3DDevice9* SGCore_GetDXDevice() return g_pDXDevice; } -SX_LIB_API void SGCore_DbgMsg(const char* format, ...) +SX_LIB_API void SGCore_DbgMsg(const char *szFormat, ...) { SG_PRECOND(_VOID); va_list va; char buf[SXGC_STR_SIZE_DBG_MSG]; - va_start(va, format); - vsprintf_s(buf, SXGC_STR_SIZE_DBG_MSG, format, va); + va_start(va, szFormat); + vsprintf_s(buf, SXGC_STR_SIZE_DBG_MSG, szFormat, va); va_end(va); RECT rect; @@ -363,22 +373,22 @@ SX_LIB_API void SGCore_ScreenQuadDraw() //########################################################################## -SX_LIB_API void SGCore_DIP(UINT type_primitive, long base_vertexIndex, UINT min_vertex_index, UINT num_vertices, UINT start_index, UINT prim_count) +SX_LIB_API void SGCore_DIP(UINT uiTypePrimitive, long lBaseVertexIndex, UINT uiMinVertexIndex, UINT uiNumVertices, UINT uiStartIndex, UINT uiPrimitiveCount) { SG_PRECOND(_VOID); - FuncDIP(type_primitive, base_vertexIndex, min_vertex_index, num_vertices, start_index, prim_count); + FuncDIP(uiTypePrimitive, lBaseVertexIndex, uiMinVertexIndex, uiNumVertices, uiStartIndex, uiPrimitiveCount); } -SX_LIB_API void SGCore_MtlSet(ID id, float4x4* world) +SX_LIB_API void SGCore_MtlSet(ID id, float4x4 *pWorld) { SG_PRECOND(_VOID); - FuncMtlSet(id, world); + FuncMtlSet(id, pWorld); } -SX_LIB_API ID SGCore_MtlLoad(const char* name, int mtl_type) +SX_LIB_API ID SGCore_MtlLoad(const char *szName, int iMtlType) { SG_PRECOND(-1); - return FuncMtlLoad(name, mtl_type); + return FuncMtlLoad(szName, iMtlType); } SX_LIB_API int SGCore_MtlGetSort(ID id) @@ -400,49 +410,49 @@ SX_LIB_API bool SGCore_MtlGroupRenderIsSingly(ID id) } -SX_LIB_API void SGCore_SetFunc_DIP(g_func_dip func) +SX_LIB_API void SGCore_SetFunc_DIP(g_func_dip fnFunc) { SG_PRECOND(_VOID); - FuncDIP = func; + FuncDIP = fnFunc; } -SX_LIB_API void SGCore_SetFunc_MtlSet(g_func_mtl_set func) +SX_LIB_API void SGCore_SetFunc_MtlSet(g_func_mtl_set fnFunc) { SG_PRECOND(_VOID); - FuncMtlSet = func; + FuncMtlSet = fnFunc; } -SX_LIB_API void SGCore_SetFunc_MtlLoad(g_func_mtl_load func) +SX_LIB_API void SGCore_SetFunc_MtlLoad(g_func_mtl_load fnFunc) { SG_PRECOND(_VOID); - FuncMtlLoad = func; + FuncMtlLoad = fnFunc; } -SX_LIB_API void SGCore_SetFunc_MtlGetSort(g_func_mtl_get_sort func) +SX_LIB_API void SGCore_SetFunc_MtlGetSort(g_func_mtl_get_sort fnFunc) { SG_PRECOND(_VOID); - FuncMtlGetSort = func; + FuncMtlGetSort = fnFunc; } -SX_LIB_API void SGCore_SetFunc_MtlGetPhysicType(g_func_mtl_get_physic_type func) +SX_LIB_API void SGCore_SetFunc_MtlGetPhysicType(g_func_mtl_get_physic_type fnFunc) { SG_PRECOND(_VOID); - FuncMtlGetPhysicType = func; + FuncMtlGetPhysicType = fnFunc; } -SX_LIB_API void SGCore_SetFunc_MtlGroupRenderIsSingly(g_func_mtl_group_render_is_singly func) +SX_LIB_API void SGCore_SetFunc_MtlGroupRenderIsSingly(g_func_mtl_group_render_is_singly fnFunc) { SG_PRECOND(_VOID); - FuncMtlGroupRenderIsSingly = func; + FuncMtlGroupRenderIsSingly = fnFunc; } //########################################################################## -SX_LIB_API ID SGCore_ShaderLoad(SHADER_TYPE type_shader, const char* path, const char* name, SHADER_CHECKDOUBLE is_check_double, D3DXMACRO* macro) +SX_LIB_API ID SGCore_ShaderLoad(SHADER_TYPE type_shader, const char *szPath, const char *szName, SHADER_CHECKDOUBLE check_double, D3DXMACRO *pMacro) { SG_PRECOND(-1); - return g_pManagerShaders->preLoad(type_shader, path, name, is_check_double, macro); + return g_pManagerShaders->preLoad(type_shader, szPath, szName, check_double, pMacro); } SX_LIB_API void SGCore_ShaderAllLoad() @@ -452,11 +462,11 @@ SX_LIB_API void SGCore_ShaderAllLoad() return g_pManagerShaders->allLoad(); } -SX_LIB_API void SGCore_ShaderUpdateN(SHADER_TYPE type_shader, const char* name) +SX_LIB_API void SGCore_ShaderUpdateN(SHADER_TYPE type_shader, const char *szName) { SG_PRECOND(_VOID); - g_pManagerShaders->update(type_shader, name); + g_pManagerShaders->update(type_shader, szName); } SX_LIB_API void SGCore_ShaderUpdate(SHADER_TYPE type_shader, ID id) @@ -473,25 +483,25 @@ SX_LIB_API void SGCore_ShaderReloadAll() g_pManagerShaders->reloadAll(); } -SX_LIB_API ID SGCore_ShaderGetID(SHADER_TYPE type_shader, const char* shader) +SX_LIB_API ID SGCore_ShaderGetID(SHADER_TYPE type_shader, const char *szNameShader) { SG_PRECOND(-1); - return g_pManagerShaders->getID(type_shader, shader); + return g_pManagerShaders->getID(type_shader, szNameShader); } -SX_LIB_API void SGCore_ShaderBindN(SHADER_TYPE type_shader, const char* shader) +SX_LIB_API void SGCore_ShaderBindN(SHADER_TYPE type_shader, const char *szNameShader) { SG_PRECOND(_VOID); - return g_pManagerShaders->bind(type_shader, shader); + return g_pManagerShaders->bind(type_shader, szNameShader); } -SX_LIB_API void SGCore_ShaderBind(SHADER_TYPE type_shader, ID shader) +SX_LIB_API void SGCore_ShaderBind(SHADER_TYPE type_shader, ID idShader) { SG_PRECOND(_VOID); - return g_pManagerShaders->bind(type_shader, shader); + return g_pManagerShaders->bind(type_shader, idShader); } @@ -596,7 +606,7 @@ SX_LIB_API void SGCore_LoadTexDelete(ID id) g_pManagerTextures->Delete(id); } -SX_LIB_API ID SGCore_LoadTexAddName(const char* name, LoadTexType type) +SX_LIB_API ID SGCore_LoadTexAddName(const char* name, LOAD_TEXTURE_TYPE type) { SG_PRECOND(-1); @@ -624,7 +634,7 @@ SX_LIB_API ID SGCore_LoadTexCreate(const char* name, IDirect3DTexture9* tex) return g_pManagerTextures->Create(name, tex); } -SX_LIB_API ID SGCore_LoadTexUpdateN(const char* name, LoadTexType type) +SX_LIB_API ID SGCore_LoadTexUpdateN(const char* name, LOAD_TEXTURE_TYPE type) { SG_PRECOND(-1); @@ -829,22 +839,22 @@ SX_LIB_API bool SGCore_0InretsectBox(const float3 * min1, const float3 * max1, c SX_LIB_API ISXFrustum* SGCore_CrFrustum() { - return new Frustum(); + return new CFrustum(); } SX_LIB_API ISXCamera* SGCore_CrCamera() { - return new Camera(); + return new CCamera(); } SX_LIB_API ISXTransObject* SGCore_CrTransObject() { - return new SXTransObject(); + return new CSXTransObject(); } SX_LIB_API ISXBound* SGCore_CrBound() { - return new SXBound(); + return new CSXBound(); } //########################################################################## @@ -896,9 +906,9 @@ SX_LIB_API void SGCore_SkyBoxCr() SG_PRECOND(_VOID); if (g_pSkyBox) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: sky_box is already init", SX_LIB_NAME); + LibReport(REPORT_MSG_LEVEL_WARNING, "sky_box is already init"); else - g_pSkyBox = new SkyBox(); + g_pSkyBox = new CSkyBox(); } SX_LIB_API bool SGCore_SkyBoxIsCr() @@ -910,61 +920,61 @@ SX_LIB_API bool SGCore_SkyBoxIsCr() SX_LIB_API bool SGCore_SkyBoxIsLoadTex() { SG_PRECOND_SKY_BOX(false); - return g_pSkyBox->IsLoadTex(); + return g_pSkyBox->isLoadTex(); } SX_LIB_API void SGCore_SkyBoxLoadTex(const char *texture) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->LoadTextures(texture); + g_pSkyBox->loadTextures(texture); } SX_LIB_API void SGCore_SkyBoxChangeTex(const char *texture) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->ChangeTexture(texture); + g_pSkyBox->changeTexture(texture); } SX_LIB_API void SGCore_SkyBoxGetActiveTex(char *texture) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->GetActiveTexture(texture); + g_pSkyBox->getActiveTexture(texture); } SX_LIB_API void SGCore_SkyBoxGetSecondTex(char *texture) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->GetSecondTexture(texture); + g_pSkyBox->getSecondTexture(texture); } SX_LIB_API void SGCore_SkyBoxSetRot(float angle) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->SetRotation(angle); + g_pSkyBox->setRotation(angle); } SX_LIB_API float SGCore_SkyBoxGetRot() { SG_PRECOND_SKY_BOX(0); - return g_pSkyBox->GetRotation(); + return g_pSkyBox->getRotation(); } -SX_LIB_API void SGCore_SkyBoxSetColor(float4_t* color) +SX_LIB_API void SGCore_SkyBoxSetColor(const float4_t* color) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->SetColor(color); + g_pSkyBox->setColor(color); } SX_LIB_API void SGCore_SkyBoxGetColor(float4_t* color) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->GetColor(color); + g_pSkyBox->getColor(color); } -SX_LIB_API void SGCore_SkyBoxRender(float timeDelta, float3* pos) +SX_LIB_API void SGCore_SkyBoxRender(float timeDelta, const float3* pos) { SG_PRECOND_SKY_BOX(_VOID); - g_pSkyBox->Render(timeDelta, pos, false); + g_pSkyBox->render(timeDelta, pos, false); } //************************************************************************** @@ -974,9 +984,9 @@ SX_LIB_API void SGCore_SkyCloudsCr() SG_PRECOND(_VOID); if (g_pSkyClouds) - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s: sky_clouds is already init", SX_LIB_NAME); + LibReport(REPORT_MSG_LEVEL_WARNING, "sky_clouds is already init"); else - g_pSkyClouds = new SkyClouds(); + g_pSkyClouds = new CSkyClouds(); } SX_LIB_API bool SGCore_SkyCloudsIsCr() @@ -990,77 +1000,77 @@ SX_LIB_API bool SGCore_SkyCloudsIsLoadTex() { SG_PRECOND_SKY_CLOUDS(false); - return g_pSkyClouds->IsLoadTex(); + return g_pSkyClouds->isLoadTex(); } -SX_LIB_API void SGCore_SkyCloudsSetWidthHeightPos(float width, float height, float3* pos) +SX_LIB_API void SGCore_SkyCloudsSetWidthHeightPos(float width, float height, const float3* pos) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->SetWidthHeightPos(width, height, pos); + g_pSkyClouds->setWidthHeightPos(width, height, pos); } SX_LIB_API void SGCore_SkyCloudsLoadTex(const char *texture) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->LoadTextures(texture); + g_pSkyClouds->loadTextures(texture); } SX_LIB_API void SGCore_SkyCloudsChangeTex(const char *texture) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->ChangeTexture(texture); + g_pSkyClouds->changeTexture(texture); } SX_LIB_API void SGCore_SkyCloudsSetRot(float angle) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->SetRotation(angle); + g_pSkyClouds->setRotation(angle); } SX_LIB_API float SGCore_SkyCloudsGetRot() { SG_PRECOND_SKY_CLOUDS(0); - return g_pSkyClouds->GetRotation(); + return g_pSkyClouds->getRotation(); } SX_LIB_API void SGCore_SkyCloudsSetAlpha(float alpha) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->SetAlpha(alpha); + g_pSkyClouds->setAlpha(alpha); } SX_LIB_API float SGCore_SkyCloudsGetAlpha() { SG_PRECOND_SKY_CLOUDS(0); - return g_pSkyClouds->GetAlpha(); + return g_pSkyClouds->getAlpha(); } SX_LIB_API void SGCore_SkyCloudsSetSpeed(float speed) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->SetSpeed(speed); + g_pSkyClouds->setSpeed(speed); } SX_LIB_API float SGCore_SkyCloudsGetSpeed() { SG_PRECOND_SKY_CLOUDS(0); - return g_pSkyClouds->GetSpeed(); + return g_pSkyClouds->getSpeed(); } -SX_LIB_API void SGCore_SkyCloudsSetColor(float4_t* color) +SX_LIB_API void SGCore_SkyCloudsSetColor(const float4_t* color) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->SetColor(color); + g_pSkyClouds->setColor(color); } SX_LIB_API void SGCore_SkyCloudsGetColor(float4_t* color) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->GetColor(color); + g_pSkyClouds->getColor(color); } -SX_LIB_API void SGCore_SkyCloudsRender(DWORD timeDetlta, float3* pos, bool is_shadow) +SX_LIB_API void SGCore_SkyCloudsRender(DWORD timeDetlta, const float3* pos, bool is_shadow) { SG_PRECOND_SKY_CLOUDS(_VOID); - g_pSkyClouds->Render(timeDetlta, pos, is_shadow); + g_pSkyClouds->render(timeDetlta, pos, is_shadow); } diff --git a/source/gcore/sxgcore.h b/source/gcore/sxgcore.h index bc8a39471..882e36ed3 100644 --- a/source/gcore/sxgcore.h +++ b/source/gcore/sxgcore.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -31,9 +31,6 @@ See the license in LICENSE #define SX_LIB_API extern "C" __declspec (dllimport) #include <core/sxcore.h> -//! имя библиотеки -#define SX_LIB_NAME COLOR_GREEN "CORE" COLOR_RESET - #ifdef SX_DLL #undef SX_LIB_API #define SX_LIB_API extern "C" __declspec (dllexport) @@ -69,7 +66,7 @@ See the license in LICENSE SX_LIB_API long SGCore_0GetVersion(); //! установка функции вывода сообщений -SX_LIB_API void SGCore_Dbg_Set(report_func rf); +SX_LIB_API void SGCore_Dbg_Set(report_func fnReport); //! инициализация подсистемы SX_LIB_API void SGCore_0Create( @@ -88,7 +85,7 @@ SX_LIB_API void SGCore_AKill(); //! возвращает dx устройство SX_LIB_API IDirect3DDevice9* SGCore_GetDXDevice(); -//! возвращает массив всех доступных разрешений монитора +//! возвращает массив всех доступных разрешений монитора, в iCount записывает размер массива SX_LIB_API const DEVMODE* SGCore_GetModes(int *iCount); //!@} @@ -120,9 +117,9 @@ SX_LIB_API void SGCore_OnLostDevice(); //! вызывать при попытке сброса устройства SX_LIB_API bool SGCore_OnDeviceReset( - int width, //!< новая ширина окна - int heigth, //!< новая выоста окна - bool windewed //!< true - оконный режим, false - полноэкранный + int iWwidth, //!< новая ширина окна + int iHeigth, //!< новая выоста окна + bool isWindewed //!< true - оконный режим, false - полноэкранный ); //! вызывать при сбросе устроства @@ -141,17 +138,17 @@ value - для Filter D3DTEXTUREFILTERTYPE, для Address D3DTEXTUREADDRESS @{*/ //! установка фильтрации для конкретного слота -SX_LIB_API void SGCore_SetSamplerFilter(DWORD id, DWORD value); +SX_LIB_API void SGCore_SetSamplerFilter(DWORD dwNum, DWORD dwValue); //! установка фильтрации для набора слотов от begin_id до end_id -SX_LIB_API void SGCore_SetSamplerFilter2(DWORD begin_id, DWORD end_id, DWORD value); +SX_LIB_API void SGCore_SetSamplerFilter2(DWORD dwNumStart, DWORD dwCount, DWORD dwValue); //! установка адресации для конкретного слота -SX_LIB_API void SGCore_SetSamplerAddress(DWORD id, DWORD value); +SX_LIB_API void SGCore_SetSamplerAddress(DWORD dwNum, DWORD dwValue); //! установка адресации для набора слотов от begin_id до end_id -SX_LIB_API void SGCore_SetSamplerAddress2(DWORD begin_id, DWORD end_id, DWORD value); +SX_LIB_API void SGCore_SetSamplerAddress2(DWORD dwNumStart, DWORD dwCount, DWORD dwValue); //!@} @@ -171,19 +168,19 @@ SX_LIB_API void SGCore_SetSamplerAddress2(DWORD begin_id, DWORD end_id, DWORD va /*! draw indexed primitive, команда отрисовки. Аналогична DrawIndexedPrimitive, в дополнение к DIP инкрементирует счетчик DIPов в int регистрах по индексу #G_RI_INT_COUNT_DIP, обнуление данных только на стороне приложения */ -typedef void(*g_func_dip) (UINT type_primitive, long base_vertexIndex, UINT min_vertex_index, UINT num_vertices, UINT start_index, UINT prim_count); +typedef void(*g_func_dip) (UINT uiTypePrimitive, long lBaseVertexIndex, UINT uiMinVertexIndex, UINT uiNumVertices, UINT uiStartIndex, UINT uiPrimitiveCount); /*! установка материала id, world - мировая матрица. По умолчанию установка текстуры в нулевой текстурный слот, id – идентификатор материала (по умолчанию - текстуры), world – матрица трансформации модели */ -typedef void(*g_func_mtl_set) (ID id, float4x4* world); +typedef void(*g_func_mtl_set) (ID id, float4x4 *pWorld); -/*! загрузка материала, name - имя текстуры с расширением, mtl_type - тип материала на случай провала загрузки. -Загрузка материала (по умолчанию – текстуры) с именем name, mtl_type – типа материала, +/*! загрузка материала, szName - имя текстуры с расширением, iMtlType - тип материала на случай провала загрузки. +Загрузка материала (по умолчанию – текстуры) с именем name, iMtlType – типа материала, будет задействован только в случае провала определения типа материала (по умолчанию не используется) - -тип стандартного материала будет определен на основании mtl_type, может принимать одно из значений MTL_TYPE_ +тип стандартного материала будет определен на основании iMtlType, может принимать одно из значений MTL_TYPE_ */ -typedef ID(*g_func_mtl_load) (const char* name, int mtl_type); +typedef ID(*g_func_mtl_load) (const char *szName, int iMtlType); //! получить сорт материала, по дефолту 0 typedef int(*g_func_mtl_get_sort) (ID id); @@ -200,13 +197,13 @@ typedef bool(*g_func_mtl_group_render_is_singly) (ID id); !@{*/ //! \copydoc g_func_dip -SX_LIB_API void SGCore_DIP(UINT type_primitive, long base_vertexIndex, UINT min_vertex_index, UINT num_vertices, UINT start_index, UINT prim_count); +SX_LIB_API void SGCore_DIP(UINT uiTypePrimitive, long lBaseVertexIndex, UINT uiMinVertexIndex, UINT uiNumVertices, UINT uiStartIndex, UINT uiPrimitiveCount); //! \copydoc g_func_mtl_set -SX_LIB_API void SGCore_MtlSet(ID id, float4x4* world); +SX_LIB_API void SGCore_MtlSet(ID id, float4x4 *pWorld); //! \copydoc g_func_mtl_load -SX_LIB_API ID SGCore_MtlLoad(const char* name, int mtl_type); +SX_LIB_API ID SGCore_MtlLoad(const char *szName, int iMtlType); //! \copydoc g_func_mtl_get_sort SX_LIB_API int SGCore_MtlGetSort(ID id); @@ -225,22 +222,22 @@ SX_LIB_API bool SGCore_MtlGroupRenderIsSingly(ID id); !@{*/ //! переназначение g_func_dip -SX_LIB_API void SGCore_SetFunc_DIP(g_func_dip func); +SX_LIB_API void SGCore_SetFunc_DIP(g_func_dip fnFunc); //! переназначение g_func_mtl_set -SX_LIB_API void SGCore_SetFunc_MtlSet(g_func_mtl_set func); +SX_LIB_API void SGCore_SetFunc_MtlSet(g_func_mtl_set fnFunc); //! переназначение g_func_mtl_load -SX_LIB_API void SGCore_SetFunc_MtlLoad(g_func_mtl_load func); +SX_LIB_API void SGCore_SetFunc_MtlLoad(g_func_mtl_load fnFunc); //! переназначение g_func_mtl_get_sort -SX_LIB_API void SGCore_SetFunc_MtlGetSort(g_func_mtl_get_sort func); +SX_LIB_API void SGCore_SetFunc_MtlGetSort(g_func_mtl_get_sort fnFunc); //! переназначение g_func_mtl_get_physic_type -SX_LIB_API void SGCore_SetFunc_MtlGetPhysicType(g_func_mtl_get_physic_type func); +SX_LIB_API void SGCore_SetFunc_MtlGetPhysicType(g_func_mtl_get_physic_type fnFunc); //! переназначение g_func_mtl_group_render_is_singly -SX_LIB_API void SGCore_SetFunc_MtlGroupRenderIsSingly(g_func_mtl_group_render_is_singly func); +SX_LIB_API void SGCore_SetFunc_MtlGroupRenderIsSingly(g_func_mtl_group_render_is_singly fnFunc); //!@} @@ -312,50 +309,50 @@ SX_LIB_API void SGCore_ShaderAllLoad(); //! поставить шейдер в очередь загрузки SX_LIB_API ID SGCore_ShaderLoad( - SHADER_TYPE type_shader, //!< тип шейдера - const char* path, //!< имя файла шейдера с расширением - const char* name, //!< имя шейдера которое присвоится при загрузке - SHADER_CHECKDOUBLE is_check_double, //!< проверять ли на уникальность - D3DXMACRO* macro = 0 //!< макросы + SHADER_TYPE type_shader, //!< тип шейдера + const char *szPath, //!< имя файла шейдера с расширением + const char *szName, //!< имя шейдера которое присвоится при загрузке + SHADER_CHECKDOUBLE check_double,//!< проверять ли на уникальность + D3DXMACRO *pMacro = 0 //!< макросы ); //! существует ли файл name в папке с шейдерами -SX_LIB_API bool SGCore_ShaderFileExists(const char* name); +SX_LIB_API bool SGCore_ShaderFileExists(const char *szName); //! записывает пользовательское имя шейдера в name -SX_LIB_API void SGCore_ShaderGetName(SHADER_TYPE type_shader, ID id, char* name); +SX_LIB_API void SGCore_ShaderGetName(SHADER_TYPE type_shader, ID idShader, char *szName); //! записывает имя шейдер с расширением в path -SX_LIB_API void SGCore_ShaderGetPath(SHADER_TYPE type_shader, ID id, char* path); +SX_LIB_API void SGCore_ShaderGetPath(SHADER_TYPE type_shader, ID idShader, char *szPath); //! существует ли шейдер с пользовательским именем name, если да то возвращает id -SX_LIB_API ID SGCore_ShaderExistsName(SHADER_TYPE type_shader, const char* name); +SX_LIB_API ID SGCore_ShaderExistsName(SHADER_TYPE type_shader, const char *szName); //! существует ли шейдер с именем файла и расширением name, если да то возвращает id -SX_LIB_API ID SGCore_ShaderExistsPath(SHADER_TYPE type_shader, const char* path); +SX_LIB_API ID SGCore_ShaderExistsPath(SHADER_TYPE type_shader, const char *szPath); //! загружен ли шейдер с данным id -SX_LIB_API bool SGCore_ShaderIsValidated(SHADER_TYPE type_shader, ID id); +SX_LIB_API bool SGCore_ShaderIsValidated(SHADER_TYPE type_shader, ID idShader); //! обновление шейдера по имени -SX_LIB_API void SGCore_ShaderUpdateN(SHADER_TYPE type_shader, const char* name); +SX_LIB_API void SGCore_ShaderUpdateN(SHADER_TYPE type_shader, const char *szName); //! обновление шейдера по id -SX_LIB_API void SGCore_ShaderUpdate(SHADER_TYPE type_shader, ID id); +SX_LIB_API void SGCore_ShaderUpdate(SHADER_TYPE type_shader, ID idShader); //! перезагрузить все шейдеры, с учетом макросов SX_LIB_API void SGCore_ShaderReloadAll(); //! получить идентификатор шейдера по имени -SX_LIB_API ID SGCore_ShaderGetID(SHADER_TYPE type_shader, const char* name); +SX_LIB_API ID SGCore_ShaderGetID(SHADER_TYPE type_shader, const char *szName); //! бинд шейдера по имени -SX_LIB_API void SGCore_ShaderBindN(SHADER_TYPE type_shader, const char* name); +SX_LIB_API void SGCore_ShaderBindN(SHADER_TYPE type_shader, const char *szName); //! бинд шейдера по id -SX_LIB_API void SGCore_ShaderBind(SHADER_TYPE type_shader, ID id); +SX_LIB_API void SGCore_ShaderBind(SHADER_TYPE type_shader, ID idShader); //! обнуление биндов шейдеров @@ -369,37 +366,37 @@ SX_LIB_API void SGCore_ShaderUnBind(); //! передача float значений в шейдер по имени SX_LIB_API void SGCore_ShaderSetVRFN( SHADER_TYPE type_shader, //!< тип шейдера из #SHADER_TYPE - const char* name_shader,//!< пользовательское имя шейдера - const char* name_var, //!< имя переменной которой присваивается значение - void* data, //!< указатель на массив данных - int count_float4 = 0 //!< количество float4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера + const char *szNameShader, //!< пользовательское имя шейдера + const char *szNameVar, //!< имя переменной которой присваивается значение + void *pData, //!< указатель на массив данных + int iCountFloat4 = 0 //!< количество float4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера ); //! передача float значений в шейдер по ID SX_LIB_API void SGCore_ShaderSetVRF( - SHADER_TYPE type_shader, //!< тип шейдера из #SHADER_TYPE - ID id, //!< идентификатор шейдера - const char* name_var, //!< имя переменной которой присваивается значение - void* data, //!< указатель на массив данных - int count_float4 = 0 //!< количество float4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера + SHADER_TYPE type_shader, //!< тип шейдера из #SHADER_TYPE + ID idShader, //!< идентификатор шейдера + const char *szNameVar, //!< имя переменной которой присваивается значение + void *pData, //!< указатель на массив данных + int iCountFloat4 = 0 //!< количество float4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера ); //! передача int значений в шейдер по имени SX_LIB_API void SGCore_ShaderSetVRIN( SHADER_TYPE type_shader, //!< тип шейдера из #SHADER_TYPE - const char* name_shader,//!< пользовательское имя шейдера - const char* name_var, //!< имя переменной которой присваивается значение - void* data, //!< указатель на массив данных - int count_int4 = 0 //!< количество int4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера + const char *szNameShader, //!< пользовательское имя шейдера + const char *szNameVar, //!< имя переменной которой присваивается значение + void *pData, //!< указатель на массив данных + int iCountInt4 = 0 //!< количество int4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера ); //! передача int значений в шейдер по ID SX_LIB_API void SGCore_ShaderSetVRI( - SHADER_TYPE type_shader, //!< тип шейдера из #SHADER_TYPE - ID id, //!< идентификатор шейдера - const char* name_var, //!< имя переменной которой присваивается значение - void* data, //!< указатель на массив данных - int count_int4 = 0 //!< количество int4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера + SHADER_TYPE type_shader, //!< тип шейдера из #SHADER_TYPE + ID idShader, //!< идентификатор шейдера + const char *szNameVar, //!< имя переменной которой присваивается значение + void *pData, //!< указатель на массив данных + int iCountInt4 = 0 //!< количество int4 значений в передаваемом массиве, если меньше одного значит количество будет взято из шейдера ); //!@} @@ -457,56 +454,56 @@ SX_LIB_API void SGCore_ShaderSetVRI( //!@} //! типы текстур -enum LoadTexType +enum LOAD_TEXTURE_TYPE { - ltt_load, //!< загружаемая - ltt_const, //!< неудаляемая загружаемая - ltt_custom, //!< созданная пользователем + LOAD_TEXTURE_TYPE_LOAD, //!< загружаемая + LOAD_TEXTURE_TYPE_CONST, //!< неудаляемая загружаемая + LOAD_TEXTURE_TYPE_CUSTOM, //!< созданная пользователем /*! самоопределение типа, на тот случай когда обновляем текстуру которая точно есть. Если определить этот тип, а внутри у текстуры на самом деле нет типа (скорее всего нет текстуры) - то будет определен ltt_load + то будет определен LOAD_TEXTURE_TYPE_LOAD */ - ltt_self, + LOAD_TEXTURE_TYPE_SELF, }; //************************************************************************** //! существует ил файл name в папке с текстурами -SX_LIB_API bool SGCore_LoadTexFileExists(const char* name); +SX_LIB_API bool SGCore_LoadTexFileExists(const char *szName); //! очистить список загружаемых текстур SX_LIB_API void SGCore_LoadTexClearLoaded(); //! удалить тектуру по id (независимо от типа) -SX_LIB_API void SGCore_LoadTexDelete(ID id); +SX_LIB_API void SGCore_LoadTexDelete(ID idTexture); //! добавляем имя текстуры, взамен получаем на нее ID (поставить в очередь) -SX_LIB_API ID SGCore_LoadTexAddName(const char* name, LoadTexType type); +SX_LIB_API ID SGCore_LoadTexAddName(const char *szName, LOAD_TEXTURE_TYPE type); //! получить id по имени -SX_LIB_API ID SGCore_LoadTexGetID(const char* name); +SX_LIB_API ID SGCore_LoadTexGetID(const char *szName); //! получить имя по id -SX_LIB_API void SGCore_LoadTexGetName(ID id, char* name); +SX_LIB_API void SGCore_LoadTexGetName(ID idTexture, char *szName); /*! создать место для текстуры tex и присвоить ей имя name, возвращает id \warning создавать текстур необходимо в managed pool (D3DPOOL_MANAGED) ибо обработка потери и восстановления устройства сюда не приходит */ -SX_LIB_API ID SGCore_LoadTexCreate(const char* name, IDirect3DTexture9* tex); +SX_LIB_API ID SGCore_LoadTexCreate(const char *szName, IDirect3DTexture9 *pTexture); /*! обновить/перезагрузить текстуру name, если текстуры не было в списке то добавляет. Если текстуру надо обновить, но тип у нее заранее не известен, но она точно уже загружена -то можно использовать тип самоопределения ltt_self, тогда тип текстуры не изменится +то можно использовать тип самоопределения LOAD_TEXTURE_TYPE_SELF, тогда тип текстуры не изменится */ -SX_LIB_API ID SGCore_LoadTexUpdateN(const char* name, LoadTexType type); +SX_LIB_API ID SGCore_LoadTexUpdateN(const char *szName, LOAD_TEXTURE_TYPE type); //! обновить/перезагрузить текстуру -SX_LIB_API void SGCore_LoadTexUpdate(ID id); +SX_LIB_API void SGCore_LoadTexUpdate(ID idTexture); //! возвращает текстуру по id -SX_LIB_API IDirect3DTexture9* SGCore_LoadTexGetTex(ID id); +SX_LIB_API IDirect3DTexture9* SGCore_LoadTexGetTex(ID idTexture); //! загрузка всех текстур поставленных в очередь, если есть очередь SX_LIB_API void SGCore_LoadTexAllLoad(); @@ -522,31 +519,31 @@ SX_LIB_API void SGCore_LoadTexAllLoad(); //! добавить новый render target SX_LIB_API ID SGCore_RTAdd( - UINT width, //!< ширина - UINT height, //!< высота - UINT levels, //!< количество mip-map уровней - DWORD usage, //!< признак применения, возможные значения из D3DUSAGE_ + UINT iWidth, //!< ширина + UINT iHeight, //!< высота + UINT iLevels, //!< количество mip-map уровней + DWORD dwUsage, //!< признак применения, возможные значения из D3DUSAGE_ D3DFORMAT format, //!< формат из D3DFORMAT D3DPOOL pool, //!< где будет размещена текстура, из D3DPOOL - const char* name, //!< имя rt + const char *szName, //!< имя rt /*! коэфициент размеров rt относительно области рендера (если rt и размер области одинаковы то 1, если rt меньша на 0.5 то 0.5) если указаны фиксированные значения то ставить 0, это нужно для устновления размеров при восстановлении устройства */ - float coeffullscreen + float fCoefFullScreen ); //! удалить rt по имени -SX_LIB_API void SGCore_RTDeleteN(const char* name); +SX_LIB_API void SGCore_RTDeleteN(const char *szName); //! удалить rt по id SX_LIB_API void SGCore_RTDelete(ID id); //! возвращает id по имени -SX_LIB_API ID SGCore_RTGetNum(const char* name); +SX_LIB_API ID SGCore_RTGetNum(const char *szName); //! возвращает текстуру по имени -SX_LIB_API IDirect3DTexture9* SGCore_RTGetTextureN(const char* name); +SX_LIB_API IDirect3DTexture9* SGCore_RTGetTextureN(const char *szName); //! возвращает текстуру по id SX_LIB_API IDirect3DTexture9* SGCore_RTGetTexture(ID id); @@ -566,32 +563,32 @@ struct ISXDataStaticModel : public IBaseObject { virtual ~ISXDataStaticModel(){}; - virtual ISXDataStaticModel* GetCopy()=0; //!< получить абсолютную копию модели + virtual ISXDataStaticModel* getCopy()=0;//!< получить абсолютную копию модели - IDirect3DVertexBuffer9* VertexBuffer; //!< вершиный буфер - IDirect3DIndexBuffer9* IndexBuffer; //!< индексный буфер - - UINT SubsetCount; //!< количество подгрупп - char** ArrTextures; //!< массив имен текстур без расширения - UINT* StartIndex; //!< массив стартовых позиций индексов для каждой подгруппы - UINT* IndexCount; //!< массив количества индексов для каждой подгруппы - UINT* StartVertex; //!< массив стартовых позиций вершин для каждой подгруппы - UINT* VertexCount; //!< массив количества вершин для каждой подгруппы - UINT AllIndexCount; //!< общее количество индексов - UINT AllVertexCount;//!< общее количество вершин - - float4_t BSphere; - float3_t BBMax, BBMin; + IDirect3DVertexBuffer9 *m_pVertexBuffer;//!< вершиный буфер + IDirect3DIndexBuffer9 *m_pIndexBuffer; //!< индексный буфер + + UINT m_uiSubsetCount; //!< количество подгрупп + char **m_ppTextures; //!< массив имен текстур без расширения + UINT *m_pStartIndex; //!< массив стартовых позиций индексов для каждой подгруппы + UINT *m_pIndexCount; //!< массив количества индексов для каждой подгруппы + UINT *m_pStartVertex; //!< массив стартовых позиций вершин для каждой подгруппы + UINT *m_pVertexCount; //!< массив количества вершин для каждой подгруппы + UINT m_uiAllIndexCount; //!< общее количество индексов + UINT m_uiAllVertexCount; //!< общее количество вершин + + float4_t m_vBSphere; + float3_t m_vBBMax, m_vBBMin; }; //! создать статическую модель SX_LIB_API ISXDataStaticModel* SGCore_StaticModelCr(); //! загрузить статическую модель, data инициализируется внутри -SX_LIB_API void SGCore_StaticModelLoad(const char* file, ISXDataStaticModel** data); +SX_LIB_API void SGCore_StaticModelLoad(const char *szFile, ISXDataStaticModel **ppData); //! сохранить статическую модель -SX_LIB_API void SGCore_StaticModelSave(const char* file, ISXDataStaticModel** data); +SX_LIB_API void SGCore_StaticModelSave(const char *szFile, ISXDataStaticModel **pData); //! возвращает декларацию вершин статической модели SX_LIB_API IDirect3DVertexDeclaration9* SGCore_StaticModelGetDecl(); @@ -613,12 +610,13 @@ struct ISXTransObject : public IBaseObject SX_ALIGNED_OP_MEM - virtual inline float4x4* CalcWorld() = 0; //!< просчет мировой матрицы трансформации на основе поворотов масштабирования и позиции + //! просчет мировой матрицы трансформации на основе поворотов масштабирования и позиции + virtual inline float4x4* calcWorld() = 0; - float3 Position; //!< позиция - float3 Rotation; //!< повороты - float3 Scale; //!< масштабирование - float4x4 World; //!< мировая матрица на основе поворотов масштабирования и позиции + float3 m_vPosition; //!< позиция + float3 m_vRotation; //!< повороты + float3 m_vScale; //!< масштабирование + float4x4 m_mWorld; //!< мировая матрица на основе поворотов масштабирования и позиции }; //! создать ISXTransObject @@ -648,38 +646,42 @@ public: SX_ALIGNED_OP_MEM /*! Просчет ограничивающего объема по вершинному буферу*/ - virtual void CalcBound( - IDirect3DVertexBuffer9* vertex_buffer, //!< вершинный буфер (незаблокированный), в вершинах которого первым элементом идет позиция float3_t вектор - DWORD count_vert, //!< количество вершин - DWORD bytepervert //!< количество байт в вершине + virtual void calcBound( + IDirect3DVertexBuffer9 *pVertexBuffer, //!< вершинный буфер (незаблокированный), в вершинах которого первым элементом идет позиция float3_t вектор + DWORD dwCountVertex, //!< количество вершин + DWORD dwBytePerVertex //!< количество байт в вершине ) = 0; //! функция просчета мировой матрицы и трансформации минимума и максимума - virtual float4x4* CalcWorldAndTrans() = 0; + virtual float4x4* calcWorldAndTrans() = 0; //! просчет структуры SXPosBBScreen - virtual void GetPosBBScreen( + virtual void getPosBBScreen( SXPosBBScreen *res, //!< инициализированная стркутура #SXPosBBScreen для записи float3* campos, //!< позиция наблюдателя float3* sizemapdepth, //!< размер карты глубины глябины для просчета float3(ширина, высота, максильная глубина) float4x4* mat //!< произведение видовой и проекционной матриц ) = 0; - virtual void SetMinMax(float3* min, float3* max) = 0; //!< установить экстремум, также просчитает и сферу - virtual void GetMinMax(float3* min, float3* max) const = 0; //!< запишет в min и max точки экстремума + //! установить экстремум, также просчитает и сферу + virtual void setMinMax(const float3 *pMin, const float3 *pMax) = 0; + + //! запишет в min и max точки экстремума + virtual void getMinMax(float3 *pMin, float3 *pMax) const = 0; + - virtual void SetSphere(float3* center, float* radius) = 0; //!< установить сферу, просчитает также и параллелепипед - virtual void GetSphere(float3* center, float* radius) const = 0; //!< запишет в center центр сферы, в radius радиус сферы + //! установить сферу, просчитает также и параллелепипед + virtual void setSphere(const float3 *pCenter, float fRadius) = 0; - virtual bool IsPointInSphere(float3* point) const = 0; //!< находится ли точка point в пределах сферы - virtual bool IsPointInBox(float3* point) const = 0; //!< находится ли точка point в пределах параллелепипеда + //! запишет в center центр сферы, в radius радиус сферы + virtual void getSphere(float3 *pCenter, float *pRadius) const = 0; -protected: - float3 Min; - float3 Max; - float3 Center; - float Radius; + //! находится ли точка point в пределах сферы + virtual bool isPointInSphere(const float3 *pPoint) const = 0; + + //! находится ли точка point в пределах параллелепипеда + virtual bool isPointInBox(const float3 *pPoint) const = 0; }; //! создать ISXBound @@ -833,20 +835,20 @@ struct SXTriangle */ //! структура описание плоскости -struct SXFrustumPlane +struct CSXFrustumPlane { - float3_t Normal; - float Distance; + float3_t m_vNormal; + float m_fDistance; SX_ALIGNED_OP_MEM - void Normalize() + void normalize() { - float denom = sqrt((Normal.x*Normal.x) + (Normal.y*Normal.y) + (Normal.z*Normal.z)); - Normal.x = Normal.x / denom; - Normal.y = Normal.y / denom; - Normal.z = Normal.z / denom; - Distance = Distance / denom; + float fDenom = sqrt((m_vNormal.x*m_vNormal.x) + (m_vNormal.y*m_vNormal.y) + (m_vNormal.z*m_vNormal.z)); + m_vNormal.x = m_vNormal.x / fDenom; + m_vNormal.y = m_vNormal.y / fDenom; + m_vNormal.z = m_vNormal.z / fDenom; + m_fDistance = m_fDistance / fDenom; } }; @@ -859,25 +861,42 @@ public: SX_ALIGNED_OP_MEM //! обновление фрустума, на вход матрицы по которым необходимо построить фрустум - virtual void Update( - const float4x4* view, //<! видовая матрица - const float4x4* proj //<! проекционная матрица + virtual void update( + const float4x4 *pView, //<! видовая матрица + const float4x4 *pProj //<! проекционная матрица ) = 0; - virtual bool PointInFrustum(const float3 *point) = 0; //!< находится ли точка во фрустуме - virtual bool PolyInFrustum(const float3* p1, const float3* p2, const float3* p3) = 0; //!< находится ли треугольник во фрутстуме - virtual bool PolyInFrustumAbs(const float3* p1, const float3* p2, const float3* p3) = 0; //!< находится ли полигон во фрустуме полностью + //! находится ли точка во фрустуме + virtual bool pointInFrustum(const float3 *pPoint) const = 0; + + //! находится ли треугольник во фрутстуме + virtual bool polyInFrustum(const float3 *pPoint1, const float3 *pPoint2, const float3 *pPoint3) const = 0; + + //! находится ли полигон во фрустуме полностью + virtual bool polyInFrustumAbs(const float3 *pPoint1, const float3 *pPoint2, const float3 *pPoint3) const = 0; + - virtual bool SphereInFrustum(const float3 *point, float radius) const = 0; //!< находится ли полигон во фрустуме + //! находится ли полигон во фрустуме + virtual bool sphereInFrustum(const float3 *pPoint, float fRadius) const = 0; - virtual bool SphereInFrustumAbs(const float3 *point, float radius) = 0; //!< находится ли сфера во фрустуме полностью - virtual bool BoxInFrustum(float3* min, float3* max) = 0; //!< находится ли параллелепипед (описанный точками экстремума) во фрустуме + //! находится ли сфера во фрустуме полностью + virtual bool sphereInFrustumAbs(const float3 *pPoint, float fRadius) const = 0; -//protected: - SXFrustumPlane ArrFrustumPlane[6]; + //! находится ли параллелепипед (описанный точками экстремума) во фрустуме + virtual bool boxInFrustum(float3 *pMin, float3 *pMax) const = 0; - float3 Point[8]; - float3 Center; + + //! возвращает координаты точки фрустума, iNumPoint = [0,7] + virtual float3 getPoint(int iNumPoint) const = 0; + + //! возвращает координаты центра фрустума + virtual float3 getCenter() const = 0; + + //! устанавливает координаты точки фрустума, iNumPoint = [0,7] + virtual void setPoint(int iNumPoint, const float3 *pPoint) = 0; + + //! устанавливает координаты центра фрустума + virtual void setCenter(const float3 *pCenter) = 0; }; //! создать ISXFrustum @@ -895,65 +914,88 @@ public: /*! \name Движение \note В метрах - @{ - */ - virtual inline void PosLeftRight(float units) = 0; //!< влево/вправо - virtual inline void PosUpDown(float units) = 0; //!< вверх/вниз - virtual inline void PosFrontBack(float units) = 0; //!< вперед/назад + @{*/ + + //! влево/вправо + virtual void posLeftRight(float fUnits) = 0; + + //! вверх/вниз + virtual void posUpDown(float fUnits) = 0; + + //! вперед/назад + virtual void posFrontBack(float fUnits) = 0; + //!@} /*! \name Вращение \note В радианах - @{ - */ - virtual inline void RotUpDown(float angle) = 0; //!< вращение вверх/вниз - virtual inline void RotRightLeft(float angle) = 0; //!< вращение вправо/влево - virtual inline void Roll(float angle) = 0; //!< крен - virtual inline void SetOrientation(const SMQuaternion & q) = 0; //!< установить полное вращение + @{*/ + + //! вращение вверх/вниз + virtual void rotUpDown(float fAngle) = 0; + + //! вращение вправо/влево + virtual void rotRightLeft(float fAngle) = 0; + + //! крен + virtual void roll(float fAngle) = 0; + + //! установить полное вращение + virtual void setOrientation(const SMQuaternion *pOrientation) = 0; + //!@} - virtual inline void GetViewMatrix(float4x4* view_matrix) = 0;//!< получаем матрицу вида в view_matrix + //! получаем матрицу вида в pMatrix + virtual void getViewMatrix(float4x4 *pMatrix) = 0; /*! \name Базис @{ */ - virtual inline void GetPosition(float3* pos) = 0; //!< в pos записывает текущую позицию в мире - virtual inline void SetPosition(float3* pos) = 0; //!< устанавливает позицию в мире + //! в pos записывает текущую позицию в мире + virtual void getPosition(float3 *pPos) const = 0; + + //! устанавливает позицию в мире + virtual void setPosition(const float3 *pPos) = 0; - virtual inline void GetRight(float3* right) = 0; //!< в right записывает парвый вектор - virtual inline void GetUp(float3* up) = 0; //!< в up записывает верхний вектор - virtual inline void GetLook(float3* look) = 0; //!< в look записывает вектор направление взгляда - virtual inline void GetRotation(float3* rot) = 0; //!< в rot записывает углы поворотов по осям, в радианах + //! в right записывает парвый вектор + virtual void getRight(float3 *pRight) const = 0; + + //! в up записывает верхний вектор + virtual void getUp(float3 *vUp) const = 0; + + //! в look записывает вектор направление взгляда + virtual void getLook(float3 *vLook) const = 0; + + + //! в rot записывает углы поворотов по осям, в радианах + virtual void getRotation(float3 *vRot) const = 0; //повроты по осям - virtual inline float GetRotationX() = 0; //!< возвращает поворот по оси X, в радианах - virtual inline float GetRotationY() = 0; //!< возвращает поворот по оси Y, в радианах - virtual inline float GetRotationZ() = 0; //!< возвращает поворот по оси Z, в радианах - //!@} + //! возвращает поворот по оси X, в радианах + virtual float getRotationX() const = 0; - virtual inline void SetFOV(float fov) = 0; //!< Устанавливает FOV камеры - virtual inline float GetFOV() = 0; //!< возвращает FOV камеры + //! возвращает поворот по оси Y, в радианах + virtual float getRotationY() const = 0; - ISXFrustum* ObjFrustum; //!< фрустум этой камеры + //! возвращает поворот по оси Z, в радианах + virtual float getRotationZ() const = 0; - float3 LastVal; //?? - bool IsAccel; //?? + //!@} -protected: - float3 Right; - float3 Up; - float3 Look; + //! устанавливает FOV камеры + virtual void setFOV(float fFOV) = 0; - float3 Position; + //! возвращает FOV камеры + virtual float getFOV() const = 0; - //float AngleUpDown, AngleRightLeft, AngleRoll; - - float3_t m_vPitchYawRoll; + //! обновление фрустума камеры + virtual void updateFrustum(const float4x4 *mProjection) = 0; - float m_fFOV; + //! возвращает константный указатель фрустума + virtual const ISXFrustum* getFrustum() = 0; }; //! создать ISXCamera @@ -982,35 +1024,35 @@ SX_LIB_API bool SGCore_SkyBoxIsLoadTex(); //! загрузка текстуры, texture - имя текстуры с расширением -SX_LIB_API void SGCore_SkyBoxLoadTex(const char *texture); +SX_LIB_API void SGCore_SkyBoxLoadTex(const char *szTexture); //! смена текстуры, texture - имя текстуры с расширением -SX_LIB_API void SGCore_SkyBoxChangeTex(const char *texture); +SX_LIB_API void SGCore_SkyBoxChangeTex(const char *szTexture); //! в аргумент записывает путь до текущей активной текстуры -SX_LIB_API void SGCore_SkyBoxGetActiveTex(char *texture); +SX_LIB_API void SGCore_SkyBoxGetActiveTex(char *szTexture); //! в аргумент записывает путь до следующей текстуры 9если включена смена) -SX_LIB_API void SGCore_SkyBoxGetSecondTex(char *texture); +SX_LIB_API void SGCore_SkyBoxGetSecondTex(char *szTexture); //! установка угла поворота angle по оси y, в радианах -SX_LIB_API void SGCore_SkyBoxSetRot(float angle); +SX_LIB_API void SGCore_SkyBoxSetRot(float fAngle); //! возвращает угол поворота по оси y, в радианах SX_LIB_API float SGCore_SkyBoxGetRot(); //! установка цвета окраски в пределах 0-1, альфа компонента (w) - на сколько будет окрашен -SX_LIB_API void SGCore_SkyBoxSetColor(float4_t* color); +SX_LIB_API void SGCore_SkyBoxSetColor(const float4_t *pColor); //! в color записывает текущий цвет окраски -SX_LIB_API void SGCore_SkyBoxGetColor(float4_t* color); +SX_LIB_API void SGCore_SkyBoxGetColor(float4_t *pColor); //! рендер скайбокса SX_LIB_API void SGCore_SkyBoxRender( float timeDelta, //!< время рендера кадра в млсек - float3* pos //!< позиция набладателя, эта же позиция будет центром skybox + const float3 *pPos //!< позиция набладателя, эта же позиция будет центром skybox ); //!@} @@ -1038,50 +1080,50 @@ SX_LIB_API bool SGCore_SkyCloudsIsLoadTex(); Так как позиция облаков константна то чтобы была илюзия полного покрытия уровня, необходимо облакам указывать размер в несколько раз больше чем весь доступный уровень, к примеру x2 */ SX_LIB_API void SGCore_SkyCloudsSetWidthHeightPos( - float width, //!< ширина в метрах - float height, //!< высота в метрах - float3* center //!< позиция центра + float fWidth, //!< ширина в метрах + float fHeight, //!< высота в метрах + const float3 *pCenter //!< позиция центра ); //! загрузка текстуры, texture - имя текстуры с расширением -SX_LIB_API void SGCore_SkyCloudsLoadTex(const char *texture); +SX_LIB_API void SGCore_SkyCloudsLoadTex(const char *szNameTexture); -//! загрузка текстуры, texture - имя текстуры с расширением -SX_LIB_API void SGCore_SkyCloudsChangeTex(const char *texture); +//! плавная смена текстуры, texture - имя текстуры с расширением +SX_LIB_API void SGCore_SkyCloudsChangeTex(const char *szNameTexture); //! установка угла поворота angle по оси y, в радианах -SX_LIB_API void SGCore_SkyCloudsSetRot(float angle); +SX_LIB_API void SGCore_SkyCloudsSetRot(float fAngle); //! возвращает текущий угол поворота по оси y, в радианах SX_LIB_API float SGCore_SkyCloudsGetRot(); //! устанавливает коэфициент прозрачности, в пределах 0-1 -SX_LIB_API void SGCore_SkyCloudsSetAlpha(float alpha); +SX_LIB_API void SGCore_SkyCloudsSetAlpha(float fAlpha); //! возвращает текущий коэфициент прозрачности SX_LIB_API float SGCore_SkyCloudsGetAlpha(); //! устанавливает коэфициент скорости движения -SX_LIB_API void SGCore_SkyCloudsSetSpeed(float speed); +SX_LIB_API void SGCore_SkyCloudsSetSpeed(float fSpeed); //! возвращает текущий коэфициент скорости движения SX_LIB_API float SGCore_SkyCloudsGetSpeed(); //! установка цвета окраски в пределах 0-1, альфа компонента (w) - на сколько будет окрашен -SX_LIB_API void SGCore_SkyCloudsSetColor(float4_t* color); +SX_LIB_API void SGCore_SkyCloudsSetColor(const float4_t *pColor); //! в color записывает текущий цвет окраски -SX_LIB_API void SGCore_SkyCloudsGetColor(float4_t* color); +SX_LIB_API void SGCore_SkyCloudsGetColor(float4_t *pColor); //! рендер облаков SX_LIB_API void SGCore_SkyCloudsRender( - DWORD timeDetlta, //!< время рендера кадра в млсек - float3* pos, //!< позиция набладателя - bool is_shadow //!< для теней ли рендерим? + DWORD timeDetlta, //!< время рендера кадра в млсек + const float3* pos, //!< позиция набладателя + bool isShadow //!< для теней ли рендерим? ); //!@} diff --git a/source/gcore/sxgcore_dll.cpp b/source/gcore/sxgcore_dll.cpp index 4030f098d..88b1ec58e 100644 --- a/source/gcore/sxgcore_dll.cpp +++ b/source/gcore/sxgcore_dll.cpp @@ -1,10 +1,9 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ -#pragma once #include <windows.h> BOOL APIENTRY DllMain(HMODULE hModule, diff --git a/source/gdefines.h b/source/gdefines.h index 3c8b8311d..f5c235178 100644 --- a/source/gdefines.h +++ b/source/gdefines.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \page general_info_libs Общая информация о библиотеках \tableofcontents @@ -159,7 +159,7 @@ struct IBaseObject #define ASSERT(expr) if(!expr) ASSERT_S(#expr) //! Тип функции вывода отладочной информации -typedef void(*report_func) (int level, const char* format, ...); +typedef void(*report_func) (int iLevel, const char *szLibName, const char *szFormat, ...); #include <cstdio> #if defined(_WINDOWS) @@ -222,7 +222,7 @@ typedef void(*report_func) (int level, const char* format, ...); #define DEFAULT_FUNCTION_REPORT /*! Дефолтовая функция вывода отладочной информации ВМЕСТО НЕЕ В ЯДРО/ПОДСИСТЕМУ НУЖНО ОТПРАВЛЯТЬ СВОЮ */ -inline void DefReport(int level, const char* format, ...) +inline void DefReport(int iLevel, const char *szLibName, const char *szFormat, ...) { #if defined(_WINDOWS) AllocConsole(); @@ -230,8 +230,8 @@ inline void DefReport(int level, const char* format, ...) #endif char buf[REPORT_MSG_MAX_LEN]; int strl = sizeof(buf); - format_str(buf, format); - fprintf(stdout, "!!! report function is not init !!! %s\n", buf); + format_str(buf, szFormat); + fprintf(stdout, "!!! report function is not init !!!\n LibName: %s\n message: %s\n", szLibName, buf); fprintf(stdout, "work program will be stopped within 5 seconds ..."); Sleep(5000); exit(1); @@ -239,4 +239,22 @@ inline void DefReport(int level, const char* format, ...) #endif + +#ifndef SX_LIB_NAME +#define SX_LIB_NAME "User" +#endif + +inline void LibReport(int iLevel, const char *szFormat, ...) +{ + extern report_func g_fnReportf; + + static char szStr[REPORT_MSG_MAX_LEN]; + szStr[0] = 0; + int iStrLen = sizeof(szStr); + format_str(szStr, szFormat); + + g_fnReportf(iLevel, SX_LIB_NAME, szStr); +} + + #endif diff --git a/source/geom/green.cpp b/source/geom/green.cpp index b8f1a3b73..295f38180 100644 --- a/source/geom/green.cpp +++ b/source/geom/green.cpp @@ -1,5 +1,10 @@ -#include <geom\\green.h> +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include "green.h" Green::Green() { @@ -179,9 +184,9 @@ void Green::PreSegmentation(Model* model, float3* min_level, float3* max_level) float3 tmpMin, tmpMax; float3 tmpMin2, tmpMax2; model->SplitsTree->BoundVolumeSys = SGCore_CrBound(); - SGCore_FCompBoundBox(model->ArrLod[0]->model->VertexBuffer, &(model->SplitsTree->BoundVolumeSys), model->ArrLod[0]->model->AllVertexCount, sizeof(vertex_static)); + SGCore_FCompBoundBox(model->ArrLod[0]->model->m_pVertexBuffer, &(model->SplitsTree->BoundVolumeSys), model->ArrLod[0]->model->m_uiAllVertexCount, sizeof(vertex_static)); - model->SplitsTree->BoundVolumeSys->GetMinMax(&tmpMin2, &tmpMax2); + model->SplitsTree->BoundVolumeSys->getMinMax(&tmpMin2, &tmpMax2); model->BBMax = tmpMax2 * (1.f + GREEN_GEN_RAND_SCALE); model->BBMin = tmpMin2 * (1.f + GREEN_GEN_RAND_SCALE); tmpMin = *min_level; @@ -200,7 +205,7 @@ void Green::PreSegmentation(Model* model, float3* min_level, float3* max_level) float tmpZ = tmpMax.z - tmpMin.z; model->SplitsTree->BoundVolumeP = SGCore_CrBound(); - model->SplitsTree->BoundVolumeP->SetMinMax(&tmpMin, &tmpMax); + model->SplitsTree->BoundVolumeP->setMinMax(&tmpMin, &tmpMax); //выравниваем по квадрату if (tmpX > tmpZ) @@ -218,7 +223,7 @@ void Green::PreSegmentation(Model* model, float3* min_level, float3* max_level) tmpMin.x -= tmpX; } - model->SplitsTree->BoundVolumeSys->SetMinMax(&tmpMin, &tmpMax); + model->SplitsTree->BoundVolumeSys->setMinMax(&tmpMin, &tmpMax); model->SplitsTree->CountAllGreen = model->AllCountGreen; if (model->AllCountGreen > 0) @@ -246,7 +251,7 @@ void Green::CycleSegmentation(Segment* Split, Model* mesh) while (queue.size()) { - queue[0]->BoundVolumeSys->GetMinMax(&min, &max); + queue[0]->BoundVolumeSys->getMinMax(&min, &max); if ((max.x - min.x)*0.5f > GREEN_BB_MIN_X && (max.z - min.z)*0.5f > GREEN_BB_MIN_Z) { Segmentation(queue[0], mesh); @@ -281,9 +286,9 @@ void Green::Segmentation(Segment* Split, Model* mesh) for (int i = 0; i<4; ++i) { Split->Splits[i]->BoundVolumeSys = ArrBound[i]; - Split->Splits[i]->BoundVolumeSys->GetMinMax(&tmpmin, &tmpmax); + Split->Splits[i]->BoundVolumeSys->getMinMax(&tmpmin, &tmpmax); Split->Splits[i]->BoundVolumeP = SGCore_CrBound(); - Split->Splits[i]->BoundVolumeP->SetMinMax(&tmpmin, &tmpmax); + Split->Splits[i]->BoundVolumeP->setMinMax(&tmpmin, &tmpmax); } bool *tmp_arr_mesh_poly = 0; @@ -298,7 +303,7 @@ void Green::Segmentation(Segment* Split, Model* mesh) float3 tmpMin, tmpMax; for (WORD i = 0; i<4; ++i) { - Split->Splits[i]->BoundVolumeSys->GetMinMax(&tmpMin, &tmpMax); + Split->Splits[i]->BoundVolumeSys->getMinMax(&tmpMin, &tmpMax); //SGCore_FCreateBoundingBoxMesh(&tmpMin, &tmpMax, &(Split->Splits[i]->BoundBox)); for (DWORD j = 0; j<Split->CountAllGreen; ++j) @@ -383,11 +388,11 @@ void Green::AlignBound(Model* model, Segment* split) float3 tmpMin, tmpMax; float scalecoef = 1.f + GREEN_GEN_RAND_SCALE; - split->BoundVolumeSys->GetMinMax(&tmpMin, &tmpMax); + split->BoundVolumeSys->getMinMax(&tmpMin, &tmpMax); tmpMax.y = comMax.y + model->BBMax.y * scalecoef; tmpMin.y = comMin.y + model->BBMin.y * scalecoef; - split->BoundVolumeSys->SetMinMax(&tmpMin, &tmpMax); + split->BoundVolumeSys->setMinMax(&tmpMin, &tmpMax); tmpMax.x = comMax.x + model->BBMax.x * scalecoef; tmpMax.y = comMax.y + model->BBMax.y * scalecoef; @@ -397,7 +402,7 @@ void Green::AlignBound(Model* model, Segment* split) tmpMin.y = comMin.y + model->BBMin.y * scalecoef; tmpMin.z = comMin.z + model->BBMin.z * scalecoef; - split->BoundVolumeP->SetMinMax(&tmpMin, &tmpMax); + split->BoundVolumeP->setMinMax(&tmpMin, &tmpMax); } } @@ -431,7 +436,7 @@ void Green::SetSplitID2(Model* model, Segment* Split, Array<Segment*, GREEN_DEFA } } -void Green::CPUFillingArrIndeces(ISXFrustum* frustum, float3* viewpos, ID id_arr) +void Green::CPUFillingArrIndeces(const ISXFrustum* frustum, float3* viewpos, ID id_arr) { GREEN_PRECOND_ARRCOMFOR_ERR_ID(id_arr); @@ -461,14 +466,14 @@ void Green::CPUFillingArrIndeces(ISXFrustum* frustum, float3* viewpos, ID id_arr int qwert = 0; } -void Green::ComRecArrIndeces(ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GREEN_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render) +void Green::ComRecArrIndeces(const ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GREEN_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render) { float3 jcenter; float jradius; ID SortId[GREEN_COUNT_TYPE_SEGMENTATION]; - comsegment->BoundVolumeP->GetSphere(&jcenter, &jradius); + comsegment->BoundVolumeP->getSphere(&jcenter, &jradius); - if (comsegment->CountAllGreen > 0 && frustum->SphereInFrustum(&jcenter, jradius)) + if (comsegment->CountAllGreen > 0 && frustum->sphereInFrustum(&jcenter, jradius)) { if (comsegment->BFNonEnd) { @@ -479,7 +484,7 @@ void Green::ComRecArrIndeces(ISXFrustum* frustum, Segment** arrsplits, DWORD *co SortId[q] = -1; if (comsegment->Splits[q]) { - comsegment->Splits[q]->BoundVolumeP->GetSphere(&jcenter, &jradius); + comsegment->Splits[q]->BoundVolumeP->getSphere(&jcenter, &jradius); comsegment->Splits[q]->DistForCamera = SMVector3Length2((jcenter - (*viewpos))) - jradius*jradius; } } @@ -555,12 +560,12 @@ void Green::GPURender2(DWORD timeDelta, float3* viewpos, ID nm, int lod, ID id_t Green::DXDevice->SetStreamSourceFreq(1, (D3DSTREAMSOURCE_INSTANCEDATA | 1)); Green::DXDevice->SetStreamSource(1, TransVertBuf, 0, sizeof(GreenDataVertex)); - Green::DXDevice->SetStreamSource(0, ArrModels[nm]->ArrLod[lod]->model->VertexBuffer, 0, sizeof(vertex_static)); - Green::DXDevice->SetIndices(ArrModels[nm]->ArrLod[lod]->model->IndexBuffer); + Green::DXDevice->SetStreamSource(0, ArrModels[nm]->ArrLod[lod]->model->m_pVertexBuffer, 0, sizeof(vertex_static)); + Green::DXDevice->SetIndices(ArrModels[nm]->ArrLod[lod]->model->m_pIndexBuffer); Green::DXDevice->SetVertexDeclaration(VertexDeclarationGreen); jCountIndex = 0; - for (DWORD i = 0; i < ArrModels[nm]->ArrLod[lod]->model->SubsetCount; i++) + for (DWORD i = 0; i < ArrModels[nm]->ArrLod[lod]->model->m_uiSubsetCount; i++) { SGCore_MtlSet((id_tex > 0 ? id_tex : ArrModels[nm]->ArrLod[lod]->idstex[i]), 0); @@ -570,13 +575,13 @@ void Green::GPURender2(DWORD timeDelta, float3* viewpos, ID nm, int lod, ID id_t Green::DXDevice->SetVertexShaderConstantF(59, (float*)&float2_t(0,0), 1); Green::DXDevice->SetVertexShaderConstantF(60, (float*)viewpos, 1); - Green::DXDevice->SetVertexShaderConstantF(61, (float*)&(ArrModels[nm]->ArrLod[lod]->model->BSphere), 1); - Green::DXDevice->SetVertexShaderConstantF(62, (float*)&(ArrModels[nm]->ArrLod[lod]->model->BBMax), 1); - Green::DXDevice->SetVertexShaderConstantF(63, (float*)&(ArrModels[nm]->ArrLod[lod]->model->BBMin), 1); + Green::DXDevice->SetVertexShaderConstantF(61, (float*)&(ArrModels[nm]->ArrLod[lod]->model->m_vBSphere), 1); + Green::DXDevice->SetVertexShaderConstantF(62, (float*)&(ArrModels[nm]->ArrLod[lod]->model->m_vBBMax), 1); + Green::DXDevice->SetVertexShaderConstantF(63, (float*)&(ArrModels[nm]->ArrLod[lod]->model->m_vBBMin), 1); - SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrModels[nm]->ArrLod[lod]->model->VertexCount[i], jCountIndex, ArrModels[nm]->ArrLod[lod]->model->IndexCount[i] / 3); - Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ((ArrModels[nm]->ArrLod[lod]->model->IndexCount[i] / 3) * RTCountDrawObj)); - jCountIndex += ArrModels[nm]->ArrLod[lod]->model->IndexCount[i]; + SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrModels[nm]->ArrLod[lod]->model->m_pVertexCount[i], jCountIndex, ArrModels[nm]->ArrLod[lod]->model->m_pIndexCount[i] / 3); + Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ((ArrModels[nm]->ArrLod[lod]->model->m_pIndexCount[i] / 3) * RTCountDrawObj)); + jCountIndex += ArrModels[nm]->ArrLod[lod]->model->m_pIndexCount[i]; } Green::DXDevice->SetStreamSourceFreq(0, 1); @@ -618,7 +623,7 @@ void Green::GPURender(DWORD timeDelta, float3* viewpos, GREEN_TYPE type, ID id_a RTCountDrawObj = 0; } - jarrsplits[i]->BoundVolumeP->GetSphere(&jcenter, &jradius); + jarrsplits[i]->BoundVolumeP->getSphere(&jcenter, &jradius); jarrsplits[i]->DistForCamera = SMVector3Length((jcenter - (*viewpos))) - jradius; if ( @@ -709,7 +714,7 @@ void Green::GPURenderSingly(DWORD timeDelta, float3* viewpos, ID id, ID id_tex) RTCountDrawObj = 0; } - jarrsplits[i]->BoundVolumeP->GetSphere(&jcenter, &jradius); + jarrsplits[i]->BoundVolumeP->getSphere(&jcenter, &jradius); jarrsplits[i]->DistForCamera = SMVector3Length((jcenter - (*viewpos))) - jradius; if ( @@ -796,9 +801,9 @@ ID Green::Init(StaticGeom* geom, const char* name, SGCore_StaticModelLoad(tmppath, &tmpnewmpdel->ArrLod[0]->model); tmpnewmpdel->ArrLod[0]->path = path; char tmppathtex[1024]; - for (int i = 0; i < tmpnewmpdel->ArrLod[0]->model->SubsetCount; ++i) + for (int i = 0; i < tmpnewmpdel->ArrLod[0]->model->m_uiSubsetCount; ++i) { - sprintf(tmppathtex, "%s.dds", tmpnewmpdel->ArrLod[0]->model->ArrTextures[i]); + sprintf(tmppathtex, "%s.dds", tmpnewmpdel->ArrLod[0]->model->m_ppTextures[i]); tmpnewmpdel->ArrLod[0]->idstex[i] = SGCore_MtlLoad(tmppathtex, (tmpnewmpdel->TypeGreen == GREEN_TYPE_TREE ? MTL_TYPE_TREE : MTL_TYPE_GRASS)); } @@ -813,9 +818,9 @@ ID Green::Init(StaticGeom* geom, const char* name, tmpnewmpdel->ArrLod[1]->path = lod1; SGCore_StaticModelLoad(tmppath, &tmpnewmpdel->ArrLod[1]->model); - for (int i = 0; i < tmpnewmpdel->ArrLod[1]->model->SubsetCount; ++i) + for (int i = 0; i < tmpnewmpdel->ArrLod[1]->model->m_uiSubsetCount; ++i) { - sprintf(tmppathtex, "%s.dds", tmpnewmpdel->ArrLod[1]->model->ArrTextures[i]); + sprintf(tmppathtex, "%s.dds", tmpnewmpdel->ArrLod[1]->model->m_ppTextures[i]); tmpnewmpdel->ArrLod[1]->idstex[i] = SGCore_MtlLoad(tmppathtex, (tmpnewmpdel->TypeGreen == GREEN_TYPE_TREE ? MTL_TYPE_TREE : MTL_TYPE_GRASS)); } } @@ -834,19 +839,19 @@ ID Green::Init(StaticGeom* geom, const char* name, tmpnewmpdel->ArrLod[2]->path = lod2; SGCore_StaticModelLoad(tmppath, &tmpnewmpdel->ArrLod[2]->model); - for (int i = 0; i < tmpnewmpdel->ArrLod[2]->model->SubsetCount; ++i) + for (int i = 0; i < tmpnewmpdel->ArrLod[2]->model->m_uiSubsetCount; ++i) { - sprintf(tmppathtex, "%s.dds", tmpnewmpdel->ArrLod[1]->model->ArrTextures[i]); + sprintf(tmppathtex, "%s.dds", tmpnewmpdel->ArrLod[1]->model->m_ppTextures[i]); tmpnewmpdel->ArrLod[2]->idstex[i] = SGCore_MtlLoad(tmppathtex, (tmpnewmpdel->TypeGreen == GREEN_TYPE_TREE ? MTL_TYPE_TREE : MTL_TYPE_GRASS)); } } } ISXBound* tmpbb = SGCore_CrBound(); - SGCore_FCompBoundBox(tmpnewmpdel->ArrLod[0]->model->VertexBuffer, &tmpbb, tmpnewmpdel->ArrLod[0]->model->AllVertexCount, sizeof(vertex_static)); + SGCore_FCompBoundBox(tmpnewmpdel->ArrLod[0]->model->m_pVertexBuffer, &tmpbb, tmpnewmpdel->ArrLod[0]->model->m_uiAllVertexCount, sizeof(vertex_static)); float3 mmax, mmin; - tmpbb->GetMinMax(&mmin, &mmax); + tmpbb->getMinMax(&mmin, &mmax); mem_release(tmpbb); float3 tmpmin, tmpmax; @@ -854,7 +859,7 @@ ID Green::Init(StaticGeom* geom, const char* name, if (def_str_validate(path_mask)) { - ID IDTexMask = SGCore_LoadTexAddName(path_mask, LoadTexType::ltt_load); + ID IDTexMask = SGCore_LoadTexAddName(path_mask, LOAD_TEXTURE_TYPE_LOAD); SGCore_LoadTexAllLoad(); GenByTex(geom, tmpnewmpdel, IDTexMask, &mmin, &mmax, count_max); @@ -875,7 +880,7 @@ ID Green::Init(StaticGeom* geom, const char* name, } else { - g_fnReportf(REPORT_MSG_LEVEL_WARNING,"not found static geometry in level!!!"); + LibReport(REPORT_MSG_LEVEL_WARNING,"not found static geometry in level!!!"); } return -1; @@ -1019,7 +1024,7 @@ ID Green::GetIDSplit(ID id, float3* pos) while (queue.size()) { - queue[0]->BoundVolumeSys->GetMinMax(&min, &max); + queue[0]->BoundVolumeSys->getMinMax(&min, &max); if (max.x >= pos->x && max.z >= pos->z && min.x <= pos->x && min.z <= pos->z) { if (!(queue[0]->Splits[0])) @@ -1032,14 +1037,14 @@ ID Green::GetIDSplit(ID id, float3* pos) float3 tmpMin, tmpMax; float scalecoef = 1.f + GREEN_GEN_RAND_SCALE; - queue[0]->BoundVolumeSys->GetMinMax(&tmpMin, &tmpMax); + queue[0]->BoundVolumeSys->getMinMax(&tmpMin, &tmpMax); if (tmpMax.y < (pos->y + ArrModels[id]->BBMax.y * scalecoef)) tmpMax.y = tmpMax.y + ArrModels[id]->BBMax.y * scalecoef; if (tmpMin.y >(pos->y + ArrModels[id]->BBMin.y * scalecoef)) tmpMin.y = tmpMin.y + ArrModels[id]->BBMin.y * scalecoef; - queue[0]->BoundVolumeSys->SetMinMax(&tmpMin, &tmpMax); + queue[0]->BoundVolumeSys->setMinMax(&tmpMin, &tmpMax); if (tmpMax.x < (pos->x + ArrModels[id]->BBMax.x * scalecoef)) tmpMax.x = tmpMax.x + ArrModels[id]->BBMax.x * scalecoef; @@ -1053,7 +1058,7 @@ ID Green::GetIDSplit(ID id, float3* pos) if (tmpMin.z >(pos->z + ArrModels[id]->BBMin.z * scalecoef)) tmpMin.z = tmpMin.z + ArrModels[id]->BBMin.z * scalecoef; - queue[0]->BoundVolumeP->SetMinMax(&tmpMin, &tmpMax); + queue[0]->BoundVolumeP->setMinMax(&tmpMin, &tmpMax); } for (int i = 0; i < GREEN_COUNT_TYPE_SEGMENTATION; i++) @@ -1230,7 +1235,7 @@ void Green::Save(const char* path) void Green::SaveSplit(Segment* Split, FILE* file, Array<Segment*> * queue) { float3 jmin, jmax; - Split->BoundVolumeSys->GetMinMax(&jmin, &jmax); + Split->BoundVolumeSys->getMinMax(&jmin, &jmax); fwrite(&jmin.x, sizeof(float), 1, file); fwrite(&jmin.y, sizeof(float), 1, file); fwrite(&jmin.z, sizeof(float), 1, file); @@ -1239,7 +1244,7 @@ void Green::SaveSplit(Segment* Split, FILE* file, Array<Segment*> * queue) fwrite(&jmax.y, sizeof(float), 1, file); fwrite(&jmax.z, sizeof(float), 1, file); - Split->BoundVolumeP->GetMinMax(&jmin, &jmax); + Split->BoundVolumeP->getMinMax(&jmin, &jmax); fwrite(&jmin.x, sizeof(float), 1, file); fwrite(&jmin.y, sizeof(float), 1, file); fwrite(&jmin.z, sizeof(float), 1, file); @@ -1341,9 +1346,9 @@ void Green::Load(const char* path) SGCore_StaticModelLoad(tmppath, &tmpmodel->ArrLod[0]->model); tmpmodel->ArrLod[0]->path = tmpstr[0]; char tmppathtex[1024]; - for (int k = 0; k < tmpmodel->ArrLod[0]->model->SubsetCount; ++k) + for (int k = 0; k < tmpmodel->ArrLod[0]->model->m_uiSubsetCount; ++k) { - sprintf(tmppathtex, "%s.dds", tmpmodel->ArrLod[0]->model->ArrTextures[k]); + sprintf(tmppathtex, "%s.dds", tmpmodel->ArrLod[0]->model->m_ppTextures[k]); tmpmodel->ArrLod[0]->idstex[k] = SGCore_MtlLoad(tmppathtex, (tmpmodel->TypeGreen == GREEN_TYPE_TREE ? MTL_TYPE_TREE : MTL_TYPE_GRASS)); } @@ -1358,9 +1363,9 @@ void Green::Load(const char* path) sprintf(tmppath, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_MESHES), tmpstr[1]); SGCore_StaticModelLoad(tmppath, &tmpmodel->ArrLod[1]->model); - for (int k = 0; k < tmpmodel->ArrLod[1]->model->SubsetCount; ++k) + for (int k = 0; k < tmpmodel->ArrLod[1]->model->m_uiSubsetCount; ++k) { - sprintf(tmppathtex, "%s.dds", tmpmodel->ArrLod[1]->model->ArrTextures[k]); + sprintf(tmppathtex, "%s.dds", tmpmodel->ArrLod[1]->model->m_ppTextures[k]); tmpmodel->ArrLod[1]->idstex[k] = SGCore_MtlLoad(tmppathtex, (tmpmodel->TypeGreen == GREEN_TYPE_TREE ? MTL_TYPE_TREE : MTL_TYPE_GRASS)); } } @@ -1379,9 +1384,9 @@ void Green::Load(const char* path) sprintf(tmppath, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_MESHES), tmpstr[2]); SGCore_StaticModelLoad(tmppath, &tmpmodel->ArrLod[2]->model); - for (int k = 0; k < tmpmodel->ArrLod[2]->model->SubsetCount; ++k) + for (int k = 0; k < tmpmodel->ArrLod[2]->model->m_uiSubsetCount; ++k) { - sprintf(tmppathtex, "%s.dds", tmpmodel->ArrLod[1]->model->ArrTextures[k]); + sprintf(tmppathtex, "%s.dds", tmpmodel->ArrLod[1]->model->m_ppTextures[k]); tmpmodel->ArrLod[2]->idstex[k] = SGCore_MtlLoad(tmppathtex, (tmpmodel->TypeGreen == GREEN_TYPE_TREE ? MTL_TYPE_TREE : MTL_TYPE_GRASS)); } } @@ -1436,7 +1441,7 @@ void Green::LoadSplit(Segment** Split, FILE* file, Array<Segment**> * queue) fread(&jmax.z, sizeof(float), 1, file); (*Split)->BoundVolumeSys = SGCore_CrBound(); - (*Split)->BoundVolumeSys->SetMinMax(&jmin, &jmax); + (*Split)->BoundVolumeSys->setMinMax(&jmin, &jmax); fread(&jmin.x, sizeof(float), 1, file); @@ -1448,7 +1453,7 @@ void Green::LoadSplit(Segment** Split, FILE* file, Array<Segment**> * queue) fread(&jmax.z, sizeof(float), 1, file); (*Split)->BoundVolumeP = SGCore_CrBound(); - (*Split)->BoundVolumeP->SetMinMax(&jmin, &jmax); + (*Split)->BoundVolumeP->setMinMax(&jmin, &jmax); fread(&(*Split)->CountAllGreen, sizeof(uint32_t), 1, file); @@ -1571,7 +1576,7 @@ long Green::GetGreenCountGen(ID id) long Green::GetGreenCountPoly(ID id) { if (id < ArrModels.size() && ArrModels[id]->ArrLod[0]) - return ArrModels[id]->ArrLod[0]->model->AllIndexCount / 3; + return ArrModels[id]->ArrLod[0]->model->m_uiAllIndexCount / 3; return -1; } @@ -1672,9 +1677,9 @@ void Green::SetGreenLod(ID id, int lod, const char* pathname) sprintf(tmppath, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_MESHES), pathname); SGCore_StaticModelLoad(tmppath, &ArrModels[id]->ArrLod[lod]->model); - for (int k = 0; k < ArrModels[id]->ArrLod[lod]->model->SubsetCount; ++k) + for (int k = 0; k < ArrModels[id]->ArrLod[lod]->model->m_uiSubsetCount; ++k) { - sprintf(tmppath, "%s.dds", ArrModels[id]->ArrLod[lod]->model->ArrTextures[k]); + sprintf(tmppath, "%s.dds", ArrModels[id]->ArrLod[lod]->model->m_ppTextures[k]); ArrModels[id]->ArrLod[lod]->idstex[k] = SGCore_MtlLoad(tmppath, (ArrModels[id]->TypeGreen == GREEN_TYPE_TREE ? MTL_TYPE_TREE : MTL_TYPE_GRASS)); } } @@ -1696,37 +1701,37 @@ void Green::SetGreenNav(ID id, const char* pathname) ISXDataStaticModel* nmesh; SGCore_StaticModelLoad(tmppath, &nmesh); - ArrModels[id]->NavigateMesh->count_vertex = nmesh->AllVertexCount; - ArrModels[id]->NavigateMesh->count_index = nmesh->AllIndexCount; - ArrModels[id]->NavigateMesh->arr_vertex = new float3_t[nmesh->AllVertexCount]; + ArrModels[id]->NavigateMesh->count_vertex = nmesh->m_uiAllVertexCount; + ArrModels[id]->NavigateMesh->count_index = nmesh->m_uiAllIndexCount; + ArrModels[id]->NavigateMesh->arr_vertex = new float3_t[nmesh->m_uiAllVertexCount]; vertex_static *pVert; - nmesh->VertexBuffer->Lock(0, 0, (void **)&pVert, 0); - for (long i = 0; i < nmesh->AllVertexCount; ++i) + nmesh->m_pVertexBuffer->Lock(0, 0, (void **)&pVert, 0); + for (long i = 0; i < nmesh->m_uiAllVertexCount; ++i) { ArrModels[id]->NavigateMesh->arr_vertex[i] = pVert[i].Pos; } - nmesh->VertexBuffer->Unlock(); + nmesh->m_pVertexBuffer->Unlock(); - ArrModels[id]->NavigateMesh->arr_index = new uint32_t[nmesh->AllIndexCount]; - ArrModels[id]->NavigateMesh->arr_mtl = new ID[nmesh->AllIndexCount]; + ArrModels[id]->NavigateMesh->arr_index = new uint32_t[nmesh->m_uiAllIndexCount]; + ArrModels[id]->NavigateMesh->arr_mtl = new ID[nmesh->m_uiAllIndexCount]; UINT* pInd; - nmesh->IndexBuffer->Lock(0, 0, (void **)&pInd, 0); + nmesh->m_pIndexBuffer->Lock(0, 0, (void **)&pInd, 0); DWORD prebias = 0; long tmp_countindex = 0; char tmpnametex[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; - for (int i = 0; i < nmesh->SubsetCount; ++i) + for (int i = 0; i < nmesh->m_uiSubsetCount; ++i) { - sprintf(tmpnametex, "%s.dds", nmesh->ArrTextures[i]); + sprintf(tmpnametex, "%s.dds", nmesh->m_ppTextures[i]); ID tmpidmtl = SGCore_MtlLoad(tmpnametex, MTL_TYPE_TREE); - for (int k = 0; k < nmesh->IndexCount[i]; ++k) + for (int k = 0; k < nmesh->m_pIndexCount[i]; ++k) { - ArrModels[id]->NavigateMesh->arr_index[tmp_countindex] = pInd[nmesh->StartIndex[i] + k] /*+ prebias*/; + ArrModels[id]->NavigateMesh->arr_index[tmp_countindex] = pInd[nmesh->m_pStartIndex[i] + k] /*+ prebias*/; ArrModels[id]->NavigateMesh->arr_mtl[tmp_countindex] = tmpidmtl; ++tmp_countindex; } - prebias += nmesh->IndexCount[i]; + prebias += nmesh->m_pIndexCount[i]; } - nmesh->IndexBuffer->Unlock(); + nmesh->m_pIndexBuffer->Unlock(); mem_release_del(nmesh); } @@ -1829,7 +1834,7 @@ void Green::GetPartBeam(float3* pos, float3 * dir, Segment** arrsplits, DWORD *c { float3 center; float radius; - comsegment->BoundVolumeP->GetSphere(¢er, &radius); + comsegment->BoundVolumeP->getSphere(¢er, &radius); float distsqr = SGCore_0DistancePointBeam2(center, *pos, *dir); if (comsegment->CountAllGreen > 0 && distsqr <= radius*radius) @@ -1881,11 +1886,11 @@ bool Green::TraceBeam(float3* start, float3* dir, float3* _res, ID* idgreen, ID* GetPartBeam(start, dir, irs->Arr, &(irs->CountCom), model->SplitsTree, irs->Count); vertex_static* pVertData = 0; - if (FAILED(model->ArrLod[0]->model->VertexBuffer->Lock(0, 0, (void**)&pVertData, 0))) + if (FAILED(model->ArrLod[0]->model->m_pVertexBuffer->Lock(0, 0, (void**)&pVertData, 0))) continue; DWORD* pIndData = 0; - if (FAILED(model->ArrLod[0]->model->IndexBuffer->Lock(0, 0, (void**)&pIndData, 0))) + if (FAILED(model->ArrLod[0]->model->m_pIndexBuffer->Lock(0, 0, (void**)&pIndData, 0))) continue; for (int k = 0; k < irs->CountCom; ++k) @@ -1893,9 +1898,9 @@ bool Green::TraceBeam(float3* start, float3* dir, float3* _res, ID* idgreen, ID* for (int key = 0; key < irs->Arr[k]->CountAllGreen; ++key) { UINT tmpcountind = 0; - for (int g = 0; g < model->ArrLod[0]->model->SubsetCount; ++g) + for (int g = 0; g < model->ArrLod[0]->model->m_uiSubsetCount; ++g) { - for (int poly = 0; poly < model->ArrLod[0]->model->IndexCount[g] / 3; ++poly) + for (int poly = 0; poly < model->ArrLod[0]->model->m_pIndexCount[g] / 3; ++poly) { float tmpscale = irs->Arr[k]->Data[key].m_vTexCoord.x; mat = SMMatrixScaling(tmpscale, tmpscale, tmpscale) * SMMatrixRotationY(irs->Arr[k]->Data[key].m_vTexCoord.y) * SMMatrixTranslation(irs->Arr[k]->Data[key].m_vPosition); @@ -1926,13 +1931,13 @@ bool Green::TraceBeam(float3* start, float3* dir, float3* _res, ID* idgreen, ID* } } - tmpcountind += model->ArrLod[0]->model->SubsetCount; + tmpcountind += model->ArrLod[0]->model->m_uiSubsetCount; } } } - model->ArrLod[0]->model->VertexBuffer->Unlock(); - model->ArrLod[0]->model->IndexBuffer->Unlock(); + model->ArrLod[0]->model->m_pVertexBuffer->Unlock(); + model->ArrLod[0]->model->m_pIndexBuffer->Unlock(); } if (found && _res) @@ -1945,7 +1950,7 @@ void Green::GetPartBB(float3* bbmin, float3 * bbmax, Segment** arrsplits, DWORD { float3 min,max; float radius; - comsegment->BoundVolumeP->GetMinMax(&min, &max); + comsegment->BoundVolumeP->getMinMax(&min, &max); if (comsegment->CountAllGreen > 0 && SGCore_0InretsectBox(bbmin, bbmax, &min, &max)) { @@ -1989,14 +1994,14 @@ bool Green::GetOccurencessLeafGrass(float3* bbmin, float3* bbmax, int physic_mtl GetPartBB(bbmin, bbmax, irs->Arr, &(irs->CountCom), model->SplitsTree, irs->Count); vertex_static* pVertData = 0; - if (FAILED(model->ArrLod[0]->model->VertexBuffer->Lock(0, 0, (void**)&pVertData, 0))) + if (FAILED(model->ArrLod[0]->model->m_pVertexBuffer->Lock(0, 0, (void**)&pVertData, 0))) continue; DWORD* pIndData = 0; - if (FAILED(model->ArrLod[0]->model->IndexBuffer->Lock(0, 0, (void**)&pIndData, 0))) + if (FAILED(model->ArrLod[0]->model->m_pIndexBuffer->Lock(0, 0, (void**)&pIndData, 0))) continue; - for (int g = 0; g < model->ArrLod[0]->model->SubsetCount && !isfound; ++g) + for (int g = 0; g < model->ArrLod[0]->model->m_uiSubsetCount && !isfound; ++g) { int pt = SGCore_MtlGetPhysicType(model->ArrLod[0]->idstex[g]); if (SGCore_MtlGetPhysicType(model->ArrLod[0]->idstex[g]) != physic_mtl) @@ -2008,7 +2013,7 @@ bool Green::GetOccurencessLeafGrass(float3* bbmin, float3* bbmax, int physic_mtl { - for (int poly = 0; poly < model->ArrLod[0]->model->IndexCount[g] / 3 && !isfound; ++poly) + for (int poly = 0; poly < model->ArrLod[0]->model->m_pIndexCount[g] / 3 && !isfound; ++poly) { float tmpscale = irs->Arr[k]->Data[key].m_vTexCoord.x; mat = SMMatrixScaling(tmpscale, tmpscale, tmpscale) * SMMatrixRotationY(irs->Arr[k]->Data[key].m_vTexCoord.y) * SMMatrixTranslation(irs->Arr[k]->Data[key].m_vPosition); @@ -2058,8 +2063,8 @@ bool Green::GetOccurencessLeafGrass(float3* bbmin, float3* bbmax, int physic_mtl } } - model->ArrLod[0]->model->VertexBuffer->Unlock(); - model->ArrLod[0]->model->IndexBuffer->Unlock(); + model->ArrLod[0]->model->m_pVertexBuffer->Unlock(); + model->ArrLod[0]->model->m_pIndexBuffer->Unlock(); } return isfound; diff --git a/source/geom/green.h b/source/geom/green.h index 87085bbd8..5bc914a6b 100644 --- a/source/geom/green.h +++ b/source/geom/green.h @@ -1,19 +1,22 @@ -#ifndef __green -#define __green +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __GREEN_H +#define __GREEN_H #include <gdefines.h> -#include <common\\string.h> -#include <common\array.h> -#include <common\SXMath.h> +#include <common/string.h> +#include <common/array.h> +#include <common/SXMath.h> #include <d3d9.h> -#include <gcore\\sxgcore.h> +#include <gcore/sxgcore.h> #include "static_geom.h" #include "sxgeom.h" -extern report_func g_fnReportf; - #define GREEN_COUNT_TYPE_SEGMENTATION 4 #define GREEN_COUNT_LOD 3 @@ -23,13 +26,13 @@ extern report_func g_fnReportf; #define GREEN_PRECOND_ARRCOMFOR_ERR_ID(id_arr) \ if (!(id_arr < ArrComFor.size()))\ {\ - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - green: unresolved id '%d' for array of compute visible", GEN_MSG_LOCATION, id_arr); \ + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - green: unresolved id '%d' for array of compute visible", GEN_MSG_LOCATION, id_arr); \ } #define GREEN_PRECOND_ARRCOMFOR_ERR_ID_MODEL(id_model) \ if (!(id_model < ArrModels.size() && ArrModels[id_model]))\ {\ - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - green: unresolved id '%d' for array of models", GEN_MSG_LOCATION, id_model); \ + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - green: unresolved id '%d' for array of models", GEN_MSG_LOCATION, id_model); \ } class Green @@ -71,7 +74,7 @@ public: void Save(const char* path); void Load(const char* path); void Clear(); - void CPUFillingArrIndeces(ISXFrustum* frustum, float3* viewpos, ID id_arr = 0); + void CPUFillingArrIndeces(const ISXFrustum* frustum, float3* viewpos, ID id_arr = 0); void GPURender(DWORD timeDelta, float3* viewpos, GREEN_TYPE type, ID id_arr = 0); void GPURenderSingly(DWORD timeDelta, float3* viewpos, ID id, ID id_tex); void GPURenderObject(DWORD timeDelta, float3* viewpos, ID id, ID split, ID idobj, ID id_tex); @@ -189,7 +192,7 @@ protected: void GetPartBeam(float3* pos, float3 * dir, Segment** arrsplits, DWORD *count, Segment* comsegment, ID curr_splits_ids_render); void GetPartBB(float3* bbmin, float3 * bbmax, Segment** arrsplits, DWORD *count, Segment* comsegment, ID curr_splits_ids_render); - void ComRecArrIndeces(ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GREEN_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render); + void ComRecArrIndeces(const ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GREEN_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render); void AddModelInArrCom(ID id_model); void DelModelInArrCom(ID id_model); diff --git a/source/geom/static_geom.cpp b/source/geom/static_geom.cpp index d31c69838..a29726b9c 100644 --- a/source/geom/static_geom.cpp +++ b/source/geom/static_geom.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "static_geom.h" StaticGeom::Segment::Segment() @@ -220,7 +225,7 @@ long StaticGeom::GetCountModel() ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) { - g_fnReportf(0, "load geometry: '%s'.. ", path); + LibReport(0, "load geometry: '%s'.. ", path); DelArrIndexPtr(); ISXDataStaticModel* model = 0; @@ -243,26 +248,26 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) vertex_static* pVert; UINT* pInd; - if (FAILED(model->VertexBuffer->Lock(0, 0, (void**)&pVert, 0))) + if (FAILED(model->m_pVertexBuffer->Lock(0, 0, (void**)&pVert, 0))) return -1; - if (FAILED(model->IndexBuffer->Lock(0, 0, (void**)&pInd, 0))) + if (FAILED(model->m_pIndexBuffer->Lock(0, 0, (void**)&pInd, 0))) return -1; - for (int i = 0; i < model->SubsetCount; ++i) + for (int i = 0; i < model->m_uiSubsetCount; ++i) { - tmpmodel->CountPoly += model->IndexCount[i] / 3; + tmpmodel->CountPoly += model->m_pIndexCount[i] / 3; char tmptex[1024]; - sprintf(tmptex, "%s.dds", model->ArrTextures[i]); + sprintf(tmptex, "%s.dds", model->m_ppTextures[i]); tmpmodel->IDTex[i] = SGCore_MtlLoad(tmptex, MTL_TYPE_GEOM); //если количество полигонов в подгруппе модели больше разрешенного - if (model->IndexCount[i] / 3 > GEOM_MAX_POLY_IN_GROUP) + if (model->m_pIndexCount[i] / 3 > GEOM_MAX_POLY_IN_GROUP) { - g_fnReportf(-1, "[GEOM] %s count polygons %d in group over default '%d'", GEN_MSG_LOCATION, model->IndexCount[i] / 3, GEOM_MAX_POLY_IN_GROUP); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s count polygons %d in group over default '%d'", GEN_MSG_LOCATION, model->m_pIndexCount[i] / 3, GEOM_MAX_POLY_IN_GROUP); return -1; } @@ -271,7 +276,7 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) for (int k = 0; k < AllGroups.size(); ++k) { //сравниваем подгруппы только по имени, если имена одинаковые значит это одна и та же подгруппа - if (stricmp(AllGroups[k]->name.c_str(), model->ArrTextures[i]) == 0) + if (stricmp(AllGroups[k]->name.c_str(), model->m_ppTextures[i]) == 0) { isunictex = false; @@ -285,13 +290,13 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) vertex_static * pData2; //если последний незаполненный буфер не вмещает в себ¤ - if (AllGroups[k]->CountIndex[AllGroups[k]->CountIndex.size() - 1] / 3 + model->IndexCount[i] / 3 > GEOM_MAX_POLY_IN_GROUP) + if (AllGroups[k]->CountIndex[AllGroups[k]->CountIndex.size() - 1] / 3 + model->m_pIndexCount[i] / 3 > GEOM_MAX_POLY_IN_GROUP) { //создаем новый gdb.VertexStart = 0; - gdb.VertexCount = model->VertexCount[i]; + gdb.VertexCount = model->m_pVertexCount[i]; - StaticGeom::DXDevice->CreateVertexBuffer(sizeof(vertex_static)* model->VertexCount[i], NULL, NULL, D3DPOOL_MANAGED, &vb, 0); + StaticGeom::DXDevice->CreateVertexBuffer(sizeof(vertex_static)* model->m_pVertexCount[i], NULL, NULL, D3DPOOL_MANAGED, &vb, 0); /*Group::VertexBuff* vborigin = new Group::VertexBuff(); vborigin->count = model->VertexCount[i]; @@ -302,12 +307,12 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) } AllGroups[k]->VertexBufferOrigin.push_back(vborigin);*/ - AllGroups[k]->AllCountVertex += model->VertexCount[i]; - AllGroups[k]->CountVertex.push_back(model->VertexCount[i]); + AllGroups[k]->AllCountVertex += model->m_pVertexCount[i]; + AllGroups[k]->CountVertex.push_back(model->m_pVertexCount[i]); //копируем данные в новый вершинный буфер if (!FAILED(vb->Lock(0, 0, (void**)&pData, 0))) { - memcpy(pData, pVert + model->StartVertex[i], sizeof(vertex_static)* model->VertexCount[i]); + memcpy(pData, pVert + model->m_pStartVertex[i], sizeof(vertex_static)* model->m_pVertexCount[i]); vb->Unlock(); } @@ -315,18 +320,18 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) gdb.IndexStart = 0; - gdb.IndexCount = model->IndexCount[i]; - AllGroups[k]->AllCountIndex += model->IndexCount[i]; - AllGroups[k]->CountIndex.push_back(model->IndexCount[i]); + gdb.IndexCount = model->m_pIndexCount[i]; + AllGroups[k]->AllCountIndex += model->m_pIndexCount[i]; + AllGroups[k]->CountIndex.push_back(model->m_pIndexCount[i]); gdb.idbuff = AllGroups[k]->VertexBuffer.size()-1; AllGroups[k]->ArrModels[gdb.idbuff].push_back(tmpmodel); - if (SizeRenderIndexBuffer < model->IndexCount[i]) + if (SizeRenderIndexBuffer < model->m_pIndexCount[i]) { mem_release(RenderIndexBuffer); - SizeRenderIndexBuffer = model->IndexCount[i]; + SizeRenderIndexBuffer = model->m_pIndexCount[i]; StaticGeom::DXDevice->CreateIndexBuffer(sizeof(uint32_t)* SizeRenderIndexBuffer, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_DEFAULT/*D3DPOOL_MANAGED*/, &RenderIndexBuffer, 0); } } @@ -339,7 +344,7 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) AllGroups[k]->ArrModels[gdb.idbuff].push_back(tmpmodel); long lastvbnum = AllGroups[k]->VertexBuffer.size() - 1; - StaticGeom::DXDevice->CreateVertexBuffer(sizeof(vertex_static)* (AllGroups[k]->CountVertex[lastvbnum] + model->VertexCount[i]), NULL, NULL, D3DPOOL_MANAGED, &vb, 0); + StaticGeom::DXDevice->CreateVertexBuffer(sizeof(vertex_static)* (AllGroups[k]->CountVertex[lastvbnum] + model->m_pVertexCount[i]), NULL, NULL, D3DPOOL_MANAGED, &vb, 0); /*Group::VertexBuff* vborigin = new Group::VertexBuff(); vborigin->count = (AllGroups[k]->CountVertex[lastvbnum] + model->VertexCount[i]); @@ -353,7 +358,7 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) AllGroups[k]->VertexBufferOrigin[lastvbnum] = vborigin;*/ gdb.VertexStart = AllGroups[k]->CountVertex[lastvbnum]; - gdb.VertexCount = model->VertexCount[i]; + gdb.VertexCount = model->m_pVertexCount[i]; if (!FAILED(vb->Lock(0, 0, (void**)&pData, 0))) { @@ -363,25 +368,25 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) AllGroups[k]->VertexBuffer[lastvbnum]->Unlock(); } - memcpy(pData + AllGroups[k]->CountVertex[lastvbnum], pVert + model->StartVertex[i], sizeof(vertex_static)* (model->VertexCount[i])); + memcpy(pData + AllGroups[k]->CountVertex[lastvbnum], pVert + model->m_pStartVertex[i], sizeof(vertex_static)* (model->m_pVertexCount[i])); vb->Unlock(); } - AllGroups[k]->AllCountVertex += model->VertexCount[i]; - AllGroups[k]->CountVertex[lastvbnum] += model->VertexCount[i]; + AllGroups[k]->AllCountVertex += model->m_pVertexCount[i]; + AllGroups[k]->CountVertex[lastvbnum] += model->m_pVertexCount[i]; mem_release(AllGroups[k]->VertexBuffer[lastvbnum]); AllGroups[k]->VertexBuffer[lastvbnum] = vb; gdb.IndexStart = AllGroups[k]->CountIndex[lastvbnum]; - gdb.IndexCount = model->IndexCount[i]; + gdb.IndexCount = model->m_pIndexCount[i]; - AllGroups[k]->AllCountIndex += model->IndexCount[i]; - AllGroups[k]->CountIndex[lastvbnum] += model->IndexCount[i]; + AllGroups[k]->AllCountIndex += model->m_pIndexCount[i]; + AllGroups[k]->CountIndex[lastvbnum] += model->m_pIndexCount[i]; - if (SizeRenderIndexBuffer < (AllGroups[k]->CountIndex[lastvbnum] + model->IndexCount[i])) + if (SizeRenderIndexBuffer < (AllGroups[k]->CountIndex[lastvbnum] + model->m_pIndexCount[i])) { mem_release(RenderIndexBuffer); - SizeRenderIndexBuffer = (AllGroups[k]->CountIndex[lastvbnum] + model->IndexCount[i]); + SizeRenderIndexBuffer = (AllGroups[k]->CountIndex[lastvbnum] + model->m_pIndexCount[i]); StaticGeom::DXDevice->CreateIndexBuffer(sizeof(uint32_t)* SizeRenderIndexBuffer, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_DEFAULT/*D3DPOOL_MANAGED*/, &RenderIndexBuffer, 0); } } @@ -400,14 +405,14 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) gdb.idbuff = 0; gdb.idgroup = AllGroups.size(); gdb.VertexStart = 0; - gdb.VertexCount = model->VertexCount[i]; + gdb.VertexCount = model->m_pVertexCount[i]; gdb.IndexStart = 0; - gdb.IndexCount = model->IndexCount[i]; + gdb.IndexCount = model->m_pIndexCount[i]; tmpmodel->SubSet.push_back(gdb); IDirect3DVertexBuffer9* vb; - StaticGeom::DXDevice->CreateVertexBuffer(sizeof(vertex_static)* model->VertexCount[i], NULL, NULL, D3DPOOL_MANAGED, &vb, 0); + StaticGeom::DXDevice->CreateVertexBuffer(sizeof(vertex_static)* model->m_pVertexCount[i], NULL, NULL, D3DPOOL_MANAGED, &vb, 0); /*Group::VertexBuff* vborigin = new Group::VertexBuff(); vborigin->count = model->VertexCount[i]; @@ -418,25 +423,25 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) vborigin->arr[k] = (model->ArrVertBuf + model->StartVertex[i] + k)->Pos; }*/ - ngroup->AllCountVertex = model->VertexCount[i]; - ngroup->CountVertex.push_back(model->VertexCount[i]); + ngroup->AllCountVertex = model->m_pVertexCount[i]; + ngroup->CountVertex.push_back(model->m_pVertexCount[i]); vertex_static * pData; if (!FAILED(vb->Lock(0, 0, (void**)&pData, 0))) { - memcpy(pData, pVert + model->StartVertex[i], sizeof(vertex_static)* model->VertexCount[i]); + memcpy(pData, pVert + model->m_pStartVertex[i], sizeof(vertex_static)* model->m_pVertexCount[i]); vb->Unlock(); } - ngroup->AllCountIndex = model->IndexCount[i]; - ngroup->CountIndex.push_back(model->IndexCount[i]); + ngroup->AllCountIndex = model->m_pIndexCount[i]; + ngroup->CountIndex.push_back(model->m_pIndexCount[i]); ngroup->VertexBuffer.push_back(vb); //ngroup->VertexBufferOrigin.push_back(vborigin); - if (SizeRenderIndexBuffer < model->IndexCount[i]) + if (SizeRenderIndexBuffer < model->m_pIndexCount[i]) { mem_release(RenderIndexBuffer); - SizeRenderIndexBuffer = model->IndexCount[i]; + SizeRenderIndexBuffer = model->m_pIndexCount[i]; StaticGeom::DXDevice->CreateIndexBuffer(sizeof(uint32_t)* SizeRenderIndexBuffer, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_DEFAULT/*D3DPOOL_MANAGED*/, &RenderIndexBuffer, 0); } @@ -446,20 +451,20 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) ngroup->idtex = tmpmodel->IDTex[i];// SGCore_LoadMtl(tmptex, MTL_GEOM); ngroup->SortGroup = SGCore_MtlGetSort(ngroup->idtex); ngroup->IsRenderSingly = SGCore_MtlGroupRenderIsSingly(ngroup->idtex); - ngroup->name = model->ArrTextures[i]; + ngroup->name = model->m_ppTextures[i]; AllGroups.push_back(ngroup); } vertex_static* pData; - model->VertexBuffer->Lock(0, 0, (void**)&pData, 0); + model->m_pVertexBuffer->Lock(0, 0, (void**)&pData, 0); - float3_t tmppos = pData[model->StartVertex[i]].Pos; + float3_t tmppos = pData[model->m_pStartVertex[i]].Pos; float3 tmpMax = tmppos; float3 tmpMin = tmppos; - for (DWORD k = 0; k<model->VertexCount[i]; k++) + for (DWORD k = 0; k<model->m_pVertexCount[i]; k++) { - tmppos = pData[model->StartVertex[i] + k].Pos; + tmppos = pData[model->m_pStartVertex[i] + k].Pos; if (tmppos.x > tmpMax.x) tmpMax.x = tmppos.x; @@ -482,24 +487,24 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) } DWORD* indeces; - model->IndexBuffer->Lock(0, 0, (void **)&indeces, 0); + model->m_pIndexBuffer->Lock(0, 0, (void **)&indeces, 0); float3 tmpMM = SMVectorLerp(tmpMax, tmpMin, 0.5f); D3DXPlaneFromPoints(&tmpmodel->SubSet[i].Plane, - &D3DXVECTOR3(pData[indeces[model->StartIndex[i] + 0]].Pos.x, pData[indeces[model->StartIndex[i] + 0]].Pos.y, pData[indeces[model->StartIndex[i] + 0]].Pos.z), - &D3DXVECTOR3(pData[indeces[model->StartIndex[i] + 1]].Pos.x, pData[indeces[model->StartIndex[i] + 1]].Pos.y, pData[indeces[model->StartIndex[i] + 1]].Pos.z), - &D3DXVECTOR3(pData[indeces[model->StartIndex[i] + 2]].Pos.x, pData[indeces[model->StartIndex[i] + 2]].Pos.y, pData[indeces[model->StartIndex[i] + 2]].Pos.z)); - model->VertexBuffer->Unlock(); - model->IndexBuffer->Unlock(); + &D3DXVECTOR3(pData[indeces[model->m_pStartIndex[i] + 0]].Pos.x, pData[indeces[model->m_pStartIndex[i] + 0]].Pos.y, pData[indeces[model->m_pStartIndex[i] + 0]].Pos.z), + &D3DXVECTOR3(pData[indeces[model->m_pStartIndex[i] + 1]].Pos.x, pData[indeces[model->m_pStartIndex[i] + 1]].Pos.y, pData[indeces[model->m_pStartIndex[i] + 1]].Pos.z), + &D3DXVECTOR3(pData[indeces[model->m_pStartIndex[i] + 2]].Pos.x, pData[indeces[model->m_pStartIndex[i] + 2]].Pos.y, pData[indeces[model->m_pStartIndex[i] + 2]].Pos.z)); + model->m_pVertexBuffer->Unlock(); + model->m_pIndexBuffer->Unlock(); tmpmodel->SubSet[i].Center = (float3_t)((tmpMax + tmpMin) * 0.5); tmpmodel->SubSet[i].Min = tmpMin; tmpmodel->SubSet[i].Max = tmpMax; } - model->VertexBuffer->Unlock(); - model->IndexBuffer->Unlock(); + model->m_pVertexBuffer->Unlock(); + model->m_pIndexBuffer->Unlock(); AllModels.push_back(tmpmodel); @@ -515,8 +520,8 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) float3 jmin, jmax, jmin2, jmax2; - AllModels[AllModels.size()-1]->ArrSplits->BoundVolumeP->GetMinMax(&jmin, &jmax); - BoundVolume->GetMinMax(&jmin2, &jmax2); + AllModels[AllModels.size()-1]->ArrSplits->BoundVolumeP->getMinMax(&jmin, &jmax); + BoundVolume->getMinMax(&jmin2, &jmax2); if (jmin2.x > jmin.x) jmin2.x = jmin.x; @@ -532,14 +537,14 @@ ID StaticGeom::AddModel(const char* path, const char* lod1, const char* name) if (jmax2.z < jmax.z) jmax2.z = jmax.z; - BoundVolume->SetMinMax(&jmin2, &jmax2); + BoundVolume->setMinMax(&jmin2, &jmax2); mem_release_del(model); mem_delete_a(ArrMeshVertex); mem_delete_a(ArrMeshIndex); - g_fnReportf(0, " completed\n", path); + LibReport(0, " completed\n", path); return AllModels.size() - 1; } @@ -625,7 +630,7 @@ void StaticGeom::DelModel(ID id) if (tmpidingroup == -1) { //то это очень плохо - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "[GEOM] %s - when deleting the model, it was found in an array of patterns in subgroups of the buffer, it is very bad", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - when deleting the model, it was found in an array of patterns in subgroups of the buffer, it is very bad", GEN_MSG_LOCATION); } //обновляем данные в подгруппе модели о стартовых позициях @@ -977,7 +982,7 @@ void StaticGeom::InitArrIndexPtr() } -void StaticGeom::CPUFillingArrIndeces(ISXFrustum* frustum, float3* viewpos, ID id_arr) +void StaticGeom::CPUFillingArrIndeces(const ISXFrustum* frustum, float3* viewpos, ID id_arr) { STATIC_PRECOND_ARRCOMFOR_ERR_ID(id_arr); @@ -991,7 +996,7 @@ void StaticGeom::CPUFillingArrIndeces(ISXFrustum* frustum, float3* viewpos, ID i { if (id_arr == 0) { - AllModels[i]->ArrSplits->BoundVolumeP->GetSphere(&jcenter, &jradius); + AllModels[i]->ArrSplits->BoundVolumeP->getSphere(&jcenter, &jradius); AllModels[i]->ArrSplits->DistForCamera = SMVector3Length((jcenter - (*viewpos))) - jradius; } @@ -1020,13 +1025,13 @@ void StaticGeom::CPUFillingArrIndeces(ISXFrustum* frustum, float3* viewpos, ID i } } -void StaticGeom::ComRecArrIndeces(ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GEOM_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render) +void StaticGeom::ComRecArrIndeces(const ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GEOM_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render) { float jradius; float3 jcenter; - comsegment->BoundVolumeP->GetSphere(&jcenter, &jradius); + comsegment->BoundVolumeP->getSphere(&jcenter, &jradius); - if (comsegment->CountAllPoly > 0 && (frustum->SphereInFrustum(&jcenter, jradius))) + if (comsegment->CountAllPoly > 0 && (frustum->sphereInFrustum(&jcenter, jradius))) { if (comsegment->BFNonEnd ) { @@ -1040,7 +1045,7 @@ void StaticGeom::ComRecArrIndeces(ISXFrustum* frustum, Segment** arrsplits, DWOR SortId[q] = -1; if (comsegment->Splits[q]) { - comsegment->Splits[q]->BoundVolumeP->GetSphere(&jcenter, &jradius); + comsegment->Splits[q]->BoundVolumeP->getSphere(&jcenter, &jradius); DistFor[q] = SMVector3Length2((jcenter - (*viewpos))) - jradius*jradius; } } @@ -1177,16 +1182,16 @@ void StaticGeom::GPURender(DWORD timeDelta, int sort_mtl, ID id_arr, ID exclude_ if (AllModels[i]->IsRenderLod) { - StaticGeom::DXDevice->SetStreamSource(0, AllModels[i]->Lod0.model->VertexBuffer, 0, sizeof(vertex_static)); - StaticGeom::DXDevice->SetIndices(AllModels[i]->Lod0.model->IndexBuffer); + StaticGeom::DXDevice->SetStreamSource(0, AllModels[i]->Lod0.model->m_pVertexBuffer, 0, sizeof(vertex_static)); + StaticGeom::DXDevice->SetIndices(AllModels[i]->Lod0.model->m_pIndexBuffer); StaticGeom::DXDevice->SetVertexDeclaration(SGCore_StaticModelGetDecl()); - for(int k = 0, kl = AllModels[i]->Lod0.model->SubsetCount; k < kl; ++k) + for (int k = 0, kl = AllModels[i]->Lod0.model->m_uiSubsetCount; k < kl; ++k) { if (AllModels[i]->Lod0.SortGroup == sort_mtl || sort_mtl == -1) { SGCore_MtlSet(AllModels[i]->Lod0.IDsTexs[k], 0); - SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, AllModels[i]->Lod0.model->VertexCount[k], AllModels[i]->Lod0.model->StartIndex[k], AllModels[i]->Lod0.model->IndexCount[k] / 3); - Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + AllModels[i]->Lod0.model->IndexCount[k] / 3); + SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, AllModels[i]->Lod0.model->m_pVertexCount[k], AllModels[i]->Lod0.model->m_pStartIndex[k], AllModels[i]->Lod0.model->m_pIndexCount[k] / 3); + Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + AllModels[i]->Lod0.model->m_pIndexCount[k] / 3); } } } @@ -1398,14 +1403,14 @@ void StaticGeom::GPURenderSingly(DWORD timeDelta, ID id, ID id_tex) if (AllModels[id]->IsRenderLod) { - StaticGeom::DXDevice->SetStreamSource(0, AllModels[id]->Lod0.model->VertexBuffer, 0, sizeof(vertex_static)); - StaticGeom::DXDevice->SetIndices(AllModels[id]->Lod0.model->IndexBuffer); + StaticGeom::DXDevice->SetStreamSource(0, AllModels[id]->Lod0.model->m_pVertexBuffer, 0, sizeof(vertex_static)); + StaticGeom::DXDevice->SetIndices(AllModels[id]->Lod0.model->m_pIndexBuffer); StaticGeom::DXDevice->SetVertexDeclaration(SGCore_StaticModelGetDecl()); - for (int k = 0, kl = AllModels[id]->Lod0.model->SubsetCount; k < kl; ++k) + for (int k = 0, kl = AllModels[id]->Lod0.model->m_uiSubsetCount; k < kl; ++k) { SGCore_MtlSet((id_tex > 0 ? id_tex : AllModels[id]->Lod0.IDsTexs[k]), 0); - SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, AllModels[id]->Lod0.model->VertexCount[k], AllModels[id]->Lod0.model->StartIndex[k], AllModels[id]->Lod0.model->IndexCount[k] / 3); - Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + AllModels[id]->Lod0.model->IndexCount[k] / 3); + SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, AllModels[id]->Lod0.model->m_pVertexCount[k], AllModels[id]->Lod0.model->m_pStartIndex[k], AllModels[id]->Lod0.model->m_pIndexCount[k] / 3); + Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + AllModels[id]->Lod0.model->m_pIndexCount[k] / 3); } } else if (ArrComFor[0]->arr[id]->CountCom > 0) @@ -1492,34 +1497,34 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) vertex_static *CreateV; mem_delete_a(ArrMeshVertex); mem_delete_a(ArrMeshIndex); - CountVertex = model->AllVertexCount; + CountVertex = model->m_uiAllVertexCount; //копируем все вершины для текущих расчетов - ArrMeshVertex = new float3[model->AllVertexCount]; + ArrMeshVertex = new float3[model->m_uiAllVertexCount]; - model->VertexBuffer->Lock(0, 0, (void **)&CreateV, 0); - for (DWORD i = 0; i<model->AllVertexCount; i++) + model->m_pVertexBuffer->Lock(0, 0, (void **)&CreateV, 0); + for (DWORD i = 0; i<model->m_uiAllVertexCount; i++) { ArrMeshVertex[i] = (CreateV[i].Pos.operator float3()); } - model->VertexBuffer->Unlock(); + model->m_pVertexBuffer->Unlock(); - ArrMeshIndex = new UINT[model->AllIndexCount]; + ArrMeshIndex = new UINT[model->m_uiAllIndexCount]; UINT* pInd; - model->IndexBuffer->Lock(0, 0, (void **)&pInd, 0); - memcpy(ArrMeshIndex, pInd, sizeof(UINT)* model->AllIndexCount); - model->IndexBuffer->Unlock(); + model->m_pIndexBuffer->Lock(0, 0, (void **)&pInd, 0); + memcpy(ArrMeshIndex, pInd, sizeof(UINT)* model->m_uiAllIndexCount); + model->m_pIndexBuffer->Unlock(); /////// mesh->ArrSplits = new Segment(); - mesh->ArrSplits->CountAllPoly = model->AllIndexCount/3; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "poly: %d, ", mesh->ArrSplits->CountAllPoly); + mesh->ArrSplits->CountAllPoly = model->m_uiAllIndexCount / 3; + LibReport(REPORT_MSG_LEVEL_NOTICE, "poly: %d, ", mesh->ArrSplits->CountAllPoly); mesh->ArrSplits->BoundVolumeP = SGCore_CrBound(); - mesh->ArrSplits->BoundVolumeP->CalcBound(model->VertexBuffer, model->AllVertexCount, sizeof(vertex_static)); + mesh->ArrSplits->BoundVolumeP->calcBound(model->m_pVertexBuffer, model->m_uiAllVertexCount, sizeof(vertex_static)); float3 tmpMin, tmpMax; - mesh->ArrSplits->BoundVolumeP->GetMinMax(&tmpMin, &tmpMax); + mesh->ArrSplits->BoundVolumeP->getMinMax(&tmpMin, &tmpMax); int CountSplitsSys = 0; int CountPolyInSegment = GEOM_MIN_COUNT_POLY; @@ -1530,24 +1535,24 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) const float minVol = GEOM_MIN_ALLVOLUME_FOR_SEGMENTATION; const float minLen = GEOM_MIN_LENGTH_FOR_SEGMENTATION; const float minOctoHeight = GEOM_MIN_HEIGHT_FOR_SEGMENTATION; - if ((allvolume >= minVol || dimensions.x >= minLen || dimensions.y >= minOctoHeight || dimensions.z >= minLen) && (model->AllIndexCount >= GEOM_MIN_POLYGONS_FOR_SEGMENTATION * 3 || allvolume >= GEOM_FORCE_ALLVOLUME_FOR_SEGMENTATION)) + if ((allvolume >= minVol || dimensions.x >= minLen || dimensions.y >= minOctoHeight || dimensions.z >= minLen) && (model->m_uiAllIndexCount >= GEOM_MIN_POLYGONS_FOR_SEGMENTATION * 3 || allvolume >= GEOM_FORCE_ALLVOLUME_FOR_SEGMENTATION)) { if(dimensions.y >= minOctoHeight) { CountSplitsSys = GEOM_COUNT_TYPE_SEGMENTATION_OCTO; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " div: octo, "); + LibReport(REPORT_MSG_LEVEL_NOTICE, " div: octo, "); } else { CountSplitsSys = GEOM_COUNT_TYPE_SEGMENTATION_QUAD; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " div: quad, "); + LibReport(REPORT_MSG_LEVEL_NOTICE, " div: quad, "); } - float4_t tmpmin(dimensions.x / minLen, dimensions.y / minOctoHeight, dimensions.z / minLen, (float)model->AllIndexCount / (float)GEOM_MIN_POLYGONS_FOR_SEGMENTATION / 3.0f); + float4_t tmpmin(dimensions.x / minLen, dimensions.y / minOctoHeight, dimensions.z / minLen, (float)model->m_uiAllIndexCount / (float)GEOM_MIN_POLYGONS_FOR_SEGMENTATION / 3.0f); tmpmin.x = min(min(min(tmpmin.x, tmpmin.y), min(tmpmin.z, tmpmin.w)), (allvolume / minVol)) * 10.0; - CountPolyInSegment = (float)model->AllIndexCount / 3.0 / tmpmin.x / CountSplitsSys; + CountPolyInSegment = (float)model->m_uiAllIndexCount / 3.0 / tmpmin.x / CountSplitsSys; if (CountPolyInSegment < GEOM_MIN_COUNT_POLY) { @@ -1559,7 +1564,7 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) CountPolyInSegment = GEOM_MAX_COUNT_POLY; } - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "poly in split: %d, ", CountPolyInSegment); + LibReport(REPORT_MSG_LEVEL_NOTICE, "poly in split: %d, ", CountPolyInSegment); } #else @@ -1576,12 +1581,12 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) { //делим как octo дерево CountSplitsSys = GEOM_COUNT_TYPE_SEGMENTATION_OCTO; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " div: octo, "); + LibReport(REPORT_MSG_LEVEL_NOTICE, " div: octo, "); } else { CountSplitsSys = STATIC_COUNT_TYPE_SEGMENTATION_QUAD; - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, " div: quad, "); + LibReport(REPORT_MSG_LEVEL_NOTICE, " div: quad, "); } //определяем коэфициент интерполяции для определния минимального количества полигонов в сплите @@ -1591,7 +1596,7 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) else if(tmpcoef < 0.f) tmpcoef = 0; CountPolyInSegment = lerpf(STATIC_MIN_COUNT_POLY, STATIC_MAX_COUNT_POLY, tmpcoef); - g_fnReportf(REPORT_MSG_LEVEL_NOTICE, "poly in split: %d, ", CountPolyInSegment); + LibReport(REPORT_MSG_LEVEL_NOTICE, "poly in split: %d, ", CountPolyInSegment); } #endif @@ -1659,22 +1664,22 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) } mesh->ArrSplits->BoundVolumeSys = SGCore_CrBound(); - mesh->ArrSplits->BoundVolumeSys->SetMinMax(&tmpMin, &tmpMax); + mesh->ArrSplits->BoundVolumeSys->setMinMax(&tmpMin, &tmpMax); //}} - mesh->ArrSplits->CountSubSet = model->SubsetCount; - mesh->ArrSplits->NumberGroup = new uint32_t[model->SubsetCount]; - mesh->ArrSplits->NumberGroupModel = new uint32_t[model->SubsetCount]; - mesh->ArrSplits->CountPoly = new uint32_t[model->SubsetCount]; + mesh->ArrSplits->CountSubSet = model->m_uiSubsetCount; + mesh->ArrSplits->NumberGroup = new uint32_t[model->m_uiSubsetCount]; + mesh->ArrSplits->NumberGroupModel = new uint32_t[model->m_uiSubsetCount]; + mesh->ArrSplits->CountPoly = new uint32_t[model->m_uiSubsetCount]; ///// //заполняем массив с номаерами подгрупп и массив с количествами полигонов - for (DWORD i = 0; i<model->SubsetCount; i++) + for (DWORD i = 0; i<model->m_uiSubsetCount; i++) { mesh->ArrSplits->NumberGroupModel[i] = i; mesh->ArrSplits->NumberGroup[i] = i; - mesh->ArrSplits->CountPoly[i] = model->IndexCount[i] / 3; + mesh->ArrSplits->CountPoly[i] = model->m_pIndexCount[i] / 3; } //создаем массивы с полигонами, каждый полигон принадлежит своей подгруппе @@ -1685,9 +1690,9 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) } //заполняем массивы с полигонами - for (DWORD i = 0; i<model->SubsetCount; i++) + for (DWORD i = 0; i<model->m_uiSubsetCount; i++) { - memcpy(mesh->ArrSplits->ArrPoly[i], ArrMeshIndex + model->StartIndex[i], model->IndexCount[i] * sizeof(uint32_t)); + memcpy(mesh->ArrSplits->ArrPoly[i], ArrMeshIndex + model->m_pStartIndex[i], model->m_pIndexCount[i] * sizeof(uint32_t)); } //если количество полигонов и текущая установка деления позволяют делить дальше @@ -1731,7 +1736,7 @@ void StaticGeom::PreSegmentation(Model* mesh, ISXDataStaticModel* model) { for (DWORD k = 0; k<mesh->ArrSplits->CountPoly[i] * 3; k++) { - mesh->ArrSplits->ArrPoly[i][k] -= model->StartVertex[mesh->ArrSplits->NumberGroup[i]]; + mesh->ArrSplits->ArrPoly[i][k] -= model->m_pStartVertex[mesh->ArrSplits->NumberGroup[i]]; mesh->ArrSplits->ArrPoly[i][k] += mesh->SubSet[mesh->ArrSplits->NumberGroup[i]].VertexStart; } mesh->ArrSplits->NumberGroup[i] = mesh->SubSet[mesh->ArrSplits->NumberGroup[i]].idgroup; @@ -1791,9 +1796,9 @@ void StaticGeom::Segmentation(Segment* Split, Model* mesh, ISXDataStaticModel* m for (int i = 0; i<CountSplitsSys; i++) { Split->Splits[i]->BoundVolumeSys = ArrBound[i]; - Split->Splits[i]->BoundVolumeSys->GetMinMax(&tmpmin, &tmpmax); + Split->Splits[i]->BoundVolumeSys->getMinMax(&tmpmin, &tmpmax); Split->Splits[i]->BoundVolumeP = SGCore_CrBound(); - Split->Splits[i]->BoundVolumeP->SetMinMax(&tmpmin, &tmpmax); + Split->Splits[i]->BoundVolumeP->setMinMax(&tmpmin, &tmpmax); } } else if (CountSplitsSys == GEOM_COUNT_TYPE_SEGMENTATION_OCTO) @@ -1808,9 +1813,9 @@ void StaticGeom::Segmentation(Segment* Split, Model* mesh, ISXDataStaticModel* m for (int i = 0; i<CountSplitsSys; i++) { Split->Splits[i]->BoundVolumeSys = ArrBound[i]; - Split->Splits[i]->BoundVolumeSys->GetMinMax(&tmpmin, &tmpmax); + Split->Splits[i]->BoundVolumeSys->getMinMax(&tmpmin, &tmpmax); Split->Splits[i]->BoundVolumeP = SGCore_CrBound(); - Split->Splits[i]->BoundVolumeP->SetMinMax(&tmpmin, &tmpmax); + Split->Splits[i]->BoundVolumeP->setMinMax(&tmpmin, &tmpmax); } } //}} @@ -1823,7 +1828,7 @@ void StaticGeom::Segmentation(Segment* Split, Model* mesh, ISXDataStaticModel* m float3 tmpMin, tmpMax; for (int i = 0; i<CountSplitsSys; i++) { - Split->Splits[i]->BoundVolumeSys->GetMinMax(&tmpMin, &tmpMax); + Split->Splits[i]->BoundVolumeSys->getMinMax(&tmpMin, &tmpMax); //SGCore_FCreateBoundingBoxMesh(&tmpMin, &tmpMax, &(Split->Splits[i]->BoundBox)); DWORD tmpNumCurrentPoly = 0; for (DWORD j = 0; j<Split->CountSubSet; j++) @@ -1881,7 +1886,7 @@ void StaticGeom::Segmentation(Segment* Split, Model* mesh, ISXDataStaticModel* m for (int q = 0; q<CountSplitsSys; q++) { - Split->Splits[q]->BoundVolumeSys->GetSphere(&SphereCenter, &ShereRadius); + Split->Splits[q]->BoundVolumeSys->getSphere(&SphereCenter, &ShereRadius); Length = -SphereCenter + CenterPoly; ArrLength[q] = SMVector3Length(Length); } @@ -2060,7 +2065,7 @@ void StaticGeom::Segmentation(Segment* Split, Model* mesh, ISXDataStaticModel* m { for (DWORD k = 0; k<Split->Splits[i]->CountPoly[q] * 3; k++) { - Split->Splits[i]->ArrPoly[q][k] -= model->StartVertex[Split->Splits[i]->NumberGroup[q]]; + Split->Splits[i]->ArrPoly[q][k] -= model->m_pStartVertex[Split->Splits[i]->NumberGroup[q]]; Split->Splits[i]->ArrPoly[q][k] += mesh->SubSet[Split->Splits[i]->NumberGroup[q]].VertexStart; } @@ -2097,7 +2102,7 @@ void StaticGeom::EditVolume(Model* mesh, Segment* Split) Min = ArrMeshVertex[(Split->ArrPoly[0][0])]; float3 Max2, Min2; - Split->BoundVolumeSys->GetMinMax(&Min2, &Max2); + Split->BoundVolumeSys->getMinMax(&Min2, &Max2); float3 tmpf; for (DWORD i = 0; i<Split->CountSubSet; i++) @@ -2125,7 +2130,7 @@ void StaticGeom::EditVolume(Model* mesh, Segment* Split) //float Radius = SMVector3Length(Center - Max); //Split->BoundVolumeP->SetSphere(&Center, &Radius); - Split->BoundVolumeP->SetMinMax(&Min, &Max); + Split->BoundVolumeP->setMinMax(&Min, &Max); } void StaticGeom::Save(const char* path) @@ -2248,7 +2253,7 @@ void StaticGeom::Save(const char* path) void StaticGeom::SaveSplit(Segment* Split, FILE* file, Array<Segment*> * queue) { float3 jmin, jmax; - Split->BoundVolumeSys->GetMinMax(&jmin, &jmax); + Split->BoundVolumeSys->getMinMax(&jmin, &jmax); fwrite(&jmin.x, sizeof(float), 1, file); fwrite(&jmin.y, sizeof(float), 1, file); fwrite(&jmin.z, sizeof(float), 1, file); @@ -2257,7 +2262,7 @@ void StaticGeom::SaveSplit(Segment* Split, FILE* file, Array<Segment*> * queue) fwrite(&jmax.y, sizeof(float), 1, file); fwrite(&jmax.z, sizeof(float), 1, file); - Split->BoundVolumeP->GetMinMax(&jmin, &jmax); + Split->BoundVolumeP->getMinMax(&jmin, &jmax); fwrite(&jmin.x, sizeof(float), 1, file); fwrite(&jmin.y, sizeof(float), 1, file); fwrite(&jmin.z, sizeof(float), 1, file); @@ -2478,8 +2483,8 @@ void StaticGeom::Load(const char* path) float3 jmin, jmax, jmin2, jmax2; - AllModels[i]->ArrSplits->BoundVolumeP->GetMinMax(&jmin, &jmax); - BoundVolume->GetMinMax(&jmin2, &jmax2); + AllModels[i]->ArrSplits->BoundVolumeP->getMinMax(&jmin, &jmax); + BoundVolume->getMinMax(&jmin2, &jmax2); if (jmin2.x > jmin.x) jmin2.x = jmin.x; @@ -2495,7 +2500,7 @@ void StaticGeom::Load(const char* path) if (jmax2.z < jmax.z) jmax2.z = jmax.z; - BoundVolume->SetMinMax(&jmin2, &jmax2); + BoundVolume->setMinMax(&jmin2, &jmax2); } for (long i = 0; i < AllGroups.size(); ++i) @@ -2528,7 +2533,7 @@ void StaticGeom::LoadSplit(Segment** Split, FILE* file, Array<Segment**> * queue fread(&jmax.z, sizeof(float), 1, file); (*Split)->BoundVolumeSys = SGCore_CrBound(); - (*Split)->BoundVolumeSys->SetMinMax(&jmin, &jmax); + (*Split)->BoundVolumeSys->setMinMax(&jmin, &jmax); fread(&jmin.x, sizeof(float), 1, file); @@ -2540,7 +2545,7 @@ void StaticGeom::LoadSplit(Segment** Split, FILE* file, Array<Segment**> * queue fread(&jmax.z, sizeof(float), 1, file); (*Split)->BoundVolumeP = SGCore_CrBound(); - (*Split)->BoundVolumeP->SetMinMax(&jmin, &jmax); + (*Split)->BoundVolumeP->setMinMax(&jmin, &jmax); fread(&(*Split)->CountAllPoly, sizeof(uint32_t), 1, file); @@ -2647,7 +2652,7 @@ void StaticGeom::SortGroup(float3* viewpos, int sort_mtl) void StaticGeom::GetIntersectedRayY2(float3* pos, Segment** arrsplits, DWORD *count, Segment* comsegment, ID curr_splits_ids_render) { float3 jmin, jmax; - comsegment->BoundVolumeP->GetMinMax(&jmin, &jmax); + comsegment->BoundVolumeP->getMinMax(&jmin, &jmax); if (comsegment->CountAllPoly > 0 && pos->x >= jmin.x && pos->z >= jmin.z && pos->x <= jmax.x && pos->z <= jmax.z) { @@ -2754,7 +2759,7 @@ bool StaticGeom::GetIntersectedRayY(float3* pos) void StaticGeom::GetMinMax(float3* min, float3* max) { - BoundVolume->GetMinMax(min, max); + BoundVolume->getMinMax(min, max); } ID StaticGeom::AddArrForCom() @@ -2861,7 +2866,7 @@ void StaticGeom::GetModelMinMax(ID id, float3* min, float3* max) if (id >= AllModels.size()) return; - AllModels[id]->ArrSplits->BoundVolumeP->GetMinMax(min, max); + AllModels[id]->ArrSplits->BoundVolumeP->getMinMax(min, max); } @@ -2910,9 +2915,9 @@ void StaticGeom::SetModelLodPath(ID id, const char* path) char tmptex[1024]; ID tmpidmat; - for (int i = 0; i < AllModels[id]->Lod0.model->SubsetCount; ++i) + for (int i = 0; i < AllModels[id]->Lod0.model->m_uiSubsetCount; ++i) { - sprintf(tmptex, "%s.dds", AllModels[id]->Lod0.model->ArrTextures[i]); + sprintf(tmptex, "%s.dds", AllModels[id]->Lod0.model->m_ppTextures[i]); tmpidmat = SGCore_MtlLoad(tmptex, MTL_TYPE_GEOM); AllModels[id]->Lod0.IDsTexs.push_back(tmpidmat); AllModels[id]->Lod0.SortGroup = SGCore_MtlGetSort(tmpidmat); @@ -2920,7 +2925,7 @@ void StaticGeom::SetModelLodPath(ID id, const char* path) sprintf(AllModels[id]->Lod0.PathName,"%s",path); - AllModels[id]->Lod0.BoundVolume->CalcBound(AllModels[id]->Lod0.model->VertexBuffer, AllModels[id]->Lod0.model->AllVertexCount, sizeof(vertex_static)); + AllModels[id]->Lod0.BoundVolume->calcBound(AllModels[id]->Lod0.model->m_pVertexBuffer, AllModels[id]->Lod0.model->m_uiAllVertexCount, sizeof(vertex_static)); ApplyTransformLod(id); } @@ -2937,7 +2942,7 @@ void StaticGeom::ApplyTransform(ID id) float3 tmpscale = tmpmodel->Scale / tmpmodel->OldScale; float3 jmin, jmax; - tmpmodel->ArrSplits->BoundVolumeP->GetMinMax(&jmin, &jmax); + tmpmodel->ArrSplits->BoundVolumeP->getMinMax(&jmin, &jmax); float3 jcentererpos = (jmax + jmin)*0.5f; RotationMat = SMMatrixRotationX(tmprot.x) * SMMatrixRotationY(tmprot.y) * SMMatrixRotationZ(tmprot.z); @@ -3015,7 +3020,7 @@ void StaticGeom::ApplyTransform(ID id) while (queue.size()) { - queue[0]->BoundVolumeSys->GetMinMax(&tmpmin, &tmpmax); + queue[0]->BoundVolumeSys->getMinMax(&tmpmin, &tmpmax); tmpmin -= jcentererpos; tmpmax -= jcentererpos; @@ -3024,9 +3029,9 @@ void StaticGeom::ApplyTransform(ID id) tmpmin += jcentererpos; tmpmax += jcentererpos; - queue[0]->BoundVolumeSys->SetMinMax(&tmpmin, &tmpmax); + queue[0]->BoundVolumeSys->setMinMax(&tmpmin, &tmpmax); - queue[0]->BoundVolumeP->GetMinMax(&tmpmin, &tmpmax); + queue[0]->BoundVolumeP->getMinMax(&tmpmin, &tmpmax); tmpmin -= jcentererpos; tmpmax -= jcentererpos; @@ -3035,7 +3040,7 @@ void StaticGeom::ApplyTransform(ID id) tmpmin += jcentererpos; tmpmax += jcentererpos; - queue[0]->BoundVolumeP->SetMinMax(&tmpmin, &tmpmax); + queue[0]->BoundVolumeP->setMinMax(&tmpmin, &tmpmax); if (queue[0]->BFNonEnd) { @@ -3064,12 +3069,12 @@ void StaticGeom::ApplyTransformLod(ID id) vertex_static* pData; float3 jmin, jmax; - AllModels[id]->Lod0.BoundVolume->GetMinMax(&jmin, &jmax); + AllModels[id]->Lod0.BoundVolume->getMinMax(&jmin, &jmax); float3 jcentererpos = (jmax + jmin)*0.5f; - tmpmodel->Lod0.model->VertexBuffer->Lock(0, 0, (void**)&pData, 0); + tmpmodel->Lod0.model->m_pVertexBuffer->Lock(0, 0, (void**)&pData, 0); - for (long i = 0; i < tmpmodel->Lod0.model->AllVertexCount; ++i) + for (long i = 0; i < tmpmodel->Lod0.model->m_uiAllVertexCount; ++i) { pData[i].Pos.x -= jcentererpos.x; pData[i].Pos.y -= jcentererpos.y; @@ -3080,7 +3085,7 @@ void StaticGeom::ApplyTransformLod(ID id) pData[i].Pos.z += jcentererpos.z; } - tmpmodel->Lod0.model->VertexBuffer->Unlock(); + tmpmodel->Lod0.model->m_pVertexBuffer->Unlock(); jmin -= jcentererpos; @@ -3091,7 +3096,7 @@ void StaticGeom::ApplyTransformLod(ID id) jmin += jcentererpos; jmax += jcentererpos; - tmpmodel->Lod0.BoundVolume->SetMinMax(&jmin, &jmax); + tmpmodel->Lod0.BoundVolume->setMinMax(&jmin, &jmax); } void StaticGeom::Clear() @@ -3123,7 +3128,7 @@ void StaticGeom::Clear() CountVertex = 0; float3 jmin(0, 0, 0), jmax(0, 0, 0); - BoundVolume->SetMinMax(&jmin,&jmax); + BoundVolume->setMinMax(&jmin,&jmax); } void StaticGeom::GetArrBuffsGeom(float3_t*** arr_vertex, int32_t** arr_count_vertex, uint32_t*** arr_index, ID*** arr_mtl, int32_t** arr_count_index, int32_t* count_models) @@ -3255,7 +3260,7 @@ void StaticGeom::GetPartBeam(float3* pos, float3 * dir, Segment** arrsplits, DWO { float3 center; float radius; - comsegment->BoundVolumeP->GetSphere(¢er, &radius); + comsegment->BoundVolumeP->getSphere(¢er, &radius); float distsqr = SGCore_0DistancePointBeam2(center, *pos, *dir); if (comsegment->CountAllPoly > 0 && distsqr <= radius*radius) diff --git a/source/geom/static_geom.h b/source/geom/static_geom.h index f8b90a08f..a4c1acbc3 100644 --- a/source/geom/static_geom.h +++ b/source/geom/static_geom.h @@ -1,31 +1,34 @@ -#ifndef __static_geom -#define __static_geom +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ -#include <common\\string.h> -#include <common\array.h> -#include <gcore\\sxgcore.h> -#include "sxgeom.h" +#ifndef __STATIC_GEOM_H +#define __STATIC_GEOM_H -extern report_func g_fnReportf; +#include <common/string.h> +#include <common/array.h> +#include <gcore/sxgcore.h> +#include "sxgeom.h" #define STATIC_PRECOND_ARRCOMFOR_ERR_ID(id_arr) \ if (!(id_arr < ArrComFor.size()))\ {\ - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - static: unresolved id '%d' for array of compute visible", GEN_MSG_LOCATION, id_arr); \ + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - static: unresolved id '%d' for array of compute visible", GEN_MSG_LOCATION, id_arr); \ } #define STATIC_PRECOND_ARRCOMFOR_ERR_ID_MODEL(id_model, retval) \ if (!(id_model < AllModels.size() && AllModels[id_model]))\ {\ - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - static: unresolved id '%d' for array of models", GEN_MSG_LOCATION, id_model); \ + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - static: unresolved id '%d' for array of models", GEN_MSG_LOCATION, id_model); \ return retval;\ } #define STATIC_PRECOND_ERR_ID_GROUP(id_model,id_group, ret_val) \ if (!(id_model < AllModels.size() && AllModels[id_model] && id_group < AllModels[id_model]->SubSet.size()))\ {\ - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - static: unresolved id '%d' for array of group in model '%d'", GEN_MSG_LOCATION, id_group, id_model); \ + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - static: unresolved id '%d' for array of group in model '%d'", GEN_MSG_LOCATION, id_group, id_model); \ return ret_val; \ } @@ -196,7 +199,7 @@ public: long GetCountModel(); - void CPUFillingArrIndeces(ISXFrustum* frustum, float3* viewpos, ID id_arr = 0); + void CPUFillingArrIndeces(const ISXFrustum* frustum, float3* viewpos, ID id_arr = 0); bool GetIntersectedRayY(float3* pos); bool SortExistsForRender(int sort, ID id_arr = 0); @@ -280,7 +283,7 @@ protected: void EditVolume(Model* mesh, Segment* Split); void SetSplitID(Segment* Split, ID* SplitsIDs, ID* SplitsIDsRender); //установка каждому куску идентификатора, удаление пустых кусков void SetSplitID2(Segment* Split, ID* SplitsIDs, ID* SplitsIDsRender, Array<Segment*>* queue); - void ComRecArrIndeces(ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GEOM_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render); + void ComRecArrIndeces(const ISXFrustum* frustum, Segment** arrsplits, DWORD *count, Segment* comsegment, float3* viewpos, Array<Segment*, GEOM_DEFAULT_RESERVE_COM>* queue, ID curr_splits_ids_render); //рабочие данные, используются внутри в методах //{{ diff --git a/source/geom/sxgeom.cpp b/source/geom/sxgeom.cpp index 374643837..72a2facd1 100644 --- a/source/geom/sxgeom.cpp +++ b/source/geom/sxgeom.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define SXGEOM_VERSION 1 @@ -30,7 +30,7 @@ report_func g_fnReportf = DefReport; StaticGeom* GeometryObj = 0; Green* GreenObj = 0; -#define GEOM_PRECOND(retval) if(!GeometryObj || !GreenObj){g_fnReportf(-1, "%s - sxgeom is not init", GEN_MSG_LOCATION); return retval;} +#define GEOM_PRECOND(retval) if(!GeometryObj || !GreenObj){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxgeom is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -54,7 +54,7 @@ SX_LIB_API void SGeom_0Create(const char *szName, bool isUnic) if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, sxgeom", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); } else { @@ -73,7 +73,7 @@ SX_LIB_API void SGeom_0Create(const char *szName, bool isUnic) } } else - g_fnReportf(-1, "%s - not init argument [name], sxgeom", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SGeom_AKill() @@ -199,7 +199,7 @@ SX_LIB_API long SGeom_ModelsGetCount() return GeometryObj->GetCountModel(); } -SX_LIB_API void SGeom_ModelsComVisible(ISXFrustum* frustum, float3* viewpos, ID id_arr) +SX_LIB_API void SGeom_ModelsComVisible(const ISXFrustum* frustum, float3* viewpos, ID id_arr) { GEOM_PRECOND(_VOID); GeometryObj->CPUFillingArrIndeces(frustum, viewpos, id_arr); @@ -474,7 +474,7 @@ SX_LIB_API void SGeom_GreenClear() GreenObj->Clear(); } -SX_LIB_API void SGeom_GreenComVisible(ISXFrustum* frustum, float3* viewpos, ID id_arr) +SX_LIB_API void SGeom_GreenComVisible(const ISXFrustum* frustum, float3* viewpos, ID id_arr) { GEOM_PRECOND(_VOID); GreenObj->CPUFillingArrIndeces(frustum, viewpos, id_arr); diff --git a/source/geom/sxgeom.h b/source/geom/sxgeom.h index 9051a914c..9da30798c 100644 --- a/source/geom/sxgeom.h +++ b/source/geom/sxgeom.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -186,7 +186,7 @@ SX_LIB_API long SGeom_ModelsGetCount(); //! просчитать видимость всех моделей для фрустума SX_LIB_API void SGeom_ModelsComVisible( - ISXFrustum *pFrustum, //!< фрустум для которого считаем видимость моделей + const ISXFrustum *pFrustum, //!< фрустум для которого считаем видимость моделей float3 *vViewPos, //!< позиция источника фрустума чтобы просчитать дистанцию ID idArr = 0 //!< идентификатор массива информации о видимости для фрустума, создается через #SGeom_ModelsAddArrForCom, если 0 то считаем в дефолтный ); @@ -526,7 +526,7 @@ SX_LIB_API void SGeom_GreenClear(); //! просчитать видимость всей растительности для фрустума SX_LIB_API void SGeom_GreenComVisible( - ISXFrustum *pFrustum, //!< фрустум для которого считаем видимость моделей + const ISXFrustum *pFrustum, //!< фрустум для которого считаем видимость моделей float3 *pViewPos, //!< позиция источника фрустума чтобы просчитать дистанцию ID idArr = 0 //!< идентификатор массива информации о видимости для фрустума, создается через #SGeom_ModelsAddArrForCom, если 0 то считаем в дефолтный ); diff --git a/source/geom/sxgeom_dll.cpp b/source/geom/sxgeom_dll.cpp index 4030f098d..88b1ec58e 100644 --- a/source/geom/sxgeom_dll.cpp +++ b/source/geom/sxgeom_dll.cpp @@ -1,10 +1,9 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ -#pragma once #include <windows.h> BOOL APIENTRY DllMain(HMODULE hModule, diff --git a/source/input/input.cpp b/source/input/input.cpp index 6632d46a4..cadca3fa0 100644 --- a/source/input/input.cpp +++ b/source/input/input.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "sxinput.h" #include "input.h" @@ -10,10 +15,6 @@ # pragma comment(lib, "sxcore.lib") #endif -#pragma once - -extern report_func g_fnReportf; - SXInput::SXInput(const char* name): mdelta({0, 0}), mdeltaOld({0, 0}) @@ -35,7 +36,7 @@ long SXInput::Init(HWND hwnd) if(RegisterRawInputDevices(Rid, sizeof(Rid) / sizeof(RAWINPUTDEVICE), sizeof(Rid[0])) == FALSE) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "Registering RAW Input failed"); + LibReport(REPORT_MSG_LEVEL_ERROR, "Registering RAW Input failed"); return(-1); } #endif diff --git a/source/input/input.h b/source/input/input.h index aa1256f3f..54b13bafe 100644 --- a/source/input/input.h +++ b/source/input/input.h @@ -1,6 +1,11 @@ -#ifndef SX_INPUT_CLASS_H -#define SX_INPUT_CLASS_H +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __INPUT_H +#define __INPUT_H #include <queue> diff --git a/source/input/sxinput.cpp b/source/input/sxinput.cpp index 58c643aea..b5477ce9e 100644 --- a/source/input/sxinput.cpp +++ b/source/input/sxinput.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #include "sxinput.h" #include "input.h" @@ -19,7 +19,7 @@ SXInput* ObjectInput = 0; report_func g_fnReportf = DefReport; #endif -#define SI_PRECOND(retval) if(!ObjectInput){g_fnReportf(-1, "%s - sxinput is not init", GEN_MSG_LOCATION); return retval;} +#define SI_PRECOND(retval) if(!ObjectInput){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxinput is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -64,14 +64,14 @@ SX_LIB_API void SSInput_0Create(const char* name, HWND hwnd, bool is_unic) if(GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name for system input", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name for system input", GEN_MSG_LOCATION); return; } } InitIntup(name, hwnd); } else - g_fnReportf(-1, "%s - not init argument [name] for system sound", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name] for system input", GEN_MSG_LOCATION); } SX_LIB_API void SSInput_Update() diff --git a/source/input/sxinput.h b/source/input/sxinput.h index 9f86b26b3..67e7d5c13 100644 --- a/source/input/sxinput.h +++ b/source/input/sxinput.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/input/sxinput_dll.cpp b/source/input/sxinput_dll.cpp index 6bd158387..88b1ec58e 100644 --- a/source/input/sxinput_dll.cpp +++ b/source/input/sxinput_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #include <windows.h> diff --git a/source/level/AmbientSounds.cpp b/source/level/AmbientSounds.cpp index 23660b1bd..3932a81b6 100644 --- a/source/level/AmbientSounds.cpp +++ b/source/level/AmbientSounds.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "AmbientSounds.h" CAmbientSounds::CAmbientSounds() diff --git a/source/level/AmbientSounds.h b/source/level/AmbientSounds.h index 3180378f3..eca3ee5da 100644 --- a/source/level/AmbientSounds.h +++ b/source/level/AmbientSounds.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __AMBIENTSOUNDS_H #define __AMBIENTSOUNDS_H diff --git a/source/level/Weather.h b/source/level/Weather.h index 419fb5d03..21b67b23f 100644 --- a/source/level/Weather.h +++ b/source/level/Weather.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __WEATHER_H #define __WEATHER_H @@ -20,8 +25,6 @@ #define WEATHER_THUNDERBOLT_LENGTH 10.f /*!< длина возможного пространства для молнии */ #define WEATHER_THUNDERBOLT_HEIGHT 100.f /*!< высота возможного пространства для молнии */ -extern report_func g_fnReportf; - //рандомные звуки с class CWeatherRndSnd { @@ -69,10 +72,10 @@ protected: #define WEATHER_CONFIG_SECTION_KEY(name_key, key, file, section) \ { \ if (!name_key || strlen(name_key) != 2 || !isdigit(name_key[0]) || !isdigit(name_key[1])) \ - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - unresolved name of key '%s' \nfile '%s' \nsection '%s'", GEN_MSG_LOCATION, key, file, section); \ + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - unresolved name of key '%s' \nfile '%s' \nsection '%s'", GEN_MSG_LOCATION, key, file, section); \ } -#define WEATHER_CONFIG_LACKS_COMPONENT(component, file, section, key) if(!component) {g_fnReportf(REPORT_MSG_LEVEL_ERROR,"%s - lacks component in key '%s' \nfile '%s' \nsection '%s'",GEN_MSG_LOCATION, key, file, section);} -#define WEATHER_CONFIG_LACKS_KEY(key, file, section) {g_fnReportf(REPORT_MSG_LEVEL_ERROR,"%s - lacks key '%s' \nfile '%s' \nsection '%s'",GEN_MSG_LOCATION, key, file, section);} +#define WEATHER_CONFIG_LACKS_COMPONENT(component, file, section, key) if(!component) {LibReport(REPORT_MSG_LEVEL_ERROR,"%s - lacks component in key '%s' \nfile '%s' \nsection '%s'",GEN_MSG_LOCATION, key, file, section);} +#define WEATHER_CONFIG_LACKS_KEY(key, file, section) {LibReport(REPORT_MSG_LEVEL_ERROR,"%s - lacks key '%s' \nfile '%s' \nsection '%s'",GEN_MSG_LOCATION, key, file, section);} class CWeather { diff --git a/source/level/level.cpp b/source/level/level.cpp index 63a8d8d7b..c124f1a32 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "level.h" CLevel::CLevel() @@ -43,7 +48,7 @@ void CLevel::load(const char *szName, bool isGame) sprintf(tmppathlevel, "%s%s/%s.lvl", Core_RStringGet(G_RI_STRING_PATH_GS_LEVELS), szName, szName); if (!Core_0FileExists(tmppathlevel)) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "not found file of level '%s'", tmppathlevel); + LibReport(REPORT_MSG_LEVEL_WARNING, "not found file of level '%s'", tmppathlevel); return; } @@ -56,7 +61,7 @@ void CLevel::load(const char *szName, bool isGame) SGeom_ModelsLoad(tmppath); else { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "not found file of geometry '%s'", tmppath); + LibReport(REPORT_MSG_LEVEL_WARNING, "not found file of geometry '%s'", tmppath); } } @@ -68,7 +73,7 @@ void CLevel::load(const char *szName, bool isGame) SGeom_GreenLoad(tmppath); else { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "not found file of green '%s'", tmppath); + LibReport(REPORT_MSG_LEVEL_WARNING, "not found file of green '%s'", tmppath); } } @@ -80,7 +85,7 @@ void CLevel::load(const char *szName, bool isGame) SXGame_LoadEnts(tmppath); else { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "not found file of entity '%s'", tmppath); + LibReport(REPORT_MSG_LEVEL_WARNING, "not found file of entity '%s'", tmppath); } } @@ -115,7 +120,7 @@ void CLevel::load(const char *szName, bool isGame) SAIG_GridLoad(tmppath); else { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "not found file of aigrid '%s'", tmppath); + LibReport(REPORT_MSG_LEVEL_WARNING, "not found file of aigrid '%s'", tmppath); } } @@ -155,7 +160,7 @@ void CLevel::load(const char *szName, bool isGame) m_pWeather->load(tmppath); else { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "not found file of weather '%s'", tmppath); + LibReport(REPORT_MSG_LEVEL_WARNING, "not found file of weather '%s'", tmppath); } } } diff --git a/source/level/level.h b/source/level/level.h index d453fd5e7..f17c32058 100644 --- a/source/level/level.h +++ b/source/level/level.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/level/sxlevel.cpp b/source/level/sxlevel.cpp index b275fc237..cf33f8559 100644 --- a/source/level/sxlevel.cpp +++ b/source/level/sxlevel.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #define SXLEVEL_VERSION 1 #include "sxlevel.h" @@ -14,7 +19,7 @@ report_func g_fnReportf = DefReport; CLevel* g_pLevel = 0; -#define SL_PRECOND(ret) if(!g_pLevel){g_fnReportf(-1, "%s - sxlevel is not init", GEN_MSG_LOCATION);return ret;} +#define SL_PRECOND(ret) if(!g_pLevel){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxlevel is not init", GEN_MSG_LOCATION);return ret;} //########################################################################## @@ -38,7 +43,7 @@ SX_LIB_API void SLevel_0Create(const char *szName, bool isUnic) if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, sxlevel", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); } else { @@ -51,7 +56,7 @@ SX_LIB_API void SLevel_0Create(const char *szName, bool isUnic) } } else - g_fnReportf(-1, "%s - not init argument [name], sxlevel", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SLevel_AKill() diff --git a/source/level/sxlevel.h b/source/level/sxlevel.h index e0f5baeb6..82918d98b 100644 --- a/source/level/sxlevel.h +++ b/source/level/sxlevel.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/level/sxlevel_dll.cpp b/source/level/sxlevel_dll.cpp index ddaaf5bd4..a34ff74f6 100644 --- a/source/level/sxlevel_dll.cpp +++ b/source/level/sxlevel_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #include <windows.h> diff --git a/source/level/weather.cpp b/source/level/weather.cpp index 79a888466..85bd30871 100644 --- a/source/level/weather.cpp +++ b/source/level/weather.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Weather.h" CWeatherRndSnd::CWeatherRndSnd() @@ -159,13 +164,13 @@ CWeather::CWeather() } else { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - not found effect 'rain'", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not found effect 'rain'", GEN_MSG_LOCATION); } m_idEffThunderbolt = SPE_EffectGetByName("thunderbolt"); if (m_idEffThunderbolt < 0) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - not found effect 'thunderbolt'", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not found effect 'thunderbolt'", GEN_MSG_LOCATION); } m_ulTimeBoltNext = m_ulTimeBoltLast = 0; @@ -225,7 +230,7 @@ void CWeather::load(const char *szPath) if (!config->sectionExists("sections")) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - not found section 'sections' \nfile '%s'", GEN_MSG_LOCATION, szPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not found section 'sections' \nfile '%s'", GEN_MSG_LOCATION, szPath); mem_release_del(config); return; } @@ -239,7 +244,7 @@ void CWeather::load(const char *szPath) if (strlen(str) != 8) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - unresolved name of key '%s' \nfile '%s' \nsection '%s'", GEN_MSG_LOCATION, str, szPath, "sections"); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - unresolved name of key '%s' \nfile '%s' \nsection '%s'", GEN_MSG_LOCATION, str, szPath, "sections"); mem_release_del(config); return; } @@ -282,7 +287,7 @@ void CWeather::load(const char *szPath) for (int i = 0, il = m_aTimeSections.size(); i < il; ++i) { - //g_fnReportf(0, "%d\n", m_aTimeSections[i].time); + //LibReport(0, "%d\n", m_aTimeSections[i].time); if (config->keyExists(m_aTimeSections[i].m_szSection, "sky_texture")) sprintf(m_aTimeSections[i].m_DataSection.m_szSkyTex, "%s", config->getKey(m_aTimeSections[i].m_szSection, "sky_texture")); @@ -487,7 +492,7 @@ void CWeather::load(const char *szPath) if (!config->sectionExists(text_env)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - lacks env_ambient section '%s' \nszPath '%s' \nsection '%s'", GEN_MSG_LOCATION, text_env, szPath, m_aTimeSections[i].m_szSection); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - lacks env_ambient section '%s' \nszPath '%s' \nsection '%s'", GEN_MSG_LOCATION, text_env, szPath, m_aTimeSections[i].m_szSection); return; } @@ -744,7 +749,7 @@ void CWeather::update() tmp_fog_color2->z = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_vFogColor.z, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vFogColor.z, lerp_factor); } else - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "cvar pp_fog_color is not init"); + LibReport(REPORT_MSG_LEVEL_WARNING, "cvar pp_fog_color is not init"); } //если в текущей секции есть частота молнии diff --git a/source/mtllight/light.cpp b/source/mtllight/light.cpp index 6d338cd88..74b59a158 100644 --- a/source/mtllight/light.cpp +++ b/source/mtllight/light.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "light.h" Lights::Lights() @@ -39,7 +44,7 @@ ID Lights::CreateCopy(ID id) tmplight2->BoundVolume = SGCore_CrBound(); IDirect3DVertexBuffer9* vertexbuf; tmplight->Mesh->GetVertexBuffer(&vertexbuf); - tmplight->BoundVolume->CalcBound(vertexbuf, tmplight->Mesh->GetNumVertices(), tmplight->Mesh->GetNumBytesPerVertex()); + tmplight->BoundVolume->calcBound(vertexbuf, tmplight->Mesh->GetNumVertices(), tmplight->Mesh->GetNumBytesPerVertex()); mem_release(vertexbuf); tmplight2->Power = tmplight->Power; tmplight2->Dist = tmplight->Dist; @@ -288,7 +293,7 @@ ID Lights::CreatePoint(ID id, const float3* center, float dist, const float3* co { if (GlobalLight != -1 && isglobal) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - light: global light exists, you can not create 2 global light sources", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - light: global light exists, you can not create 2 global light sources", GEN_MSG_LOCATION); return -1; } @@ -357,7 +362,7 @@ ID Lights::CreatePoint(ID id, const float3* center, float dist, const float3* co tmplight->BoundVolume = SGCore_CrBound(); IDirect3DVertexBuffer9* vertexbuf; tmplight->Mesh->GetVertexBuffer(&vertexbuf); - tmplight->BoundVolume->CalcBound(vertexbuf, tmplight->Mesh->GetNumVertices(), tmplight->Mesh->GetNumBytesPerVertex()); + tmplight->BoundVolume->calcBound(vertexbuf, tmplight->Mesh->GetNumVertices(), tmplight->Mesh->GetNumBytesPerVertex()); mem_release(vertexbuf); if (tmplight->IsGlobal) @@ -425,7 +430,7 @@ ID Lights::CreateDirection(ID id, const float3* pos, float dist, const float3* c tmplight->BoundVolume = SGCore_CrBound(); IDirect3DVertexBuffer9* vertexbuf; tmplight->Mesh->GetVertexBuffer(&vertexbuf); - tmplight->BoundVolume->CalcBound(vertexbuf, tmplight->Mesh->GetNumVertices(), tmplight->Mesh->GetNumBytesPerVertex()); + tmplight->BoundVolume->calcBound(vertexbuf, tmplight->Mesh->GetNumVertices(), tmplight->Mesh->GetNumBytesPerVertex()); mem_release(vertexbuf); ID tmpid = id; @@ -548,7 +553,7 @@ void Lights::SetLightDist(ID id, float radius_height, bool is_create) { IDirect3DVertexBuffer9* vertexbuf; ArrLights[id]->Mesh->GetVertexBuffer(&vertexbuf); - ArrLights[id]->BoundVolume->CalcBound(vertexbuf, ArrLights[id]->Mesh->GetNumVertices(), ArrLights[id]->Mesh->GetNumBytesPerVertex()); + ArrLights[id]->BoundVolume->calcBound(vertexbuf, ArrLights[id]->Mesh->GetNumVertices(), ArrLights[id]->Mesh->GetNumBytesPerVertex()); mem_release_del(vertexbuf); } @@ -675,10 +680,10 @@ bool Lights::ComVisibleForFrustum(ID id, const ISXFrustum* frustum) float3 tmpcenter; float tmpradius; - ArrLights[id]->BoundVolume->GetSphere(&tmpcenter, &tmpradius); + ArrLights[id]->BoundVolume->getSphere(&tmpcenter, &tmpradius); tmpcenter = SMVector3Transform(tmpcenter, ArrLights[id]->WorldMat); - return frustum->SphereInFrustum(&tmpcenter, tmpradius); + return frustum->sphereInFrustum(&tmpcenter, tmpradius); } bool Lights::GetVisibleForFrustum(ID id) @@ -955,7 +960,7 @@ void Lights::SetLightAngle(ID id, float angle, bool is_create) { IDirect3DVertexBuffer9* vertexbuf; ArrLights[id]->Mesh->GetVertexBuffer(&vertexbuf); - ArrLights[id]->BoundVolume->CalcBound(vertexbuf, ArrLights[id]->Mesh->GetNumVertices(), ArrLights[id]->Mesh->GetNumBytesPerVertex()); + ArrLights[id]->BoundVolume->calcBound(vertexbuf, ArrLights[id]->Mesh->GetNumVertices(), ArrLights[id]->Mesh->GetNumBytesPerVertex()); mem_release(vertexbuf); } @@ -980,7 +985,7 @@ void Lights::SetLightTopRadius(ID id, float top_radius) { IDirect3DVertexBuffer9* vertexbuf; ArrLights[id]->Mesh->GetVertexBuffer(&vertexbuf); - ArrLights[id]->BoundVolume->CalcBound(vertexbuf, ArrLights[id]->Mesh->GetNumVertices(), ArrLights[id]->Mesh->GetNumBytesPerVertex()); + ArrLights[id]->BoundVolume->calcBound(vertexbuf, ArrLights[id]->Mesh->GetNumVertices(), ArrLights[id]->Mesh->GetNumBytesPerVertex()); mem_release_del(vertexbuf); } @@ -1227,7 +1232,7 @@ bool Lights::LightCountUpdateUpdate(ID id, const float3* viewpos, int ghow) float3 tmpcenter; float tmpradius; - tmpl->BoundVolume->GetSphere(&tmpcenter, &tmpradius); + tmpl->BoundVolume->getSphere(&tmpcenter, &tmpradius); float dist = SMVector3Distance(tmpl->Position, (*viewpos)) - tmpradius; if (dist < LIGHTS_UPDATE_L0_DIST) tmpl->CountUpdate = -1; diff --git a/source/mtllight/light.h b/source/mtllight/light.h index e09a8f1fe..406ad080b 100644 --- a/source/mtllight/light.h +++ b/source/mtllight/light.h @@ -1,6 +1,11 @@ -#ifndef __light_h -#define __light_h +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __LIGHT_H +#define __LIGHT_H #include <gdefines.h> @@ -12,17 +17,16 @@ #include "sxmtllight.h" #include "ml_data.h" -extern report_func g_fnReportf; #define LIGHTS_PRE_COND_ID(id,stdval) \ if (!(id >= 0 && id < ArrLights.size()))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - light: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; }\ +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - light: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; }\ else if (!ArrLights[id]) \ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - light: light is deleted '%d'", GEN_MSG_LOCATION, id); return stdval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - light: light is deleted '%d'", GEN_MSG_LOCATION, id); return stdval; } #define LIGHTS_PRE_COND_KEY_DEL(key,stdval) \ if (!(key >= 0 && key < ArrDelLights.size()))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - light: unresolved key of access '%d'", GEN_MSG_LOCATION, key); return stdval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - light: unresolved key of access '%d'", GEN_MSG_LOCATION, key); return stdval; } #include "shadow.h" //#include <common\\string.cpp> diff --git a/source/mtllight/material.cpp b/source/mtllight/material.cpp index b03440093..22b28f6da 100644 --- a/source/mtllight/material.cpp +++ b/source/mtllight/material.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "material.h" Materials::Materials() @@ -546,7 +551,7 @@ MTLTYPE_PHYSIC Materials::MtlGetPhysicMaterial(ID id) void Materials::MtlSetTexture(ID id, const char* path_tex) { MTL_PRE_COND_ID(id); - ArrMaterials[id]->mtl->MainTexture = SGCore_LoadTexAddName(path_tex, LoadTexType::ltt_load); + ArrMaterials[id]->mtl->MainTexture = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); } void Materials::MtlGetTexture(ID id, char* name) @@ -620,7 +625,7 @@ bool Materials::MtlGetIsTextureLighting(ID id) void Materials::MtlSetTextureLighting(ID id, const char* path_tex) { MTL_PRE_COND_ID(id); - ArrMaterials[id]->mtl->LightParam.ParamTex = SGCore_LoadTexAddName(path_tex, LoadTexType::ltt_load); + ArrMaterials[id]->mtl->LightParam.ParamTex = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); } void Materials::MtlGetTextureLighting(ID id, char* path_tex) @@ -753,7 +758,7 @@ MTLTYPE_REFLECT Materials::MtlGetTypeReflection(ID id) void Materials::MtlSetMaskTex(ID id, const char* path_tex) { MTL_PRE_COND_ID(id); - ArrMaterials[id]->mtl->MicroDetail.Mask = SGCore_LoadTexAddName(path_tex, LoadTexType::ltt_load); + ArrMaterials[id]->mtl->MicroDetail.Mask = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); } void Materials::MtlGetMaskTex(ID id, char* path_tex) @@ -768,7 +773,7 @@ void Materials::MtlGetMaskTex(ID id, char* path_tex) void Materials::MtlSetMRTex(ID id, int channel, const char* path_tex) { MTL_PRE_COND_ID(id); - ArrMaterials[id]->mtl->MicroDetail.ArrMicroDiffuse[channel] = SGCore_LoadTexAddName(path_tex, LoadTexType::ltt_load); + ArrMaterials[id]->mtl->MicroDetail.ArrMicroDiffuse[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); } void Materials::MtlGetMRTex(ID id, int channel, char* path_tex) @@ -784,7 +789,7 @@ void Materials::MtlGetMRTex(ID id, int channel, char* path_tex) void Materials::MtlSetDTex(ID id, int channel, const char* path_tex) { MTL_PRE_COND_ID(id); - ArrMaterials[id]->mtl->MicroDetail.ArrDeatail[channel] = SGCore_LoadTexAddName(path_tex, LoadTexType::ltt_load); + ArrMaterials[id]->mtl->MicroDetail.ArrDeatail[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); } void Materials::MtlGetDTex(ID id, int channel, char* path_tex) @@ -980,7 +985,7 @@ ID Materials::IsExists(const char* name) if (!IsTruePath) { return -2; - //reportf(-1, "%s - wrong texture name [%s]!!!", gen_msg_location, name); + //LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", gen_msg_location, name); } long tmpkey = -1; //переменная в которой храним ключ от массива в который записываем @@ -1148,9 +1153,9 @@ bool Materials::LoadMtl(const char* name, Material** mtl) //если в конфиге указана текстура то берем ее if (config->keyExists(tmp_name, "texture")) - tmpMtl->MainTexture = SGCore_LoadTexAddName(config->getKey(tmp_name, "texture"), LoadTexType::ltt_load); + tmpMtl->MainTexture = SGCore_LoadTexAddName(config->getKey(tmp_name, "texture"), LOAD_TEXTURE_TYPE_LOAD); else //если нет то тогда берем имя материала, может быть он имя текстуры, иначе будет -1 - tmpMtl->MainTexture = SGCore_LoadTexAddName(name, LoadTexType::ltt_load); + tmpMtl->MainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD); sprintf(tmpMtl->Name, "%s", tmp_name); @@ -1194,7 +1199,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) sprintf(tmpMicroDiff[0], "%s", config->getKey(tmp_name, "mirco_diff_r")); if (tmpMicroDiff[0][0] != '0' && tmpMicroDiff[0][0] != 0) - tmpMtl->MicroDetail.ArrMicroDiffuse[0] = SGCore_LoadTexAddName(tmpMicroDiff[0], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrMicroDiffuse[0] = SGCore_LoadTexAddName(tmpMicroDiff[0], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrMicroDiffuse[0] = -1; @@ -1202,7 +1207,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "mirco_diff_g")) sprintf(tmpMicroDiff[1], "%s", config->getKey(tmp_name, "mirco_diff_g")); if (tmpMicroDiff[1][0] != '0' && tmpMicroDiff[1][0] != 0) - tmpMtl->MicroDetail.ArrMicroDiffuse[1] = SGCore_LoadTexAddName(tmpMicroDiff[1], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrMicroDiffuse[1] = SGCore_LoadTexAddName(tmpMicroDiff[1], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrMicroDiffuse[1] = -1; @@ -1210,7 +1215,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "mirco_diff_b")) sprintf(tmpMicroDiff[2], "%s", config->getKey(tmp_name, "mirco_diff_b")); if (tmpMicroDiff[2][0] != '0' && tmpMicroDiff[2][0] != 0) - tmpMtl->MicroDetail.ArrMicroDiffuse[2] = SGCore_LoadTexAddName(tmpMicroDiff[2], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrMicroDiffuse[2] = SGCore_LoadTexAddName(tmpMicroDiff[2], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrMicroDiffuse[2] = -1; @@ -1218,7 +1223,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "mirco_diff_a")) sprintf(tmpMicroDiff[3], "%s", config->getKey(tmp_name, "mirco_diff_a")); if (tmpMicroDiff[3][0] != '0' && tmpMicroDiff[3][0] != 0) - tmpMtl->MicroDetail.ArrMicroDiffuse[3] = SGCore_LoadTexAddName(tmpMicroDiff[3], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrMicroDiffuse[3] = SGCore_LoadTexAddName(tmpMicroDiff[3], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrMicroDiffuse[3] = -1; @@ -1227,7 +1232,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "detail_r")) sprintf(tmpDetail[0], "%s", config->getKey(tmp_name, "detail_r")); if (tmpDetail[0][0] != '0' && tmpMicroDiff[0][0] != 0) - tmpMtl->MicroDetail.ArrDeatail[0] = SGCore_LoadTexAddName(tmpDetail[0], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrDeatail[0] = SGCore_LoadTexAddName(tmpDetail[0], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrDeatail[0] = -1; @@ -1235,7 +1240,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "detail_g")) sprintf(tmpDetail[1], "%s", config->getKey(tmp_name, "detail_g")); if (tmpDetail[1][0] != '0' && tmpMicroDiff[1][0] != 0) - tmpMtl->MicroDetail.ArrDeatail[1] = SGCore_LoadTexAddName(tmpDetail[1], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrDeatail[1] = SGCore_LoadTexAddName(tmpDetail[1], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrDeatail[1] = -1; @@ -1243,7 +1248,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "detail_b")) sprintf(tmpDetail[2], "%s", config->getKey(tmp_name, "detail_b")); if (tmpDetail[2][0] != '0' && tmpMicroDiff[2][0] != 0) - tmpMtl->MicroDetail.ArrDeatail[2] = SGCore_LoadTexAddName(tmpDetail[2], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrDeatail[2] = SGCore_LoadTexAddName(tmpDetail[2], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrDeatail[2] = -1; @@ -1251,7 +1256,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "detail_a")) sprintf(tmpDetail[3], "%s", config->getKey(tmp_name, "detail_a")); if (tmpDetail[3][0] != '0' && tmpMicroDiff[3][0] != 0) - tmpMtl->MicroDetail.ArrDeatail[3] = SGCore_LoadTexAddName(tmpDetail[3], LoadTexType::ltt_load); + tmpMtl->MicroDetail.ArrDeatail[3] = SGCore_LoadTexAddName(tmpDetail[3], LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.ArrDeatail[3] = -1; @@ -1259,7 +1264,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) if (config->keyExists(tmp_name, "mask")) sprintf(tmpMask, "%s", config->getKey(tmp_name, "mask")); if (tmpMask[0] != '0' && tmpMask[0] != 0) - tmpMtl->MicroDetail.Mask = SGCore_LoadTexAddName(tmpMask, LoadTexType::ltt_load); + tmpMtl->MicroDetail.Mask = SGCore_LoadTexAddName(tmpMask, LOAD_TEXTURE_TYPE_LOAD); else tmpMtl->MicroDetail.Mask = -1; @@ -1302,7 +1307,7 @@ bool Materials::LoadMtl(const char* name, Material** mtl) //если текстура с параметрами освещения была определена if (tmpParamLigth[0] != '0' && tmpParamLigth[0] != 0) { - tmpMtl->LightParam.ParamTex = SGCore_LoadTexAddName(tmpParamLigth, LoadTexType::ltt_load); + tmpMtl->LightParam.ParamTex = SGCore_LoadTexAddName(tmpParamLigth, LOAD_TEXTURE_TYPE_LOAD); //если использование параметров освещения из текстуры не было определено if (istexparam == -1) tmpMtl->LightParam.IsTextureParam = true; @@ -1501,7 +1506,7 @@ void Materials::CreateMtl(const char* name, Material** mtl, MTLTYPE_MODEL type) tmpMtl->PS.Param = float4(0, 0, 0, 0); }*/ - tmpMtl->MainTexture = SGCore_LoadTexAddName(name, LoadTexType::ltt_load); + tmpMtl->MainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD); tmpMtl->VS.IsTransWorldViewProjection = true; tmpMtl->LightParam.RoughnessValue = MTL_LIGHTING_DEFAULT_ROUGHNESS; diff --git a/source/mtllight/material.h b/source/mtllight/material.h index fc7181cb1..87003dc48 100644 --- a/source/mtllight/material.h +++ b/source/mtllight/material.h @@ -1,24 +1,27 @@ -#ifndef __sxmaterial -#define __sxmaterial +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __MATERIAL_H +#define __MATERIAL_H #include <common/String.h> #include <common/Array.h> #include "reflection.h" #include <direct.h> -extern report_func g_fnReportf; - #define MTL_PRE_COND_ID(id,stdval) \ if (!(id >= 0 && id < ArrMaterials.size()))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - material: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; }\ +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; }\ else if (!ArrMaterials[id])\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - material: material '%d' is not init", GEN_MSG_LOCATION, id); return stdval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material '%d' is not init", GEN_MSG_LOCATION, id); return stdval; } #define MTL_REF_PRE_COND_ID(id,stdval) \ MTL_PRE_COND_ID(id, stdval)\ if (!(ArrMaterials[id]->Reflect))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - material: material id = '%d', name = '%s' unsupported reflection", GEN_MSG_LOCATION, id, ArrMaterials[id]->mtl->Name); return stdval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material id = '%d', name = '%s' unsupported reflection", GEN_MSG_LOCATION, id, ArrMaterials[id]->mtl->Name); return stdval; } class Materials { diff --git a/source/mtllight/ml_data.cpp b/source/mtllight/ml_data.cpp index d43d06190..30a84ae6b 100644 --- a/source/mtllight/ml_data.cpp +++ b/source/mtllight/ml_data.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "ml_data.h" namespace MLSet @@ -181,7 +186,7 @@ void MLSet::MLInit() MLSet::WinSize = *winsize; MLSet::ProjFov = projfov;*/ - MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexAddName("noise_rottex.dds", LoadTexType::ltt_const); + MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST); diff --git a/source/mtllight/ml_data.h b/source/mtllight/ml_data.h index dff658de2..162c173b7 100644 --- a/source/mtllight/ml_data.h +++ b/source/mtllight/ml_data.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __ML_DATA_H #define __ML_DATA_H @@ -6,7 +11,7 @@ #define SM_D3D_CONVERSIONS #include <common/SXMath.h> -#include <common\array.h> +#include <common/array.h> #include <GRegisterIndex.h> diff --git a/source/mtllight/reflection.cpp b/source/mtllight/reflection.cpp index 90697afb7..71bbbec2f 100644 --- a/source/mtllight/reflection.cpp +++ b/source/mtllight/reflection.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "reflection.h" Reflection::Reflection() @@ -162,7 +167,7 @@ void Reflection::PreRenderRefPlane(D3DXPLANE* plane) { if (!plane) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - sxmtllight [reflection]: plane is NULL", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - sxmtllight [reflection]: plane is NULL", GEN_MSG_LOCATION); return; } @@ -180,7 +185,7 @@ void Reflection::PreRenderRefPlane(D3DXPLANE* plane) viewmat._32 = -viewmat._32; viewmat._42 = -viewmat._42; - ReflectFrustum[0]->Update(&viewmat, &(MLSet::RefMProjPlane)); + ReflectFrustum[0]->update(&viewmat, &(MLSet::RefMProjPlane)); Core_RMatrixGet(G_RI_MATRIX_VIEW, &OldMatView); Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &OldMatProj); @@ -242,7 +247,7 @@ void Reflection::BeginRenderRefCube(float3_t* center) { if (!center) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - sxmtllight [reflection]: position center is NULL", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - sxmtllight [reflection]: position center is NULL", GEN_MSG_LOCATION); return; } @@ -275,7 +280,7 @@ void Reflection::PreRenderRefCube(int cube, float4x4* world) Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &MLSet::RefMProjCube); Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &(MatrixView * MLSet::RefMProjCube)); - ReflectFrustum[cube]->Update(&float4x4(MatrixView), &MLSet::RefMProjCube); + ReflectFrustum[cube]->update(&float4x4(MatrixView), &MLSet::RefMProjCube); mem_release_del(SurfaceReflect); TextureReflect->GetSurfaceLevel(0, &SurfaceReflect); diff --git a/source/mtllight/reflection.h b/source/mtllight/reflection.h index e1405cbed..019b26e56 100644 --- a/source/mtllight/reflection.h +++ b/source/mtllight/reflection.h @@ -1,6 +1,11 @@ -#ifndef __reflection -#define __reflection +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __REFLECTION_H +#define __REFLECTION_H #include <gdefines.h> @@ -12,8 +17,6 @@ #include "sxmtllight.h" #include "ml_data.h" -extern report_func g_fnReportf; - class Reflection { public: diff --git a/source/mtllight/shadow.cpp b/source/mtllight/shadow.cpp index 20c69f5ee..e097c24c3 100644 --- a/source/mtllight/shadow.cpp +++ b/source/mtllight/shadow.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "shadow.h" PSSM::PSSM() @@ -127,7 +132,7 @@ void PSSM::OnResetDevice() HRESULT hr = MLSet::DXDevice->CreateTexture(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F,D3DPOOL_DEFAULT, &(DepthMaps[i]), NULL); /*if(FAILED(hr)) - reportf(-1,"Ќе удалось создать текстуру глубины PSSM");*/ + LibReport(REPORT_MSG_LEVEL_ERROR,"Ќе удалось создать текстуру глубины PSSM");*/ DepthSurfaces[i] = 0; } @@ -208,7 +213,7 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam) FovRatio.x = *r_default_fov; FovRatio.y = float(*r_win_width) / float(*r_win_height); - Frustums[split]->Update(&(Views[split]), &(Projs[split])); + Frustums[split]->update(&(Views[split]), &(Projs[split])); float3 up(0.0f, 1.0f, 0.0f); float3 right = SMVector3Normalize(SMVector3Cross((*dircam), up)); @@ -223,26 +228,25 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam) float far_height = tan(FovRatio.x / 2.f) * NearFar[split].y; float far_width = far_height * FovRatio.y; - Frustums[split]->Point[0] = nc - up*near_height - right*near_width; - Frustums[split]->Point[1] = nc + up*near_height - right*near_width; - Frustums[split]->Point[2] = nc + up*near_height + right*near_width; - Frustums[split]->Point[3] = nc - up*near_height + right*near_width; + Frustums[split]->setPoint(0, &float3(nc - up*near_height - right*near_width)); + Frustums[split]->setPoint(1, &float3(nc + up*near_height - right*near_width)); + Frustums[split]->setPoint(2, &float3(nc + up*near_height + right*near_width)); + Frustums[split]->setPoint(3, &float3(nc - up*near_height + right*near_width)); - Frustums[split]->Point[4] = fc - up*far_height - right*far_width; - Frustums[split]->Point[5] = fc + up*far_height - right*far_width; - Frustums[split]->Point[6] = fc + up*far_height + right*far_width; - Frustums[split]->Point[7] = fc - up*far_height + right*far_width; + Frustums[split]->setPoint(4, &float3(fc - up*far_height - right*far_width)); + Frustums[split]->setPoint(5, &float3(fc + up*far_height - right*far_width)); + Frustums[split]->setPoint(6, &float3(fc + up*far_height + right*far_width)); + Frustums[split]->setPoint(7, &float3(fc - up*far_height + right*far_width)); float3 vCenter(0, 0, 0); for (int i = 0; i < 8; i++) - vCenter += Frustums[split]->Point[i]; + vCenter += Frustums[split]->getPoint(i); vCenter /= 8; - Frustums[split]->Center = vCenter; - + Frustums[split]->setCenter(&vCenter); float dist = 1; float3 DirL = Position; - float3 TarG = float3(Frustums[split]->Center.x, Frustums[split]->Center.y, Frustums[split]->Center.z); + float3 TarG = float3(Frustums[split]->getCenter()); float3 LightPos = TarG + DirL*dist; float3 LightPos2 = DirL; @@ -258,7 +262,7 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam) float maxZ = 0; float4 trans0; - float4 transform0(Frustums[split]->Point[0].x, Frustums[split]->Point[0].y, Frustums[split]->Point[0].z, 1); + float4 transform0(Frustums[split]->getPoint(0), 1); trans0 = SMVector4Transform(transform0, Views[split]); minX = trans0.x; maxX = trans0.x; @@ -268,7 +272,7 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam) for (int i = 0; i<8; i++) { float4 trans; - float4 transform(Frustums[split]->Point[i].x, Frustums[split]->Point[i].y, Frustums[split]->Point[i].z, 1); + float4 transform(Frustums[split]->getPoint(i), 1); trans = SMVector4Transform(transform, Views[split]); @@ -290,7 +294,7 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam) float2 OrtMax = float2(maxX, maxY); float2 OrtMin = float2(minX, minY); - float3 Diagonal = Frustums[split]->Point[0] - Frustums[split]->Point[6]; + float3 Diagonal = Frustums[split]->getPoint(0) - Frustums[split]->getPoint(6); float LengthDiagonal = SMVector3Length(Diagonal); float2 BoarderOffset = (float2(LengthDiagonal, LengthDiagonal) - (OrtMax - OrtMin)) * 0.5; @@ -709,7 +713,7 @@ void ShadowMapTech::Begin() Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &Proj); Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &(View * Proj)); - Frustum->Update(&(View),&(Proj)); + Frustum->update(&(View),&(Proj)); SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "WorldViewProjection", &SMMatrixTranspose(View * Proj)); SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect); @@ -1027,7 +1031,7 @@ void ShadowMapCubeTech::Pre(int cube) //MLSet::DXDevice->SetTransform(D3DTS_VIEW,&(View[cube].operator D3DXMATRIX())); //MLSet::DXDevice->SetTransform(D3DTS_PROJECTION,&(Proj[cube].operator D3DXMATRIX())); - Frustums[cube]->Update(&(View[cube]), &(Proj[cube])); + Frustums[cube]->update(&(View[cube]), &(Proj[cube])); float4x4 vp = View[cube] * Proj[cube]; diff --git a/source/mtllight/shadow.h b/source/mtllight/shadow.h index 9af154b10..d9dead086 100644 --- a/source/mtllight/shadow.h +++ b/source/mtllight/shadow.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __SHADOW_H #define __SHADOW_H diff --git a/source/mtllight/sxmtllight.cpp b/source/mtllight/sxmtllight.cpp index 817681b77..bc37f158c 100644 --- a/source/mtllight/sxmtllight.cpp +++ b/source/mtllight/sxmtllight.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define SXMATERIAL_LIGTH_VERSION 1 @@ -20,7 +20,7 @@ report_func g_fnReportf = DefReport; Lights* ArrLights = 0; Materials* ArrMaterials = 0; -#define ML_PRECOND(retval) if(!ArrLights){g_fnReportf(-1, "%s - sxmtlligth is not init", GEN_MSG_LOCATION); return retval;} +#define ML_PRECOND(retval) if(!ArrLights){LibReport(-1, "%s - sxmtlligth is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -44,7 +44,7 @@ SX_LIB_API void SML_0Create(const char* name, bool is_unic) if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, sxmaterial_ligth", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); } else { @@ -63,7 +63,7 @@ SX_LIB_API void SML_0Create(const char* name, bool is_unic) } } else - g_fnReportf(-1, "%s - not init argument [name], sxmaterial_ligth", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SML_AKill() diff --git a/source/mtllight/sxmtllight.h b/source/mtllight/sxmtllight.h index 1f475ca2c..ce6619087 100644 --- a/source/mtllight/sxmtllight.h +++ b/source/mtllight/sxmtllight.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -230,7 +230,7 @@ SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed); \note Предварительный просчет - просчет для всего света (к примеру в другом потоке) @{*/ -SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const ISXFrustum *pFrustum); //!< виден ли свет в данном фрустуме frustum (отдельный просчет) +SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const const ISXFrustum *pFrustum); //!< виден ли свет в данном фрустуме frustum (отдельный просчет) SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pViewPos); //!< дистанция от viewpos до начала света (отдельный просчет) //! просчет видимости и расстояния от наблюдателя viewpos до начала света, для каждого света (предварительный просчет) diff --git a/source/mtllight/sxmtllight_dll.cpp b/source/mtllight/sxmtllight_dll.cpp index 6bd158387..88b1ec58e 100644 --- a/source/mtllight/sxmtllight_dll.cpp +++ b/source/mtllight/sxmtllight_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #include <windows.h> diff --git a/source/particles/PESet.cpp b/source/particles/PESet.cpp index ea6dbf538..2eac90d08 100644 --- a/source/particles/PESet.cpp +++ b/source/particles/PESet.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "PESet.h" namespace PESet diff --git a/source/particles/PESet.h b/source/particles/PESet.h index 3de967ea4..99882a1f6 100644 --- a/source/particles/PESet.h +++ b/source/particles/PESet.h @@ -1,6 +1,11 @@ -#ifndef __PESET_H -#define __PESET_H +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __PE_SET_H +#define __PE_SET_H #include <gdefines.h> #include <d3d9.h> diff --git a/source/particles/effect.cpp b/source/particles/effect.cpp index 78f0868f9..3a150f357 100644 --- a/source/particles/effect.cpp +++ b/source/particles/effect.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "effect.h" Effects::Effects() @@ -123,7 +128,7 @@ void Effects::Save(const char* path) if (!file) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - failed to save %s", GEN_MSG_LOCATION, path); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - failed to save %s", GEN_MSG_LOCATION, path); return; } @@ -301,7 +306,7 @@ void Effects::Load(const char* path) { if (!Core_0FileExists(path)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - failed to save, %s", GEN_MSG_LOCATION, path); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed to save, %s", GEN_MSG_LOCATION, path); return; } @@ -309,13 +314,13 @@ void Effects::Load(const char* path) if (!config->sectionExists("effects")) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - main section 'effects' not found, %s", GEN_MSG_LOCATION, path); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - main section 'effects' not found, %s", GEN_MSG_LOCATION, path); return; } if (!config->keyExists("effects", "count")) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - main key 'count' in section 'effects' not found, %s", GEN_MSG_LOCATION, path); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - main key 'count' in section 'effects' not found, %s", GEN_MSG_LOCATION, path); return; } @@ -328,7 +333,7 @@ void Effects::Load(const char* path) sprintf(eff_section_name, "effect_%d", i); if (!config->sectionExists(eff_section_name)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - not found effect [%s], %s", GEN_MSG_LOCATION, eff_section_name, path); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not found effect [%s], %s", GEN_MSG_LOCATION, eff_section_name, path); return; } @@ -347,7 +352,7 @@ void Effects::Load(const char* path) sprintf(part_section_name, "effect_%d_emitter_%d", i, k); if (!config->sectionExists(eff_section_name)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - not found particles [%s], %s", GEN_MSG_LOCATION, part_section_name, path); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not found particles [%s], %s", GEN_MSG_LOCATION, part_section_name, path); return; } @@ -1122,7 +1127,7 @@ void Effects::EffectRenderAll(DWORD timeDelta) } } -bool Effects::EffectVisibleCom(ID id, ISXFrustum* frustum, float3* view) +bool Effects::EffectVisibleCom(ID id, const ISXFrustum* frustum, float3* view) { EFFECTS_EFFECT_PRECOND(id, false); @@ -1136,14 +1141,14 @@ bool Effects::EffectVisibleCom(ID id, ISXFrustum* frustum, float3* view) scenter = (eff->CurrMin2 + eff->CurrMax2) * 0.5f; sradius = SMVector3Length(scenter - eff->CurrMax2); - eff->ViewRender = frustum->SphereInFrustum(&scenter, sradius); + eff->ViewRender = frustum->sphereInFrustum(&scenter, sradius); eff->ViewDist = SMVector3Length((scenter - (*view))) - sradius; return eff->ViewRender; } -void Effects::EffectVisibleComAll(ISXFrustum* frustum, float3* view) +void Effects::EffectVisibleComAll(const ISXFrustum* frustum, float3* view) { for(int i = 0, l = ArrID.size(); i < l; ++i) { @@ -1183,12 +1188,12 @@ void Effects::EffectVisibleComAll(ISXFrustum* frustum, float3* view) { for (int i = 0; i < ArrSortSizeCurr; ++i) { - //g_fnReportf(0, "ArrSort[%d] = %d\n", i, ArrSort[i]); + //LibReport(0, "ArrSort[%d] = %d\n", i, ArrSort[i]); if (ArrSort[i] >= 0) - g_fnReportf(0, "ViewDist = %f\n", ArrID[ArrSort[i]]->ViewDist); + LibReport(0, "ViewDist = %f\n", ArrID[ArrSort[i]]->ViewDist); } - g_fnReportf(0, "%d---------\n", ArrSortSizeCurr); + LibReport(0, "%d---------\n", ArrSortSizeCurr); }*/ } diff --git a/source/particles/effect.h b/source/particles/effect.h index 22e5c6a99..4c0089476 100644 --- a/source/particles/effect.h +++ b/source/particles/effect.h @@ -1,37 +1,40 @@ -#ifndef __effect_h -#define __effect_h +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __EFFECT_H +#define __EFFECT_H #include <gdefines.h> #define SM_D3D_CONVERSIONS -#include <common\SXMath.h> +#include <common/SXMath.h> #include "PESet.h" -extern report_func g_fnReportf; - #include "emitter.h" #include <common/array.h> #include <common/string.h> #define EFFECTS_EFFECT_PRECOND_KEY(key,retval) \ if (!(key >= 0 && key < ArrKey.size()))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles: unresolved key of access '%d'", GEN_MSG_LOCATION, key); return retval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles: unresolved key of access '%d'", GEN_MSG_LOCATION, key); return retval; } #define EFFECTS_EFFECT_PRECOND(id, retval) \ if (id < 0 || id >= ArrID.size() || !(ArrID[id]))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - unresolved address to effect %d", GEN_MSG_LOCATION, id); return retval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - unresolved address to effect %d", GEN_MSG_LOCATION, id); return retval; } #define EFFECTS_POOL_PRECOND(id, retval) \ if (id < 0 || id >= Pools.size())\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - unresolved address to pool %d", GEN_MSG_LOCATION, id); return retval; } \ +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - unresolved address to pool %d", GEN_MSG_LOCATION, id); return retval; } \ if (Pools[id]->ideff < 0) \ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - uninitialized pool %d", GEN_MSG_LOCATION, id); return retval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - uninitialized pool %d", GEN_MSG_LOCATION, id); return retval; } #define EFFECTS_PARTICLES_PRECOND(id, id_part, retval) \ if (id_part < 0 || id_part >= ArrID[id]->Arr.size() || !(ArrID[id]->Arr[id_part]))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - unresolved address to particles %d in effect %d", GEN_MSG_LOCATION, id_part, id); return retval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles - unresolved address to particles %d in effect %d", GEN_MSG_LOCATION, id_part, id); return retval; } #define EFFECTS_PRECOND(id, id_part, retval) \ EFFECTS_EFFECT_PRECOND(id, retval); \ @@ -155,8 +158,8 @@ public: void EffectDirGet(ID id, float3* dir); void EffectRotGet(ID id, float3* rot); - bool EffectVisibleCom(ID id, ISXFrustum* frustum, float3* view); - void EffectVisibleComAll(ISXFrustum* frustum, float3* view); + bool EffectVisibleCom(ID id, const ISXFrustum* frustum, float3* view); + void EffectVisibleComAll(const ISXFrustum* frustum, float3* view); bool EffectVisibleGet(ID id); float EffectDistToViewGet(ID id); diff --git a/source/particles/emitter.cpp b/source/particles/emitter.cpp index 2eef7f58f..6b7bf9e6e 100644 --- a/source/particles/emitter.cpp +++ b/source/particles/emitter.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Emitter.h" void Emitter::NullingInit() @@ -114,7 +119,7 @@ void Emitter::TextureSetID(ID tex) void Emitter::TextureSet(const char* tex) { - IDTex = SGCore_LoadTexAddName(tex, LoadTexType::ltt_load); + IDTex = SGCore_LoadTexAddName(tex, LOAD_TEXTURE_TYPE_LOAD); //SGCore_LoadTexLoadTextures(); isTexInit = false; if (SGCore_LoadTexGetTex(IDTex)) @@ -144,7 +149,7 @@ void Emitter::TextureTrackSetID(ID tex) void Emitter::TextureTrackSet(const char* tex) { - IDTexTrack = SGCore_LoadTexAddName(tex, LoadTexType::ltt_load); + IDTexTrack = SGCore_LoadTexAddName(tex, LOAD_TEXTURE_TYPE_LOAD); //SGCore_LoadTexLoadTextures(); } @@ -251,7 +256,7 @@ void Emitter::CountSet(int count) if (Count <= 0) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - buffer null size", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - buffer null size", GEN_MSG_LOCATION); return; } @@ -1306,7 +1311,7 @@ void Emitter::Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos) if (PESet::IDsRenderTargets::DepthScene >= 0) PESet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PESet::IDsRenderTargets::DepthScene)); else - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxparticles - not init depth map\n"); + LibReport(REPORT_MSG_LEVEL_WARNING, "sxparticles - not init depth map\n"); } SGCore_ShaderBind(SHADER_TYPE_VERTEX, PESet::IDsShaders::VS::Particles); diff --git a/source/particles/emitter.h b/source/particles/emitter.h index 2e9640c4e..62a2f30aa 100644 --- a/source/particles/emitter.h +++ b/source/particles/emitter.h @@ -1,16 +1,20 @@ -#ifndef __particles_h -#define __particles_h +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __EMITTER_H +#define __EMITTER_H #include <gdefines.h> #define SM_D3D_CONVERSIONS -#include <common\SXMath.h> +#include <common/SXMath.h> #include "sxparticles.h" #include "PESet.h" -extern report_func g_fnReportf; extern g_particles_phy_collision GParticlesPhyCollision; //структура описывающая партикл diff --git a/source/particles/sxparticles.cpp b/source/particles/sxparticles.cpp index 6b3a53003..f9d62c87b 100644 --- a/source/particles/sxparticles.cpp +++ b/source/particles/sxparticles.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "sxparticles.h" #include "emitter.h" #include "effect.h" @@ -21,7 +26,7 @@ g_particles_phy_collision GParticlesPhyCollision = ParticlesPhyCollision; Effects* ArrEffects = 0; -#define PE_PRECOND(retval) if(!ArrEffects){g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles is not init", GEN_MSG_LOCATION); return retval;} +#define PE_PRECOND(retval) if(!ArrEffects){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxparticles is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -50,7 +55,7 @@ SX_LIB_API void SPE_0Create(const char* name, bool is_unic) if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, sxparticles", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); } else { @@ -65,7 +70,7 @@ SX_LIB_API void SPE_0Create(const char* name, bool is_unic) } } else - g_fnReportf(-1, "%s - not init argument [name], sxparticles", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SPE_RTDepthSet(ID id) @@ -321,14 +326,14 @@ SX_LIB_API void SPE_EffectRotGet(ID id, float3* rot) } -SX_LIB_API bool SPE_EffectVisibleCom(ID id, ISXFrustum* frustum, float3* view) +SX_LIB_API bool SPE_EffectVisibleCom(ID id, const ISXFrustum* frustum, float3* view) { PE_PRECOND(false); return ArrEffects->EffectVisibleCom(id, frustum, view); } -SX_LIB_API void SPE_EffectVisibleComAll(ISXFrustum* frustum, float3* view) +SX_LIB_API void SPE_EffectVisibleComAll(const ISXFrustum* frustum, float3* view) { PE_PRECOND(_VOID); diff --git a/source/particles/sxparticles.h b/source/particles/sxparticles.h index 939856846..dfc0eeb06 100644 --- a/source/particles/sxparticles.h +++ b/source/particles/sxparticles.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -498,10 +498,10 @@ SX_LIB_API void SPE_EffectRotGet(ID id, float3* rot); //! просчет видимости эффекта для фрустума frustum, и расчет расстояния от позиции наблюдателя view до эффекта, возвращает виден ли фруустуму эффект -SX_LIB_API bool SPE_EffectVisibleCom(ID id, ISXFrustum* frustum, float3* view); +SX_LIB_API bool SPE_EffectVisibleCom(ID id, const ISXFrustum* frustum, float3* view); //! просчет видимости всех эффектов для фрустума frustum, и расчет расстояний от позиции наблюдателя view до всех эффектов -SX_LIB_API void SPE_EffectVisibleComAll(ISXFrustum* frustum, float3* view); +SX_LIB_API void SPE_EffectVisibleComAll(const ISXFrustum* frustum, float3* view); //! виден ли эффект? по результатам просчетов #SPE_EffectVisibleComAll diff --git a/source/particles/sxparticles_dll.cpp b/source/particles/sxparticles_dll.cpp index 6bd158387..88b1ec58e 100644 --- a/source/particles/sxparticles_dll.cpp +++ b/source/particles/sxparticles_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #include <windows.h> diff --git a/source/physics/PhyWorld.cpp b/source/physics/PhyWorld.cpp index b0a196688..c58e7a5f8 100644 --- a/source/physics/PhyWorld.cpp +++ b/source/physics/PhyWorld.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "PhyWorld.h" #include <core/sxcore.h> #include <geom/sxgeom.h> @@ -605,7 +611,7 @@ void PhyWorld::DebugDrawer::drawContactPoint(const btVector3 & PointOnB, const b void PhyWorld::DebugDrawer::reportErrorWarning(const char * warningString) { - reportf(REPORT_MSG_LEVEL_WARNING, "%s\n", warningString); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s\n", warningString); } void PhyWorld::DebugDrawer::draw3dText(const btVector3& location, const char* textString) diff --git a/source/physics/PhyWorld.h b/source/physics/PhyWorld.h index 103a8637c..435608ca7 100644 --- a/source/physics/PhyWorld.h +++ b/source/physics/PhyWorld.h @@ -1,5 +1,11 @@ -#ifndef SXPHYWORLD_H -#define SXPHYWORLD_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __PHY_WORLD_H +#define __PHY_WORLD_H #include <btBulletDynamicsCommon.h> @@ -30,8 +36,6 @@ struct PhyMatFile }; #pragma pack(pop) -extern report_func reportf; - class PhyWorld { public: diff --git a/source/physics/sxphysics.h b/source/physics/sxphysics.h index 8f69cc3fd..4c2ee3e85 100644 --- a/source/physics/sxphysics.h +++ b/source/physics/sxphysics.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/physics/sxphysics_dll.cpp b/source/physics/sxphysics_dll.cpp index 99a5920d4..3ec2b29dc 100644 --- a/source/physics/sxphysics_dll.cpp +++ b/source/physics/sxphysics_dll.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define WIN32_LEAN_AND_MEAN #include <windows.h> @@ -32,12 +32,12 @@ See the license in LICENSE #if !defined(DEF_STD_REPORT) #define DEF_STD_REPORT -report_func reportf = DefReport; +report_func g_fnReportf = DefReport; #endif PhyWorld * g_pWorld = NULL; -#define SP_PRECOND(ret) if(!g_pWorld){reportf(-1, "%s - sxphysics is not init", GEN_MSG_LOCATION);return ret;} +#define SP_PRECOND(ret) if(!g_pWorld){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxphysics is not init", GEN_MSG_LOCATION);return ret;} BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, @@ -59,7 +59,7 @@ SX_LIB_API void SXPhysics_0Create() { if(g_pWorld) { - reportf(-1, "%s - sxphysics double init", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxphysics double init", GEN_MSG_LOCATION); return; } Core_SetOutPtr(); @@ -90,7 +90,7 @@ SX_LIB_API void SXPhysics_Sync() SX_LIB_API void SXPhysics_Dbg_Set(report_func rf) { - reportf = rf; + g_fnReportf = rf; } SX_LIB_API void SXPhysics_LoadGeom(const char * file) diff --git a/source/pp/sxpp.cpp b/source/pp/sxpp.cpp index 59e1e00fb..54a490a67 100644 --- a/source/pp/sxpp.cpp +++ b/source/pp/sxpp.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define SXPP_VERSION 1 @@ -167,7 +167,7 @@ void PPSet::Init() PPSet::IDsShaders::PS::DLAA_Small = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "ppe_dlaa_small.ps", "ppe_dlaa_small.ps", SHADER_CHECKDOUBLE_PATH); PPSet::IDsShaders::PS::DLAA_Long = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "ppe_dlaa_long.ps", "ppe_dlaa_long.ps", SHADER_CHECKDOUBLE_PATH); - PPSet::IDsTexs::Noise = SGCore_LoadTexAddName("noise_rottex.dds", LoadTexType::ltt_const); + PPSet::IDsTexs::Noise = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST); PPSet::IDsTexs::Sun = -1; @@ -195,8 +195,8 @@ void PPSet::Init() PPSet::IDsRenderTargets::Bright2 = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_bright2", 1); } -#define PP_PRECOND(retval) if(!PPSet::DXDevice){g_fnReportf(-1, "%s - post process is not init", GEN_MSG_LOCATION); return retval;} -#define PP_PRECOND_SECOND(retval) if(PPSet::IDsRenderTargets::Input < 0 || PPSet::IDsRenderTargets::Output < 0){g_fnReportf(-1, "%s - post process is not init output textures", GEN_MSG_LOCATION); return retval;} +#define PP_PRECOND(retval) if(!PPSet::DXDevice){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - post process is not init", GEN_MSG_LOCATION); return retval;} +#define PP_PRECOND_SECOND(retval) if(PPSet::IDsRenderTargets::Input < 0 || PPSet::IDsRenderTargets::Output < 0){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - post process is not init output textures", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -221,7 +221,7 @@ SX_LIB_API void SPP_0Create(const char* name, bool is_unic) if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, post process", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); } else { @@ -234,7 +234,7 @@ SX_LIB_API void SPP_0Create(const char* name, bool is_unic) } } else - g_fnReportf(-1, "%s - not init argument [name], post process", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SPP_0Kill() @@ -721,7 +721,7 @@ SX_LIB_API void SPP_UpdateSun(float3* sunpos) SX_LIB_API void SPP_ChangeTexSun(const char* str) { - PPSet::IDsTexs::Sun = SGCore_LoadTexAddName(str, LoadTexType::ltt_const); + PPSet::IDsTexs::Sun = SGCore_LoadTexAddName(str, LOAD_TEXTURE_TYPE_CONST); } SX_LIB_API void SPP_RenderSun(float4_t* sun_color) @@ -734,7 +734,7 @@ SX_LIB_API void SPP_RenderSun(float4_t* sun_color) if (PPSet::IDsTexs::Sun < 0 || !SGCore_LoadTexGetTex(PPSet::IDsTexs::Sun)) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "sxpp: %s - sun texture is not init, process can not be started\n", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - sun texture is not init, process can not be started\n", GEN_MSG_LOCATION); return; } diff --git a/source/pp/sxpp.h b/source/pp/sxpp.h index 400e0513b..7ad0eacf9 100644 --- a/source/pp/sxpp.h +++ b/source/pp/sxpp.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -25,7 +25,7 @@ See the license in LICENSE #undef SX_LIB_API #define SX_LIB_API extern "C" __declspec (dllimport) -#include <gcore\\sxgcore.h> +#include <gcore/sxgcore.h> #ifdef SX_DLL #undef SX_LIB_API diff --git a/source/pp/sxpp_dll.cpp b/source/pp/sxpp_dll.cpp index 4030f098d..88b1ec58e 100644 --- a/source/pp/sxpp_dll.cpp +++ b/source/pp/sxpp_dll.cpp @@ -1,10 +1,9 @@ -/****************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ -#pragma once #include <windows.h> BOOL APIENTRY DllMain(HMODULE hModule, diff --git a/source/render/camera_update.cpp b/source/render/camera_update.cpp index 40fcf3e1b..13465dd5b 100644 --- a/source/render/camera_update.cpp +++ b/source/render/camera_update.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "camera_update.h" //обработка вводы информации с клавиатуры @@ -6,28 +11,28 @@ void CameraUpdate::UpdateInputKeyBoard(DWORD timeDelta) { //обработка ходьбы if(SSInput_GetKeyState(SIK_W)) - GData::ObjCamera->PosFrontBack( + GData::ObjCamera->posFrontBack( GData::CamWalkParamEditor.x * (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * float(timeDelta) * 0.001f ); if(SSInput_GetKeyState(SIK_S)) - GData::ObjCamera->PosFrontBack( + GData::ObjCamera->posFrontBack( -GData::CamWalkParamEditor.x * (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * GData::CamWalkParamEditor.w * float(timeDelta) * 0.001f ); if(SSInput_GetKeyState(SIK_A)) - GData::ObjCamera->PosLeftRight( + GData::ObjCamera->posLeftRight( -GData::CamWalkParamEditor.x * (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * GData::CamWalkParamEditor.z * float(timeDelta) * 0.001f ); if(SSInput_GetKeyState(SIK_D)) - GData::ObjCamera->PosLeftRight( + GData::ObjCamera->posLeftRight( GData::CamWalkParamEditor.x * (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * GData::CamWalkParamEditor.z * float(timeDelta) * 0.001f @@ -45,13 +50,13 @@ void CameraUpdate::UpdateInputMouseRotate(DWORD timeDelta) if(dx) { - GData::ObjCamera->RotRightLeft(float(timeDelta) * *sense * float(dx)); + GData::ObjCamera->rotRightLeft(float(timeDelta) * *sense * float(dx)); //SetCursorPos(centr.x,cy); } if(dy) { - GData::ObjCamera->RotUpDown(float(timeDelta) * *sense * float(dy)); + GData::ObjCamera->rotUpDown(float(timeDelta) * *sense * float(dy)); //SetCursorPos(cx,centr.y); } } @@ -67,7 +72,7 @@ void CameraUpdate::UpdateInputMouseUpDown(DWORD timeDelta) if(dy) { - GData::ObjCamera->PosUpDown(5 * float(timeDelta) * *sense * float(-dy)); + GData::ObjCamera->posUpDown(5 * float(timeDelta) * *sense * float(-dy)); } } diff --git a/source/render/camera_update.h b/source/render/camera_update.h index 9d4426365..5ffa34770 100644 --- a/source/render/camera_update.h +++ b/source/render/camera_update.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -13,8 +13,8 @@ See the license in LICENSE \ingroup render @{*/ -#ifndef __CAMERA_UPDATE -#define __CAMERA_UPDATE +#ifndef __CAMERA_UPDATE_H +#define __CAMERA_UPDATE_H #include <windows.h> #include <input/sxinput.h> diff --git a/source/render/editor/axes_static.cpp b/source/render/editor/axes_static.cpp index 844bfeaea..1a84aedca 100644 --- a/source/render/editor/axes_static.cpp +++ b/source/render/editor/axes_static.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "grid.h" CAxesStatic::CAxesStatic() diff --git a/source/render/editor/axes_static.h b/source/render/editor/axes_static.h index b3fd3d267..a974a8b82 100644 --- a/source/render/editor/axes_static.h +++ b/source/render/editor/axes_static.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __AXES_STATIC_H #define __AXES_STATIC_H diff --git a/source/render/editor/grid.cpp b/source/render/editor/grid.cpp index dbfcdd8e8..34c438a88 100644 --- a/source/render/editor/grid.cpp +++ b/source/render/editor/grid.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "grid.h" CGrid::CGrid() diff --git a/source/render/editor/grid.h b/source/render/editor/grid.h index 359fcdf45..6c2e7e8ed 100644 --- a/source/render/editor/grid.h +++ b/source/render/editor/grid.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __GRID_H #define __GRID_H diff --git a/source/render/gdata.cpp b/source/render/gdata.cpp index dfc8ee2f5..0591d76b0 100644 --- a/source/render/gdata.cpp +++ b/source/render/gdata.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "gdata.h" namespace GData diff --git a/source/render/gdata.h b/source/render/gdata.h index 982349713..02125fe56 100644 --- a/source/render/gdata.h +++ b/source/render/gdata.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/render/model_sim.cpp b/source/render/model_sim.cpp index e03e721ca..bc59a307c 100644 --- a/source/render/model_sim.cpp +++ b/source/render/model_sim.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "model_sim.h" ModelSim::ModelSim() @@ -85,24 +90,24 @@ void ModelSim::Add(const char* path) sprintf(tmppath, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_MESHES), path); SGCore_StaticModelLoad(tmppath, &StaticModel); - if (StaticModel->SubsetCount > 1) + if (StaticModel->m_uiSubsetCount > 1) { //error } - sprintf(tmppath, "%s.dds", StaticModel->ArrTextures[0]); + sprintf(tmppath, "%s.dds", StaticModel->m_ppTextures[0]); IDsMat = SGCore_MtlLoad(tmppath, MTL_TYPE_GEOM); vertex_static* pData; - StaticModel->VertexBuffer->Lock(0, 0, (void**)&pData, 0); + StaticModel->m_pVertexBuffer->Lock(0, 0, (void**)&pData, 0); - float3_t tmppos = pData[StaticModel->StartVertex[0]].Pos; + float3_t tmppos = pData[StaticModel->m_pStartVertex[0]].Pos; float3 tmpMax = tmppos; float3 tmpMin = tmppos; - for (DWORD k = 0; k<StaticModel->VertexCount[0]; k++) + for (DWORD k = 0; k<StaticModel->m_pVertexCount[0]; k++) { - tmppos = pData[StaticModel->StartVertex[0] + k].Pos; + tmppos = pData[StaticModel->m_pStartVertex[0] + k].Pos; if (tmppos.x > tmpMax.x) tmpMax.x = tmppos.x; @@ -125,16 +130,16 @@ void ModelSim::Add(const char* path) } DWORD* indeces; - StaticModel->IndexBuffer->Lock(0, 0, (void **)&indeces, 0); + StaticModel->m_pIndexBuffer->Lock(0, 0, (void **)&indeces, 0); float3 tmpMM = SMVectorLerp(tmpMax, tmpMin, 0.5f); D3DXPLANE Plane; D3DXPlaneFromPoints(&Plane, - &D3DXVECTOR3(pData[indeces[StaticModel->StartIndex[0] + 0]].Pos.x, pData[indeces[StaticModel->StartIndex[0] + 0]].Pos.y, pData[indeces[StaticModel->StartIndex[0] + 0]].Pos.z), - &D3DXVECTOR3(pData[indeces[StaticModel->StartIndex[0] + 1]].Pos.x, pData[indeces[StaticModel->StartIndex[0] + 1]].Pos.y, pData[indeces[StaticModel->StartIndex[0] + 1]].Pos.z), - &D3DXVECTOR3(pData[indeces[StaticModel->StartIndex[0] + 2]].Pos.x, pData[indeces[StaticModel->StartIndex[0] + 2]].Pos.y, pData[indeces[StaticModel->StartIndex[0] + 2]].Pos.z)); - StaticModel->VertexBuffer->Unlock(); - StaticModel->IndexBuffer->Unlock(); + &D3DXVECTOR3(pData[indeces[StaticModel->m_pStartIndex[0] + 0]].Pos.x, pData[indeces[StaticModel->m_pStartIndex[0] + 0]].Pos.y, pData[indeces[StaticModel->m_pStartIndex[0] + 0]].Pos.z), + &D3DXVECTOR3(pData[indeces[StaticModel->m_pStartIndex[0] + 1]].Pos.x, pData[indeces[StaticModel->m_pStartIndex[0] + 1]].Pos.y, pData[indeces[StaticModel->m_pStartIndex[0] + 1]].Pos.z), + &D3DXVECTOR3(pData[indeces[StaticModel->m_pStartIndex[0] + 2]].Pos.x, pData[indeces[StaticModel->m_pStartIndex[0] + 2]].Pos.y, pData[indeces[StaticModel->m_pStartIndex[0] + 2]].Pos.z)); + StaticModel->m_pVertexBuffer->Unlock(); + StaticModel->m_pIndexBuffer->Unlock(); float3_t Center = (float3_t)((tmpMax + tmpMin) * 0.5); float3_t Min = tmpMin; @@ -144,7 +149,7 @@ void ModelSim::Add(const char* path) IDirect3DVertexBuffer9* Anim; GData::DXDevice->CreateVertexBuffer( - StaticModel->AllVertexCount * sizeof(vertex_animated), + StaticModel->m_uiAllVertexCount * sizeof(vertex_animated), D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, @@ -153,9 +158,9 @@ void ModelSim::Add(const char* path) vertex_animated* pDataAnim; Anim->Lock(0, 0, (void**)&pDataAnim, 0); - StaticModel->VertexBuffer->Lock(0, 0, (void**)&pData, 0); + StaticModel->m_pVertexBuffer->Lock(0, 0, (void**)&pData, 0); - for (UINT i = 0; i < StaticModel->AllVertexCount; ++i) + for (UINT i = 0; i < StaticModel->m_uiAllVertexCount; ++i) { pDataAnim[i].Pos = pData[i].Pos; pDataAnim[i].Norm = pData[i].Norm; @@ -166,7 +171,7 @@ void ModelSim::Add(const char* path) } Anim->Unlock(); - StaticModel->VertexBuffer->Unlock(); + StaticModel->m_pVertexBuffer->Unlock(); ArrStaticModel[ArrStaticModel.size() - 1]->Anim = Anim; } @@ -221,16 +226,16 @@ void ModelSim::RenderStatic(DWORD timeDelta) { // uint32_t* RTGPUArrIndicesPtrs2; - GData::DXDevice->SetStreamSource(0, ArrStaticModel[CurrRenderModel]->Model->VertexBuffer, 0, sizeof(vertex_static)); - GData::DXDevice->SetIndices(ArrStaticModel[CurrRenderModel]->Model->IndexBuffer); + GData::DXDevice->SetStreamSource(0, ArrStaticModel[CurrRenderModel]->Model->m_pVertexBuffer, 0, sizeof(vertex_static)); + GData::DXDevice->SetIndices(ArrStaticModel[CurrRenderModel]->Model->m_pIndexBuffer); GData::DXDevice->SetVertexDeclaration(VertexDeclarationStatic); long jCountIndex = 0; SGCore_MtlSet(IDsMat, &WorldMat); - SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrStaticModel[CurrRenderModel]->Model->VertexCount[0], jCountIndex, ArrStaticModel[CurrRenderModel]->Model->IndexCount[0] / 3); - Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ArrStaticModel[CurrRenderModel]->Model->IndexCount[0] / 3); - jCountIndex += ArrStaticModel[CurrRenderModel]->Model->IndexCount[0]; + SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrStaticModel[CurrRenderModel]->Model->m_pVertexCount[0], jCountIndex, ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0] / 3); + Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0] / 3); + jCountIndex += ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0]; } void ModelSim::RenderGreen(DWORD timeDelta) @@ -240,17 +245,17 @@ void ModelSim::RenderGreen(DWORD timeDelta) GData::DXDevice->SetStreamSourceFreq(1, (D3DSTREAMSOURCE_INSTANCEDATA | 1)); GData::DXDevice->SetStreamSource(1, TransVertBufGreen, 0, sizeof(DataVertex)); - GData::DXDevice->SetStreamSource(0, ArrStaticModel[CurrRenderModel]->Model->VertexBuffer, 0, sizeof(vertex_static)); - GData::DXDevice->SetIndices(ArrStaticModel[CurrRenderModel]->Model->IndexBuffer); + GData::DXDevice->SetStreamSource(0, ArrStaticModel[CurrRenderModel]->Model->m_pVertexBuffer, 0, sizeof(vertex_static)); + GData::DXDevice->SetIndices(ArrStaticModel[CurrRenderModel]->Model->m_pIndexBuffer); GData::DXDevice->SetVertexDeclaration(VertexDeclarationGreen); long jCountIndex = 0; SGCore_MtlSet(IDsMat, &SMMatrixIdentity()); - SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrStaticModel[CurrRenderModel]->Model->VertexCount[0], jCountIndex, ArrStaticModel[CurrRenderModel]->Model->IndexCount[0] / 3); - Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ((ArrStaticModel[CurrRenderModel]->Model->IndexCount[0] / 3) * 1)); - jCountIndex += ArrStaticModel[CurrRenderModel]->Model->IndexCount[0]; + SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrStaticModel[CurrRenderModel]->Model->m_pVertexCount[0], jCountIndex, ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0] / 3); + Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ((ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0] / 3) * 1)); + jCountIndex += ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0]; GData::DXDevice->SetStreamSourceFreq(0, 1); GData::DXDevice->SetStreamSourceFreq(1, 1); @@ -263,11 +268,11 @@ void ModelSim::RenderSkin(DWORD timeDelta) mbs.orient = SMQuaternion(); GData::DXDevice->SetStreamSource(0, ArrStaticModel[CurrRenderModel]->Anim, 0, sizeof(vertex_animated)); - GData::DXDevice->SetIndices(ArrStaticModel[CurrRenderModel]->Model->IndexBuffer); + GData::DXDevice->SetIndices(ArrStaticModel[CurrRenderModel]->Model->m_pIndexBuffer); GData::DXDevice->SetVertexDeclaration(VertexDeclarationSkin); SGCore_MtlSet(IDsMat, &WorldMat); GData::DXDevice->SetVertexShaderConstantF(16, (float*)&mbs, 2); - SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrStaticModel[CurrRenderModel]->Model->VertexCount[0], 0, ArrStaticModel[CurrRenderModel]->Model->IndexCount[0] / 3); - Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ArrStaticModel[CurrRenderModel]->Model->IndexCount[0] / 3); + SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, ArrStaticModel[CurrRenderModel]->Model->m_pVertexCount[0], 0, ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0] / 3); + Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ArrStaticModel[CurrRenderModel]->Model->m_pIndexCount[0] / 3); } \ No newline at end of file diff --git a/source/render/model_sim.h b/source/render/model_sim.h index 9945e9671..d5a4eb8f4 100644 --- a/source/render/model_sim.h +++ b/source/render/model_sim.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/render/render_func.cpp b/source/render/render_func.cpp index 9265f0e29..f0c3e7936 100644 --- a/source/render/render_func.cpp +++ b/source/render/render_func.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "render_func.h" /* @@ -134,12 +139,12 @@ void SXRenderFunc::ComDeviceLost() SXRenderFunc::InitModeWindow(); bool bf = SGCore_OnDeviceReset(*r_win_width, *r_win_height, *r_win_windowed); - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "r_win_width %d, r_win_height %d, r_win_windowed %d \n", *r_win_width, *r_win_height, *r_win_windowed); + LibReport(REPORT_MSG_LEVEL_WARNING, "r_win_width %d, r_win_height %d, r_win_windowed %d \n", *r_win_width, *r_win_height, *r_win_windowed); if (bf) { //если все-таки функция зашла сюда значит что-то было неосвобождено - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "reset device is failed ... \n"); + LibReport(REPORT_MSG_LEVEL_ERROR, "reset device is failed ... \n"); } else { @@ -163,7 +168,7 @@ void SXRenderFunc::ComVisibleForLight() if (!SML_LigthsGetExists(i)) continue; - if (SML_LigthsGetShadowed(i) && (SML_LigthsComVisibleForFrustum(i, GData::ObjCamera->ObjFrustum) && SML_LigthsGetEnable(i)) /*|| (Data::Level::LightManager->Arr[i]->ShadowCube && Data::Level::LightManager->Arr[i]->ShadowCube->GetStatic() && !Data::Level::LightManager->Arr[i]->ShadowCube->GetUpdate())*/) + if (SML_LigthsGetShadowed(i) && (SML_LigthsComVisibleForFrustum(i, GData::ObjCamera->getFrustum()) && SML_LigthsGetEnable(i)) /*|| (Data::Level::LightManager->Arr[i]->ShadowCube && Data::Level::LightManager->Arr[i]->ShadowCube->GetStatic() && !Data::Level::LightManager->Arr[i]->ShadowCube->GetUpdate())*/) { if (SML_LigthsGetType(i) == LTYPE_LIGHT_GLOBAL) { @@ -286,12 +291,12 @@ void SXRenderFunc::ComVisibleForLight() void SXRenderFunc::ComVisibleForCamera() { if (SGeom_ModelsGetCount() > 0) - SGeom_ModelsComVisible(GData::ObjCamera->ObjFrustum, &GData::ConstCurrCamPos); + SGeom_ModelsComVisible(GData::ObjCamera->getFrustum(), &GData::ConstCurrCamPos); if (SGeom_GreenGetCount() > 0) - SGeom_GreenComVisible(GData::ObjCamera->ObjFrustum, &GData::ConstCurrCamPos); + SGeom_GreenComVisible(GData::ObjCamera->getFrustum(), &GData::ConstCurrCamPos); - SXAnim_ModelsComVisible(GData::ObjCamera->ObjFrustum, &GData::ConstCurrCamPos); + SXAnim_ModelsComVisible(GData::ObjCamera->getFrustum(), &GData::ConstCurrCamPos); } void SXRenderFunc::ComVisibleReflection() @@ -492,7 +497,7 @@ void SXRenderFunc::FullScreenChangeSizeAbs() *r_win_width = iFullScreenWidth; *r_win_height = iFullScreenHeight; - //g_fnReportf(REPORT_MSG_LEVEL_WARNING, "iFullScreenWidth %d, iFullScreenHeight %d \n", iFullScreenWidth, iFullScreenHeight); + //LibReport(REPORT_MSG_LEVEL_WARNING, "iFullScreenWidth %d, iFullScreenHeight %d \n", iFullScreenWidth, iFullScreenHeight); } static int *r_resize = (int*)GET_PCVAR_INT("r_resize"); @@ -505,7 +510,7 @@ void SXRenderFunc::UpdateView() { GData::InitAllMatrix(); - GData::ObjCamera->GetViewMatrix(&GData::MCamView); + GData::ObjCamera->getViewMatrix(&GData::MCamView); Core_RMatrixSet(G_RI_MATRIX_WORLD, &SMMatrixIdentity()); Core_RMatrixSet(G_RI_MATRIX_VIEW, &GData::MCamView); @@ -513,8 +518,8 @@ void SXRenderFunc::UpdateView() Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &(GData::MCamView * GData::MLightProj)); Core_RMatrixSet(G_RI_MATRIX_TRANSP_VIEWPROJ, &SMMatrixTranspose(GData::MCamView * GData::MLightProj)); - GData::ObjCamera->GetPosition(&GData::ConstCurrCamPos); - GData::ObjCamera->GetLook(&GData::ConstCurrCamDir); + GData::ObjCamera->getPosition(&GData::ConstCurrCamPos); + GData::ObjCamera->getLook(&GData::ConstCurrCamDir); Core_RFloat3Set(G_RI_FLOAT3_OBSERVER_POSITION, &GData::ConstCurrCamPos); Core_RFloat3Set(G_RI_FLOAT3_OBSERVER_DIRECTION, &GData::ConstCurrCamDir); @@ -527,7 +532,7 @@ void SXRenderFunc::UpdateView() Core_RFloatSet(G_RI_FLOAT_OBSERVER_FAR, GData::NearFar.y); Core_RFloatSet(G_RI_FLOAT_OBSERVER_FOV, GData::ProjFov);*/ - GData::ObjCamera->ObjFrustum->Update(&(GData::MCamView), &(GData::MCamProj)); + GData::ObjCamera->updateFrustum(&GData::MCamProj); if (GData::DefaultGeomIDArr < 0) GData::DefaultGeomIDArr = SGeom_ModelsAddArrForCom(); @@ -823,7 +828,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) void SXRenderFunc::UpdateShadow(DWORD timeDelta) { Core_RIntSet(G_RI_INT_RENDERSTATE, RENDER_STATE_SHADOW); - SML_LigthsComVisibleFrustumDistFor(GData::ObjCamera->ObjFrustum, &GData::ConstCurrCamPos); + SML_LigthsComVisibleFrustumDistFor(GData::ObjCamera->getFrustum(), &GData::ConstCurrCamPos); GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); @@ -842,7 +847,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta) continue; Core_RIntSet(G_RI_INT_CURRIDLIGHT, i); - if (SML_LigthsGetShadowed(i) && (SML_LigthsComVisibleForFrustum(i, GData::ObjCamera->ObjFrustum) && SML_LigthsGetEnable(i)) /*|| (Data::Level::LightManager->Arr[i]->ShadowCube && Data::Level::LightManager->Arr[i]->ShadowCube->GetStatic() && !Data::Level::LightManager->Arr[i]->ShadowCube->GetUpdate())*/) + if (SML_LigthsGetShadowed(i) && (SML_LigthsComVisibleForFrustum(i, GData::ObjCamera->getFrustum()) && SML_LigthsGetEnable(i)) /*|| (Data::Level::LightManager->Arr[i]->ShadowCube && Data::Level::LightManager->Arr[i]->ShadowCube->GetStatic() && !Data::Level::LightManager->Arr[i]->ShadowCube->GetUpdate())*/) { if (SML_LigthsGetType(i) == LTYPE_LIGHT_GLOBAL) { diff --git a/source/render/render_func.h b/source/render/render_func.h index 703131977..8e6859f6f 100644 --- a/source/render/render_func.h +++ b/source/render/render_func.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file @@ -34,8 +34,6 @@ See the license in LICENSE #include <pp/sxpp.h> #include <decals/sxdecals.h> -extern report_func g_fnReportf; - //! пространство имен с орагнизацией рендера namespace SXRenderFunc { diff --git a/source/render/sxrender.cpp b/source/render/sxrender.cpp index c85721b49..6b43a9238 100644 --- a/source/render/sxrender.cpp +++ b/source/render/sxrender.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "sxrender.h" #include <render/camera_update.h> @@ -13,7 +18,7 @@ report_func g_fnReportf = DefReport; #endif -#define SR_PRECOND(retval) if(!GData::DXDevice){g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxrender is not init", GEN_MSG_LOCATION); return retval;} +#define SR_PRECOND(retval) if(!GData::DXDevice){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxrender is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -37,7 +42,7 @@ SX_LIB_API void SRender_0Create(const char *szName, HWND hWnd3D, HWND hWndParent if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, sxparticles", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); return; } } @@ -48,7 +53,7 @@ SX_LIB_API void SRender_0Create(const char *szName, HWND hWnd3D, HWND hWndParent GData::DXDevice = SGCore_GetDXDevice(); GData::ObjCamera = SGCore_CrCamera(); - GData::ObjCamera->SetFOV(GData::ProjFov); + GData::ObjCamera->setFOV(GData::ProjFov); GData::InitAllMatrix(); @@ -97,7 +102,7 @@ SX_LIB_API void SRender_0Create(const char *szName, HWND hWnd3D, HWND hWndParent //SGCore_LoadTexLoadTextures(); } else - g_fnReportf(-1, "%s - not init argument [name], sxparticles", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SRender_AKill() diff --git a/source/render/sxrender.h b/source/render/sxrender.h index fe75890a8..0954ff53f 100644 --- a/source/render/sxrender.h +++ b/source/render/sxrender.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/score/CallBackOgg.cpp b/source/score/CallBackOgg.cpp index d4b6630c6..da236f7fa 100644 --- a/source/score/CallBackOgg.cpp +++ b/source/score/CallBackOgg.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #pragma once //чтение файла diff --git a/source/score/sound.cpp b/source/score/sound.cpp index 718701bde..41b5ce6b5 100644 --- a/source/score/sound.cpp +++ b/source/score/sound.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "sound.h" size_t ogg_read(void *ptr, size_t size, size_t nmemb, void *datasource) @@ -81,13 +86,13 @@ void MainSound::Init(HWND hwnd) { if (FAILED(DirectSoundCreate8(NULL, &DeviceSound, NULL))) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - could not create sound device", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - could not create sound device", GEN_MSG_LOCATION); return;// SOUND_INIT_ERR_INIT; } if (FAILED(DeviceSound->SetCooperativeLevel(hwnd, DSSCL_EXCLUSIVE))) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - could not create cooperative level", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - could not create cooperative level", GEN_MSG_LOCATION); return;// SOUND_INIT_ERR_CL; } @@ -101,7 +106,7 @@ void MainSound::Init(HWND hwnd) if (FAILED(DeviceSound->CreateSoundBuffer(&dsbd, &DSPrimary, NULL))) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - could not create primary buffer", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - could not create primary buffer", GEN_MSG_LOCATION); return;// SOUND_INIT_ERR_PRIM_BUF; } @@ -117,7 +122,7 @@ void MainSound::Init(HWND hwnd) if (FAILED(DSPrimary->SetFormat(&wfex))) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - could not init format", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - could not init format", GEN_MSG_LOCATION); return;// SOUND_INIT_ERR_SET_FORMAT; } @@ -182,7 +187,7 @@ void MainSound::LoadWAV(Sound* snd, const char* fpath) if (!(snd->DSBuffer = SoundBufferCreate(&Hdr))) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - could not create sound buffer [%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - could not create sound buffer [%s]", GEN_MSG_LOCATION, snd->RPath); return; } @@ -299,7 +304,7 @@ void MainSound::LoadOGG(Sound* snd, const char* fpath) if (ov_fopen(fpath, &ogg)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - error reading [%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error reading [%s]", GEN_MSG_LOCATION, snd->RPath); return; } @@ -317,7 +322,7 @@ void MainSound::LoadOGG(Sound* snd, const char* fpath) if (!vi) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - error reading (info) [%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - error reading (info) [%s]", GEN_MSG_LOCATION, snd->RPath); return; } @@ -342,7 +347,7 @@ void MainSound::LoadOGG(Sound* snd, const char* fpath) if (!snd->DSBuffer) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - could not create sound buffer [%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - could not create sound buffer [%s]", GEN_MSG_LOCATION, snd->RPath); return; } @@ -421,7 +426,7 @@ void MainSound::SoundDataOGGLoad(OggVorbis_File* VorbisFile, IDirectSoundBuffer8 else if (bites_read == OV_EINVAL) { //ошибка при декодировании, нужно поставить заглушку - g_fnReportf(REPORT_MSG_LEVEL_WARNING,"OV_EINVAL"); + LibReport(REPORT_MSG_LEVEL_WARNING,"OV_EINVAL"); } else break; @@ -445,7 +450,7 @@ void MainSound::SoundDataOGGLoad(OggVorbis_File* VorbisFile, IDirectSoundBuffer8 else if (bites_read == OV_EINVAL) { //ошибка при декодировании, нужно поставить заглушку - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "OV_EINVAL"); + LibReport(REPORT_MSG_LEVEL_WARNING, "OV_EINVAL"); } else break; @@ -467,7 +472,7 @@ ID MainSound::SoundCreate2d(const char *file, bool looping, DWORD size_stream) if (!Core_0FileExists(fullpath)) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - file not found [%s]", GEN_MSG_LOCATION, fullpath); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - file not found [%s]", GEN_MSG_LOCATION, fullpath); return -1; } @@ -475,7 +480,7 @@ ID MainSound::SoundCreate2d(const char *file, bool looping, DWORD size_stream) if (fmt == SOUND_FILEFORMAT_UNKNOWN) { - g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - unknown format [%s]", GEN_MSG_LOCATION, file); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - unknown format [%s]", GEN_MSG_LOCATION, file); return -1; } @@ -566,13 +571,13 @@ void MainSound::SoundInstancePlay2d(ID id, int volume, int pan) if (snd->StreamSize > 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance for streaming [%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance for streaming [%s]", GEN_MSG_LOCATION, snd->RPath); return; } if (snd->Is3d) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - can not create 2d sound instance by 3d [%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - can not create 2d sound instance by 3d [%s]", GEN_MSG_LOCATION, snd->RPath); return; } @@ -593,7 +598,7 @@ void MainSound::SoundInstancePlay2d(ID id, int volume, int pan) DeviceSound->DuplicateSoundBuffer(snd->DSBuffer, &tsb); if (!tsb) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance [%s], this is big problem", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance [%s], this is big problem", GEN_MSG_LOCATION, snd->RPath); return; } tsb->QueryInterface(IID_IDirectSoundBuffer8, (void**)&tsb8); @@ -626,13 +631,13 @@ void MainSound::SoundInstancePlay3d(ID id, const float3* pos) if (snd->StreamSize > 0) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance for streaming [%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance for streaming [%s]", GEN_MSG_LOCATION, snd->RPath); return; } if (!snd->Is3d) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - can not create 3d sound instance by 2d[%s]", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - can not create 3d sound instance by 2d[%s]", GEN_MSG_LOCATION, snd->RPath); return; } @@ -653,7 +658,7 @@ void MainSound::SoundInstancePlay3d(ID id, const float3* pos) DeviceSound->DuplicateSoundBuffer(snd->DSBuffer, &tsb); if (!tsb) { - g_fnReportf(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance [%s], this is big problem", GEN_MSG_LOCATION, snd->RPath); + LibReport(REPORT_MSG_LEVEL_WARNING, "%s - can not create sound instance [%s], this is big problem", GEN_MSG_LOCATION, snd->RPath); return; } tsb->QueryInterface(IID_IDirectSoundBuffer8, (void**)&tsb8); diff --git a/source/score/sound.h b/source/score/sound.h index d365d60e4..a5fe99dde 100644 --- a/source/score/sound.h +++ b/source/score/sound.h @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #ifndef __SOUND_H #define __SOUND_H @@ -19,8 +24,6 @@ #include <common/assotiativearray.h> #include "sxscore.h" -extern report_func g_fnReportf; - struct AAStringNR : public AAString { __forceinline AAStringNR(const char * str) @@ -44,7 +47,7 @@ struct AAStringNR : public AAString #define SOUND_PRECOND(id, retval) \ if((UINT)id >= ArrSounds.size() || !(ArrSounds[id]))\ -{g_fnReportf(REPORT_MSG_LEVEL_ERROR, "%s - sxsound - unresolved address to sound %d", GEN_MSG_LOCATION, id); return retval; } +{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - unresolved address to sound %d", GEN_MSG_LOCATION, id); return retval; } inline long SOUND_3D_COM_VOLUME(const float3 & snd_pos, const float3 & view_pos, const float snd_distaudible) { diff --git a/source/score/sxscore.cpp b/source/score/sxscore.cpp index 5baa139a2..a4dc51178 100644 --- a/source/score/sxscore.cpp +++ b/source/score/sxscore.cpp @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ #define SXSCORE_VERSION 1 @@ -16,7 +16,7 @@ report_func g_fnReportf = DefReport; MainSound* MSound = 0; -#define SCORE_PRECOND(retval) if(!MSound){g_fnReportf(-1, "%s - sxsound is not init", GEN_MSG_LOCATION); return retval;} +#define SCORE_PRECOND(retval) if(!MSound){LibReport(-1, "%s - sxsound is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -40,7 +40,7 @@ SX_LIB_API void SSCore_0Create(const char* name, HWND hwnd, bool is_unic) if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); - g_fnReportf(-1, "%s - none unic name, sxsound", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); } else { @@ -55,7 +55,7 @@ SX_LIB_API void SSCore_0Create(const char* name, HWND hwnd, bool is_unic) } } else - g_fnReportf(-1, "%s - not init argument [name], sxsound", GEN_MSG_LOCATION); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); } SX_LIB_API void SSCore_AKill() diff --git a/source/score/sxscore.h b/source/score/sxscore.h index 18c2650f5..60bb52183 100644 --- a/source/score/sxscore.h +++ b/source/score/sxscore.h @@ -1,8 +1,8 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ /*! \file diff --git a/source/score/sxscore_dll.cpp b/source/score/sxscore_dll.cpp index 40901c2f9..a34ff74f6 100644 --- a/source/score/sxscore_dll.cpp +++ b/source/score/sxscore_dll.cpp @@ -1,10 +1,9 @@ -/****************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017 +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 See the license in LICENSE -******************************************************/ +***********************************************************/ -#pragma once #include <windows.h> BOOL APIENTRY DllMain(HMODULE hModule, diff --git a/source/skyxengine.cpp b/source/skyxengine.cpp index 97bf1bf4b..b2e1b62e1 100644 --- a/source/skyxengine.cpp +++ b/source/skyxengine.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "SkyXEngine.h" //########################################################################## @@ -61,39 +66,71 @@ void SkyXEngine_InitOutLog() } } -void SkyXEngine_PrintfLog(int level, const char *szFormat, ...) +void SkyXEngine_PrintfLog(int iLevel, const char *szLibName, const char *szFormat, ...) { - va_list va; + /*va_list va; char buf[REPORT_MSG_MAX_LEN]; va_start(va, szFormat); vsprintf_s(buf, REPORT_MSG_MAX_LEN, szFormat, va); + va_end(va);*/ + + static char szStr[REPORT_MSG_MAX_LEN]; + szStr[0] = 0; + static char szStr2[REPORT_MSG_MAX_LEN]; + szStr2[0] = 0; + int iStrLen = sizeof(szStr); + + va_list va; + va_start(va, szFormat); + vsprintf_s(szStr, REPORT_MSG_MAX_LEN, szFormat, va); va_end(va); if (g_pFileOutLog) { - if (level == REPORT_MSG_LEVEL_ERROR) + if (szStr[0] != ' ' && szStr[0] != '\t') + sprintf(szStr2, "%s%s%s: ", COLOR_GREEN, szLibName, COLOR_RESET); + + /*if (iLevel == REPORT_MSG_LEVEL_ERROR) { printf(COLOR_LRED "! "); fwrite("! ", 1, 2, g_pFileOutLog); } - else if (level == REPORT_MSG_LEVEL_WARNING) + else if (iLevel == REPORT_MSG_LEVEL_WARNING) { printf(COLOR_YELLOW "* "); fwrite("* ", 1, 2, g_pFileOutLog); } printf(buf); - if (level == REPORT_MSG_LEVEL_ERROR || level == REPORT_MSG_LEVEL_WARNING) + if (iLevel == REPORT_MSG_LEVEL_ERROR || iLevel == REPORT_MSG_LEVEL_WARNING) { printf(COLOR_RESET); + }*/ + + if (iLevel == REPORT_MSG_LEVEL_ERROR) + { + sprintf(szStr2 + strlen(szStr2), "%s", COLOR_LRED); + } + else if (iLevel == REPORT_MSG_LEVEL_WARNING) + { + sprintf(szStr2 + strlen(szStr2), "%s", COLOR_YELLOW); + } + + sprintf(szStr2 + strlen(szStr2), "%s", szStr); + + if (iLevel == REPORT_MSG_LEVEL_ERROR || iLevel == REPORT_MSG_LEVEL_WARNING) + { + sprintf(szStr2 + strlen(szStr2), "%s", COLOR_RESET); } - fwrite(buf, 1, strlen(buf), g_pFileOutLog); + + printf(szStr2); + fwrite(szStr2, 1, strlen(szStr2), g_pFileOutLog); //fprintf(FileOutLog, "\n"); fflush(g_pFileOutLog); - if (level == REPORT_MSG_LEVEL_ERROR) + if (iLevel == REPORT_MSG_LEVEL_ERROR) { - SkyXEngine_HandlerError(buf); + SkyXEngine_HandlerError(szStr2); } } } @@ -513,7 +550,7 @@ void SkyXEngine_Frame(DWORD timeDelta) if (!pDXDevice) { - SkyXEngine_PrintfLog(REPORT_MSG_LEVEL_ERROR, "dxdevice not found ..."); + SkyXEngine_PrintfLog(REPORT_MSG_LEVEL_ERROR, "SkyXEngine_Frame", "dxdevice not found ..."); return; } @@ -762,7 +799,7 @@ void SkyXEngine_Frame(DWORD timeDelta) DelayUpdateVisibleForLight += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime; ttime = TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)); - SPE_EffectVisibleComAll(SRender_GetCamera()->ObjFrustum, &vCamPos); + SPE_EffectVisibleComAll(SRender_GetCamera()->getFrustum(), &vCamPos); SPE_EffectComputeAll(); SPE_EffectComputeLightingAll(); DelayUpdateParticles += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime; diff --git a/source/sxae/Camera.cpp b/source/sxae/Camera.cpp index ab62d2f12..bda3832d5 100644 --- a/source/sxae/Camera.cpp +++ b/source/sxae/Camera.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Camera.h" Camera::Camera(): diff --git a/source/sxae/Camera.h b/source/sxae/Camera.h index 197ea65dd..895177795 100644 --- a/source/sxae/Camera.h +++ b/source/sxae/Camera.h @@ -1,5 +1,11 @@ -#ifndef CAMERA_H -#define CAMERA_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __CAMERA_H +#define __CAMERA_H #include <common/SXMath.h> diff --git a/source/sxae/EMessages.h b/source/sxae/EMessages.h index e98294649..35514c25b 100644 --- a/source/sxae/EMessages.h +++ b/source/sxae/EMessages.h @@ -1,5 +1,11 @@ -#ifndef EMessages_H -#define EMessages_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __EMESSAGES_H +#define __EMESSAGES_H #include <Windows.h> diff --git a/source/sxae/Editor.cpp b/source/sxae/Editor.cpp index 022886836..b624fc6ac 100644 --- a/source/sxae/Editor.cpp +++ b/source/sxae/Editor.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Editor.h" #include <Commdlg.h> diff --git a/source/sxae/Editor.h b/source/sxae/Editor.h index 0d35632ba..af22a8989 100644 --- a/source/sxae/Editor.h +++ b/source/sxae/Editor.h @@ -1,5 +1,11 @@ -#ifndef Editor_H -#define Editor_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __EDITOR_H +#define __EDITOR_H #define MAINWIN_SIZE_X 1320 #define MAINWIN_SIZE_Y 730 diff --git a/source/sxae/EditorTab.cpp b/source/sxae/EditorTab.cpp index 3108af6ed..f06f57d95 100644 --- a/source/sxae/EditorTab.cpp +++ b/source/sxae/EditorTab.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "EditorTab.h" EditorTab::EditorTab(TabManager * tm): diff --git a/source/sxae/EditorTab.h b/source/sxae/EditorTab.h index 099d26097..7a0867d13 100644 --- a/source/sxae/EditorTab.h +++ b/source/sxae/EditorTab.h @@ -1,5 +1,11 @@ -#ifndef EditorTab_H -#define EditorTab_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __EDITOR_TAB_H +#define __EDITOR_TAB_H #include "TabManager.h" #include <SXGUIWinApi/sxgui.h> diff --git a/source/sxae/TabActivities.cpp b/source/sxae/TabActivities.cpp index 14f35dad1..2c14f5173 100644 --- a/source/sxae/TabActivities.cpp +++ b/source/sxae/TabActivities.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabActivities.h" #include "Tools.h" diff --git a/source/sxae/TabActivities.h b/source/sxae/TabActivities.h index 5a5e8a034..533cf4931 100644 --- a/source/sxae/TabActivities.h +++ b/source/sxae/TabActivities.h @@ -1,5 +1,11 @@ -#ifndef TabActivities_H -#define TabActivities_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_ACTIVITIES_H +#define __TAB_ACTIVITIES_H #include "EditorTab.h" #include <anim/animated.h> diff --git a/source/sxae/TabAnimation.cpp b/source/sxae/TabAnimation.cpp index 1fdfacf2e..6e81dbe42 100644 --- a/source/sxae/TabAnimation.cpp +++ b/source/sxae/TabAnimation.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabAnimation.h" TabAnimation::TabAnimation(TabManager * tm):EditorTab(tm) diff --git a/source/sxae/TabAnimation.h b/source/sxae/TabAnimation.h index c586570d7..4c8bf8b9f 100644 --- a/source/sxae/TabAnimation.h +++ b/source/sxae/TabAnimation.h @@ -1,5 +1,11 @@ -#ifndef TabAnimation_H -#define TabAnimation_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_ANIMATION_H +#define __TAB_ANIMATION_H #include "EditorTab.h" diff --git a/source/sxae/TabAttachments.cpp b/source/sxae/TabAttachments.cpp index e80cd0315..dea3e7e8a 100644 --- a/source/sxae/TabAttachments.cpp +++ b/source/sxae/TabAttachments.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabAttachments.h" TabAttachments::TabAttachments(TabManager * tm):EditorTab(tm) diff --git a/source/sxae/TabAttachments.h b/source/sxae/TabAttachments.h index 8c6893829..4b38e0e89 100644 --- a/source/sxae/TabAttachments.h +++ b/source/sxae/TabAttachments.h @@ -1,5 +1,11 @@ -#ifndef TabAttachments_H -#define TabAttachments_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_ATTACHMENTS_H +#define __TAB_ATTACHMENTS_H #include "EditorTab.h" diff --git a/source/sxae/TabControllers.cpp b/source/sxae/TabControllers.cpp index 7e231b403..9b9db41cb 100644 --- a/source/sxae/TabControllers.cpp +++ b/source/sxae/TabControllers.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabControllers.h" TabControllers::TabControllers(TabManager * tm):EditorTab(tm) diff --git a/source/sxae/TabControllers.h b/source/sxae/TabControllers.h index 87c9ec49f..c39e20361 100644 --- a/source/sxae/TabControllers.h +++ b/source/sxae/TabControllers.h @@ -1,5 +1,11 @@ -#ifndef TabControllers_H -#define TabControllers_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_CONTROLLERS_H +#define __TAB_CONTROLLERS_H #include "EditorTab.h" diff --git a/source/sxae/TabFiles.cpp b/source/sxae/TabFiles.cpp index 3eec45e5e..c7d81059f 100644 --- a/source/sxae/TabFiles.cpp +++ b/source/sxae/TabFiles.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabFiles.h" TabFiles::TabFiles(TabManager * tm):EditorTab(tm) diff --git a/source/sxae/TabFiles.h b/source/sxae/TabFiles.h index 11b06cc04..7f91b8aa6 100644 --- a/source/sxae/TabFiles.h +++ b/source/sxae/TabFiles.h @@ -1,5 +1,11 @@ -#ifndef TabFiles_H -#define TabFiles_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_FILES_H +#define __TAB_FILES_H #include "EditorTab.h" diff --git a/source/sxae/TabHitboxes.cpp b/source/sxae/TabHitboxes.cpp index 483952f5e..36742fba6 100644 --- a/source/sxae/TabHitboxes.cpp +++ b/source/sxae/TabHitboxes.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabHitboxes.h" #include <anim/ModelFile.h> diff --git a/source/sxae/TabHitboxes.h b/source/sxae/TabHitboxes.h index edb55fd70..e62bc8406 100644 --- a/source/sxae/TabHitboxes.h +++ b/source/sxae/TabHitboxes.h @@ -1,5 +1,11 @@ -#ifndef TabHitboxes_H -#define TabHitboxes_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_HITBOXES_H +#define __TAB_HITBOXES_H #include "EditorTab.h" diff --git a/source/sxae/TabManager.cpp b/source/sxae/TabManager.cpp index 854b0486f..f4fb71bd5 100644 --- a/source/sxae/TabManager.cpp +++ b/source/sxae/TabManager.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabManager.h" #include "TabAttachments.h" diff --git a/source/sxae/TabManager.h b/source/sxae/TabManager.h index ad081be7b..aa2a181ec 100644 --- a/source/sxae/TabManager.h +++ b/source/sxae/TabManager.h @@ -1,5 +1,11 @@ -#ifndef TabManager_H -#define TabManager_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_MANAGER_H +#define __TAB_MANAGER_H class EditorTab; struct ISXGUIBaseWnd; diff --git a/source/sxae/TabSkins.cpp b/source/sxae/TabSkins.cpp index 909ac472e..adce7dc62 100644 --- a/source/sxae/TabSkins.cpp +++ b/source/sxae/TabSkins.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "TabSkins.h" TabSkins::TabSkins(TabManager * tm):EditorTab(tm) diff --git a/source/sxae/TabSkins.h b/source/sxae/TabSkins.h index 525ab5022..d014dab21 100644 --- a/source/sxae/TabSkins.h +++ b/source/sxae/TabSkins.h @@ -1,5 +1,11 @@ -#ifndef TabSkins_H -#define TabSkins_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TAB_SKINS_H +#define __TAB_SKINS_H #include "EditorTab.h" diff --git a/source/sxae/Tools.cpp b/source/sxae/Tools.cpp index f77748f40..a8f2b91a0 100644 --- a/source/sxae/Tools.cpp +++ b/source/sxae/Tools.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "Tools.h" #include <windows.h> diff --git a/source/sxae/Tools.h b/source/sxae/Tools.h index 532ec9f6e..4bcd416a9 100644 --- a/source/sxae/Tools.h +++ b/source/sxae/Tools.h @@ -1,5 +1,11 @@ -#ifndef Tools_H -#define Tools_H + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __TOOLS_H +#define __TOOLS_H #include <Windows.h> diff --git a/source/sxae/main.cpp b/source/sxae/main.cpp index 787d074c7..b66a0be94 100644 --- a/source/sxae/main.cpp +++ b/source/sxae/main.cpp @@ -1,4 +1,9 @@ +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + //#define WIN32_LEAN_AND_MEAN #include <Windows.h> diff --git a/source/sxae/ui.cpp b/source/sxae/ui.cpp index 1bb57846b..5a9ced1aa 100644 --- a/source/sxae/ui.cpp +++ b/source/sxae/ui.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + //include the header file and the lib file #include <SXGUIWinApi/sxguielements.h> diff --git a/source/sxconsole/ColorPrint.cpp b/source/sxconsole/ColorPrint.cpp index b1c775c7a..c0cf50734 100644 --- a/source/sxconsole/ColorPrint.cpp +++ b/source/sxconsole/ColorPrint.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include "ColorPrint.h" diff --git a/source/sxconsole/ColorPrint.h b/source/sxconsole/ColorPrint.h index bc5e0f7dc..32864f68e 100644 --- a/source/sxconsole/ColorPrint.h +++ b/source/sxconsole/ColorPrint.h @@ -1,5 +1,11 @@ -#ifndef _ColorPrint_H_ -#define _ColorPrint_H_ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __COLOR_PRINT_H +#define __COLOR_PRINT_H #include <windows.h> diff --git a/source/sxconsole/sxconsole.cpp b/source/sxconsole/sxconsole.cpp index 7f4956198..61c8b6670 100644 --- a/source/sxconsole/sxconsole.cpp +++ b/source/sxconsole/sxconsole.cpp @@ -1,3 +1,9 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + #include <stdio.h> #include <stdlib.h> -- GitLab