diff --git a/build/gamesource/levels/stalker_atp/stalker_atp.ent b/build/gamesource/levels/stalker_atp/stalker_atp.ent index 155794ca1da9e55d6c44d929d0ad464a56184712..25103e01dd44ee7a289ca3e66f8b067b2fcfbc87 100644 --- a/build/gamesource/levels/stalker_atp/stalker_atp.ent +++ b/build/gamesource/levels/stalker_atp/stalker_atp.ent @@ -266,6 +266,7 @@ rotation = 0.000000 0.980603 0.000000 -0.196004 team = 0 [ent_21] +skin = 0 OnTouchStart = OnTouchEndAll = OnTouchEnd = diff --git a/build/gamesource/levels/stalker_atp/stalker_atp.lvl b/build/gamesource/levels/stalker_atp/stalker_atp.lvl index 6d983de410865d9dc8f665cf68ff40ba479ccf28..f06861b40e476d411c925b76ae1c11a5f25acde8 100644 --- a/build/gamesource/levels/stalker_atp/stalker_atp.lvl +++ b/build/gamesource/levels/stalker_atp/stalker_atp.lvl @@ -1,6 +1,5 @@ [level] geometry = stalker_atp.geom ---green = stalker_atp.green type = outdoor entity = stalker_atp.ent aigrid = stalker_atp.aigrid diff --git a/build/gamesource/levels/stalker_atp/stalker_atp.phy b/build/gamesource/levels/stalker_atp/stalker_atp.phy index 642b5466b216877e12e6452b14c63c513d5825d8..b79cd15a4c5c90330d6e99efdcd53a2b8c105df0 100644 Binary files a/build/gamesource/levels/stalker_atp/stalker_atp.phy and b/build/gamesource/levels/stalker_atp/stalker_atp.phy differ diff --git a/build/gamesource/levels/stalker_atp/stalker_atp.phym b/build/gamesource/levels/stalker_atp/stalker_atp.phym index c098a3a15f425bb3b8643e497b45786d80cfda12..c8315b1d84efe4bf28b6b4507a4c0b072b067115 100644 Binary files a/build/gamesource/levels/stalker_atp/stalker_atp.phym and b/build/gamesource/levels/stalker_atp/stalker_atp.phym differ diff --git a/proj/SkyXEngine/vs2013/SkyXEngine.sln b/proj/SkyXEngine/vs2013/SkyXEngine.sln index 2b2acaea1e1c73cbfe800a9f58525b52cd3f2131..23b8350cc184c2b0556ea002c8d91aa7ee1c8c37 100644 --- a/proj/SkyXEngine/vs2013/SkyXEngine.sln +++ b/proj/SkyXEngine/vs2013/SkyXEngine.sln @@ -20,6 +20,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SkyXEngine", "SkyXEngine.vc {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} + {8144D5F8-07D0-4663-AAAE-11053614FAC5} = {8144D5F8-07D0-4663-AAAE-11053614FAC5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxcore", "..\..\sxcore\vs2013\sxcore.vcxproj", "{C1C1F046-C839-4602-AF70-923CDD237C1B}" @@ -41,11 +42,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxinput", "..\..\sxinput\vs {C1C1F046-C839-4602-AF70-923CDD237C1B} = {C1C1F046-C839-4602-AF70-923CDD237C1B} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxmtllight", "..\..\sxmtllight\vs2013\sxmtllight.vcxproj", "{2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}" - ProjectSection(ProjectDependencies) = postProject - {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {AEECC2DB-C7C7-4089-9262-A69794DF834D} - EndProjectSection -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxpp", "..\..\sxpp\vs2013\sxpp.vcxproj", "{BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE}" ProjectSection(ProjectDependencies) = postProject {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {AEECC2DB-C7C7-4089-9262-A69794DF834D} @@ -98,6 +94,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxphysics", "..\..\sxphysic {E74F00B5-7DC5-DC48-8E91-D1C2296F455F} = {E74F00B5-7DC5-DC48-8E91-D1C2296F455F} {0C7E3DB7-005F-41E9-A570-868BCF959E91} = {0C7E3DB7-005F-41E9-A570-868BCF959E91} {072A60D2-317A-CC41-AD12-7E381235064A} = {072A60D2-317A-CC41-AD12-7E381235064A} + {8144D5F8-07D0-4663-AAAE-11053614FAC5} = {8144D5F8-07D0-4663-AAAE-11053614FAC5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletDynamics", "..\..\..\sdks\bullet3\build3\vs2010\BulletDynamics.vcxproj", "{072A60D2-317A-CC41-AD12-7E381235064A}" @@ -140,6 +137,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxgame", "..\..\sxgame\vs20 {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} + {8144D5F8-07D0-4663-AAAE-11053614FAC5} = {8144D5F8-07D0-4663-AAAE-11053614FAC5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxdecals", "..\..\sxdecals\vs2013\sxdecals.vcxproj", "{B9656841-7734-4D0B-8619-1BED5E2ED7AE}" @@ -147,6 +145,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxdecals", "..\..\sxdecals\ {7C0C8205-BDD3-44A3-AA3A-7855C7EFC88E} = {7C0C8205-BDD3-44A3-AA3A-7855C7EFC88E} {C1C1F046-C839-4602-AF70-923CDD237C1B} = {C1C1F046-C839-4602-AF70-923CDD237C1B} {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {AEECC2DB-C7C7-4089-9262-A69794DF834D} + {8144D5F8-07D0-4663-AAAE-11053614FAC5} = {8144D5F8-07D0-4663-AAAE-11053614FAC5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxparticleseditor", "..\..\sxparticleseditor\vs2013\sxparticleseditor.vcxproj", "{B66C63CA-62E0-472F-9D24-070CAC7C8B12}" @@ -177,6 +176,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxrender", "..\..\sxrender\ {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} + {8144D5F8-07D0-4663-AAAE-11053614FAC5} = {8144D5F8-07D0-4663-AAAE-11053614FAC5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxgenpreview", "..\..\sxgenpreview\vs2013\sxgenpreview.vcxproj", "{D381001E-C1FF-415F-A269-5264AD9013D5}" @@ -190,6 +190,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "freetype-2.6", "freetype-2. EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "..\..\..\sdks\freetype-2.6\builds\windows\vc2013\freetype.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxmtrl", "..\..\sxmtrl\vs2013\sxmtrl.vcxproj", "{8144D5F8-07D0-4663-AAAE-11053614FAC5}" + ProjectSection(ProjectDependencies) = postProject + {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {AEECC2DB-C7C7-4089-9262-A69794DF834D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxlight", "..\..\sxlight\vs2013\sxlight.vcxproj", "{2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug Multithreaded|Win32 = Debug Multithreaded|Win32 @@ -313,27 +320,6 @@ Global {3A5449A3-DCE7-4557-9C9F-DEEAFBAAC763}.Release|Win32.ActiveCfg = Release|Win32 {3A5449A3-DCE7-4557-9C9F-DEEAFBAAC763}.Release|Win32.Build.0 = Release|Win32 {3A5449A3-DCE7-4557-9C9F-DEEAFBAAC763}.Release|x64.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Multithreaded|Win32.ActiveCfg = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Multithreaded|Win32.Build.0 = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Multithreaded|x64.ActiveCfg = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Singlethreaded|Win32.ActiveCfg = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Singlethreaded|Win32.Build.0 = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Singlethreaded|x64.ActiveCfg = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug|Win32.ActiveCfg = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug|Win32.Build.0 = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug|x64.ActiveCfg = Debug|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Multithreaded|Win32.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Multithreaded|Win32.Build.0 = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Multithreaded|x64.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Singlethreaded|Win32.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Singlethreaded|Win32.Build.0 = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Singlethreaded|x64.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release SM16|Win32.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release SM16|Win32.Build.0 = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release SM16|x64.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release|Win32.ActiveCfg = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release|Win32.Build.0 = Release|Win32 - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release|x64.ActiveCfg = Release|Win32 {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE}.Debug Multithreaded|Win32.ActiveCfg = Debug|Win32 {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE}.Debug Multithreaded|Win32.Build.0 = Debug|Win32 {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE}.Debug Multithreaded|x64.ActiveCfg = Debug|Win32 @@ -1097,6 +1083,48 @@ Global {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug Multithreaded|Win32.ActiveCfg = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug Multithreaded|Win32.Build.0 = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug Multithreaded|x64.ActiveCfg = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug Singlethreaded|Win32.ActiveCfg = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug Singlethreaded|Win32.Build.0 = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug Singlethreaded|x64.ActiveCfg = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug|Win32.ActiveCfg = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug|Win32.Build.0 = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Debug|x64.ActiveCfg = Debug|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release Multithreaded|Win32.ActiveCfg = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release Multithreaded|Win32.Build.0 = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release Multithreaded|x64.ActiveCfg = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release Singlethreaded|Win32.ActiveCfg = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release Singlethreaded|Win32.Build.0 = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release Singlethreaded|x64.ActiveCfg = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release SM16|Win32.ActiveCfg = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release SM16|Win32.Build.0 = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release SM16|x64.ActiveCfg = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release|Win32.ActiveCfg = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release|Win32.Build.0 = Release|Win32 + {8144D5F8-07D0-4663-AAAE-11053614FAC5}.Release|x64.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Multithreaded|Win32.ActiveCfg = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Multithreaded|Win32.Build.0 = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Multithreaded|x64.ActiveCfg = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Singlethreaded|Win32.ActiveCfg = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Singlethreaded|Win32.Build.0 = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug Singlethreaded|x64.ActiveCfg = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug|Win32.ActiveCfg = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug|Win32.Build.0 = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Debug|x64.ActiveCfg = Debug|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Multithreaded|Win32.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Multithreaded|Win32.Build.0 = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Multithreaded|x64.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Singlethreaded|Win32.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Singlethreaded|Win32.Build.0 = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release Singlethreaded|x64.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release SM16|Win32.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release SM16|Win32.Build.0 = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release SM16|x64.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release|Win32.ActiveCfg = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release|Win32.Build.0 = Release|Win32 + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1106,7 +1134,6 @@ Global {AEECC2DB-C7C7-4089-9262-A69794DF834D} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {0C7E3DB7-005F-41E9-A570-868BCF959E91} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {3A5449A3-DCE7-4557-9C9F-DEEAFBAAC763} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} - {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {BA779DCC-93C8-4FB7-BBB9-A7D2F76C35DE} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {0292BE32-298E-4E18-BC42-5A39F9487EBA} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {709D8A7A-D3E0-4070-A493-EFDF7A8E9D73} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} @@ -1122,6 +1149,8 @@ Global {7F0ACED1-6E16-4DD3-800E-0C50150897C2} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {8AA0585B-D6E4-46B4-9183-3BACD5B9D47F} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {2D039A6D-B874-4AA7-8F89-E86DD70B21ED} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} + {8144D5F8-07D0-4663-AAAE-11053614FAC5} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} + {2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D} = {13D5622C-8643-4BD8-A730-B5C919DAFDDC} {6A3341BF-710B-4310-A7F8-810040D698DC} = {5128FBE9-1706-4255-B422-4A652320085E} {AFBF200A-9260-4469-AE64-DCB42C796DD6} = {5128FBE9-1706-4255-B422-4A652320085E} {A2B9EACA-69C1-4E9D-AF3C-704608DB57DE} = {5128FBE9-1706-4255-B422-4A652320085E} diff --git a/proj/sxgcore/vs2013/sxgcore.vcxproj b/proj/sxgcore/vs2013/sxgcore.vcxproj index 75c7b89c332148c000135b1fdb47ee959f8d31e4..8651a9846f724545a85cf83569ac69afc21ade2d 100644 --- a/proj/sxgcore/vs2013/sxgcore.vcxproj +++ b/proj/sxgcore/vs2013/sxgcore.vcxproj @@ -108,12 +108,15 @@ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> </ClCompile> + <ClCompile Include="..\..\..\source\gcore\gcore_data.cpp" /> + <ClCompile Include="..\..\..\source\gcore\gcore_utils.cpp" /> <ClCompile Include="..\..\..\source\gcore\GeomOptimize.cpp" /> <ClCompile Include="..\..\..\source\gcore\LoaderTextures.cpp"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> </ClCompile> <ClCompile Include="..\..\..\source\gcore\loader_static.cpp" /> + <ClCompile Include="..\..\..\source\gcore\oc.cpp" /> <ClCompile Include="..\..\..\source\gcore\shader.cpp"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> @@ -135,10 +138,13 @@ <ClInclude Include="..\..\..\source\gcore\bound.h" /> <ClInclude Include="..\..\..\source\gcore\camera.h" /> <ClInclude Include="..\..\..\source\gcore\creatortextures.h" /> + <ClInclude Include="..\..\..\source\gcore\gcore_data.h" /> + <ClInclude Include="..\..\..\source\gcore\gcore_utils.h" /> <ClInclude Include="..\..\..\source\gcore\GeomOptimize.h" /> <ClInclude Include="..\..\..\source\gcore\LoaderTextures.h" /> <ClInclude Include="..\..\..\source\gcore\loader_static.h" /> <ClInclude Include="..\..\..\source\gcore\ModelFile.h" /> + <ClInclude Include="..\..\..\source\gcore\oc.h" /> <ClInclude Include="..\..\..\source\gcore\shader.h" /> <ClInclude Include="..\..\..\source\gcore\sky.h" /> <ClInclude Include="..\..\..\source\gcore\sxgcore.h" /> diff --git a/proj/sxgcore/vs2013/sxgcore.vcxproj.filters b/proj/sxgcore/vs2013/sxgcore.vcxproj.filters index 36cfc4945d92bdeac9c628ef69a25010247a1c0e..1258050140cadf9a02145ef897858bbba72a2f99 100644 --- a/proj/sxgcore/vs2013/sxgcore.vcxproj.filters +++ b/proj/sxgcore/vs2013/sxgcore.vcxproj.filters @@ -40,6 +40,15 @@ <ClCompile Include="..\..\..\source\common\string_utils.cpp"> <Filter>Source</Filter> </ClCompile> + <ClCompile Include="..\..\..\source\gcore\oc.cpp"> + <Filter>Source</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\gcore\gcore_utils.cpp"> + <Filter>Source</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\gcore\gcore_data.cpp"> + <Filter>Source</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <Filter Include="Source"> @@ -89,5 +98,14 @@ <ClInclude Include="..\..\..\source\common\string_utils.h"> <Filter>Header</Filter> </ClInclude> + <ClInclude Include="..\..\..\source\gcore\oc.h"> + <Filter>Header</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\gcore\gcore_utils.h"> + <Filter>Header</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\gcore\gcore_data.h"> + <Filter>Header</Filter> + </ClInclude> </ItemGroup> </Project> \ No newline at end of file diff --git a/proj/sxgui/vs2013/sxgui.vcxproj b/proj/sxgui/vs2013/sxgui.vcxproj index ef452e6e9ddae0ff1683b9a771c349e3dd0a5341..0b564287181a4cc7b1b80d088fbd2e81bb89f736 100644 --- a/proj/sxgui/vs2013/sxgui.vcxproj +++ b/proj/sxgui/vs2013/sxgui.vcxproj @@ -68,6 +68,7 @@ </IgnoreSpecificDefaultLibraries> <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> <Profile>true</Profile> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> </Link> <Lib> <OutputFile>$(OutDir)$(TargetName)d$(TargetExt)</OutputFile> diff --git a/proj/sxmtllight/vs2013/sxmtllight.sln b/proj/sxlight/vs2013/sxlight.sln similarity index 86% rename from proj/sxmtllight/vs2013/sxmtllight.sln rename to proj/sxlight/vs2013/sxlight.sln index 766634348aa27f7a15af2b1a95edd75346097e14..9679e4bb20b5d07de99250b81cfc843afc8d2989 100644 --- a/proj/sxmtllight/vs2013/sxmtllight.sln +++ b/proj/sxlight/vs2013/sxlight.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxmtllight", "sxmtllight.vcxproj", "{2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sxlight", "sxlight.vcxproj", "{2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/proj/sxmtllight/vs2013/sxmtllight.vcxproj b/proj/sxlight/vs2013/sxlight.vcxproj similarity index 79% rename from proj/sxmtllight/vs2013/sxmtllight.vcxproj rename to proj/sxlight/vs2013/sxlight.vcxproj index 5007ecf9bee20d1cea8b811a8b8eef1593ea0363..40321617421b17999aa5fa9ec8615c9ed1fee0b4 100644 --- a/proj/sxmtllight/vs2013/sxmtllight.vcxproj +++ b/proj/sxlight/vs2013/sxlight.vcxproj @@ -13,7 +13,8 @@ <PropertyGroup Label="Globals"> <ProjectGuid>{2B3BA583-D5EC-4DC2-91CF-42B1C7ADFD9D}</ProjectGuid> <Keyword>Win32Proj</Keyword> - <RootNamespace>sxmtllight</RootNamespace> + <RootNamespace>sxlight</RootNamespace> + <ProjectName>sxlight</ProjectName> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> @@ -60,7 +61,7 @@ </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXMTLLIGHT_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="MTLLIGHT"</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXLIGHT_EXPORTS;SX_DLL;%(PreprocessorDefinitions);SX_LIB_NAME="LIGHT"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <TreatSpecificWarningsAsErrors>4316</TreatSpecificWarningsAsErrors> @@ -81,7 +82,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXMTLLIGHT_EXPORTS;SX_EXE;%(PreprocessorDefinitions);SX_LIB_NAME="MTLLIGHT"</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXLIGHT_EXPORTS;SX_EXE;%(PreprocessorDefinitions);SX_LIB_NAME="LIGHT"</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <TreatSpecificWarningsAsErrors>4316</TreatSpecificWarningsAsErrors> </ClCompile> @@ -98,42 +99,32 @@ <ClCompile Include="..\..\..\source\common\file_utils.cpp" /> <ClCompile Include="..\..\..\source\common\string.cpp" /> <ClCompile Include="..\..\..\source\common\string_utils.cpp" /> - <ClCompile Include="..\..\..\source\mtllight\light.cpp"> + <ClCompile Include="..\..\..\source\light\light.cpp"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\material.cpp"> + <ClCompile Include="..\..\..\source\light\ml_data.cpp"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\ml_data.cpp"> + <ClCompile Include="..\..\..\source\light\shadow.cpp"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\reflection.cpp"> + <ClCompile Include="..\..\..\source\light\sxlight.cpp"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\shadow.cpp"> - <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> - <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\sxmtllight.cpp"> - <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild> - <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\sxmtllight_dll.cpp" /> + <ClCompile Include="..\..\..\source\light\sxlight_dll.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\source\common\file_utils.h" /> <ClInclude Include="..\..\..\source\common\string.h" /> <ClInclude Include="..\..\..\source\common\string_utils.h" /> - <ClInclude Include="..\..\..\source\mtllight\light.h" /> - <ClInclude Include="..\..\..\source\mtllight\material.h" /> - <ClInclude Include="..\..\..\source\mtllight\ml_data.h" /> - <ClInclude Include="..\..\..\source\mtllight\reflection.h" /> - <ClInclude Include="..\..\..\source\mtllight\shadow.h" /> - <ClInclude Include="..\..\..\source\mtllight\sxmtllight.h" /> + <ClInclude Include="..\..\..\source\light\light.h" /> + <ClInclude Include="..\..\..\source\light\ml_data.h" /> + <ClInclude Include="..\..\..\source\light\shadow.h" /> + <ClInclude Include="..\..\..\source\light\sxlight.h" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> diff --git a/proj/sxmtllight/vs2013/sxmtllight.vcxproj.filters b/proj/sxlight/vs2013/sxlight.vcxproj.filters similarity index 61% rename from proj/sxmtllight/vs2013/sxmtllight.vcxproj.filters rename to proj/sxlight/vs2013/sxlight.vcxproj.filters index 4990307c104a7da2d9c51939f38654e07ea7ab7f..14e398cee7514767418a2149ad0c1a58493cb31e 100644 --- a/proj/sxmtllight/vs2013/sxmtllight.vcxproj.filters +++ b/proj/sxlight/vs2013/sxlight.vcxproj.filters @@ -1,23 +1,16 @@ <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> - <ClCompile Include="..\..\..\source\mtllight\sxmtllight_dll.cpp" /> - <ClCompile Include="..\..\..\source\mtllight\ml_data.cpp"> + <ClCompile Include="..\..\..\source\light\ml_data.cpp"> <Filter>Source</Filter> </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\reflection.cpp"> + <ClCompile Include="..\..\..\source\light\shadow.cpp"> <Filter>Source</Filter> </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\shadow.cpp"> + <ClCompile Include="..\..\..\source\light\sxlight.cpp"> <Filter>Source</Filter> </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\sxmtllight.cpp"> - <Filter>Source</Filter> - </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\light.cpp"> - <Filter>Source</Filter> - </ClCompile> - <ClCompile Include="..\..\..\source\mtllight\material.cpp"> + <ClCompile Include="..\..\..\source\light\light.cpp"> <Filter>Source</Filter> </ClCompile> <ClCompile Include="..\..\..\source\common\string.cpp"> @@ -29,6 +22,9 @@ <ClCompile Include="..\..\..\source\common\string_utils.cpp"> <Filter>Source</Filter> </ClCompile> + <ClCompile Include="..\..\..\source\light\sxlight_dll.cpp"> + <Filter>Source</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <Filter Include="Source"> @@ -39,22 +35,16 @@ </Filter> </ItemGroup> <ItemGroup> - <ClInclude Include="..\..\..\source\mtllight\reflection.h"> - <Filter>Headers</Filter> - </ClInclude> - <ClInclude Include="..\..\..\source\mtllight\shadow.h"> - <Filter>Headers</Filter> - </ClInclude> - <ClInclude Include="..\..\..\source\mtllight\sxmtllight.h"> + <ClInclude Include="..\..\..\source\light\shadow.h"> <Filter>Headers</Filter> </ClInclude> - <ClInclude Include="..\..\..\source\mtllight\light.h"> + <ClInclude Include="..\..\..\source\light\sxlight.h"> <Filter>Headers</Filter> </ClInclude> - <ClInclude Include="..\..\..\source\mtllight\material.h"> + <ClInclude Include="..\..\..\source\light\light.h"> <Filter>Headers</Filter> </ClInclude> - <ClInclude Include="..\..\..\source\mtllight\ml_data.h"> + <ClInclude Include="..\..\..\source\light\ml_data.h"> <Filter>Headers</Filter> </ClInclude> <ClInclude Include="..\..\..\source\common\string.h"> diff --git a/proj/sxmtrl/vs2013/sxmtrl.vcxproj b/proj/sxmtrl/vs2013/sxmtrl.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..5a9838a5a7f32fd9c3369e334209562eb13a1474 --- /dev/null +++ b/proj/sxmtrl/vs2013/sxmtrl.vcxproj @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{8144D5F8-07D0-4663-AAAE-11053614FAC5}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sxmtrl</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v120_xp</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v120_xp</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>../../../build/</OutDir> + <TargetName>$(ProjectName)_d</TargetName> + <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> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>../../../build/</OutDir> + <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> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level1</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SXMTRL_EXPORTS;SX_LIB_NAME="LIGHT";%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> + <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level1</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SXMTRL_EXPORTS;SX_LIB_NAME="LIGHT";%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <ProgramDatabaseFile>$(ProjectDir)$(TargetName).pdb</ProgramDatabaseFile> + <ImportLibrary>../../../libs/$(TargetName).lib</ImportLibrary> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\source\common\file_utils.cpp" /> + <ClCompile Include="..\..\..\source\common\string.cpp" /> + <ClCompile Include="..\..\..\source\common\string_utils.cpp" /> + <ClCompile Include="..\..\..\source\mtrl\material.cpp" /> + <ClCompile Include="..\..\..\source\mtrl\ml_data.cpp" /> + <ClCompile Include="..\..\..\source\mtrl\reflection.cpp" /> + <ClCompile Include="..\..\..\source\mtrl\sxmtrl.cpp" /> + <ClCompile Include="..\..\..\source\mtrl\sxmtrl_dll.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\source\common\file_utils.h" /> + <ClInclude Include="..\..\..\source\common\string.h" /> + <ClInclude Include="..\..\..\source\common\string_utils.h" /> + <ClInclude Include="..\..\..\source\mtrl\material.h" /> + <ClInclude Include="..\..\..\source\mtrl\ml_data.h" /> + <ClInclude Include="..\..\..\source\mtrl\reflection.h" /> + <ClInclude Include="..\..\..\source\mtrl\sxmtrl.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/proj/sxmtrl/vs2013/sxmtrl.vcxproj.filters b/proj/sxmtrl/vs2013/sxmtrl.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..95a3241c2266b3485dcfbdb6fb6549143d025a1a --- /dev/null +++ b/proj/sxmtrl/vs2013/sxmtrl.vcxproj.filters @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\source\mtrl\sxmtrl_dll.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\mtrl\sxmtrl.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\mtrl\reflection.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\mtrl\material.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\mtrl\ml_data.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\common\file_utils.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\common\string.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\source\common\string_utils.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\source\mtrl\sxmtrl.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\mtrl\reflection.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\mtrl\material.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\mtrl\ml_data.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\common\string_utils.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\common\file_utils.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\source\common\string.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/CL.read.1.tlog b/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/CL.read.1.tlog deleted file mode 100644 index 21ad67b7f01edf6208209b2214e1f95aca02589c..0000000000000000000000000000000000000000 Binary files a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/CL.read.1.tlog and /dev/null differ diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/Lib-link.read.1.tlog b/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/Lib-link.read.1.tlog deleted file mode 100644 index 196a4fcb4d469df26a8779d9f8cb52dce1e26fca..0000000000000000000000000000000000000000 Binary files a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/Lib-link.read.1.tlog and /dev/null differ diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/Lib-link.write.1.tlog b/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/Lib-link.write.1.tlog deleted file mode 100644 index 5eb96e361355e475c1fac75e8ebd31ad19545eae..0000000000000000000000000000000000000000 Binary files a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/Lib-link.write.1.tlog and /dev/null differ diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/cl.command.1.tlog b/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/cl.command.1.tlog deleted file mode 100644 index 20f668b75be63d882179c2ceb73c99bf4c8a1e98..0000000000000000000000000000000000000000 Binary files a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/cl.command.1.tlog and /dev/null differ diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/cl.write.1.tlog b/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/cl.write.1.tlog deleted file mode 100644 index 546b9a4abfbd0fea1eab53008c20e64ab18488b6..0000000000000000000000000000000000000000 Binary files a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/cl.write.1.tlog and /dev/null differ diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/freetype.lastbuildstate b/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/freetype.lastbuildstate deleted file mode 100644 index e34b30b699a2e161b2278900cd8c630bcb963d6b..0000000000000000000000000000000000000000 --- a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/freetype.lastbuildstate +++ /dev/null @@ -1,2 +0,0 @@ -#TargetFrameworkVersion=v4.0:PlatformToolSet=v120:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit -Release Multithreaded|Win32|C:\DSe\DSe\| diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/lib.command.1.tlog b/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/lib.command.1.tlog deleted file mode 100644 index 2a6469042d9a25e10ed2ba6f780dde4586801a65..0000000000000000000000000000000000000000 Binary files a/sdks/freetype-2.6/objs/vc2010/Win32/Release Multithreaded/freetype.tlog/lib.command.1.tlog and /dev/null differ diff --git a/sdks/freetype-2.6/objs/vc2010/Win32/freetype26MT.lib b/sdks/freetype-2.6/objs/vc2010/Win32/freetype26MT.lib index 9067e68f26af99711fc2fb81295c2b77b8f472c4..a69f157ea5fc58470568e4752771406927e7d911 100644 Binary files a/sdks/freetype-2.6/objs/vc2010/Win32/freetype26MT.lib and b/sdks/freetype-2.6/objs/vc2010/Win32/freetype26MT.lib differ diff --git a/source/SkyXEngine.h b/source/SkyXEngine.h index d0e2556487dfa2a814281f2605c00b90ce1e07be..9df65aff224c4ffa8f6d31e8f496447735b27c36 100644 --- a/source/SkyXEngine.h +++ b/source/SkyXEngine.h @@ -96,7 +96,7 @@ HDR эффект присутсвует. Основной идеей предназначения служила и служит идея о том чтобы предоставляемый инструментарий мог полностью удовлетворять потребностям разработчика, без необходимости со стороны разработчика вникать в детали реализации, но чтобы этот инструментарий имел прозрачную, открытую, свободную, бесплатную лицензию, и разработчик мог спокойно податься в стихию сотворения своего мира. \n Также главенствовал принцип разделения функционала на логические блоки (библиотеки) и после окончания разработки очередного блока он бы выносился в dll (с глаз долой). Однако существенным дополнением являлась идея о том что библиотеки не должны ничего значть о равнозначных себе библиотеках в общей иерархии. -К примеру \ref sxgeom "библиотека статической геометрии и растительности" ничего не знает о \ref sxmtllight "библиотеке материалов", и последняя ничего не знает о первой, однако первая использует функции из второй посредством графического ядра, а вторая осуществляется настройку материалов перед рендером первой.\n +К примеру \ref sxgeom "библиотека статической геометрии и растительности" ничего не знает о \ref sxmtrl "библиотеке материалов", и последняя ничего не знает о первой, однако первая использует функции из второй посредством графического ядра, а вторая осуществляется настройку материалов перед рендером первой.\n Немаловажным моментом являлся ориентир на гибкость. К примеру \ref sxgcore_redefinition_func "переопредляемые функции" в графическом ядре, позволяют настроить на свой лад рендер. \n Ну и пожалуй самая главная идея заключается в полноценной возможности разработки игр с видом от первого лица, с настройкой/перестройкой "под себя" всего рендера. Также к приправе к этому мы руководствовались мыслью о том что скриптеры (коих не мало) могли бы вести разработку игры на своем (доступном им) уровне, со всеми возможностями движка. @@ -107,7 +107,8 @@ HDR эффект присутсвует. \-- \ref sxgcore\n \--- \ref sxgeom\n \--- \ref sxanim\n -\--- \ref sxmtllight\n +\--- \ref sxlight\n +\--- \ref sxmtrl\n \--- \ref sxpp\n \- \ref sxinput\n Все библиотеки представлены файлами dll, что позволяет разделить функционал и реализацию. Также в большинстве случаев библиотеки могут быть вычленены из самого движка и могут использоваться автономно.\n @@ -350,11 +351,18 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот #include <geom/sxgeom.h> #if defined(_DEBUG) -#pragma comment(lib, "sxmtllight_d.lib") +#pragma comment(lib, "sxlight_d.lib") #else -#pragma comment(lib, "sxmtllight.lib") +#pragma comment(lib, "sxlight.lib") #endif -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> + +#if defined(_DEBUG) +#pragma comment(lib, "sxmtrl_d.lib") +#else +#pragma comment(lib, "sxmtrl.lib") +#endif +#include <mtrl/sxmtrl.h> #if defined(_DEBUG) #pragma comment(lib, "sxparticles_d.lib") @@ -537,6 +545,9 @@ bool SkyXEngine_RFuncAIQuadPhyNavigate(float3_t * pos); //! просчет столкновения частицы с миром bool SkyXEngine_RFuncParticlesPhyCollision(const float3 * lastpos, const float3* nextpos, float3* coll_pos, float3* coll_nrm); +//! просчет столкновения растительности с миром при генерации +bool SkyXEngine_RFuncGreenIntersect(const float3 *pStart, const float3 *pFinish, float3 *pResult); + //!@} //########################################################################## diff --git a/source/SkyXEngine_Build/SkyXEngine_Build.cpp b/source/SkyXEngine_Build/SkyXEngine_Build.cpp index 3c90c1d1079251b92a006cb2cb686c379d0265fb..a98c689d2a8607f3931fe37583780e6277b41765 100644 --- a/source/SkyXEngine_Build/SkyXEngine_Build.cpp +++ b/source/SkyXEngine_Build/SkyXEngine_Build.cpp @@ -19,7 +19,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLin SGCore_SkyCloudsLoadTex("sky_oblaka.dds"); //SGCore_SkyCloudsSetWidthHeightPos(1000, 1000, &float3(0, 0, 0)); - SGCore_OC_SetEnable(false); + //SGCore_OC_SetEnable(false); //SLevel_Load("stalker_atp", true); //SLevel_Load("sga", true); diff --git a/source/common b/source/common index 87e35b5e73a14e15c89cb95b2ecba63951a247b0..a4dc88ffd0720991c2689b7b4209b96ee0e2c33e 160000 --- a/source/common +++ b/source/common @@ -1 +1 @@ -Subproject commit 87e35b5e73a14e15c89cb95b2ecba63951a247b0 +Subproject commit a4dc88ffd0720991c2689b7b4209b96ee0e2c33e diff --git a/source/decals/DecalManager.cpp b/source/decals/DecalManager.cpp index 281fdd004ff472e640d5364d95181bb75308de46..028c954211eef2f5aedfac7e8a83ea07106aad00 100644 --- a/source/decals/DecalManager.cpp +++ b/source/decals/DecalManager.cpp @@ -320,7 +320,7 @@ void DecalManager::shootDecal(DECAL_TYPE type, const float3 & position, ID iMate return; } - pTex = SGCore_LoadTexGetTex(SML_MtlGetTextureID(pMat)); + pTex = SGCore_LoadTexGetTex(SMtrl_MtlGetTextureID(pMat)); if(!pTex) { return; diff --git a/source/decals/sxdecals.h b/source/decals/sxdecals.h index a2690ff35d416c257847a3c809899d0fa6750109..42d34df52b481d121f7e1202d8bf2a3be32b1628 100644 --- a/source/decals/sxdecals.h +++ b/source/decals/sxdecals.h @@ -21,14 +21,14 @@ See the license in LICENSE #include <common/SXMath.h> #if defined(_DEBUG) -#pragma comment(lib, "sxmtllight_d.lib") +#pragma comment(lib, "sxmtrl_d.lib") #else -#pragma comment(lib, "sxmtllight.lib") +#pragma comment(lib, "sxmtrl.lib") #endif #undef SX_LIB_API #define SX_LIB_API extern "C" __declspec (dllimport) -#include <mtllight/sxmtllight.h> +#include <mtrl/sxmtrl.h> #ifdef SX_DLL #undef SX_LIB_API diff --git a/source/game/BaseAmmo.cpp b/source/game/BaseAmmo.cpp index c2fd013553b77d388090f95a7a83d12316761c0f..a673f144f6215f2fd7873a56c628913b11856be9 100644 --- a/source/game/BaseAmmo.cpp +++ b/source/game/BaseAmmo.cpp @@ -144,7 +144,7 @@ void CBaseAmmo::fire(const float3 &_vStart, const float3 &_vDir, CBaseCharacter ID idMtl = SXPhysics_GetMtlID(aHitPoints[i].pCollisionObject, &aHitPoints[i].shapeInfo); if(ID_VALID(idMtl) && !aHitPoints[i].isExit) { - float fHitChance = SML_MtlGetHitChance(idMtl); + float fHitChance = SMtrl_MtlGetHitChance(idMtl); if(fHitChance < randf(0.0f, 1.0f)) { int c = 0; @@ -271,7 +271,7 @@ void CBaseAmmo::shootDecal(const float3 &vPos, const float3 &vNormal, ID idMtl) { if(ID_VALID(idMtl)) { - MTLTYPE_PHYSIC type = SML_MtlGetPhysicMaterial(idMtl); + MTLTYPE_PHYSIC type = SMtrl_MtlGetPhysicMaterial(idMtl); DECAL_TYPE decalType = DECAL_TYPE_CONCRETE; switch(type) { @@ -330,8 +330,8 @@ bool CBaseAmmo::shouldRecochet(const float3 &vPos, const float3 &vNormal, const bool isNewSpeedSet = false; if(ID_VALID(idMtl)) { - fDurability = SML_MtlGetDurability(idMtl); // прочность - fDensity = SML_MtlGetDensity(idMtl); // плотность + fDurability = SMtrl_MtlGetDurability(idMtl); // прочность + fDensity = SMtrl_MtlGetDensity(idMtl); // плотность if(fDurability <= 0) { fDurability = 10; diff --git a/source/game/GameData.h b/source/game/GameData.h index 59e15389bdca492690e5af6167a4db76d034405e..22c58cb5e9184d43d2d2eaa6c15f836c07758301 100644 --- a/source/game/GameData.h +++ b/source/game/GameData.h @@ -10,7 +10,7 @@ See the license in LICENSE #include "Player.h" #include "crosshair.h" -#include <mtllight/sxmtllight.h> +#include <mtrl/sxmtrl.h> #include <gui/guimain.h> #include "HUDcontroller.h" #include "GameStateManager.h" diff --git a/source/game/LightDirectional.cpp b/source/game/LightDirectional.cpp index 4905d416a7bf092e0ac7c2c9d930c814292371f6..7b76a665d5be74e4cfdd933c48be34848c93537f 100644 --- a/source/game/LightDirectional.cpp +++ b/source/game/LightDirectional.cpp @@ -6,7 +6,7 @@ See the license in LICENSE #include "LightDirectional.h" -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> /*! \skydocent light_directional Направленный источник света @@ -46,7 +46,7 @@ BaseClass(pMgr) m_iShadowType = 1; m_fAngle = SM_PI * 0.4f; m_fRadiusTop = 0.01f; - m_idLight = SML_LigthsCreateDirection(&float3(0, 0, 0), m_fDist, &(float3)m_vColor, &SMQuaternion(-SM_PI, 'z'), m_fRadiusTop, m_fAngle, true); + m_idLight = SLight_CreateDirection(&float3(0, 0, 0), m_fDist, &(float3)m_vColor, &SMQuaternion(-SM_PI, 'z'), m_fRadiusTop, m_fAngle, true); m_isEnable = true; float3 f = LIGHTS_DIR_BASE; @@ -57,52 +57,52 @@ BaseClass(pMgr) CLightDirectional::~CLightDirectional() { - SML_LigthsDeleteLight(m_idLight); + SLight_DeleteLight(m_idLight); } void CLightDirectional::toggleEnable() { m_isEnable = !m_isEnable; - SML_LigthsSetEnable(m_idLight, m_isEnable); + SLight_SetEnable(m_idLight, m_isEnable); } void CLightDirectional::onSync() { BaseClass::onSync(); - if (SML_LigthsGetEnable(m_idLight) != m_isEnable) - SML_LigthsSetEnable(m_idLight, m_isEnable); + if (SLight_GetEnable(m_idLight) != m_isEnable) + SLight_SetEnable(m_idLight, m_isEnable); static float3 vec; - SML_LigthsGetPos(m_idLight, &vec, false); + SLight_GetPos(m_idLight, &vec, false); if (vec.x != m_vPosition.x || vec.y != m_vPosition.y || vec.z != m_vPosition.z) - SML_LigthsSetPos(m_idLight, &(float3)m_vPosition, false); + SLight_SetPos(m_idLight, &(float3)m_vPosition, false); - SML_LigthsSetColor(m_idLight, &(float3)m_vColor); + SLight_SetColor(m_idLight, &(float3)m_vColor); - if (SML_LigthsGetDist(m_idLight) != m_fDist) + if (SLight_GetDist(m_idLight) != m_fDist) { - SML_LigthsSetDist(m_idLight, m_fDist, true); + SLight_SetDist(m_idLight, m_fDist, true); m_fShadowDist = m_fDist; } - if (SML_LigthsGetShadowLocalFar(m_idLight) != m_fShadowDist) - SML_LigthsSetShadowLocalFar(m_idLight, m_fShadowDist); + if (SLight_GetShadowLocalFar(m_idLight) != m_fShadowDist) + SLight_SetShadowLocalFar(m_idLight, m_fShadowDist); - if (SML_LigthsGetTypeShadowed(m_idLight) != m_iShadowType) - SML_LigthsSetTypeShadowed(m_idLight, (LTYPE_SHADOW)m_iShadowType); + if (SLight_GetTypeShadowed(m_idLight) != m_iShadowType) + SLight_SetTypeShadowed(m_idLight, (LTYPE_SHADOW)m_iShadowType); static SMQuaternion curr_rot; - SML_LigthsGetOrient(m_idLight, &curr_rot); + SLight_GetOrient(m_idLight, &curr_rot); if (curr_rot.x != m_vOrientation.x || curr_rot.y != m_vOrientation.y || curr_rot.z != m_vOrientation.z || curr_rot.w != m_vOrientation.w) - SML_LigthsSetOrient(m_idLight, &m_vOrientation); + SLight_SetOrient(m_idLight, &m_vOrientation); - if (SML_LigthsGetAngle(m_idLight) != m_fAngle) - SML_LigthsSetAngle(m_idLight, m_fAngle); + if (SLight_GetAngle(m_idLight) != m_fAngle) + SLight_SetAngle(m_idLight, m_fAngle); - if (SML_LigthsGetTopRadius(m_idLight) != m_fRadiusTop) - SML_LigthsSetTopRadius(m_idLight, m_fRadiusTop); + if (SLight_GetTopRadius(m_idLight) != m_fRadiusTop) + SLight_SetTopRadius(m_idLight, m_fRadiusTop); } diff --git a/source/game/LightPoint.cpp b/source/game/LightPoint.cpp index 8e7ea413ac59cce38633355c46ab9fd500047bad..e7bca950aa116887985369481f4a60ee9eb5b6b2 100644 --- a/source/game/LightPoint.cpp +++ b/source/game/LightPoint.cpp @@ -6,7 +6,7 @@ See the license in LICENSE #include "LightPoint.h" -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> /*! \skydocent light_point Точечный источник света @@ -50,46 +50,46 @@ BaseClass(pMgr) m_fDist = 10; m_fShadowDist = m_fDist; m_iShadowType = 1; - m_idLight = SML_LigthsCreatePoint(&float3(0, 0, 0), m_fDist, &(float3)m_vColor, false, true); + m_idLight = SLight_CreatePoint(&float3(0, 0, 0), m_fDist, &(float3)m_vColor, false, true); } CLightPoint::~CLightPoint() { - SML_LigthsDeleteLight(m_idLight); + SLight_DeleteLight(m_idLight); } void CLightPoint::toggleEnable() { m_isEnable = !m_isEnable; - SML_LigthsSetEnable(m_idLight, m_isEnable); + SLight_SetEnable(m_idLight, m_isEnable); } void CLightPoint::onSync() { BaseClass::onSync(); - if (SML_LigthsGetEnable(m_idLight) != m_isEnable) - SML_LigthsSetEnable(m_idLight, m_isEnable); + if (SLight_GetEnable(m_idLight) != m_isEnable) + SLight_SetEnable(m_idLight, m_isEnable); static float3 vec; - SML_LigthsGetPos(m_idLight, &vec, false); + SLight_GetPos(m_idLight, &vec, false); if (vec.x != m_vPosition.x || vec.y != m_vPosition.y || vec.z != m_vPosition.z) - SML_LigthsSetPos(m_idLight, &(float3)m_vPosition, false); + SLight_SetPos(m_idLight, &(float3)m_vPosition, false); - SML_LigthsSetColor(m_idLight, &(float3)m_vColor); + SLight_SetColor(m_idLight, &(float3)m_vColor); - if (SML_LigthsGetDist(m_idLight) != m_fDist) + if (SLight_GetDist(m_idLight) != m_fDist) { - SML_LigthsSetDist(m_idLight, m_fDist, true); + SLight_SetDist(m_idLight, m_fDist, true); m_fShadowDist = m_fDist; } - if (SML_LigthsGetShadowLocalFar(m_idLight) != m_fShadowDist) - SML_LigthsSetShadowLocalFar(m_idLight, m_fShadowDist); + if (SLight_GetShadowLocalFar(m_idLight) != m_fShadowDist) + SLight_SetShadowLocalFar(m_idLight, m_fShadowDist); - if (SML_LigthsGetTypeShadowed(m_idLight) != m_iShadowType) - SML_LigthsSetTypeShadowed(m_idLight, (LTYPE_SHADOW)m_iShadowType); + if (SLight_GetTypeShadowed(m_idLight) != m_iShadowType) + SLight_SetTypeShadowed(m_idLight, (LTYPE_SHADOW)m_iShadowType); } diff --git a/source/game/Player.cpp b/source/game/Player.cpp index f96411a951838d63f31bb770de7c3ea41039ca9f..745a1e80de205ffb89f32233344a74cf35ba3593 100644 --- a/source/game/Player.cpp +++ b/source/game/Player.cpp @@ -5,7 +5,7 @@ See the license in LICENSE ***********************************************************/ #include <input/sxinput.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include "Player.h" #include "LightDirectional.h" #include "BaseTool.h" diff --git a/source/game/sxgame_dll.cpp b/source/game/sxgame_dll.cpp index aca0cdfeb56ef3ed1cd3438a2caf07ec87c57899..aa069d513f8f624d68fa88f8ffcff1a4df0a51e9 100644 --- a/source/game/sxgame_dll.cpp +++ b/source/game/sxgame_dll.cpp @@ -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, "sxmtrl_d.lib") # pragma comment(lib, "sxaigrid_d.lib") # pragma comment(lib, "sxgeom_d.lib") # pragma comment(lib, "sxlevel_d.lib") @@ -40,7 +40,7 @@ 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, "sxmtrl.lib") # pragma comment(lib, "sxaigrid.lib") # pragma comment(lib, "sxgeom.lib") # pragma comment(lib, "sxlevel.lib") diff --git a/source/gcore/LoaderTextures.cpp b/source/gcore/LoaderTextures.cpp index f37207e124c8104cadd4938776c58377f1d08a05..f790266dde2e1450fd9bec8591140809cdb430cf 100644 --- a/source/gcore/LoaderTextures.cpp +++ b/source/gcore/LoaderTextures.cpp @@ -127,7 +127,7 @@ ID } } - if(!IsTruePath) + if (!IsTruePath || (StrFindI(name, ":") >= 0 || StrFindI(name, "/") >= 0 || StrFindI(name, "\\") >= 0)) { LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", GEN_MSG_LOCATION, name); } diff --git a/source/gcore/gcore_data.cpp b/source/gcore/gcore_data.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4046d7858835c50d74fc68e6e285a00ff2753449 --- /dev/null +++ b/source/gcore/gcore_data.cpp @@ -0,0 +1,56 @@ + +#include "gcore_data.h" + +namespace gcore_data +{ + namespace rt_id + { + ID idComLight = -1; + + ID idColorScene = -1; + ID idNormalScene = -1; + ID idParamsScene = -1; + ID idDepthScene = -1; + ID idDepthScene0 = -1; + ID idDepthScene1 = -1; + + ID idLightAmbientDiff = -1; + ID idLightSpecular = -1; + + Array<ID> aToneMaps; + Array<LPDIRECT3DSURFACE9> aSurfToneMap; + int iCountArrToneMaps = 0; + + //** + + ID idAdaptLumCurr = -1; + ID idAdaptLumLast = -1; + + int iHowAdaptedLum = 0; + ID GetCurrAdaptedLum(){ if (iHowAdaptedLum == 0) return idAdaptLumCurr; else return idAdaptLumLast; }; + ID GetLastAdaptedLum(){ if (iHowAdaptedLum == 1) return idAdaptLumCurr; else return idAdaptLumLast; }; + void IncrAdaptedLum(){ if (iHowAdaptedLum >= 1) iHowAdaptedLum = 0; else iHowAdaptedLum = 1; }; + + //** + + ID idLigthCom = -1; + ID idLigthCom2 = -1; + ID idLigthCom3 = -1; + + ID idLigthComScaled = -1; + + float2 aHDRSampleOffsets[16]; + }; + + namespace vs_id + { + ID idScreenOut = -1; + }; + + namespace ps_id + { + ID idSampleLumIterative = -1; + ID idSampleLumInit = -1; + ID idCalcAdaptedLum = -1; + }; +}; \ No newline at end of file diff --git a/source/gcore/gcore_data.h b/source/gcore/gcore_data.h new file mode 100644 index 0000000000000000000000000000000000000000..6551dfe913cc0583f4bb1b46c674c23f8e18c920 --- /dev/null +++ b/source/gcore/gcore_data.h @@ -0,0 +1,64 @@ + +#ifndef __GCORE_DATA +#define __GCORE_DATA + +#include <gdefines.h> +#include <d3d9.h> +#include <common/array.h> +#include <common/SXMath.h> + +namespace gcore_data +{ + namespace rt_id + { + extern ID idComLight; + + extern ID idColorScene; + extern ID idNormalScene; + extern ID idParamsScene; + extern ID idDepthScene; + extern ID idDepthScene0; + extern ID idDepthScene1; + + extern ID idLightAmbientDiff; + extern ID idLightSpecular; + + extern Array<ID> aToneMaps; + extern Array<LPDIRECT3DSURFACE9> aSurfToneMap; + extern int iCountArrToneMaps; + + //** + + extern ID idAdaptLumCurr; + extern ID idAdaptLumLast; + + extern int iHowAdaptedLum; + extern ID GetCurrAdaptedLum(); + extern ID GetLastAdaptedLum(); + extern void IncrAdaptedLum(); + + //** + + extern ID idLigthCom; + extern ID idLigthCom2; + extern ID idLigthCom3; + + extern ID idLigthComScaled; + + extern float2 aHDRSampleOffsets[16]; + }; + + namespace vs_id + { + extern ID idScreenOut; + }; + + namespace ps_id + { + extern ID idSampleLumIterative; + extern ID idSampleLumInit; + extern ID idCalcAdaptedLum; + }; +}; + +#endif \ No newline at end of file diff --git a/source/gcore/gcore_utils.cpp b/source/gcore/gcore_utils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..54327d61b85e4b5844d94c64d0b242f8b27bfc7c --- /dev/null +++ b/source/gcore/gcore_utils.cpp @@ -0,0 +1,326 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include "gcore_utils.h" + +void InitDevice(HWND hWnd, int iWidth, int iHeight, bool isWindowed, DWORD dwFlags) +{ + g_pD3D9 = Direct3DCreate9(D3D_SDK_VERSION); + + if (!g_pD3D9) + { + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none detected d3d", GEN_MSG_LOCATION); + return; + } + + D3DCAPS9 caps; + g_pD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); + + memset(&g_oD3DAPP, 0, sizeof(g_oD3DAPP)); + g_oD3DAPP.BackBufferWidth = iWidth; + g_oD3DAPP.BackBufferHeight = iHeight; + 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 = isWindowed; + g_oD3DAPP.EnableAutoDepthStencil = true; + g_oD3DAPP.AutoDepthStencilFormat = D3DFMT_D24S8; + 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 | dwFlags | D3DCREATE_MULTITHREADED, &g_oD3DAPP, &g_pDXDevice))) + { + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed initialized d3d", GEN_MSG_LOCATION); + return; + } +} + +void InitFPStext() +{ + D3DXFONT_DESC LF; + ZeroMemory(&LF, sizeof(D3DXFONT_DESC)); + LF.Height = 14; + LF.Width = 7; + LF.Weight = 10; + LF.Italic = 0; + LF.CharSet = DEFAULT_CHARSET; + sprintf(LF.FaceName, "Courier New"); + + D3DXCreateFontIndirect(g_pDXDevice, &LF, &g_pFPStext); +} + +void InitFullScreenQuad() +{ + D3DVERTEXELEMENT9 oLayoutQuad[] = + { + { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + D3DDECL_END() + }; + + D3DXCreateMesh(2, 4, D3DXMESH_MANAGED, oLayoutQuad, g_pDXDevice, &g_pScreenTexture); + + struct VERTEX_SCREEN_TEXTURE { float x, y, z, tx, ty, tz; }; + + const float fOffsetPixelX = 1.0f / float(g_oD3DAPP.BackBufferWidth); + const float fOffsetPixelY = 1.0f / float(g_oD3DAPP.BackBufferHeight); + + VERTEX_SCREEN_TEXTURE aVertices[] = + { + { -1.0f - fOffsetPixelX, -1.0f + fOffsetPixelY, 1.0f, 0.0f, 1.0f, 0 }, + { -1.0f - fOffsetPixelX, 1.0f + fOffsetPixelY, 1.0f, 0.0f, 0.0f, 1 }, + { 1.0f - fOffsetPixelX, 1.0f + fOffsetPixelY, 1.0f, 1.0f, 0.0f, 2 }, + { 1.0f - fOffsetPixelX, -1.0f + fOffsetPixelY, 1.0f, 1.0f, 1.0f, 3 }, + }; + + void * pVertices; + if (!FAILED(g_pScreenTexture->LockVertexBuffer(0, (void**)&pVertices))) + { + memcpy(pVertices, aVertices, sizeof(aVertices)); + g_pScreenTexture->UnlockVertexBuffer(); + } + + WORD *pIndeces = 0; + g_pScreenTexture->LockIndexBuffer(0, (void**)&pIndeces); + pIndeces[0] = 0; pIndeces[1] = 1; pIndeces[2] = 2; + pIndeces[3] = 0; pIndeces[4] = 2; pIndeces[5] = 3; + g_pScreenTexture->UnlockIndexBuffer(); +} + +void InitArrModes() +{ + //��������� ���� ��������� ���������� �������� + DEVMODE oDevMode; + int iNum = 0; + while (EnumDisplaySettings(NULL, iNum, &oDevMode)) + { + iNum++; + if (oDevMode.dmBitsPerPel >= 32 && oDevMode.dmPelsWidth >= 800 && oDevMode.dmPelsHeight >= 600) + { + bool isUnic = true; + for (int i = 0, il = g_aModes.size(); i < il; ++i) + { + if (g_aModes[i].dmPelsWidth == oDevMode.dmPelsWidth && g_aModes[i].dmPelsHeight == oDevMode.dmPelsHeight) + { + isUnic = false; + break; + } + } + + if (isUnic) + g_aModes.push_back(oDevMode); + } + } +} + +void InitRT4Gbuffer() +{ + const int *r_win_width = GET_PCVAR_INT("r_win_width"); + const int *r_win_height = GET_PCVAR_INT("r_win_height"); + + float tmpcoefsizert = 1; + float2_t tmp_sizert = float2_t(float(*r_win_width) * tmpcoefsizert, (*r_win_height) * tmpcoefsizert); + + //���� (��������) + gcore_data::rt_id::idColorScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_color", tmpcoefsizert); + //������� + ����������� + gcore_data::rt_id::idNormalScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8/*D3DFMT_A2R10G10B10*/, D3DPOOL_DEFAULT, "ds_normal", tmpcoefsizert); + //��������� �������� + gcore_data::rt_id::idParamsScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_param", tmpcoefsizert); + + gcore_data::rt_id::idDepthScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "ds_depth", tmpcoefsizert); + gcore_data::rt_id::idDepthScene0 = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "ds_depth_0", tmpcoefsizert); + gcore_data::rt_id::idDepthScene1 = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "ds_depth_1", tmpcoefsizert); + + gcore_data::rt_id::idLightAmbientDiff = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_ambient", tmpcoefsizert); + gcore_data::rt_id::idLightSpecular = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "ds_specdiff", tmpcoefsizert); + + + gcore_data::rt_id::aToneMaps.clear(); + gcore_data::rt_id::aSurfToneMap.clear(); + + char szNameRT[64]; + int tmpcount = 0; + while (true) + { + int tmpsize = 1 << (2 * tmpcount); + if (tmpsize >= float(*r_win_width)*0.25 || tmpsize > (*r_win_height)*0.25) + break; + + sprintf(szNameRT, "tone_map_%dx%d", tmpsize, tmpsize); + gcore_data::rt_id::aToneMaps[tmpcount] = SGCore_RTAdd(tmpsize, tmpsize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, szNameRT, 0); + gcore_data::rt_id::aSurfToneMap[tmpcount] = 0; + ++tmpcount; + } + gcore_data::rt_id::iCountArrToneMaps = tmpcount; + + gcore_data::rt_id::idAdaptLumCurr = SGCore_RTAdd(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "adapted_lum_curr", 0); + gcore_data::rt_id::idAdaptLumLast = SGCore_RTAdd(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "adapted_lum_last", 0); + + gcore_data::rt_id::idLigthCom = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcom", 1); + gcore_data::rt_id::idLigthCom2 = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcom2", 1); + gcore_data::rt_id::idLigthCom3 = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_lightcom3", 1); + + gcore_data::rt_id::idLigthComScaled = SGCore_RTAdd(float(*r_win_width)*0.25f, float(*r_win_height)*0.25f, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcomscaled", 0.25); + + + gcore_data::ps_id::idCalcAdaptedLum = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pptm_calc_adapted_lum.ps", "pptm_calc_adapted_lum.ps", SHADER_CHECKDOUBLE_PATH); + gcore_data::ps_id::idSampleLumInit = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pptm_lum_init.ps", "pptm_lum_init.ps", SHADER_CHECKDOUBLE_PATH); + gcore_data::ps_id::idSampleLumIterative = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pptm_lum_iterative.ps", "pptm_lum_iterative.ps", SHADER_CHECKDOUBLE_PATH); +} + +void LoadShaders() +{ + gcore_data::vs_id::idScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs", SHADER_CHECKDOUBLE_PATH); + //MLSet::IDsShaders::PS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps", SHADER_CHECKDOUBLE_PATH); +} + +void ToneMappingGetArrDownScale4x4(int iWidth, int iHeight, float2 aDS[]) +{ + if (aDS == 0) + return; + + float tU = 1.0f / float(iWidth); + float tV = 1.0f / float(iHeight); + + int index = 0; + + for (int y = 0; y < 4; ++y) + { + for (int x = 0; x < 4; ++x) + { + aDS[index].x = (x - 1.5f) * tU; + aDS[index].y = (y - 1.5f) * tV; + + ++index; + } + } +} + +void ToneMappingCom(DWORD timeDelta, float fFactorAdapted) +{ + static const int *r_win_width = GET_PCVAR_INT("r_win_width"); + static const int *r_win_height = GET_PCVAR_INT("r_win_height"); + + ToneMappingGetArrDownScale4x4(*r_win_width, *r_win_height, gcore_data::rt_id::aHDRSampleOffsets); + + LPDIRECT3DSURFACE9 SurfSceneScale, BackBuf; + + SGCore_RTGetTexture(gcore_data::rt_id::idLigthComScaled)->GetSurfaceLevel(0, &SurfSceneScale); + + g_pDXDevice->GetRenderTarget(0, &BackBuf); + g_pDXDevice->SetRenderTarget(0, SurfSceneScale); + + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gcore_data::vs_id::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gcore_data::ps_id::idSampleLumIterative); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gcore_data::ps_id::idSampleLumIterative, "g_aOffsets", &(gcore_data::rt_id::aHDRSampleOffsets)); + + g_pDXDevice->SetTexture(0, SGCore_RTGetTexture(gcore_data::rt_id::idLigthCom)); + SGCore_ScreenQuadDraw(); + + SGCore_ShaderUnBind(); + + mem_release(SurfSceneScale); + + g_pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED); + int CurrTexture = gcore_data::rt_id::iCountArrToneMaps - 1; + + for (int i = 0; i < gcore_data::rt_id::iCountArrToneMaps; i++) + { + IDirect3DTexture9* tmptex = SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[i]); + IDirect3DSurface9* tmpsurf = gcore_data::rt_id::aSurfToneMap[i]; + SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[i])->GetSurfaceLevel(0, &gcore_data::rt_id::aSurfToneMap[i]); + int qwert = 0; + } + + D3DSURFACE_DESC desc; + SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[CurrTexture])->GetLevelDesc(0, &desc); + + ToneMappingGetArrDownScale4x4(desc.Width, desc.Height, gcore_data::rt_id::aHDRSampleOffsets); + + g_pDXDevice->SetRenderTarget(0, gcore_data::rt_id::aSurfToneMap[CurrTexture]); + g_pDXDevice->SetTexture(0, SGCore_RTGetTexture(gcore_data::rt_id::idLigthComScaled)); + g_pDXDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + g_pDXDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + g_pDXDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + g_pDXDevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gcore_data::vs_id::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gcore_data::ps_id::idSampleLumInit); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gcore_data::ps_id::idSampleLumInit, "g_aOffsets", &(gcore_data::rt_id::aHDRSampleOffsets)); + + SGCore_ScreenQuadDraw(); + + SGCore_ShaderUnBind(); + mem_release(gcore_data::rt_id::aSurfToneMap[CurrTexture]); + + --CurrTexture; + + + + while (CurrTexture >= 0) + { + SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[CurrTexture + 1])->GetLevelDesc(0, &desc); + ToneMappingGetArrDownScale4x4(desc.Width, desc.Height, gcore_data::rt_id::aHDRSampleOffsets); + + g_pDXDevice->SetRenderTarget(0, gcore_data::rt_id::aSurfToneMap[CurrTexture]); + g_pDXDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + g_pDXDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); + + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gcore_data::vs_id::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gcore_data::ps_id::idSampleLumIterative); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gcore_data::ps_id::idSampleLumIterative, "g_aOffsets", &(gcore_data::rt_id::aHDRSampleOffsets)); + + g_pDXDevice->SetTexture(0, SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[CurrTexture + 1])); + SGCore_ScreenQuadDraw(); + + SGCore_ShaderUnBind(); + CurrTexture--; + } + + IDirect3DTexture9* tmptex = SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[3]); + + for (int i = 0; i < gcore_data::rt_id::iCountArrToneMaps - 1; i++) + { + IDirect3DSurface9* tmpsurf = gcore_data::rt_id::aSurfToneMap[i]; + mem_release(gcore_data::rt_id::aSurfToneMap[i]); + } + + tmptex = SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[3]); + + gcore_data::rt_id::IncrAdaptedLum(); + LPDIRECT3DSURFACE9 SurfAdaptedLum = NULL; + SGCore_RTGetTexture(gcore_data::rt_id::GetCurrAdaptedLum())->GetSurfaceLevel(0, &SurfAdaptedLum); + + g_pDXDevice->SetRenderTarget(0, SurfAdaptedLum); + g_pDXDevice->SetTexture(0, SGCore_RTGetTexture(gcore_data::rt_id::GetLastAdaptedLum())); + g_pDXDevice->SetTexture(1, SGCore_RTGetTexture(gcore_data::rt_id::aToneMaps[0])); + g_pDXDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + g_pDXDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); + g_pDXDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + g_pDXDevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_POINT); + + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gcore_data::vs_id::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gcore_data::ps_id::idCalcAdaptedLum); + + float ElapsedTime = float(timeDelta) * 0.001f * (fFactorAdapted * 1000.f); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gcore_data::ps_id::idCalcAdaptedLum, "g_fElapsedTime", &(ElapsedTime)); + + SGCore_ScreenQuadDraw(); + + SGCore_ShaderUnBind(); + mem_release(SurfAdaptedLum); + + g_pDXDevice->SetRenderTarget(0, BackBuf); + mem_release(BackBuf); + + g_pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); + +} \ No newline at end of file diff --git a/source/gcore/gcore_utils.h b/source/gcore/gcore_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..d6351721b5f3851e7f3d3bb1e8f67dd160d3aebe --- /dev/null +++ b/source/gcore/gcore_utils.h @@ -0,0 +1,53 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __UTILS_H +#define __UTILS_H + +#include <gdefines.h> +#include <d3d9.h> +#include <common/array.h> +#include <common/SXMath.h> + +#include <gcore/sxgcore.h> +#include <gcore/gcore_data.h> + +//########################################################################## + +extern IDirect3DDevice9 *g_pDXDevice; +extern D3DPRESENT_PARAMETERS g_oD3DAPP; +extern IDirect3D9 *g_pD3D9; +extern ID3DXFont *g_pFPStext; +extern Array<DEVMODE> g_aModes; +extern ID3DXMesh *g_pScreenTexture; + +//########################################################################## + +//! ������������� ���������� +void InitDevice(HWND hWnd, int iWidth, int iHeight, bool isWindowed, DWORD dwFlags); + +//! ������������� ���������� ���� +void InitFPStext(); + +//! ������������� �������������� �������� +void InitFullScreenQuad(); + +//! ������������� ������� ������� �������� +void InitArrModes(); + +//! ������������� ������ �������� ��� +void InitRT4Gbuffer(); + +//! �������� �������� +void LoadShaders(); + +//! ���������� ������� ��� tone mapping +void ToneMappingGetArrDownScale4x4(int iWidth, int iHeight, float2 aDS[]); + +//! ������ tone mapping +void ToneMappingCom(DWORD timeDelta, float fFactorAdapted); + +#endif \ No newline at end of file diff --git a/source/gcore/oc.cpp b/source/gcore/oc.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d3be0b881f65595abfb93786a60665bea98d615b --- /dev/null +++ b/source/gcore/oc.cpp @@ -0,0 +1,632 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include "oc.h" + +void SwapFloat3(float3 &vA, float3 &vB) +{ + float3 vV; + vV = vA; + vA = vB; + vB = vV; +} + +void TriGetSphere(const float3 &vA, const float3 &vB, const float3 &vC, float &fRadius, float2 &vCenter) +{ + float x12 = vA.x - vB.x; + float x23 = vB.x - vC.x; + float x31 = vC.x - vA.x; + + float y12 = vA.y - vB.y; + float y23 = vB.y - vC.y; + float y31 = vC.y - vA.y; + + float z1 = (vA.x * vA.x) + (vA.y * vA.y); + float z2 = (vB.x * vB.x) + (vB.y * vB.y); + float z3 = (vC.x * vC.x) + (vC.y * vC.y); + + float zx = y12 * z3 + y23 * z1 + y31 * z2; + float zy = x12 * z3 + x23 * z1 + x31 * z2; + float z = x12 * y31 - y12 * x31; + + vCenter.x = -(zx / (2 * z)); + vCenter.y = zy / (2 * z); + + fRadius = sqrt(pow(vA.x - vCenter.x, 2) + (vA.y - vCenter.y, 2)); +} + +void QuadGetSphere(const float2 &vMin, const float2 &vMax, float &fRadius, float2 &vCenter) +{ + vCenter = (vMin + vMax) / 2; + + fRadius = SMVector2Length(vCenter - vMin); +} + +//########################################################################## + +COcclusionCulling::COcclusionCulling() +{ + m_isEnable = true; + + m_pFrustum = 0; + m_iCountFC = 0; + m_iCountFCfail = 0; + + m_iWidth = m_iHeight = m_iCountPixels = 0; + + m_pSurfDepthBuffer[0] = m_pSurfDepthBuffer[1] = m_pSurfDepthBuffer[2]; + + m_pArrDepthBuffer = 0; + m_pArrDepthBuffer = 0; + m_pArrWorldPos = 0; + m_pArrDepthBufferReProjection = 0; + m_pArrDepthBufferRasterize = 0; + + m_aRTdepth[0] = -1; + m_aRTdepth[1] = -1; + + m_idVS_ScreenOut = -1; + m_idPS_ScreenOut = -1; + m_idPS_FindMax9 = -1; + + m_fBiasDepth = 0.0001f; + + m_iCurrRTdepth = 0; +} + +COcclusionCulling::~COcclusionCulling() +{ + mem_release(m_pSurfDepthBuffer[0]); + mem_release(m_pSurfDepthBuffer[1]); + mem_release(m_pSurfDepthBuffer[2]); + mem_delete_a(m_pArrDepthBuffer); + mem_delete_a(m_pArrDepthBufferReProjection); + mem_delete_a(m_pArrWorldPos); + mem_delete_a(m_pArrDepthBufferRasterize); +} + +void COcclusionCulling::init(int iWidth, int iHeight) +{ + m_iWidth = float(iWidth * OC_SIZE_COEF); + m_iHeight = float(iHeight * OC_SIZE_COEF); + m_iCountPixels = m_iWidth * m_iHeight; + + g_pDXDevice->CreateOffscreenPlainSurface(m_iWidth, m_iHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &m_pSurfDepthBuffer[0], 0); + g_pDXDevice->CreateOffscreenPlainSurface(m_iWidth, m_iHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &m_pSurfDepthBuffer[1], 0); + g_pDXDevice->CreateOffscreenPlainSurface(m_iWidth, m_iHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &m_pSurfDepthBuffer[2], 0); + + m_pArrDepthBuffer = new float[m_iCountPixels + 1]; + m_pArrWorldPos = new float4[m_iCountPixels + 1]; + m_pArrDepthBufferReProjection = new float[m_iCountPixels + 1]; + m_pArrDepthBufferRasterize = new float[m_iCountPixels + 1]; + + m_aRTdepth[0] = SGCore_RTAdd(m_iWidth, m_iHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "depth_oc", 0.25f); + m_aRTdepth[1] = SGCore_RTAdd(m_iWidth, m_iHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "depth_oc2", 0.25f); + + m_idVS_ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs", SHADER_CHECKDOUBLE_PATH); + m_idPS_ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps", SHADER_CHECKDOUBLE_PATH); + m_idPS_FindMax9 = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_depth_find_max9.ps", "pp_depth_find_max9.ps", SHADER_CHECKDOUBLE_NAME); +} + +void COcclusionCulling::onLostDevice() +{ + mem_release(m_pSurfDepthBuffer[0]); + mem_release(m_pSurfDepthBuffer[1]); + mem_release(m_pSurfDepthBuffer[2]); + + mem_delete_a(m_pArrDepthBuffer); + mem_delete_a(m_pArrDepthBufferReProjection); + mem_delete_a(m_pArrWorldPos); + mem_delete_a(m_pArrDepthBufferRasterize); +} + +void COcclusionCulling::onResetDevice(int iWidth, int iHeight) +{ + m_iWidth = float(iWidth * OC_SIZE_COEF); + m_iHeight = float(iHeight * OC_SIZE_COEF); + m_iCountPixels = m_iWidth * m_iHeight; + + g_pDXDevice->CreateOffscreenPlainSurface(m_iWidth, m_iHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &m_pSurfDepthBuffer[0], 0); + g_pDXDevice->CreateOffscreenPlainSurface(m_iWidth, m_iHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &m_pSurfDepthBuffer[1], 0); + g_pDXDevice->CreateOffscreenPlainSurface(m_iWidth, m_iHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &m_pSurfDepthBuffer[2], 0); + + m_pArrDepthBuffer = new float[m_iCountPixels + 1]; + m_pArrWorldPos = new float4[m_iCountPixels + 1]; + m_pArrDepthBufferReProjection = new float[m_iCountPixels + 1]; + m_pArrDepthBufferRasterize = new float[m_iCountPixels + 1]; +} + + +void COcclusionCulling::setEnable(bool isEnable) +{ + m_isEnable = isEnable; +} + +bool COcclusionCulling::getEnable() +{ + return m_isEnable; +} + +void COcclusionCulling::update(ID idDepthMap, const IFrustum *pFrustum) +{ + if (!m_isEnable) + return; + + m_pFrustum = pFrustum; + m_iCountFC = 0; + m_iCountFCfail = 0; + + static const float *r_near = GET_PCVAR_FLOAT("r_near"); + static const float *r_far = GET_PCVAR_FLOAT("r_far"); + + // ���� ��� ������ ���������� ��������� ������ ���-�� �� ��� + if (!r_near || !r_far) + { + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_near or r_far is not found!", GEN_MSG_LOCATION); + return; + } + + static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); + + //���� ��� ����� fov ������ ���-�� �� ��� + if (!r_default_fov) + { + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_default_fov is not found!", GEN_MSG_LOCATION); + return; + } + + m_fBiasDepth = 1.f / (*r_far); + + IDirect3DTexture9 *pTexDepth = SGCore_RTGetTexture(idDepthMap); + IDirect3DTexture9 *pTexDepthOC = SGCore_RTGetTexture(m_aRTdepth[m_iCurrRTdepth]); + + //������ ������� � ������������ �������� � ����������� ����� + g_pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + g_pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + g_pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + g_pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + LPDIRECT3DSURFACE9 RenderSurf2, BackBuf2; + + pTexDepthOC->GetSurfaceLevel(0, &RenderSurf2); + g_pDXDevice->GetRenderTarget(0, &BackBuf2); + g_pDXDevice->SetRenderTarget(0, RenderSurf2); + + SGCore_SetSamplerFilter(0, D3DTEXF_NONE); + SGCore_SetSamplerAddress(0, D3DTADDRESS_CLAMP); + + g_pDXDevice->SetTexture(0, pTexDepth); + + SGCore_ShaderBind(SHADER_TYPE_VERTEX, m_idVS_ScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, m_idPS_FindMax9); + + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS_FindMax9, "g_vPixelSize", (&float2(1.f / float(g_oD3DAPP.BackBufferWidth), 1.f / float(g_oD3DAPP.BackBufferHeight)))); + + SGCore_ScreenQuadDraw(); + + SGCore_ShaderUnBind(); + + g_pDXDevice->SetRenderTarget(0, BackBuf2); + + mem_release(RenderSurf2); + mem_release(BackBuf2); + + //********************************************************************** + + //�������� ������������ ������� � ������ + LPDIRECT3DSURFACE9 pDepthSurf; + + int iCurrOld = 1 - m_iCurrRTdepth; + + pTexDepthOC = SGCore_RTGetTexture(m_aRTdepth[m_iCurrRTdepth]); + + pTexDepthOC->GetSurfaceLevel(0, &pDepthSurf); + g_pDXDevice->GetRenderTargetData(pDepthSurf, m_pSurfDepthBuffer[m_iCurrRTdepth]); + + D3DLOCKED_RECT srect; + m_pSurfDepthBuffer[iCurrOld]->LockRect(&srect, 0, D3DLOCK_READONLY | D3DLOCK_DONOTWAIT); + + memcpy(m_pArrDepthBuffer, srect.pBits, sizeof(float)* m_iCountPixels); + m_pSurfDepthBuffer[iCurrOld]->UnlockRect(); + + mem_release(pDepthSurf); + + //********************************************************************** + + float fPosX = 0, fPosY = 0; + + float4 vWorldPos; + + float4x4 mView, mProjection; + Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mView); + Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &mProjection); + + float4x4 mViewProj = m_mOldView * m_mOldProj;// = mView * mProjection; + float fD = 0.f; + float4x4 mInvVP = SMMatrixInverse(&fD, mViewProj); + + float3 vObserverPos; + Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos); + + float fTanHalfFOV = tan((*r_default_fov) * 0.5f); + float fAspectRatio = float(m_iWidth) / float(m_iHeight); + float fFarY = fTanHalfFOV * (*r_far); + float fFarX = fFarY * fAspectRatio; + + float4 vEyeRay, vWorldRay; + float4x4 mInvView = SMMatrixInverse(&fD, m_mOldView); + + float4 aWorldRays[4]; + aWorldRays[0] = SMVector4Transform(float4(-1.f * fFarX, -1.f * fFarY, (*r_far), 0.f), mInvView); + aWorldRays[1] = SMVector4Transform(float4(1.f * fFarX, -1.f * fFarY, (*r_far), 0.f), mInvView); + aWorldRays[2] = SMVector4Transform(float4(1.f * fFarX, 1.f * fFarY, (*r_far), 0.f), mInvView); + aWorldRays[3] = SMVector4Transform(float4(-1.f * fFarX, 1.f * fFarY, (*r_far), 0.f), mInvView); + + float4 vWorldRay0, vWorldRay1; + + for (int x = 0; x < m_iWidth; ++x) + { + vWorldRay0 = SMVectorLerp(aWorldRays[0], aWorldRays[1], float(x) / m_iWidth); + vWorldRay1 = SMVectorLerp(aWorldRays[3], aWorldRays[2], float(x) / m_iWidth); + for (int y = 0; y < m_iHeight; ++y) + { + int iPosPixel = (y * m_iWidth) + x; + vWorldRay = SMVectorLerp(vWorldRay1, vWorldRay0, float(y) / m_iHeight); + vWorldPos = vObserverPos + vWorldRay * m_pArrDepthBuffer[iPosPixel]; + vWorldPos.w = 1.f; + m_pArrWorldPos[iPosPixel] = vWorldPos; + } + } + + m_mOldView = mView; + m_mOldProj = mProjection; + + ++m_iCurrRTdepth; + + if (m_iCurrRTdepth >= 2) + m_iCurrRTdepth = 0; + + + /*if (GetKeyState('M')) + { + m_pSurfDepthBuffer[2]->LockRect(&srect, 0, D3DLOCK_READONLY); + + memcpy(srect.pBits, m_pArrDepthBuffer, sizeof(float)* m_iCountPixels); + m_pSurfDepthBuffer[2]->UnlockRect(); + + D3DXSaveSurfaceToFile("C:/1/m_pSurfDepthBuffer.jpg", D3DXIFF_JPG, m_pSurfDepthBuffer[2], NULL, NULL); + }*/ +} + + +void COcclusionCulling::reprojection() +{ + if (!m_isEnable) + return; + + static const float *r_near = GET_PCVAR_FLOAT("r_near"); + static const float *r_far = GET_PCVAR_FLOAT("r_far"); + + if (!r_near || !r_far) + { + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_near or r_far is not found!", GEN_MSG_LOCATION); + return; + } + + float4x4 mView, mProjection; + Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mView); + Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &mProjection); + + float4x4 mViewProj = mView * mProjection; + + float4 vNewPos; + + for (int i = 0; i < m_iCountPixels; ++i) + { + m_pArrDepthBufferReProjection[i] = 1.f; + m_pArrDepthBufferRasterize[i] = 1.f; + } + + float3 vObserverPos; + Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos); + + float2 vNewPos2; + + //���� ���������� ������� �������, ������ ����� ������� � screen-space � ����� ������� + for (int i = 0; i < m_iCountPixels; ++i) + { + vNewPos = SMVector4Transform(m_pArrWorldPos[i], mViewProj); + + vNewPos.x /= abs(vNewPos.w); + vNewPos.y /= abs(vNewPos.w); + vNewPos.z = (vNewPos.z + (*r_near)) / (*r_far); + + vNewPos.x = vNewPos.x * 0.5f + 0.5f; + vNewPos.y = (vNewPos.y * (-0.5f) + 0.5f); + + //������� ������� ������� ����������, ��� ����� ����� ����� ����� + + vNewPos2.x = float(int(vNewPos.x * 10000.f) / 10000.f); + vNewPos2.y = float(int(vNewPos.y * 10000.f) / 10000.f); + + if (vNewPos2.x == 0.f || vNewPos2.x == 1.f) + vNewPos.x = vNewPos2.x; + + if (vNewPos2.y == 0.f || vNewPos2.y == 1.f) + vNewPos.y = vNewPos2.y; + + //****************************************************************** + + if ((vNewPos.x <= 1.f && vNewPos.x >= 0.f) && (vNewPos.y <= 1.f && vNewPos.y >= 0.f)) + { + int x = floor(vNewPos.x * float(m_iWidth) + 0.5f); + int y = floor(vNewPos.y * m_iHeight + 0.5f); + int iPosPixel = int(y * m_iWidth) + x; + + if (iPosPixel > m_iCountPixels) + int qwerty = 0; + else + { + //���� � ������ ���������� ��� ������� ��� �������� �������, ���� ���������� ������� ������ ��� ����� + if (m_pArrDepthBufferReProjection[iPosPixel] >= 1.f || vNewPos.z > m_pArrDepthBufferReProjection[iPosPixel]) + m_pArrDepthBufferReProjection[iPosPixel] = vNewPos.z; + } + } + } + + + /*if (GetKeyState('N')) + { + D3DLOCKED_RECT srect; + g_pOCsurfDepthBuffer[2]->LockRect(&srect, 0, D3DLOCK_READONLY); + + memcpy(srect.pBits, g_pOCarrDepthBufferReProjection, sizeof(float)* g_iOCcountPixels); + g_pOCsurfDepthBuffer[2]->UnlockRect(); + D3DXSaveSurfaceToFile("C:/1/g_pSurfDepthBufferOCreproj.jpg", D3DXIFF_JPG, g_pOCsurfDepthBuffer[2], NULL, NULL); + }*/ +} + +bool COcclusionCulling::comVisible(const float3 *pMax, const float3 *pMin) +{ + if (!pMax || !pMin) + { + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - min or max is null!", GEN_MSG_LOCATION); + return false; + } + + if (!m_isEnable) + return true; + + float3 vObserverPos; + Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos); + + static const float *r_near = GET_PCVAR_FLOAT("r_near"); + static const float *r_far = GET_PCVAR_FLOAT("r_far"); + + if (!r_near || !r_far) + { + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_near or r_far is not found!", GEN_MSG_LOCATION); + return false; + } + + float3 vMax, vMin; + vMax = *pMax; + vMin = *pMin; + + //���������� ������ � ������� �� xz ����� ���������� ��������� �� ����������� + float3 vCenter = (vMin + vMax) * 0.5f; + float fRadius = SMVector3Length2(float3(vCenter.x, 0.f, vCenter.z) - float3(vMax.x, 0, vMax.z)); + + float fDist = SMVector3Length2(vObserverPos - vCenter); + + //���� ��������� �� ���������� ������ ���� ����� ������� ����� �� xz ������ ����������� � ����� + if (fDist <= fRadius) + return true; + + fDist -= fRadius; + + //���� ���� � �������� �������� ���������� ����������� �� �����������, ������ �� ����� + if (fDist >= 0.f && fDist <= OC_DIST_NEAR_NOT_CULL*OC_DIST_NEAR_NOT_CULL) + return true; + + //��������� ����� ����� ������� ���������, ������ �� ������� ���������� �� �������� ��� ����, �������� ������ ����� ������� ������� ����������� + vMax += g_cvOCext; + vMin -= g_cvOCext; + + float4x4 mWorld, mView, mProjection; + Core_RMatrixGet(G_RI_MATRIX_WORLD, &mWorld); + Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mView); + Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &mProjection); + + float4x4 mWVP = mWorld * mView *mProjection; + + + float4 aSSPoints[8]; + float4 aWPoints[8]; + aWPoints[0] = float4(vMax.x, vMax.y, vMax.z, 1.0f); + aWPoints[1] = float4(vMax.x, vMax.y, vMin.z, 1.0f); + aWPoints[2] = float4(vMax.x, vMin.y, vMax.z, 1.0f); + aWPoints[3] = float4(vMin.x, vMax.y, vMax.z, 1.0f); + aWPoints[4] = float4(vMax.x, vMin.y, vMin.z, 1.0f); + aWPoints[5] = float4(vMin.x, vMin.y, vMax.z, 1.0f); + aWPoints[6] = float4(vMin.x, vMax.y, vMin.z, 1.0f); + aWPoints[7] = float4(vMin.x, vMin.y, vMin.z, 1.0f); + + for (int i = 0; i < 8; ++i) + { + aSSPoints[i] = SMVector4Transform(aWPoints[i], mWVP); + + aSSPoints[i].x /= abs(aSSPoints[i].w); + aSSPoints[i].y /= abs(aSSPoints[i].w); + aSSPoints[i].z = ((aSSPoints[i].z + (*r_near)) / (*r_far));// *sign(aSSPoints[i].w); + + //������� �������� ������� �� ���������� + //float fLinearDepth = (*r_near) / ((*r_far) + (*r_near) - aPoints[i].w * ((*r_far) - (*r_near))); + + aSSPoints[i].x = aSSPoints[i].x * 0.5 + 0.5; + aSSPoints[i].y = aSSPoints[i].y * (-0.5) + 0.5; + + aSSPoints[i].x *= m_iWidth; + aSSPoints[i].y *= m_iHeight; + + aSSPoints[i].x = int(aSSPoints[i].x); + aSSPoints[i].y = int(aSSPoints[i].y); + } + + float2 vNearFar((*r_near), (*r_far)); + + bool isVisible = ( + (triFrustumCulling(aWPoints[7], aWPoints[6], aWPoints[1]) && triRasterize(aSSPoints[7], aSSPoints[6], aSSPoints[1], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[7], aWPoints[1], aWPoints[4]) && triRasterize(aSSPoints[7], aSSPoints[1], aSSPoints[4], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[0], aWPoints[5], aWPoints[2]) && triRasterize(aSSPoints[0], aSSPoints[5], aSSPoints[2], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[0], aWPoints[3], aWPoints[5]) && triRasterize(aSSPoints[0], aSSPoints[3], aSSPoints[5], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[0], aWPoints[1], aWPoints[3]) && triRasterize(aSSPoints[0], aSSPoints[1], aSSPoints[3], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[1], aWPoints[6], aWPoints[3]) && triRasterize(aSSPoints[1], aSSPoints[6], aSSPoints[3], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[5], aWPoints[4], aWPoints[2]) && triRasterize(aSSPoints[5], aSSPoints[4], aSSPoints[2], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[4], aWPoints[5], aWPoints[7]) && triRasterize(aSSPoints[4], aSSPoints[5], aSSPoints[7], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[0], aWPoints[2], aWPoints[1]) && triRasterize(aSSPoints[0], aSSPoints[2], aSSPoints[1], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[1], aWPoints[2], aWPoints[4]) && triRasterize(aSSPoints[1], aSSPoints[2], aSSPoints[4], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[6], aWPoints[5], aWPoints[3]) && triRasterize(aSSPoints[6], aSSPoints[5], aSSPoints[3], false, aSSPoints[0], vNearFar)) || + (triFrustumCulling(aWPoints[5], aWPoints[6], aWPoints[7]) && triRasterize(aSSPoints[5], aSSPoints[6], aSSPoints[7], false, aSSPoints[0], vNearFar)) + ); + + return isVisible; +} + + +bool COcclusionCulling::triFrustumCulling(const float3 &vA, const float3 &vB, const float3 &vC) +{ + /*if (GetAsyncKeyState('P')) + return true;*/ + + ++m_iCountFC; + + bool isVisible = (!m_pFrustum || m_pFrustum->polyInFrustum(&vA, &vB, &vC)); + + if (!isVisible) + ++m_iCountFCfail; + + return isVisible; +} + +bool COcclusionCulling::triRasterize(const float4 &vA, const float4 &vB, const float4 &vC, bool isRasterize, const float3 &vNormal2, const float2_t &vNearFar) +{ + if (vA.z < 0.f && vB.z < 0.f && vC.z < 0.f) + return false; + + float3 vNormal = SMVector3Normalize(SMVector3Cross(vC - vA, vB - vA)); + + float3 vPointA = vA; + float3 vPointB = vB; + float3 vPointC = vC; + + //��� ���������� D ���������� ������������ ������������� ����� ������������ + float fD = -(vNormal.x * vPointA.x + vNormal.y * vPointA.y + vNormal.z * vPointA.z); + + /* + �������� ����������������� �������� ������� ����� ���: -(N.x * x + N.y * y + D) / N.z + N - ������� + x � y - ������� ���������� �� ������������ + */ + + //���������� ����� �� �������� ���������� Y + if (vPointB.y < vPointA.y) + SwapFloat3(vPointA, vPointB); + + if (vPointC.y < vPointA.y) + SwapFloat3(vPointA, vPointC); + + if (vPointB.y > vPointC.y) + SwapFloat3(vPointB, vPointC); + + + bool isVisible = false; + + //���������� ������������, �� ������ ����������� ����������, ������� ����� ����� + vPointA.y -= g_fOCextTriangle; + vPointC.y += g_fOCextTriangle; + + int iTotalHeight = vPointC.y - vPointA.y; + + if (iTotalHeight == 0) + return false; + + int iSegmentHeight = vPointB.y - vPointA.y + 1; + + if (iSegmentHeight == 0) + return false; + + int iStartY = clampf(vPointA.y, 0, m_iHeight - 1); + int iFinishY = clampf(vPointB.y, 0, m_iHeight - 1); + + for (int y = iStartY; y <= iFinishY; ++y) + { + float fA = (y - vPointA.y) / iTotalHeight; + float fB = (y - vPointA.y) / iSegmentHeight; + fA = vPointA.x + (vPointC.x - vPointA.x) * fA; + fB = vPointA.x + (vPointB.x - vPointA.x) * fB; + + if (fA > fB) + std::swap(fA, fB); + + fA = clampf(fA - g_fOCextTriangle, 0, m_iWidth - 1); + fB = clampf(fB + g_fOCextTriangle, 0, m_iWidth - 1); + + //� ��������� �������� � ���������� ������� �� ����, �� �������� ������� ����� ������� ���� ��������� + for (int x = fA; x <= fB; ++x) + { + int iPosPixel = (y * m_iWidth) + x; + if (iPosPixel < m_iCountPixels) + { + float fCurrDepth = (-(vNormal.x * float(x) + vNormal.y * float(y) + fD) / vNormal.z); + + if (fCurrDepth >= 0.f && m_pArrDepthBufferReProjection[iPosPixel] >= (fCurrDepth - m_fBiasDepth)) + { + return true; + } + } + } + } + + + iSegmentHeight = vPointC.y - vPointB.y + 1; + + if (iSegmentHeight == 0) + return false; + + iStartY = clampf(vPointB.y, 0, m_iHeight - 1); + iFinishY = clampf(vPointC.y, 0, m_iHeight - 1); + + for (int y = iStartY; y <= iFinishY; ++y) + { + float fA = (y - vPointA.y) / iTotalHeight; + float fB = (y - vPointB.y) / iSegmentHeight; + fA = vPointA.x + (vPointC.x - vPointA.x) * fA; + fB = vPointB.x + (vPointC.x - vPointB.x) * fB; + + if (fA > fB) + std::swap(fA, fB); + + fA = clampf(fA - g_fOCextTriangle, 0, m_iWidth - 1); + fB = clampf(fB + g_fOCextTriangle, 0, m_iWidth - 1); + + //� ��������� �������� � ���������� ������� �� ����, �� �������� ������� ����� ������� ���� ��������� + for (int x = fA; x <= fB; ++x) + { + int iPosPixel = (y * m_iWidth) + x; + if (iPosPixel < m_iCountPixels) + { + float fCurrDepth = (-(vNormal.x * float(x) + vNormal.y * float(y) + fD) / vNormal.z); + + if (fCurrDepth >= 0.f && m_pArrDepthBufferReProjection[iPosPixel] >= (fCurrDepth - m_fBiasDepth)) + { + return true; + } + } + } + } + + return isVisible; +} \ No newline at end of file diff --git a/source/gcore/oc.h b/source/gcore/oc.h new file mode 100644 index 0000000000000000000000000000000000000000..e6fcf9b15f3213d770c31079c3ab7adde74dba6a --- /dev/null +++ b/source/gcore/oc.h @@ -0,0 +1,142 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __OC_H +#define __OC_H + +#include <gdefines.h> +#include <d3d9.h> +#include <common/SXMath.h> + +#include <gcore/sxgcore.h> + +extern IDirect3DDevice9 *g_pDXDevice; +extern D3DPRESENT_PARAMETERS g_oD3DAPP; + +//! ����������� ������� ������ ������� occlusion culling +#define OC_SIZE_COEF 0.25f + +//! ��������� (� ������) ��� ������� ���� occlusion culling ������ ����� ������ true +#define OC_DIST_NEAR_NOT_CULL 4.f + +//! ����������� ������ ������ ��� ����� occlusion culling +//static float g_fOCbiasDepth = 0.0001f; + +//! ���������� �������� ���������� ������������� ��� +const float g_fOCextTriangle = 2.f; + +//! ��������� ���������� ����� ��� ����� occlusion culling +const float3 g_cvOCext(0.05f, 0.05f, 0.05f); + +//########################################################################## + +/*inline bool OC_RasterizeQuad(const float3 &vA, const float3 &vB, const float3 &vC, const float3 &vD, const float2 &vNearFar) +{ + float3 vNormal = TriGetNormal(vA, vB, vC); + return (OC_TriangleRasterize(vA, vB, vC, false, vNormal, vNearFar) || OC_TriangleRasterize(vB, vC, vD, false, vNormal, vNearFar)); +}*/ + +void SwapFloat3(float3 &vA, float3 &vB); +void TriGetSphere(const float3 &vA, const float3 &vB, const float3 &vC, float &fRadius, float2 &vCenter); +void QuadGetSphere(const float2 &vMin, const float2 &vMax, float &fRadius, float2 &vCenter); + +//########################################################################## + +class COcclusionCulling +{ +public: + + SX_ALIGNED_OP_MEM + + COcclusionCulling(); + ~COcclusionCulling(); + + //! ������������� �� ��������� �������� ������� + void init(int iWidth, int iHeight); + + //! ��������� ������ ���������� + void onLostDevice(); + + //! �������� ������ ���������� + void onResetDevice(int iWidth, int iHeight); + + //! ��������� �������/�������� ���� + void setEnable(bool isEnable); + + //! ���������� ������� ��������� ����������� ����� + bool getEnable(); + + /*! ���������� ������ ����� + \param idDepthMap - ������������� rt ������� + \param pFrustum - ������� ������ + */ + void update(ID idDepthMap, const IFrustum *pFrustum); + + //! ���������� ������� ������ ������� �� ��������� ����� ������ + void reprojection(); + + //! ������� ��������� ����� + bool comVisible(const float3 *pMax, const float3 *pMin); + +protected: + + bool triFrustumCulling(const float3 &vA, const float3 &vB, const float3 &vC); + bool triRasterize(const float4 &vA, const float4 &vB, const float4 &vC, bool isRasterize, const float3 &vNormal2, const float2_t &vNearFar); + + //! ������ surfaces ��� ��������� + IDirect3DSurface9 *m_pSurfDepthBuffer[3]; + + //! ������ ������� + float *m_pArrDepthBuffer = 0; + + //! ������ ������� ��������� + float4 *m_pArrWorldPos = 0; + + //! ������ �������������� ������� + float *m_pArrDepthBufferReProjection = 0; + + //! ������ ������������ (debug) + float *m_pArrDepthBufferRasterize = 0; + + //! ������� �� ���� + bool m_isEnable; + + //! ������� ������� ������� + float4x4 m_mOldView; + + //! ������� ������������ ������� + float4x4 m_mOldProj; + + //! ����� ���������� �������� � ������ ��� ����� + int m_iCountPixels; + + //! ������ ������ ����� + int m_iWidth; + + //! ������ ������ ����� + int m_iHeight; + + //! ������ �� ������ + ID m_aRTdepth[2]; + + //! ������� ���� ������� #m_aRTdepth + int m_iCurrRTdepth; + + + ID m_idVS_ScreenOut; + ID m_idPS_ScreenOut; + ID m_idPS_FindMax9; + + //! ������� ������� ������ + const IFrustum *m_pFrustum; + + int m_iCountFC; + int m_iCountFCfail; + + float m_fBiasDepth; +}; + +#endif \ No newline at end of file diff --git a/source/gcore/sxgcore.cpp b/source/gcore/sxgcore.cpp index 67b8058a7269fc4be3f8fb848b5163faddd7647b..71cbaf59a92fe6a2a5633c8c84cbfb6742eee6bd 100644 --- a/source/gcore/sxgcore.cpp +++ b/source/gcore/sxgcore.cpp @@ -12,60 +12,40 @@ See the license in LICENSE #include <gcore/loadertextures.h> #include <gcore/bound.h> #include <gcore/camera.h> +#include <gcore/oc.h> #include <gcore/loader_static.h> #include <gcore/sky.h> +#include <gcore/gcore_utils.h> +#include <gcore/gcore_data.h> + #if !defined(DEF_STD_REPORT) #define DEF_STD_REPORT 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); +//########################################################################## + +#define SXGCORE_VERSION 1 - g_fnReportf(iLevel, SX_LIB_NAME, szStr); -}*/ IDirect3DDevice9 *g_pDXDevice = 0; D3DPRESENT_PARAMETERS g_oD3DAPP; IDirect3D9 *g_pD3D9 = 0; ID3DXFont *g_pFPStext = 0; -Array<DEVMODE> g_aArrModes; - -IDirect3DSurface9 *g_pOCsurfDepthBuffer[3]; -float *g_pOCarrDepthBuffer = 0; -float4 *g_pOCarrWorldPos = 0; -float *g_pOCarrDepthBufferReProjection = 0; -float *g_pOCarrDepthBufferRasterize = 0; -bool g_isOCenable = false; -float4x4 g_mOColdView; -float4x4 g_mOColdProj; -int g_iOCcountPixels = 0; -int g_iOCWidth = 0; -int g_iOCHeight = 0; -ID RT_DepthOC[2]; -int g_iOCcurrDepth = 0; -ID VS_ScreenOut = -1; -ID PS_ScreenOut = -1; -ID PS_FindMax9 = -1; - -//! ����������� ������ ������ ��� ����� occlusion culling -float g_fOCbiasDEpth = 0.0001f; - -//! ���������� �������� ���������� ������������� ��� -float g_fOCextTriangle = 2.f; - -//! ���������� ������� ������ ������� occlusion culling -#define OC_SIZE_COEF 0.25f - -//! ��������� (� ������) ��� ������� ���� occlusion culling ������ ����� ������ true -#define OC_DIST_NEAR_NOT_CULL 4.f +Array<DEVMODE> g_aModes; + +IDirect3DVertexDeclaration9 *g_pStaticVertexDecl = 0; + +CShaderManager *g_pManagerShaders = 0; +CreatorTextures *g_pManagerRenderTargets = 0; +�LoaderTextures *g_pManagerTextures = 0; +ID3DXMesh *g_pScreenTexture = 0; +CSkyBox *g_pSkyBox = 0; +CSkyClouds *g_pSkyClouds = 0; +COcclusionCulling *g_pOC = 0; //########################################################################## @@ -101,122 +81,33 @@ bool StdMtlGroupIsSyngly(ID id) return false; } -g_func_dip FuncDIP = StdDrawIndexedPrimitive; -g_func_mtl_set FuncMtlSet = StdMtlSet; -g_func_mtl_load FuncMtlLoad = StdMtlLoad; -g_func_mtl_get_sort FuncMtlGetSort = StdMtlGetSort; -g_func_mtl_get_physic_type FuncMtlGetPhysicType = StdMtlGetPhysicType; -g_func_mtl_group_render_is_singly FuncMtlGroupRenderIsSingly = StdMtlGroupIsSyngly; +g_func_dip g_fnDIP = StdDrawIndexedPrimitive; +g_func_mtl_set g_fnMtlSet = StdMtlSet; +g_func_mtl_load g_fnMtlLoad = StdMtlLoad; +g_func_mtl_get_sort g_fnMtlGetSort = StdMtlGetSort; +g_func_mtl_get_physic_type g_fnMtlGetPhysicType = StdMtlGetPhysicType; +g_func_mtl_group_render_is_singly g_fnMtlGroupRenderIsSingly = StdMtlGroupIsSyngly; //########################################################################## -IDirect3DVertexDeclaration9 *g_pStaticVertexDecl = 0; - - -#define SXGCORE_VERSION 1 - -CShaderManager *g_pManagerShaders = 0; -CreatorTextures *g_pManagerRenderTargets = 0; -�LoaderTextures *g_pManagerTextures = 0; -ID3DXMesh *g_pScreenTexture = 0; -CSkyBox *g_pSkyBox = 0; -CSkyClouds *g_pSkyClouds = 0; - - #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;} +#define SG_PRECOND_SKY_OC(retval) SG_PRECOND(retval _VOID); if(!g_pOC){ LibReport(REPORT_MSG_LEVEL_ERROR, "%s - occlusion culling is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## void GCoreInit(HWND hWnd, int iWidth, int iHeight, bool isWindowed, DWORD dwFlags) { - g_pD3D9 = Direct3DCreate9(D3D_SDK_VERSION); - - if (!g_pD3D9) - { - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none detected d3d", GEN_MSG_LOCATION); - return; - } - - D3DCAPS9 caps; - g_pD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); - - memset(&g_oD3DAPP, 0, sizeof(g_oD3DAPP)); - g_oD3DAPP.BackBufferWidth = iWidth; - g_oD3DAPP.BackBufferHeight = iHeight; - 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 = isWindowed; - g_oD3DAPP.EnableAutoDepthStencil = true; - g_oD3DAPP.AutoDepthStencilFormat = D3DFMT_D24S8; - 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 | dwFlags | D3DCREATE_MULTITHREADED, &g_oD3DAPP, &g_pDXDevice))) - { - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - failed initialized d3d", GEN_MSG_LOCATION); - return; - } - - D3DXFONT_DESC LF; - ZeroMemory(&LF, sizeof(D3DXFONT_DESC)); - LF.Height = 14; - LF.Width = 7; - LF.Weight = 10; - LF.Italic = 0; - LF.CharSet = DEFAULT_CHARSET; - sprintf(LF.FaceName, "Courier New"); - - D3DXCreateFontIndirect(g_pDXDevice, &LF, &g_pFPStext); - - D3DVERTEXELEMENT9 oLayoutQuad[] = - { - { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, - D3DDECL_END() - }; + InitDevice(hWnd, iWidth, iHeight, isWindowed, dwFlags); + InitFPStext(); + InitFullScreenQuad(); - //IDirect3DVertexDeclaration9* VertexDeclarationQuad; - //GData::g_pDXDevice->CreateVertexDeclaration(layoutquad, &VertexDeclarationQuad); - - D3DXCreateMesh(2, 4, D3DXMESH_MANAGED, oLayoutQuad, g_pDXDevice, &g_pScreenTexture); - - struct VERTEX_SCREEN_TEXTURE { float x, y, z, tx, ty, tz; }; - - const float fOffsetPixelX = 1.0f / float(g_oD3DAPP.BackBufferWidth); - const float fOffsetPixelY = 1.0f / float(g_oD3DAPP.BackBufferHeight); - - VERTEX_SCREEN_TEXTURE aVertices[] = - { - { -1.0f - fOffsetPixelX, -1.0f + fOffsetPixelY, 1.0f, 0.0f, 1.0f, 0 }, - { -1.0f - fOffsetPixelX, 1.0f + fOffsetPixelY, 1.0f, 0.0f, 0.0f, 1 }, - { 1.0f - fOffsetPixelX, 1.0f + fOffsetPixelY, 1.0f, 1.0f, 0.0f, 2 }, - { 1.0f - fOffsetPixelX, -1.0f + fOffsetPixelY, 1.0f, 1.0f, 1.0f, 3 }, - }; - - void * pVertices; - if (!FAILED(g_pScreenTexture->LockVertexBuffer(0, (void**)&pVertices))) - { - memcpy(pVertices, aVertices, sizeof(aVertices)); - g_pScreenTexture->UnlockVertexBuffer(); - } - - WORD *pIndeces = 0; - g_pScreenTexture->LockIndexBuffer(0, (void**)&pIndeces); - pIndeces[0] = 0; pIndeces[1] = 1; pIndeces[2] = 2; - pIndeces[3] = 0; pIndeces[4] = 2; pIndeces[5] = 3; - g_pScreenTexture->UnlockIndexBuffer(); - - g_pManagerShaders = new CShaderManager(); g_pManagerRenderTargets = new CreatorTextures(); g_pManagerTextures = new �LoaderTextures(); + g_pOC = new COcclusionCulling(); + g_pOC->init(g_oD3DAPP.BackBufferWidth, g_oD3DAPP.BackBufferHeight); D3DVERTEXELEMENT9 oLayoutStatic[] = { @@ -228,49 +119,60 @@ void GCoreInit(HWND hWnd, int iWidth, int iHeight, bool isWindowed, DWORD dwFlag g_pDXDevice->CreateVertexDeclaration(oLayoutStatic, &g_pStaticVertexDecl); + InitArrModes(); + InitRT4Gbuffer(); + LoadShaders(); +} - //��������� ���� ��������� ���������� �������� - DEVMODE oDevMode; - int iNum = 0; - while (EnumDisplaySettings(NULL, iNum, &oDevMode)) - { - iNum++; - if (oDevMode.dmBitsPerPel >= 32 && oDevMode.dmPelsWidth >= 800 && oDevMode.dmPelsHeight >= 600) - { - bool isUnic = true; - for (int i = 0, il = g_aArrModes.size(); i < il; ++i) - { - if (g_aArrModes[i].dmPelsWidth == oDevMode.dmPelsWidth && g_aArrModes[i].dmPelsHeight == oDevMode.dmPelsHeight) - { - isUnic = false; - break; - } - } +//########################################################################## - if (isUnic) - g_aArrModes.push_back(oDevMode); - } - } +SX_LIB_API ID SGCore_GbufferGetRT_ID(DS_RT type) +{ + SG_PRECOND(-1); - - g_iOCWidth = float(iWidth * OC_SIZE_COEF); - g_iOCHeight = float(iHeight * OC_SIZE_COEF); - g_iOCcountPixels = g_iOCWidth * g_iOCHeight; - - g_pDXDevice->CreateOffscreenPlainSurface(g_iOCWidth, g_iOCHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &g_pOCsurfDepthBuffer[0], 0); - g_pDXDevice->CreateOffscreenPlainSurface(g_iOCWidth, g_iOCHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &g_pOCsurfDepthBuffer[1], 0); - g_pDXDevice->CreateOffscreenPlainSurface(g_iOCWidth, g_iOCHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &g_pOCsurfDepthBuffer[2], 0); - g_pOCarrDepthBuffer = new float[g_iOCcountPixels+1]; - g_pOCarrWorldPos = new float4[g_iOCcountPixels+1]; - g_pOCarrDepthBufferReProjection = new float[g_iOCcountPixels+1]; - g_pOCarrDepthBufferRasterize = new float[g_iOCcountPixels]; - - RT_DepthOC[0] = SGCore_RTAdd(g_iOCWidth, g_iOCHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "depth_oc", 0.25f); - RT_DepthOC[1] = SGCore_RTAdd(g_iOCWidth, g_iOCHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "depth_oc2", 0.25f); - - VS_ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs", SHADER_CHECKDOUBLE_PATH); - PS_ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps", SHADER_CHECKDOUBLE_PATH); - PS_FindMax9 = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_depth_find_max9.ps", "pp_depth_find_max9.ps", SHADER_CHECKDOUBLE_NAME); + if (type == DS_RT_COLOR) + return gcore_data::rt_id::idColorScene; + else if (type == DS_RT_NORMAL) + return gcore_data::rt_id::idNormalScene; + else if (type == DS_RT_PARAM) + return gcore_data::rt_id::idParamsScene; + else if (type == DS_RT_DEPTH) + return gcore_data::rt_id::idDepthScene; + else if (type == DS_RT_DEPTH0) + return gcore_data::rt_id::idDepthScene0; + else if (type == DS_RT_DEPTH1) + return gcore_data::rt_id::idDepthScene1; + + else if (type == DS_RT_AMBIENTDIFF) + return gcore_data::rt_id::idLightAmbientDiff; + else if (type == DS_RT_SPECULAR) + return gcore_data::rt_id::idLightSpecular; + + else if (type == DS_RT_SCENELIGHT) + return gcore_data::rt_id::idLigthCom; + else if (type == DS_RT_SCENELIGHT2) + return gcore_data::rt_id::idLigthCom2; + + else if (type == DS_RT_ADAPTEDLUM) + return gcore_data::rt_id::GetCurrAdaptedLum(); + + return -1; +} + +SX_LIB_API IDirect3DTexture9* SGCore_GbufferGetRT(DS_RT type) +{ + SG_PRECOND(0); + + ID id = SGCore_GbufferGetRT_ID(type); + if (id >= 0) + return SGCore_RTGetTexture(id); + else + return 0; +} + +SX_LIB_API void SGCore_ToneMappingCom(DWORD timeDelta, float fFactorAdapted) +{ + ToneMappingCom(timeDelta, fFactorAdapted); } //########################################################################## @@ -310,9 +212,9 @@ SX_LIB_API const DEVMODE* SGCore_GetModes(int *pCount) SG_PRECOND(0); if (pCount) - *pCount = g_aArrModes.size(); + *pCount = g_aModes.size(); - return &(g_aArrModes[0]); + return &(g_aModes[0]); } SX_LIB_API HWND SGCore_GetHWND() @@ -324,13 +226,7 @@ SX_LIB_API void SGCore_AKill() { SG_PRECOND(_VOID); - mem_release(g_pOCsurfDepthBuffer[0]); - mem_release(g_pOCsurfDepthBuffer[1]); - mem_release(g_pOCsurfDepthBuffer[2]); - mem_delete_a(g_pOCarrDepthBuffer); - mem_delete_a(g_pOCarrDepthBufferReProjection); - mem_delete_a(g_pOCarrWorldPos); - mem_delete_a(g_pOCarrDepthBufferRasterize); + mem_delete(g_pOC); mem_delete(g_pManagerShaders); mem_delete(g_pManagerRenderTargets); @@ -376,34 +272,16 @@ SX_LIB_API void SGCore_OnLostDevice() { SG_PRECOND(_VOID); - mem_release(g_pOCsurfDepthBuffer[0]); - mem_release(g_pOCsurfDepthBuffer[1]); - mem_release(g_pOCsurfDepthBuffer[2]); - mem_delete_a(g_pOCarrDepthBuffer); - mem_delete_a(g_pOCarrDepthBufferReProjection); - mem_delete_a(g_pOCarrWorldPos); - mem_delete_a(g_pOCarrDepthBufferRasterize); - g_pFPStext->OnLostDevice(); g_pManagerRenderTargets->OnLostDevice(); + + g_pOC->onLostDevice(); } SX_LIB_API bool SGCore_OnDeviceReset(int iWidth, int iHeight, bool isWindowed) { SG_PRECOND(false); - g_iOCWidth = float(iWidth * OC_SIZE_COEF); - g_iOCHeight = float(iHeight * OC_SIZE_COEF); - g_iOCcountPixels = g_iOCWidth * g_iOCHeight; - - g_pDXDevice->CreateOffscreenPlainSurface(g_iOCWidth, g_iOCHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &g_pOCsurfDepthBuffer[0], 0); - g_pDXDevice->CreateOffscreenPlainSurface(g_iOCWidth, g_iOCHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &g_pOCsurfDepthBuffer[1], 0); - g_pDXDevice->CreateOffscreenPlainSurface(g_iOCWidth, g_iOCHeight, D3DFMT_R32F, D3DPOOL_SYSTEMMEM, &g_pOCsurfDepthBuffer[2], 0); - g_pOCarrDepthBuffer = new float[g_iOCcountPixels + 1]; - g_pOCarrWorldPos = new float4[g_iOCcountPixels + 1]; - g_pOCarrDepthBufferReProjection = new float[g_iOCcountPixels + 1]; - g_pOCarrDepthBufferRasterize = new float[g_iOCcountPixels]; - g_oD3DAPP.BackBufferWidth = iWidth; g_oD3DAPP.BackBufferHeight = iHeight; g_oD3DAPP.Windowed = isWindowed; @@ -417,6 +295,7 @@ SX_LIB_API void SGCore_OnResetDevice() g_pFPStext->OnResetDevice(); g_pManagerRenderTargets->OnResetDevice(); + g_pOC->onResetDevice(g_oD3DAPP.BackBufferWidth, g_oD3DAPP.BackBufferHeight); struct VERTEX_SCREEN_TEXTURE { float x, y, z, tx, ty, tz; }; @@ -437,6 +316,8 @@ SX_LIB_API void SGCore_OnResetDevice() memcpy(pVertices, aVertices, sizeof(aVertices)); g_pScreenTexture->UnlockVertexBuffer(); } + + gcore_data::rt_id::iHowAdaptedLum = 0; } SX_LIB_API void SGCore_ScreenQuadDraw() @@ -450,919 +331,103 @@ SX_LIB_API void SGCore_ScreenQuadDraw() SX_LIB_API void SGCore_DIP(UINT uiTypePrimitive, long lBaseVertexIndex, UINT uiMinVertexIndex, UINT uiNumVertices, UINT uiStartIndex, UINT uiPrimitiveCount) { SG_PRECOND(_VOID); - FuncDIP(uiTypePrimitive, lBaseVertexIndex, uiMinVertexIndex, uiNumVertices, uiStartIndex, uiPrimitiveCount); + g_fnDIP(uiTypePrimitive, lBaseVertexIndex, uiMinVertexIndex, uiNumVertices, uiStartIndex, uiPrimitiveCount); } SX_LIB_API void SGCore_MtlSet(ID id, float4x4 *pWorld) { SG_PRECOND(_VOID); - FuncMtlSet(id, pWorld); + g_fnMtlSet(id, pWorld); } SX_LIB_API ID SGCore_MtlLoad(const char *szName, int iMtlType) { SG_PRECOND(-1); - return FuncMtlLoad(szName, iMtlType); + return g_fnMtlLoad(szName, iMtlType); } SX_LIB_API int SGCore_MtlGetSort(ID id) { SG_PRECOND(-1); - return FuncMtlGetSort(id); + return g_fnMtlGetSort(id); } SX_LIB_API int SGCore_MtlGetPhysicType(ID id) { SG_PRECOND(-1); - return FuncMtlGetPhysicType(id); + return g_fnMtlGetPhysicType(id); } SX_LIB_API bool SGCore_MtlGroupRenderIsSingly(ID id) { SG_PRECOND(false); - return FuncMtlGroupRenderIsSingly(id); + return g_fnMtlGroupRenderIsSingly(id); } SX_LIB_API void SGCore_SetFunc_DIP(g_func_dip fnFunc) { SG_PRECOND(_VOID); - FuncDIP = fnFunc; + g_fnDIP = fnFunc; } SX_LIB_API void SGCore_SetFunc_MtlSet(g_func_mtl_set fnFunc) { SG_PRECOND(_VOID); - FuncMtlSet = fnFunc; + g_fnMtlSet = fnFunc; } SX_LIB_API void SGCore_SetFunc_MtlLoad(g_func_mtl_load fnFunc) { SG_PRECOND(_VOID); - FuncMtlLoad = fnFunc; + g_fnMtlLoad = fnFunc; } SX_LIB_API void SGCore_SetFunc_MtlGetSort(g_func_mtl_get_sort fnFunc) { SG_PRECOND(_VOID); - FuncMtlGetSort = fnFunc; + g_fnMtlGetSort = fnFunc; } SX_LIB_API void SGCore_SetFunc_MtlGetPhysicType(g_func_mtl_get_physic_type fnFunc) { SG_PRECOND(_VOID); - FuncMtlGetPhysicType = fnFunc; + g_fnMtlGetPhysicType = fnFunc; } SX_LIB_API void SGCore_SetFunc_MtlGroupRenderIsSingly(g_func_mtl_group_render_is_singly fnFunc) { SG_PRECOND(_VOID); - FuncMtlGroupRenderIsSingly = fnFunc; + g_fnMtlGroupRenderIsSingly = fnFunc; } //########################################################################## -//! ��������� ���������� ����� ��� ����� occlusion culling -const float3 g_cvOCext(0.05f, 0.05f, 0.05f); - SX_LIB_API void SGCore_OC_SetEnable(bool isEnable) { - SG_PRECOND(_VOID); - g_isOCenable = isEnable; + SG_PRECOND_SKY_OC(_VOID); + g_pOC->setEnable(isEnable); } -const IFrustum *g_pFrustum = 0; -int g_iOCcountFC = 0; -int g_iOCcountFCfail = 0; - SX_LIB_API void SGCore_OC_Update(ID idDepthMap, const IFrustum *pFrustum) { - SG_PRECOND(_VOID); - - if (!g_isOCenable) - return; - - g_pFrustum = pFrustum; - g_iOCcountFC = 0; - g_iOCcountFCfail = 0; - - - static const float *r_near = GET_PCVAR_FLOAT("r_near"); - static const float *r_far = GET_PCVAR_FLOAT("r_far"); - - // ���� ��� ������ ���������� ��������� ������ ���-�� �� ��� - if (!r_near || !r_far) - { - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_near or r_far is not found!", GEN_MSG_LOCATION); - return; - } - - static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); - - //���� ��� ����� fov ������ ���-�� �� ��� - if (!r_default_fov) - { - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_default_fov is not found!", GEN_MSG_LOCATION); - return; - } + SG_PRECOND_SKY_OC(_VOID); - g_fOCbiasDEpth = 1.f / (*r_far); - - /*float fWidth = g_oD3DAPP.BackBufferWidth * OC_SIZE_COEF; - float fHeight = g_oD3DAPP.BackBufferHeight * OC_SIZE_COEF;*/ - - IDirect3DTexture9 *pTexDepth = SGCore_RTGetTexture(idDepthMap); - IDirect3DTexture9 *pTexDepthOC = SGCore_RTGetTexture(RT_DepthOC[g_iOCcurrDepth]); - - //������ ������� � ������������ �������� � ����������� ����� - g_pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - g_pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - g_pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - g_pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - LPDIRECT3DSURFACE9 RenderSurf2, BackBuf2; - - pTexDepthOC->GetSurfaceLevel(0, &RenderSurf2); - g_pDXDevice->GetRenderTarget(0, &BackBuf2); - g_pDXDevice->SetRenderTarget(0, RenderSurf2); - - SGCore_SetSamplerFilter(0, D3DTEXF_NONE); - SGCore_SetSamplerAddress(0, D3DTADDRESS_CLAMP); - - g_pDXDevice->SetTexture(0, pTexDepth); - - SGCore_ShaderBind(SHADER_TYPE_VERTEX, VS_ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, PS_FindMax9); - - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_FindMax9, "g_vPixelSize", (&float2(1.f / float(g_oD3DAPP.BackBufferWidth), 1.f / float(g_oD3DAPP.BackBufferHeight)))); - - SGCore_ScreenQuadDraw(); - - SGCore_ShaderUnBind(); - - g_pDXDevice->SetRenderTarget(0, BackBuf2); - - mem_release(RenderSurf2); - mem_release(BackBuf2); - - //********************************************************************** - - //�������� ������������ ������� � ������ - LPDIRECT3DSURFACE9 pDepthSurf; - - int iCurrOld = 1 - g_iOCcurrDepth; - - pTexDepthOC = SGCore_RTGetTexture(RT_DepthOC[g_iOCcurrDepth]); - - pTexDepthOC->GetSurfaceLevel(0, &pDepthSurf); - g_pDXDevice->GetRenderTargetData(pDepthSurf, g_pOCsurfDepthBuffer[g_iOCcurrDepth]); - - D3DLOCKED_RECT srect; - g_pOCsurfDepthBuffer[iCurrOld]->LockRect(&srect, 0, D3DLOCK_READONLY | D3DLOCK_DONOTWAIT); - - memcpy(g_pOCarrDepthBuffer, srect.pBits, sizeof(float)* g_iOCcountPixels); - g_pOCsurfDepthBuffer[iCurrOld]->UnlockRect(); - - mem_release(pDepthSurf); - - //********************************************************************** - - float fPosX = 0, fPosY = 0; - - float4 vWorldPos; - - float4x4 mView, mProjection; - Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mView); - Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &mProjection); - - float4x4 mViewProj = g_mOColdView * g_mOColdProj;// = mView * mProjection; - float fD = 0.f; - float4x4 mInvVP = SMMatrixInverse(&fD, mViewProj); - - //���� �������������� ������� ������� ������� ������� �� ������� - /*for (int i = 0; i < iCountPixels; ++i) - { - fPosY = int(float(i) / fWidth); - fPosX = int(i - (fPosY * fWidth)); - - fPosX = fPosX / fWidth; - fPosY = fPosY / fHeight; - - fPosX = 2.f * fPosX - 1.f; - fPosY = 2.f * (1.f - fPosY) - 1.f; - - vWorldPos = SMVector4Transform(float4(fPosX, fPosY, g_pOCarrDepthBuffer[i], 1.f), mInvVP); - vWorldPos /= vWorldPos.w; - g_pOCarrWorldPos[i] = vWorldPos; - - //g_pOCarrDepthBuffer[i] = (*r_near) / ((*r_far) + (*r_near) - g_pOCarrDepthBuffer[i] * ((*r_far) - (*r_near))); //vWorldPos.z / (*r_far); - }*/ - - float3 vObserverPos; - Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos); - - float fTanHalfFOV = tan((*r_default_fov) * 0.5f); - float fAspectRatio = float(g_iOCWidth) / float(g_iOCHeight); - float fFarY = fTanHalfFOV * (*r_far); - float fFarX = fFarY * fAspectRatio; - - float4 vEyeRay, vWorldRay; - float4x4 mInvView = SMMatrixInverse(&fD, g_mOColdView); - - /*for (int i = 0; i < g_iOCcountPixels; ++i) - { - //float linearDepth = (2.0 * (*r_near)) / ((*r_far) + (*r_near) - g_pArrDepthBufferOC[i] * ((*r_far) - (*r_near))); - //g_pArrDepthBufferOC[i] = linearDepth; - - fPosY = int(float(i) / g_iOCWidth); - fPosX = int(i - (fPosY * g_iOCWidth)); - - fPosX = fPosX / g_iOCWidth; - fPosY = fPosY / g_iOCHeight; - - fPosX = 2.f * fPosX - 1.f; - fPosY = 2.f * (1.f - fPosY) - 1.f; - vEyeRay = float4((fPosX)* fFarX, (fPosY)* fFarY, (*r_far), 0.f); - vWorldRay = SMVector4Transform(vEyeRay, mInvView); - - vWorldPos = float4(vObserverPos + vWorldRay * g_pOCarrDepthBuffer[i], 1.f); - g_pOCarrWorldPos[i] = vWorldPos; - int qwerty = 0; - }*/ - - float4 aWorldRays[4]; - aWorldRays[0] = SMVector4Transform(float4(-1.f * fFarX, -1.f * fFarY, (*r_far), 0.f), mInvView); - aWorldRays[1] = SMVector4Transform(float4(1.f * fFarX, -1.f * fFarY, (*r_far), 0.f), mInvView); - aWorldRays[2] = SMVector4Transform(float4(1.f * fFarX, 1.f * fFarY, (*r_far), 0.f), mInvView); - aWorldRays[3] = SMVector4Transform(float4(-1.f * fFarX, 1.f * fFarY, (*r_far), 0.f), mInvView); - - float4 vWorldRay0, vWorldRay1; - - for (int x = 0; x < g_iOCWidth; ++x) - { - vWorldRay0 = SMVectorLerp(aWorldRays[0], aWorldRays[1], float(x) / g_iOCWidth); - vWorldRay1 = SMVectorLerp(aWorldRays[3], aWorldRays[2], float(x) / g_iOCWidth); - for (int y = 0; y < g_iOCHeight; ++y) - { - int iPosPixel = (y * g_iOCWidth) + x; - vWorldRay = SMVectorLerp(vWorldRay1, vWorldRay0, float(y) / g_iOCHeight); - vWorldPos = vObserverPos + vWorldRay * g_pOCarrDepthBuffer[iPosPixel]; - vWorldPos.w = 1.f; - g_pOCarrWorldPos[iPosPixel] = vWorldPos; - } - } - - g_mOColdView = mView; - g_mOColdProj = mProjection; - - ++g_iOCcurrDepth; - - if (g_iOCcurrDepth >= 2) - g_iOCcurrDepth = 0; - - - if (GetKeyState('M')) - { - g_pOCsurfDepthBuffer[2]->LockRect(&srect, 0, D3DLOCK_READONLY); - - memcpy(srect.pBits, g_pOCarrDepthBuffer, sizeof(float) * g_iOCcountPixels); - g_pOCsurfDepthBuffer[2]->UnlockRect(); - - D3DXSaveSurfaceToFile("C:/1/g_pOCsurfDepthBuffer.jpg", D3DXIFF_JPG, g_pOCsurfDepthBuffer[2], NULL, NULL); - } + g_pOC->update(idDepthMap, pFrustum); } - -/*struct CTriV -{ - float3_t m_vA; - float3_t m_vB; - float3_t m_vC; -}; - -Array<CTriV> g_aVetrs;*/ - SX_LIB_API void SGCore_OC_Reprojection() { - SG_PRECOND(_VOID); - - if (!g_isOCenable) - return; - - /*if (GetAsyncKeyState('C')) - g_aVetrs.clear();*/ - - static const float *r_near = GET_PCVAR_FLOAT("r_near"); - static const float *r_far = GET_PCVAR_FLOAT("r_far"); - - if (!r_near || !r_far) - { - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_near or r_far is not found!", GEN_MSG_LOCATION); - return; - } - - /*float fWidth = g_oD3DAPP.BackBufferWidth * OC_SIZE_COEF; - float fHeight = g_oD3DAPP.BackBufferHeight * OC_SIZE_COEF;*/ - - float4x4 mView, mProjection; - Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mView); - Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &mProjection); - - float4x4 mViewProj = mView * mProjection; - - //int iCountPixels = fWidth * fHeight; - - float4 vNewPos; - - for (int i = 0; i < g_iOCcountPixels; ++i) - { - g_pOCarrDepthBufferReProjection[i] = 1.f; - g_pOCarrDepthBufferRasterize[i] = 1.f; - } - - float3 vObserverPos; - Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos); - - float2 vNewPos2; - - //���� ���������� ������� �������, ������ ����� ������� � screen-space � ����� ������� - for (int i = 0; i < g_iOCcountPixels; ++i) - { - vNewPos = SMVector4Transform(g_pOCarrWorldPos[i], mViewProj); - - vNewPos.x /= abs(vNewPos.w); - vNewPos.y /= abs(vNewPos.w); - vNewPos.z = (vNewPos.z + (*r_near)) / (*r_far); - /*vNewPos.x /= abs(vNewPos.w); - vNewPos.y /= abs(vNewPos.w); - vNewPos.z /= abs(vNewPos.w);*/ - - vNewPos.x = vNewPos.x * 0.5f + 0.5f; - vNewPos.y = (vNewPos.y * (-0.5f) + 0.5f); - - //������� ������� ������� ����������, ��� ����� ����� ����� ����� - - vNewPos2.x = float(int(vNewPos.x * 10000.f) / 10000.f); - vNewPos2.y = float(int(vNewPos.y * 10000.f) / 10000.f); - - if (vNewPos2.x == 0.f || vNewPos2.x == 1.f) - vNewPos.x = vNewPos2.x; - - if (vNewPos2.y == 0.f || vNewPos2.y == 1.f) - vNewPos.y = vNewPos2.y; - - //****************************************************************** - - if ((vNewPos.x <= 1.f && vNewPos.x >= 0.f) && (vNewPos.y <= 1.f && vNewPos.y >= 0.f)) - { - int x = floor(vNewPos.x * float(g_iOCWidth) + 0.5f); - int y = floor(vNewPos.y * g_iOCHeight + 0.5f); - int iPosPixel = int(y * g_iOCWidth) + x; - - if (iPosPixel > g_iOCcountPixels) - int qwerty = 0; - else - { - //���� � ������ ���������� ��� ������� ��� �������� �������, ���� ���������� ������� ������ ��� ����� - if (g_pOCarrDepthBufferReProjection[iPosPixel] >= 1.f || vNewPos.z > g_pOCarrDepthBufferReProjection[iPosPixel]) - g_pOCarrDepthBufferReProjection[iPosPixel] = vNewPos.z; - } - } - } - - - if (GetKeyState('N')) - { - D3DLOCKED_RECT srect; - g_pOCsurfDepthBuffer[2]->LockRect(&srect, 0, D3DLOCK_READONLY); - - memcpy(srect.pBits, g_pOCarrDepthBufferReProjection, sizeof(float) * g_iOCcountPixels); - g_pOCsurfDepthBuffer[2]->UnlockRect(); - D3DXSaveSurfaceToFile("C:/1/g_pSurfDepthBufferOCreproj.jpg", D3DXIFF_JPG, g_pOCsurfDepthBuffer[2], NULL, NULL); - } -} - -inline void SwapFloat3(float3 &vA, float3 &vB) -{ - float3 vV; - vV = vA; - vA = vB; - vB = vV; -} - -inline void TriGetSphere(const float3 &vA, const float3 &vB, const float3 &vC, float &fRadius, float2 &vCenter) -{ - float x12 = vA.x - vB.x; - float x23 = vB.x - vC.x; - float x31 = vC.x - vA.x; - - float y12 = vA.y - vB.y; - float y23 = vB.y - vC.y; - float y31 = vC.y - vA.y; - - float z1 = (vA.x * vA.x) + (vA.y * vA.y); - float z2 = (vB.x * vB.x) + (vB.y * vB.y); - float z3 = (vC.x * vC.x) + (vC.y * vC.y); - - float zx = y12 * z3 + y23 * z1 + y31 * z2; - float zy = x12 * z3 + x23 * z1 + x31 * z2; - float z = x12 * y31 - y12 * x31; - - vCenter.x = -(zx / (2 * z)); - vCenter.y = zy / (2 * z); - - fRadius = sqrt(pow(vA.x - vCenter.x, 2) + (vA.y - vCenter.y, 2)); -} - -inline void QuadGetSphere(const float2 &vMin, const float2 &vMax, float &fRadius, float2 &vCenter) -{ - vCenter = (vMin + vMax) / 2; - - fRadius = SMVector2Length(vCenter - vMin); -} - - -inline bool OC_TriangleRasterize(const float4 &vA, const float4 &vB, const float4 &vC, bool isRasterize, const float3 &vNormal2, const float2_t &vNearFar) -{ - if (vA.z < 0.f && vB.z < 0.f && vC.z < 0.f) - return false; - - float3 vNormal = SMVector3Normalize(SMVector3Cross(vC - vA, vB - vA)); - - float3 vPointA = vA; - float3 vPointB = vB; - float3 vPointC = vC; - - /*int iWidth = g_oD3DAPP.BackBufferWidth * OC_SIZE_COEF; - int iHeight = g_oD3DAPP.BackBufferHeight * OC_SIZE_COEF;*/ - - //int iCountPixels = iWidth * iHeight; - - //��� ���������� D ���������� ������������ ������������� ����� ������������ - float fD = -(vNormal.x * vPointA.x + vNormal.y * vPointA.y + vNormal.z * vPointA.z); - - /* - �������� ����������������� �������� ������� ����� ���: -(N.x * x + N.y * y + D) / N.z - N - ������� - x � y - ������� ���������� �� ������������ - */ - - //���������� ����� �� �������� ���������� Y - if (vPointB.y < vPointA.y) - SwapFloat3(vPointA, vPointB); - - if (vPointC.y < vPointA.y) - SwapFloat3(vPointA, vPointC); - - if (vPointB.y > vPointC.y) - SwapFloat3(vPointB, vPointC); - - - bool isVisible = false; - - //���������� ������������, �� ������ ����������� ����������, ������� ����� ����� - vPointA.y -= g_fOCextTriangle; - vPointC.y += g_fOCextTriangle; - - int iTotalHeight = vPointC.y - vPointA.y; - - if (iTotalHeight == 0) - return false; - - int iSegmentHeight = vPointB.y - vPointA.y + 1; - - if (iSegmentHeight == 0) - return false; - - int iStartY = clampf(vPointA.y, 0, g_iOCHeight - 1); - int iFinishY = clampf(vPointB.y, 0, g_iOCHeight - 1); - - for (int y = iStartY; y <= iFinishY; ++y) - { - /*if (!(y >= 0 && y <= iHeight - 1)) - continue;*/ - - float fA = (y - vPointA.y) / iTotalHeight; - float fB = (y - vPointA.y) / iSegmentHeight; - fA = vPointA.x + (vPointC.x - vPointA.x) * fA; - fB = vPointA.x + (vPointB.x - vPointA.x) * fB; - - if (fA > fB) - std::swap(fA, fB); - - fA = clampf(fA - g_fOCextTriangle, 0, g_iOCWidth - 1); - fB = clampf(fB + g_fOCextTriangle, 0, g_iOCWidth - 1); - - //� ��������� �������� � ���������� ������� �� ����, �� �������� ������� ����� ������� ���� ��������� - for (int x = fA; x <= fB; ++x) - { - /*if (x < 0 || x > iWidth - 1) - continue;*/ - - int iPosPixel = (y * g_iOCWidth) + x; - if (iPosPixel < g_iOCcountPixels) - { - float fCurrDepth = (-(vNormal.x * float(x) + vNormal.y * float(y) + fD) / vNormal.z); - - /*if (isRasterize) - g_pOCarrDepthBufferRasterize[iPosPixel] = 0;*/ - - if (fCurrDepth >= 0.f && g_pOCarrDepthBufferReProjection[iPosPixel] >= (fCurrDepth - g_fOCbiasDEpth)) - { - //if (!isRasterize) - return true; - /*else - isVisible = true;*/ - } - } - } - } - - - iSegmentHeight = vPointC.y - vPointB.y + 1; - - if (iSegmentHeight == 0) - return false; - - iStartY = clampf(vPointB.y, 0, g_iOCHeight - 1); - iFinishY = clampf(vPointC.y, 0, g_iOCHeight - 1); - - for (int y = iStartY; y <= iFinishY; ++y) - { - /*if (!(y >= 0 && y <= iHeight - 1)) - continue;*/ - - float fA = (y - vPointA.y) / iTotalHeight; - float fB = (y - vPointB.y) / iSegmentHeight; - fA = vPointA.x + (vPointC.x - vPointA.x) * fA; - fB = vPointB.x + (vPointC.x - vPointB.x) * fB; - - if (fA > fB) - std::swap(fA, fB); - - fA = clampf(fA - g_fOCextTriangle, 0, g_iOCWidth - 1); - fB = clampf(fB + g_fOCextTriangle, 0, g_iOCWidth - 1); - - //� ��������� �������� � ���������� ������� �� ����, �� �������� ������� ����� ������� ���� ��������� - for (int x = fA; x <= fB; ++x) - { - /*if (x < 0 || x > iWidth - 1) - continue;*/ - - int iPosPixel = (y * g_iOCWidth) + x; - if (iPosPixel < g_iOCcountPixels) - { - float fCurrDepth = (-(vNormal.x * float(x) + vNormal.y * float(y) + fD) / vNormal.z); - - /*if (isRasterize) - g_pOCarrDepthBufferRasterize[iPosPixel] = 0;*/ - - if (fCurrDepth >= 0.f && g_pOCarrDepthBufferReProjection[iPosPixel] >= (fCurrDepth - g_fOCbiasDEpth)) - { - //if (!isRasterize) - return true; - /*else - isVisible = true;*/ - } - } - } - } - - return isVisible; -} - -inline bool OC_RasterizeQuad(const float3 &vA, const float3 &vB, const float3 &vC, const float3 &vD, const float2 &vNearFar) -{ - float3 vNormal = TriGetNormal(vA, vB, vC); - return (OC_TriangleRasterize(vA, vB, vC, false, vNormal, vNearFar) || OC_TriangleRasterize(vB, vC, vD, false, vNormal, vNearFar)); -} + SG_PRECOND_SKY_OC(_VOID); - - -inline bool OC_FrustumCulling(const float3 &vA, const float3 &vB, const float3 &vC) -{ - if (GetAsyncKeyState('P')) - return true; - ++g_iOCcountFC; - bool isVisible = (!g_pFrustum || g_pFrustum->polyInFrustum(&vA, &vB, &vC)); - if (!isVisible) - ++g_iOCcountFCfail; - return isVisible; + g_pOC->reprojection(); } - SX_LIB_API bool SGCore_OC_IsVisible(const float3 *pMax, const float3 *pMin) { - SG_PRECOND(false); - - if (!pMax || !pMin) - { - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - min or max is null!", GEN_MSG_LOCATION); - return false; - } - - if (!g_isOCenable) - return true; - - float3 vObserverPos; - Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos); - - static const float *r_near = GET_PCVAR_FLOAT("r_near"); - static const float *r_far = GET_PCVAR_FLOAT("r_far"); - - if (!r_near || !r_far) - { - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - cvar r_near or r_far is not found!", GEN_MSG_LOCATION); - return false; - } - - float3 vMax, vMin; - vMax = *pMax; - vMin = *pMin; - - //���������� ������ � ������� �� xz ����� ���������� ��������� �� ����������� - float3 vCenter = (vMin + vMax) * 0.5f; - float fRadius = SMVector3Length2(float3(vCenter.x, 0.f, vCenter.z) - float3(vMax.x, 0, vMax.z)); - - float fDist = SMVector3Length2(vObserverPos - vCenter); - - //���� ��������� �� ���������� ������ ���� ����� ������� ����� �� xz ������ ����������� � ����� - if (fDist <= fRadius) - return true; - - fDist -= fRadius; - - //���� ���� � �������� �������� ���������� ����������� �� �����������, ������ �� ����� - if (fDist >= 0.f && fDist <= OC_DIST_NEAR_NOT_CULL*OC_DIST_NEAR_NOT_CULL) - return true; - - //��������� ����� ����� ������� ���������, ������ �� ������� ���������� �� �������� ��� ����, �������� ������ ����� ������� ������� ����������� - vMax += g_cvOCext; - vMin -= g_cvOCext; - - - /*float fWidth = g_oD3DAPP.BackBufferWidth * OC_SIZE_COEF; - float fHeight = g_oD3DAPP.BackBufferHeight * OC_SIZE_COEF; - - int iCountPixels = fWidth * fHeight;*/ - - float4x4 mWorld, mView, mProjection; - Core_RMatrixGet(G_RI_MATRIX_WORLD, &mWorld); - Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mView); - Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &mProjection); - - float4x4 mWVP = mWorld * mView *mProjection; - - - float4 aSSPoints[8]; - float4 aWPoints[8]; - aWPoints[0] = float4(vMax.x, vMax.y, vMax.z, 1.0f); - aWPoints[1] = float4(vMax.x, vMax.y, vMin.z, 1.0f); - aWPoints[2] = float4(vMax.x, vMin.y, vMax.z, 1.0f); - aWPoints[3] = float4(vMin.x, vMax.y, vMax.z, 1.0f); - aWPoints[4] = float4(vMax.x, vMin.y, vMin.z, 1.0f); - aWPoints[5] = float4(vMin.x, vMin.y, vMax.z, 1.0f); - aWPoints[6] = float4(vMin.x, vMax.y, vMin.z, 1.0f); - aWPoints[7] = float4(vMin.x, vMin.y, vMin.z, 1.0f); - - for (int i = 0; i < 8; ++i) - { - aSSPoints[i] = SMVector4Transform(aWPoints[i], mWVP); - - aSSPoints[i].x /= abs(aSSPoints[i].w); - aSSPoints[i].y /= abs(aSSPoints[i].w); - aSSPoints[i].z = ((aSSPoints[i].z + (*r_near)) / (*r_far));// *sign(aSSPoints[i].w); - - //������� �������� ������� �� ���������� - //float fLinearDepth = (*r_near) / ((*r_far) + (*r_near) - aPoints[i].w * ((*r_far) - (*r_near))); - - aSSPoints[i].x = aSSPoints[i].x * 0.5 + 0.5; - aSSPoints[i].y = aSSPoints[i].y * (-0.5) + 0.5; - - aSSPoints[i].x *= g_iOCWidth; - aSSPoints[i].y *= g_iOCHeight; - - aSSPoints[i].x = int(aSSPoints[i].x); - aSSPoints[i].y = int(aSSPoints[i].y); - - /*float2 vNewPos2; - vNewPos2.x = float(int(aPoints[i].x * 1000) / 1000.f); - vNewPos2.y = float(int(aPoints[i].y * 1000) / 1000.f); - - if (vNewPos2.x == 0.f || vNewPos2.x == 1.f) - aPoints[i].x = vNewPos2.x; - - if (vNewPos2.y == 0.f || vNewPos2.y == 1.f) - aPoints[i].y = vNewPos2.y; - - aPoints[i].x = int(floor(aPoints[i].x * fMapWidth + 0.5f)); - aPoints[i].y = int(floor(aPoints[i].y * fMapHeight + 0.5f));*/ - } - - float2 vNearFar((*r_near), (*r_far)); - - /*float3 aCenters[6]; - - //��� - aCenters[0] = (aWPoints[7] + aWPoints[1]) * 0.5f;// SMVectorLerp(aWPoints[7], aWPoints[1], 0.5f); - //����� - aCenters[1] = (aWPoints[0] + aWPoints[5]) * 0.5f;// SMVectorLerp(aWPoints[0], aWPoints[5], 0.5f); - - //���� - aCenters[2] = (aWPoints[0] + aWPoints[6]) * 0.5f;// SMVectorLerp(aWPoints[0], aWPoints[6], 0.5f); - //��� - aCenters[3] = (aWPoints[7] + aWPoints[2]) * 0.5f;// SMVectorLerp(aWPoints[7], aWPoints[2], 0.5f); + SG_PRECOND_SKY_OC(false); - //���� - aCenters[4] = (aWPoints[7] + aWPoints[3]) * 0.5f;// SMVectorLerp(aWPoints[7], aWPoints[3], 0.5f); - //����� - aCenters[5] = (aWPoints[0] + aWPoints[4]) * 0.5f;// SMVectorLerp(aWPoints[0], aWPoints[4], 0.5f); - - - float aDist2[6]; - - for (int i = 0; i < 6; ++i) - { - aDist2[i] = SMVector3Length2(aCenters[i] - vObserverPos); - }*/ - - - - //bool isVisible = ( - //(/*(aDist2[0] <= aDist2[1] || GetAsyncKeyState('F')*) &&*/ OC_RasterizeQuad(aSSPoints[6], aSSPoints[1], aSSPoints[4], aSSPoints[7], vNearFar)) || - - //(/*(aDist2[1] <= aDist2[0] || GetAsyncKeyState('F')) &&*/ OC_RasterizeQuad(aSSPoints[0], aSSPoints[3], aSSPoints[5], aSSPoints[2], vNearFar)) || - - //(/*(aDist2[2] <= aDist2[3] || GetAsyncKeyState('F')) &&*/ OC_RasterizeQuad(aSSPoints[3], aSSPoints[0], aSSPoints[1], aSSPoints[6], vNearFar)) || - - //(/*(aDist2[3] <= aDist2[2] || GetAsyncKeyState('F')) &&*/ OC_RasterizeQuad(aSSPoints[7], aSSPoints[4], aSSPoints[2], aSSPoints[5], vNearFar)) || - - //(/*(aDist2[4] <= aDist2[5] || GetAsyncKeyState('F')) &&*/ OC_RasterizeQuad(aSSPoints[3], aSSPoints[6], aSSPoints[7], aSSPoints[5], vNearFar)) || - - //(/*(aDist2[5] <= aDist2[4] || GetAsyncKeyState('F')) &&*/ OC_RasterizeQuad(aSSPoints[1], aSSPoints[0], aSSPoints[2], aSSPoints[4], vNearFar)) - //); - - /*bool isVisible = ( - ((aDist2[0] <= aDist2[1] || GetAsyncKeyState('F')) && - OC_TriangleRasterize(aSSPoints[6], aSSPoints[1], aSSPoints[4], false, aSSPoints[7], vNearFar) && - OC_TriangleRasterize(aSSPoints[6], aSSPoints[4], aSSPoints[7], false, aSSPoints[7], vNearFar)) || - - ((aDist2[1] <= aDist2[0] || GetAsyncKeyState('F')) && - OC_TriangleRasterize(aSSPoints[0], aSSPoints[3], aSSPoints[5], false, aSSPoints[2], vNearFar) && - OC_TriangleRasterize(aSSPoints[0], aSSPoints[5], aSSPoints[2], false, aSSPoints[2], vNearFar)) || - - ((aDist2[2] <= aDist2[3] || GetAsyncKeyState('F')) && - OC_TriangleRasterize(aSSPoints[3], aSSPoints[0], aSSPoints[1], false, aSSPoints[6], vNearFar) && - OC_TriangleRasterize(aSSPoints[3], aSSPoints[1], aSSPoints[6], false, aSSPoints[6], vNearFar)) || - - ((aDist2[3] <= aDist2[2] || GetAsyncKeyState('F')) && - OC_TriangleRasterize(aSSPoints[7], aSSPoints[4], aSSPoints[2], false, aSSPoints[5], vNearFar) && - OC_TriangleRasterize(aSSPoints[7], aSSPoints[2], aSSPoints[5], false, aSSPoints[5], vNearFar)) || - - ((aDist2[4] <= aDist2[5] || GetAsyncKeyState('F')) && - OC_TriangleRasterize(aSSPoints[3], aSSPoints[6], aSSPoints[7], false, aSSPoints[5], vNearFar) && - OC_TriangleRasterize(aSSPoints[3], aSSPoints[7], aSSPoints[5], false, aSSPoints[5], vNearFar)) || - - ((aDist2[5] <= aDist2[4] || GetAsyncKeyState('F')) && - OC_TriangleRasterize(aSSPoints[1], aSSPoints[0], aSSPoints[2], false, aSSPoints[4], vNearFar) && - OC_TriangleRasterize(aSSPoints[1], aSSPoints[2], aSSPoints[4], false, aSSPoints[4], vNearFar)) - );*/ - - - //��� - /*TriangleRasterize((float3)aPoints[7], (float3)aPoints[6], (float3)aPoints[1], aNormals[0], vNearFar); - TriangleRasterize((float3)aPoints[7], (float3)aPoints[1], (float3)aPoints[4], aNormals[0], vNearFar); - - //����� - TriangleRasterize((float3)aPoints[0], (float3)aPoints[5], (float3)aPoints[2], aNormals[0], vNearFar); - TriangleRasterize((float3)aPoints[0], (float3)aPoints[3], (float3)aPoints[5], aNormals[0], vNearFar); - - //---- - - //���� - TriangleRasterize((float3)aPoints[0], (float3)aPoints[1], (float3)aPoints[3], aNormals[0], vNearFar); - TriangleRasterize((float3)aPoints[1], (float3)aPoints[6], (float3)aPoints[3], aNormals[0], vNearFar); - - //��� - TriangleRasterize((float3)aPoints[5], (float3)aPoints[4], (float3)aPoints[2], aNormals[0], vNearFar); - TriangleRasterize((float3)aPoints[4], (float3)aPoints[5], (float3)aPoints[7], aNormals[0], vNearFar); - - //---- - - //���� - TriangleRasterize((float3)aPoints[0], (float3)aPoints[2], (float3)aPoints[1], aNormals[0], vNearFar); - TriangleRasterize((float3)aPoints[1], (float3)aPoints[2], (float3)aPoints[4], aNormals[0], vNearFar); - - //����� - TriangleRasterize((float3)aPoints[6], (float3)aPoints[5], (float3)aPoints[3], aNormals[0], vNearFar); - TriangleRasterize((float3)aPoints[5], (float3)aPoints[6], (float3)aPoints[7], aNormals[0], vNearFar);*/ - - //float3 aNormals[12]; - /*aNormals[0] = TriGetNormal(aWPoints[7], aWPoints[6], aWPoints[1]); - aNormals[1] = TriGetNormal(aWPoints[7], aWPoints[1], aWPoints[4]); - aNormals[2] = TriGetNormal(aWPoints[0], aWPoints[5], aWPoints[2]); - aNormals[3] = TriGetNormal(aWPoints[0], aWPoints[3], aWPoints[5]); - aNormals[4] = TriGetNormal(aWPoints[0], aWPoints[1], aWPoints[3]); - aNormals[5] = TriGetNormal(aWPoints[1], aWPoints[6], aWPoints[3]); - aNormals[6] = TriGetNormal(aWPoints[5], aWPoints[4], aWPoints[2]); - aNormals[7] = TriGetNormal(aWPoints[4], aWPoints[5], aWPoints[7]); - aNormals[8] = TriGetNormal(aWPoints[0], aWPoints[2], aWPoints[1]); - aNormals[9] = TriGetNormal(aWPoints[1], aWPoints[2], aWPoints[4]); - aNormals[10] = TriGetNormal(aWPoints[6], aWPoints[5], aWPoints[3]); - aNormals[11] = TriGetNormal(aWPoints[5], aWPoints[6], aWPoints[7]); - - float3 vObserverDir; - Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_DIRECTION, &vObserverDir);*/ - - //-13.92, 0.25, -52.76 - /*if (GetAsyncKeyState('C') - ) - { - if (aNormals[0].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[7]), float3_t(aWPoints[6]), float3_t(aWPoints[1]) }); - - if (aNormals[1].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[7]), float3_t(aWPoints[1]), float3_t(aWPoints[4]) }); - - if (aNormals[2].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[0]), float3_t(aWPoints[5]), float3_t(aWPoints[2]) }); - - if (aNormals[3].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[0]), float3_t(aWPoints[3]), float3_t(aWPoints[5]) }); - - if (aNormals[4].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[0]), float3_t(aWPoints[1]), float3_t(aWPoints[3]) }); - - if (aNormals[5].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[1]), float3_t(aWPoints[6]), float3_t(aWPoints[3]) }); - - if (aNormals[6].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[5]), float3_t(aWPoints[4]), float3_t(aWPoints[2]) }); - - if (aNormals[7].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[4]), float3_t(aWPoints[5]), float3_t(aWPoints[7]) }); - - if (aNormals[8].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[0]), float3_t(aWPoints[2]), float3_t(aWPoints[1]) }); - - if (aNormals[9].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[1]), float3_t(aWPoints[2]), float3_t(aWPoints[4]) }); - - if (aNormals[10].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[6]), float3_t(aWPoints[5]), float3_t(aWPoints[3]) }); - - if (aNormals[11].z > 0.f) - g_aVetrs.push_back({ float3_t(aWPoints[5]), float3_t(aWPoints[6]), float3_t(aWPoints[7]) }); - }*/ - - /*if (g_aVetrs.size() > 0) - { - SGCore_ShaderUnBind(); - - g_pDXDevice->SetTransform(D3DTS_WORLD, &((D3DXMATRIX)SMMatrixIdentity())); - g_pDXDevice->SetTransform(D3DTS_VIEW, &((D3DXMATRIX)mView)); - g_pDXDevice->SetTransform(D3DTS_PROJECTION, &((D3DXMATRIX)mProjection)); - g_pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - g_pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - g_pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - //g_pDXDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); - g_pDXDevice->SetTexture(0, 0); - g_pDXDevice->SetFVF(D3DFVF_XYZ); - g_pDXDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, g_aVetrs.size(), &(g_aVetrs[0]), sizeof(float3_t)); - //g_pDXDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - }*/ - - - /*bool isVisible = ( - ((SMVector3Dot(aNormals[0], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[7], aSSPoints[6], aSSPoints[1], false, vNearFar)) || - ((SMVector3Dot(aNormals[1], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[7], aSSPoints[1], aSSPoints[4], false, vNearFar)) || - ((SMVector3Dot(aNormals[2], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[5], aSSPoints[2], false, vNearFar)) || - ((SMVector3Dot(aNormals[3], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[3], aSSPoints[5], false, vNearFar)) || - ((SMVector3Dot(aNormals[4], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[1], aSSPoints[3], false, vNearFar)) || - ((SMVector3Dot(aNormals[5], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[1], aSSPoints[6], aSSPoints[3], false, vNearFar)) || - ((SMVector3Dot(aNormals[6], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[5], aSSPoints[4], aSSPoints[2], false, vNearFar)) || - ((SMVector3Dot(aNormals[7], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[4], aSSPoints[5], aSSPoints[7], false, vNearFar)) || - ((SMVector3Dot(aNormals[8], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[2], aSSPoints[1], false, vNearFar)) || - ((SMVector3Dot(aNormals[9], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[1], aSSPoints[2], aSSPoints[4], false, vNearFar)) || - ((SMVector3Dot(aNormals[10], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[6], aSSPoints[5], aSSPoints[3], false, vNearFar)) || - ((SMVector3Dot(aNormals[11], vObserverDir) <= 0.f || GetAsyncKeyState('F')) && OC_TriangleRasterize(aSSPoints[5], aSSPoints[6], aSSPoints[7], false, vNearFar)) - );*/ - - bool isVisible = ( - (OC_FrustumCulling(aWPoints[7], aWPoints[6], aWPoints[1]) && OC_TriangleRasterize(aSSPoints[7], aSSPoints[6], aSSPoints[1], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[7], aWPoints[1], aWPoints[4]) && OC_TriangleRasterize(aSSPoints[7], aSSPoints[1], aSSPoints[4], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[0], aWPoints[5], aWPoints[2]) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[5], aSSPoints[2], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[0], aWPoints[3], aWPoints[5]) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[3], aSSPoints[5], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[0], aWPoints[1], aWPoints[3]) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[1], aSSPoints[3], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[1], aWPoints[6], aWPoints[3]) && OC_TriangleRasterize(aSSPoints[1], aSSPoints[6], aSSPoints[3], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[5], aWPoints[4], aWPoints[2]) && OC_TriangleRasterize(aSSPoints[5], aSSPoints[4], aSSPoints[2], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[4], aWPoints[5], aWPoints[7]) && OC_TriangleRasterize(aSSPoints[4], aSSPoints[5], aSSPoints[7], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[0], aWPoints[2], aWPoints[1]) && OC_TriangleRasterize(aSSPoints[0], aSSPoints[2], aSSPoints[1], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[1], aWPoints[2], aWPoints[4]) && OC_TriangleRasterize(aSSPoints[1], aSSPoints[2], aSSPoints[4], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[6], aWPoints[5], aWPoints[3]) && OC_TriangleRasterize(aSSPoints[6], aSSPoints[5], aSSPoints[3], false, aSSPoints[0], vNearFar)) || - (OC_FrustumCulling(aWPoints[5], aWPoints[6], aWPoints[7]) && OC_TriangleRasterize(aSSPoints[5], aSSPoints[6], aSSPoints[7], false, aSSPoints[0], vNearFar)) - ); - - return isVisible; + return g_pOC->comVisible(pMax, pMin); } //########################################################################## diff --git a/source/gcore/sxgcore.h b/source/gcore/sxgcore.h index 89e642eb8c9e95b48011cd64759880d47b4ae4bc..72730412f59998c0a69886f9a3cf05fa23506c3b 100644 --- a/source/gcore/sxgcore.h +++ b/source/gcore/sxgcore.h @@ -221,6 +221,60 @@ SX_LIB_API bool SGCore_MtlGroupRenderIsSingly(ID id); //!@} +//############################################################################# + +/*! \defgroup sxgcore_ds Render targets для deferred shading +\ingroup sxgcore +@{*/ + +//! типы render targets +enum DS_RT +{ + //! цвет rgba8 + DS_RT_COLOR = 0, + + //! нормали (включая микрорельеф) rfb10a2 + DS_RT_NORMAL, + + //! параметры освещения rgba8 + DS_RT_PARAM, + + //! глубина r16f, непрозрачные материалы + DS_RT_DEPTH, + + //! глубина r16f, непрозрачные материалы + DS_RT_DEPTH0, + + //! глубина r16f, непрозрачные и полупрозрачные пиксели, однако прозрачные (если есть) будут перекрывать непрозрачные, и в этом случае их глубина будет 1 то есть максимальной(для идентификации) + DS_RT_DEPTH1, + + + //! эмбиент цвет (цвет света rgb) и диффузное освещение (a) rgba16f + DS_RT_AMBIENTDIFF, + + //! блики r16f + DS_RT_SPECULAR, + + //! освещенная сцена rgba16 + DS_RT_SCENELIGHT, + + //! освещенная сцена rgba16 + DS_RT_SCENELIGHT2, + + //! текущий rt адаптации глаза к освещению r16f + DS_RT_ADAPTEDLUM +}; + +//! id render target по его типу +SX_LIB_API ID SGCore_GbufferGetRT_ID(DS_RT type); + +//! текстура render target по его типу +SX_LIB_API IDirect3DTexture9* SGCore_GbufferGetRT(DS_RT type); + +SX_LIB_API void SGCore_ToneMappingCom(DWORD timeDelta, float factor_adapted); + +//!@} sxgcore_ds + //########################################################################## /*! \name Переопределение функций diff --git a/source/geom/green.cpp b/source/geom/green.cpp index 4caab1a4af6999208bb766ba5883a3cd769e9344..1c6da9e5cc65fd8078751a0ebb65cc8718f79a7d 100644 --- a/source/geom/green.cpp +++ b/source/geom/green.cpp @@ -1201,6 +1201,10 @@ void CGreen::genByTex(CStaticGeom* geom, CModel* model, ID idmask, float3* min, float3 tmppos2; bool isintersect; + float3 vGeomMin, vGeomMax; + SGeom_ModelsGetMinMax(&vGeomMin, &vGeomMax); + float3 vPosMin = vGeomMin; + for (DWORD x = 0; x<desc.Width; ++x) { for (DWORD y = 0; y<desc.Height; ++y) @@ -1242,7 +1246,11 @@ void CGreen::genByTex(CStaticGeom* geom, CModel* model, ID idmask, float3* min, } if (isintersect) - isintersect = geom->getIntersectedRayY(&tmppos2); + { + vPosMin.x = tmppos2.x; + vPosMin.z = tmppos2.z; + isintersect = g_fnIntersect(&tmppos2, &vPosMin, &tmppos2); + } if (isintersect) { diff --git a/source/geom/green.h b/source/geom/green.h index 0b26a908c6bce6db995f6005570b976cf4de7897..36856e7819c7f0ce313262076e97bf6bbce48c11 100644 --- a/source/geom/green.h +++ b/source/geom/green.h @@ -18,6 +18,8 @@ See the license in LICENSE #include "static_geom.h" #include "sxgeom.h" +extern g_phy_intersect g_fnIntersect; + //########################################################################## #define GREEN_PRECOND_ARRCOMFOR_ERR_ID(id_arr) \ diff --git a/source/geom/static_geom.cpp b/source/geom/static_geom.cpp index 570c7c3e31c5f995a3b065343f4d34a7166777ce..c42ab0214ce05620069554fb703fa996e3451b1f 100644 --- a/source/geom/static_geom.cpp +++ b/source/geom/static_geom.cpp @@ -2692,7 +2692,7 @@ void CStaticGeom::sortGroup(const float3* viewpos, int sort_mtl) } -void CStaticGeom::getIntersectedRayY2(float3* pos, CSegment** arrsplits, int *count, CSegment* comsegment, ID curr_splits_ids_render) +/*void CStaticGeom::getIntersectedRayY2(float3* pos, CSegment** arrsplits, int *count, CSegment* comsegment, ID curr_splits_ids_render) { float3 jmin, jmax; comsegment->m_pBoundVolumeP->getMinMax(&jmin, &jmax); @@ -2717,9 +2717,9 @@ void CStaticGeom::getIntersectedRayY2(float3* pos, CSegment** arrsplits, int *co } } } -} +}*/ -bool CStaticGeom::getIntersectedRayY(float3* pos) +/*bool CStaticGeom::getIntersectedRayY(float3* pos) { D3DXVECTOR3 jpos; float3 jvec0, jvec1, jvec2; @@ -2742,8 +2742,8 @@ bool CStaticGeom::getIntersectedRayY(float3* pos) { for (DWORD group = 0; group<m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_uiCountSubSet; group++) { - /*if (m_aAllGroups[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroup[group]]->m_iSortGroup > 0) - continue;*/ + //if (m_aAllGroups[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroup[group]]->m_iSortGroup > 0) + //continue; ID idbuff = m_aAllModels[id]->m_aSubSets[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroupModel[group]].m_idBuff; ID idgroup = m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroup[group]; @@ -2756,14 +2756,7 @@ bool CStaticGeom::getIntersectedRayY(float3* pos) { Dist = -1000.f; //находим все 3 вершины - /*jvec0 = ArrMeshVertex2[m_aArrComFor[1].arr[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly]]; - jvec1 = ArrMeshVertex2[m_aArrComFor[1].arr[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly + 1]]; - jvec2 = ArrMeshVertex2[m_aArrComFor[1].arr[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly + 2]];*/ - //jvec0 = m_aAllGroups[idgroup]->VertexBufferOrigin[idbuff]->arr[m_aArrComFor[1]->arr[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly]]; - //jvec1 = m_aAllGroups[idgroup]->VertexBufferOrigin[idbuff]->arr[m_aArrComFor[1]->arr[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly + 1]]; - //jvec2 = m_aAllGroups[idgroup]->VertexBufferOrigin[idbuff]->arr[m_aArrComFor[1]->arr[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly + 2]]; - jvec0 = pData[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly]].Pos; jvec1 = pData[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly + 1]].Pos; jvec2 = pData[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_ppArrPoly[group][numpoly + 2]].Pos; @@ -2801,7 +2794,7 @@ bool CStaticGeom::getIntersectedRayY(float3* pos) } pos->y = tmpy; return is_find; -} +}*/ void CStaticGeom::getMinMax(float3* min, float3* max) { diff --git a/source/geom/static_geom.h b/source/geom/static_geom.h index 966b6c4d0a5fd7074cfe3054019a6eb79c5144ab..f488506b92fceacf4ea24d23d106b56d0484c12d 100644 --- a/source/geom/static_geom.h +++ b/source/geom/static_geom.h @@ -356,7 +356,7 @@ public: int getCountModel(); void comArrIndeces(const IFrustum *pFrustum, const float3 *pViewPos, ID idArr = 0); - bool getIntersectedRayY(float3 *pPos); + //bool getIntersectedRayY(float3 *pPos); bool sortExistsForRender(int iSortMtl, ID idArr = 0); diff --git a/source/geom/sxgeom.cpp b/source/geom/sxgeom.cpp index 500fb5749a59a7c8ef1baf7b065e6c66ad4cbb3d..31f9fb71e78ba652a7d6c6e67e506b040b04f4aa 100644 --- a/source/geom/sxgeom.cpp +++ b/source/geom/sxgeom.cpp @@ -400,6 +400,18 @@ SX_LIB_API bool SGeom_ModelsTraceBeam(const float3 *pStart, const float3 *pDir, //########################################################################## +bool StdFuncIntersect(const float3 *pStart, const float3 *pEnd, float3 *pResult) +{ + return false; +} + +g_phy_intersect g_fnIntersect = StdFuncIntersect; + +SX_LIB_API void SGeom_GreenSetFncIntersect(g_phy_intersect fnFunc) +{ + g_fnIntersect = fnFunc; +} + SX_LIB_API ID SGeom_GreenAddGreen( const char *szName, const char *szPathMask, diff --git a/source/geom/sxgeom.h b/source/geom/sxgeom.h index 818c29a060972a7707b5f1e1c193917c072ed7ac..6ed5f3f42d7ff7de225da9215df0990032daf470 100644 --- a/source/geom/sxgeom.h +++ b/source/geom/sxgeom.h @@ -405,6 +405,10 @@ SX_LIB_API bool SGeom_ModelsTraceBeam( #define GREEN_GEN_RAND_SCALE 1.f /*!< рандомный масштаб модели при генерации (0, 1 + GREEN_GEN_RAND_SCALE) */ #define GREEN_GEN_RAND_ROTATE_Y SM_2PI /*!< рандомный поворот (в радианах) модели при генерации (0, 1 + GREEN_GEN_RAND_ROTATE_Y) */ +typedef bool(*g_phy_intersect)(const float3 *pStart, const float3 *pFinish, float3 *pResult); + +SX_LIB_API void SGeom_GreenSetFncIntersect(g_phy_intersect fnFunc); + //! типы растительности enum GREEN_TYPE { diff --git a/source/level/level.cpp b/source/level/level.cpp index 4b12ab34a07277ed3fa7cb0e0a85ae0acc3d246c..141bc9ded94af60c440083b0e3271fff91f72fc5 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -34,7 +34,7 @@ void CLevel::clear() SGeom_ModelsClear(); SGeom_GreenClear(); - SML_LigthsClearIDArr(); + SLight_ClearIDArr(); //SXGame_UnloadObjLevel(); Core_0ConsoleExecCmd("ent_unload_level"); @@ -189,14 +189,14 @@ void CLevel::load(const char *szName, bool isGame) SGeom_ModelsGetMinMax(&vMin, &vMax); SGCore_SkyCloudsSetWidthHeightPos((vMax.x - vMin.x) * 2.f, (vMax.z - vMin.z) * 2.f, &float3((vMax + vMin) * 0.5)); - ID gid = SML_LigthsCreatePoint( + ID gid = SLight_CreatePoint( &float3(60, 60, 0), 0, &float3(1, 1, 1), true, true); - SML_LigthsSetEnable(gid, true); - SML_LigthsSetName(gid, "sun"); + SLight_SetEnable(gid, true); + SLight_SetName(gid, "sun"); } } @@ -235,7 +235,7 @@ void CLevel::save(const char *szName) SGeom_GreenSave(tmppathlevel); } - if (SML_LigthsGetGlobal() > 0) + if (SLight_GetGlobal() > 0) fprintf(file, "type = outdoor\n"); else fprintf(file, "type = indoor\n"); diff --git a/source/level/weather.cpp b/source/level/weather.cpp index dddc24a338ba84b0fc1415b32f3e927d02b7aebc..aabd62da45265a33612c7f425d62f5318eae36b9 100644 --- a/source/level/weather.cpp +++ b/source/level/weather.cpp @@ -174,8 +174,8 @@ CWeather::CWeather() } m_ulTimeBoltNext = m_ulTimeBoltLast = 0; - m_idLightThunderbolt = SML_LigthsCreatePoint(&float3(0, 0, 0), 200, &float3(1, 1, 1), false, true); - SML_LigthsSetEnable(m_idLightThunderbolt, false); + m_idLightThunderbolt = SLight_CreatePoint(&float3(0, 0, 0), 200, &float3(1, 1, 1), false, true); + SLight_SetEnable(m_idLightThunderbolt, false); m_idSndRain = SSCore_SndCreate2d("nature/rain.ogg", SX_SOUND_CHANNEL_GAME, true); m_idSndThunder = SSCore_SndCreate2d("nature/thunder.ogg", SX_SOUND_CHANNEL_GAME); @@ -185,7 +185,7 @@ CWeather::CWeather() CWeather::~CWeather() { m_aTimeSections.clear(); - SML_LigthsDeleteLight(m_idLightThunderbolt); + SLight_DeleteLight(m_idLightThunderbolt); SSCore_SndDelete(m_idSndRain); SSCore_SndDelete(m_idSndThunder); } @@ -217,7 +217,7 @@ void CWeather::load(const char *szPath) SSCore_SndStop(m_idSndRain); SPE_EffectEnableSet(m_idEffThunderbolt, false); - SML_LigthsSetEnable(m_idLightThunderbolt, false); + SLight_SetEnable(m_idLightThunderbolt, false); SSCore_SndStop(m_idSndThunder); m_aTimeSections.clear(); @@ -562,7 +562,7 @@ void CWeather::update() if (m_isPlaying) m_RndSnd.update(); - ID gid = SML_LigthsGetGlobal(); + ID gid = SLight_GetGlobal(); static const float * env_weather_snd_volume = GET_PCVAR_FLOAT("env_weather_snd_volume"); @@ -631,10 +631,10 @@ void CWeather::update() if (gid >= 0) { //установка/сброс состояния включения - SML_LigthsSetEnable(gid, pStrSunTex[0] != '0'); + SLight_SetEnable(gid, pStrSunTex[0] != '0'); //установка/сброс состояния "все в тени от глобального источника" - SML_LigthsSetCastGlobalShadow(pStrSunTex[0] == '1'); + SLight_SetCastGlobalShadow(pStrSunTex[0] == '1'); } m_hasUpdate = true; @@ -720,14 +720,14 @@ void CWeather::update() tmp_scolor.x = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_vSunColor.x, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vSunColor.x, lerp_factor); tmp_scolor.y = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_vSunColor.y, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vSunColor.y, lerp_factor); tmp_scolor.z = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_vSunColor.z, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vSunColor.z, lerp_factor); - SML_LigthsSetColor(gid, &tmp_scolor); + SLight_SetColor(gid, &tmp_scolor); //позици¤ солнца float3 tmp_spos; tmp_spos.x = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_vSunPos.x, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vSunPos.x, lerp_factor); tmp_spos.y = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_vSunPos.y, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vSunPos.y, lerp_factor); tmp_spos.z = 0; - SML_LigthsSetPos(gid, &tmp_spos, false); + SLight_SetPos(gid, &tmp_spos, false); } //дальность видимости @@ -774,8 +774,8 @@ void CWeather::update() float3 tpos = float3(randf(m_vBoltMin.x, m_vBoltMax.x), randf(m_vBoltMin.y, m_vBoltMax.y), randf(m_vBoltMin.z, m_vBoltMax.z)); SPE_EffectPosSet(m_idEffThunderbolt, &tpos); SPE_EffectEnableSet(m_idEffThunderbolt, true); - SML_LigthsSetPos(m_idLightThunderbolt, &tpos, false); - SML_LigthsSetEnable(m_idLightThunderbolt, true); + SLight_SetPos(m_idLightThunderbolt, &tpos, false); + SLight_SetEnable(m_idLightThunderbolt, true); m_ulTimeBoltLight = TimeGetMls(Core_RIntGet(G_RI_INT_TIMER_RENDER)); } else @@ -803,7 +803,7 @@ void CWeather::update() if (m_ulTimeBoltLight > 0 && TimeGetMls(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - m_ulTimeBoltLight > WEATHER_THUNDERBOLT_LIGHT_TIME) { m_ulTimeBoltLight = 0; - SML_LigthsSetEnable(m_idLightThunderbolt, false); + SLight_SetEnable(m_idLightThunderbolt, false); //и заодно проиграть звук молнии SSCore_SndSetPosPlay(m_idSndThunder, 0); diff --git a/source/mtllight/light.cpp b/source/light/light.cpp similarity index 87% rename from source/mtllight/light.cpp rename to source/light/light.cpp index bb8055222d30422112308bdfd023051800522621..c77a78961059c99b98ab7bfc1ddb4023fe429569 100644 --- a/source/mtllight/light.cpp +++ b/source/light/light.cpp @@ -1328,7 +1328,7 @@ void CLights::shadowSoft(bool randomsam, float size, bool isfirst) SGCore_SetSamplerFilter(1, D3DTEXF_POINT); SGCore_SetSamplerAddress(1, D3DTADDRESS_CLAMP); - MLSet::DXDevice->SetTexture(0,SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene)); + MLSet::DXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_DEPTH)); if(HowShadow == 0) MLSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(ShadowMap)); @@ -1374,128 +1374,6 @@ void CLights::shadowSoft(bool randomsam, float size, bool isfirst) HowShadow = 1; } -void CLights::toneMappingCom(DWORD timeDelta, float factor_adapted) -{ - static const int *r_win_width = GET_PCVAR_INT("r_win_width"); - static const int *r_win_height = GET_PCVAR_INT("r_win_height"); - - MLSet::GetArrDownScale4x4(*r_win_width, *r_win_height, MLSet::HDRSampleOffsets); - - LPDIRECT3DSURFACE9 SurfSceneScale, BackBuf; - - SGCore_RTGetTexture(MLSet::IDsRenderTargets::LigthComScaled)->GetSurfaceLevel(0, &SurfSceneScale); - - MLSet::DXDevice->GetRenderTarget(0, &BackBuf); - MLSet::DXDevice->SetRenderTarget(0, SurfSceneScale); - - SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative, "g_aOffsets", &(MLSet::HDRSampleOffsets)); - - MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::LigthCom)); - SGCore_ScreenQuadDraw(); - - SGCore_ShaderUnBind(); - - mem_release(SurfSceneScale); - - MLSet::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED); - int CurrTexture = MLSet::IDsRenderTargets::CountArrToneMaps - 1; - - for (int i = 0; i < MLSet::IDsRenderTargets::CountArrToneMaps; i++) - { - IDirect3DTexture9* tmptex = SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[i]); - IDirect3DSurface9* tmpsurf = MLSet::IDsRenderTargets::SurfToneMap[i]; - SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[i])->GetSurfaceLevel(0, &MLSet::IDsRenderTargets::SurfToneMap[i]); - int qwert = 0; - } - - D3DSURFACE_DESC desc; - SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[CurrTexture])->GetLevelDesc(0, &desc); - - MLSet::GetArrDownScale4x4(desc.Width, desc.Height, MLSet::HDRSampleOffsets); - - MLSet::DXDevice->SetRenderTarget(0, MLSet::IDsRenderTargets::SurfToneMap[CurrTexture]); - MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::LigthComScaled)); - MLSet::DXDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - MLSet::DXDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - MLSet::DXDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - MLSet::DXDevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - - SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumInit); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumInit, "g_aOffsets", &(MLSet::HDRSampleOffsets)); - - SGCore_ScreenQuadDraw(); - - SGCore_ShaderUnBind(); - mem_release(MLSet::IDsRenderTargets::SurfToneMap[CurrTexture]); - - --CurrTexture; - - - - while (CurrTexture >= 0) - { - SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[CurrTexture + 1])->GetLevelDesc(0, &desc); - MLSet::GetArrDownScale4x4(desc.Width, desc.Height, MLSet::HDRSampleOffsets); - - MLSet::DXDevice->SetRenderTarget(0, MLSet::IDsRenderTargets::SurfToneMap[CurrTexture]); - MLSet::DXDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - MLSet::DXDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - - SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative, "g_aOffsets", &(MLSet::HDRSampleOffsets)); - - MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[CurrTexture + 1])); - SGCore_ScreenQuadDraw(); - - SGCore_ShaderUnBind(); - CurrTexture--; - } - - IDirect3DTexture9* tmptex = SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[3]); - - for (int i = 0; i < MLSet::IDsRenderTargets::CountArrToneMaps-1; i++) - { - IDirect3DSurface9* tmpsurf = MLSet::IDsRenderTargets::SurfToneMap[i]; - mem_release(MLSet::IDsRenderTargets::SurfToneMap[i]); - } - - tmptex = SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[3]); - - MLSet::IDsRenderTargets::IncrAdaptedLum(); - LPDIRECT3DSURFACE9 SurfAdaptedLum = NULL; - SGCore_RTGetTexture(MLSet::IDsRenderTargets::GetCurrAdaptedLum())->GetSurfaceLevel(0, &SurfAdaptedLum); - - MLSet::DXDevice->SetRenderTarget(0, SurfAdaptedLum); - MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::GetLastAdaptedLum())); - MLSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[0])); - MLSet::DXDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - MLSet::DXDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - MLSet::DXDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - MLSet::DXDevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_POINT); - - SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::CalcAdaptedLum); - - float ElapsedTime = float(timeDelta) * 0.001f * (factor_adapted * 1000.f); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::CalcAdaptedLum, "g_fElapsedTime", &(ElapsedTime)); - - SGCore_ScreenQuadDraw(); - - SGCore_ShaderUnBind(); - mem_release(SurfAdaptedLum); - - MLSet::DXDevice->SetRenderTarget(0, BackBuf); - mem_release(BackBuf); - - MLSet::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); - - -} - void CLights::set4Or3Splits(ID id, bool is4) { LIGHTS_PRE_COND_ID(id, _VOID); diff --git a/source/mtllight/light.h b/source/light/light.h similarity index 99% rename from source/mtllight/light.h rename to source/light/light.h index 2e63e57e7c178e27cd1391b6e014ef17e4f6ba55..1eeff1020b866d956c1feb673465999feaf8965c 100644 --- a/source/mtllight/light.h +++ b/source/light/light.h @@ -15,7 +15,7 @@ See the license in LICENSE #include <common/String.h> #include <d3d9.h> -#include "sxmtllight.h" +#include "sxlight.h" #include "ml_data.h" #define LIGHTS_PRE_COND_ID(id,stdval) \ diff --git a/source/mtllight/ml_data.cpp b/source/light/ml_data.cpp similarity index 95% rename from source/mtllight/ml_data.cpp rename to source/light/ml_data.cpp index dbb498e2d96ebbc974e7a0479b7dd5ef18a1a696..3f2721d720178187c5b042a0c2159100aa5911cb 100644 --- a/source/mtllight/ml_data.cpp +++ b/source/light/ml_data.cpp @@ -26,8 +26,7 @@ namespace MLSet //коэфициент размера текстур дл¤ карт глубин глобального источника света float CoefSizeDepthMapForGlobal = 1; - float2_t SizeTexReflection = float2_t(MTL_REF_TEX_SIZE, MTL_REF_TEX_SIZE); - + void ReCalcSize() { static const int *r_win_width = GET_PCVAR_INT("r_win_width"); @@ -40,7 +39,7 @@ namespace MLSet SizeTexDepthLocal.y = float(*r_win_height) * CoefSizeDepthMapForLocal; } - void GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]); + //void GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]); bool IsHalfGenPCFShadowLocal = false; @@ -48,7 +47,7 @@ namespace MLSet float3 OrientedCube[6] = { float3(1, 0, 0), float3(-1, 0, 0), float3(0, 1, 0), float3(0, -1, 0), float3(0, 0, 1), float3(0, 0, -1) }; float3 UpVectorsCube[6] = { float3(0, 1, 0), float3(0, 1, 0), float3(0, 0, -1), float3(0, 0, 1), float3(0, 1, 0), float3(0, 1, 0) }; - float2 HDRSampleOffsets[16]; + //float2 HDRSampleOffsets[16]; float4x4 RefMProjPlane; float4x4 RefMProjCube; @@ -100,9 +99,9 @@ namespace MLSet ID GenShadowCube1; ID GenShadowCube6; - ID CalcAdaptedLum; + /*ID CalcAdaptedLum; ID SampleLumInit; - ID SampleLumIterative; + ID SampleLumIterative;*/ ID ScreenOut; @@ -115,7 +114,7 @@ namespace MLSet }; }; - namespace IDsRenderTargets + /*namespace IDsRenderTargets { ID DSComLight; @@ -147,7 +146,7 @@ namespace MLSet ID LigthCom3; ID LigthComScaled; - }; + };*/ namespace IDsTexs { @@ -277,10 +276,10 @@ void MLSet::MLInit() MLSet::IDsShaders::PS::PPBlurDepthBased = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_blur_depth_based.ps", "pp_blur_depth_based.ps", SHADER_CHECKDOUBLE_PATH); MLSet::IDsShaders::PS::PPBlurDepthBasedNoise = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_blur_depth_based_noise.ps", "pp_blur_depth_based_noise.ps", SHADER_CHECKDOUBLE_PATH); - MLSet::IDsShaders::PS::CalcAdaptedLum = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pptm_calc_adapted_lum.ps", "pptm_calc_adapted_lum.ps", SHADER_CHECKDOUBLE_PATH); + /*MLSet::IDsShaders::PS::CalcAdaptedLum = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pptm_calc_adapted_lum.ps", "pptm_calc_adapted_lum.ps", SHADER_CHECKDOUBLE_PATH); MLSet::IDsShaders::PS::SampleLumInit = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pptm_lum_init.ps", "pptm_lum_init.ps", SHADER_CHECKDOUBLE_PATH); MLSet::IDsShaders::PS::SampleLumIterative = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pptm_lum_iterative.ps", "pptm_lum_iterative.ps", SHADER_CHECKDOUBLE_PATH); - + */ MLSet::IDsShaders::VS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs", SHADER_CHECKDOUBLE_PATH); MLSet::IDsShaders::PS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps", SHADER_CHECKDOUBLE_PATH); @@ -306,15 +305,15 @@ void MLSet::MLInit() ////////// - float tmpcoefsizert = 1; + /*float tmpcoefsizert = 1; float2_t tmp_sizert = float2_t(float(*r_win_width) * tmpcoefsizert, (*r_win_height) * tmpcoefsizert); //цвет (текстуры) MLSet::IDsRenderTargets::ColorScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_color", tmpcoefsizert); //номрали + микрорельеф - MLSet::IDsRenderTargets::NormalScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8/*D3DFMT_A2R10G10B10*/, D3DPOOL_DEFAULT, "ds_normal", tmpcoefsizert); + MLSet::IDsRenderTargets::NormalScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_normal", tmpcoefsizert); //параметры освещени¤ - MLSet::IDsRenderTargets::ParamsScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_param", tmpcoefsizert); + /*MLSet::IDsRenderTargets::ParamsScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_param", tmpcoefsizert); MLSet::IDsRenderTargets::DepthScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "ds_depth", tmpcoefsizert); MLSet::IDsRenderTargets::DepthScene0 = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "ds_depth_0", tmpcoefsizert); @@ -352,10 +351,10 @@ void MLSet::MLInit() MLSet::IDsRenderTargets::LigthComScaled = SGCore_RTAdd(float(*r_win_width)*0.25f, float(*r_win_height)*0.25f, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcomscaled", 0.25); MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*r_win_width) / float(*r_win_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); - MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); + MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR);*/ } -void MLSet::GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]) +/*void MLSet::GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]) { if (arr == 0) return; @@ -375,4 +374,4 @@ void MLSet::GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]) ++index; } } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/source/mtllight/ml_data.h b/source/light/ml_data.h similarity index 93% rename from source/mtllight/ml_data.h rename to source/light/ml_data.h index 162c173b7aeb1f9f25407df8a679fc214d013c6c..2f06f52b495f7de146d0e5e91c4199fbc7163fb2 100644 --- a/source/mtllight/ml_data.h +++ b/source/light/ml_data.h @@ -15,7 +15,7 @@ See the license in LICENSE #include <GRegisterIndex.h> -#include "sxmtllight.h" +#include "sxlight.h" namespace MLSet { @@ -42,7 +42,7 @@ namespace MLSet void ReCalcSize(); - void GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]); + //void GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]); extern bool IsHalfGenPCFShadowLocal; @@ -51,7 +51,7 @@ namespace MLSet extern float3 OrientedCube[6]; extern float3 UpVectorsCube[6]; - extern float2 HDRSampleOffsets[16]; + //extern float2 HDRSampleOffsets[16]; extern float4x4 RefMProjPlane; extern float4x4 RefMProjCube; @@ -103,9 +103,9 @@ namespace MLSet extern ID GenShadowCube1; extern ID GenShadowCube6; - extern ID CalcAdaptedLum; + /*extern ID CalcAdaptedLum; extern ID SampleLumInit; - extern ID SampleLumIterative; + extern ID SampleLumIterative;*/ extern ID ScreenOut; @@ -118,7 +118,7 @@ namespace MLSet }; }; - namespace IDsRenderTargets + /*namespace IDsRenderTargets { extern ID DSComLight; @@ -150,7 +150,7 @@ namespace MLSet extern ID LigthCom3; extern ID LigthComScaled; - }; + };*/ namespace IDsTexs { diff --git a/source/mtllight/shadow.cpp b/source/light/shadow.cpp similarity index 98% rename from source/mtllight/shadow.cpp rename to source/light/shadow.cpp index 7f185c063a638225b81580aab30d3293497424e2..6f903017072e022687cd25e04144478153978bab 100644 --- a/source/mtllight/shadow.cpp +++ b/source/light/shadow.cpp @@ -444,8 +444,8 @@ void PSSM::genShadow(IDirect3DTexture9* shadowmap) SGCore_SetSamplerFilter2(1, 6, D3DTEXF_LINEAR); SGCore_SetSamplerAddress2(1, 6, D3DTADDRESS_CLAMP); - MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene)); - MLSet::DXDevice->SetTexture(6, SGCore_RTGetTexture(MLSet::IDsRenderTargets::NormalScene)); + MLSet::DXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_DEPTH)); + MLSet::DXDevice->SetTexture(6, SGCore_GbufferGetRT(DS_RT_NORMAL)); float4x4 aMatrixTexture[5]; @@ -775,7 +775,7 @@ void ShadowMapTech::genShadow(IDirect3DTexture9* shadowmap) SGCore_SetSamplerFilter(2, D3DTEXF_POINT); SGCore_SetSamplerAddress(2, D3DTADDRESS_WRAP); - MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene)); + MLSet::DXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_DEPTH)); float4x4 MatrixTexture; @@ -1118,7 +1118,7 @@ void ShadowMapCubeTech::genShadow(IDirect3DTexture9* shadowmap) SGCore_SetSamplerFilter(2, D3DTEXF_POINT); SGCore_SetSamplerAddress(2, D3DTADDRESS_WRAP); - MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene)); + MLSet::DXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_DEPTH)); MLSet::DXDevice->SetTexture(1, DepthMap); MLSet::DXDevice->SetTexture(2, SGCore_LoadTexGetTex(MLSet::IDsTexs::Tex_NoiseTex)); diff --git a/source/mtllight/shadow.h b/source/light/shadow.h similarity index 99% rename from source/mtllight/shadow.h rename to source/light/shadow.h index 0d0e0f6a8c79c3c0501bf6a698aecff63506f559..1de77f4ae04886246ceaea2b7f2e2c069ed99405 100644 --- a/source/mtllight/shadow.h +++ b/source/light/shadow.h @@ -14,7 +14,7 @@ See the license in LICENSE #include <common/Array.h> #include <d3d9.h> #include <gcore/sxgcore.h> -#include "sxmtllight.h" +#include "sxlight.h" #include "ml_data.h" class PSSM diff --git a/source/light/sxlight.cpp b/source/light/sxlight.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a243a170500c2eb02f347cad3fc6c830c19a27ee --- /dev/null +++ b/source/light/sxlight.cpp @@ -0,0 +1,556 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#define SXMATERIAL_LIGTH_VERSION 1 + +#include "sxlight.h" +#include "ml_data.h" + +#include "light.h" + +#if !defined(DEF_STD_REPORT) +#define DEF_STD_REPORT +report_func g_fnReportf = DefReport; +#endif + +CLights* ArrLights = 0; + +#define ML_PRECOND(retval) if(!ArrLights){LibReport(-1, "%s - sxmtlligth is not init", GEN_MSG_LOCATION); return retval;} + +//########################################################################## + +SX_LIB_API long SLight_0GetVersion() +{ + return SXMATERIAL_LIGTH_VERSION; +} + +SX_LIB_API void SLight_Dbg_Set(report_func rf) +{ + g_fnReportf = rf; +} + +SX_LIB_API void SLight_0Create(const char *szName, bool isUnic) +{ + if (szName && strlen(szName) > 1) + { + if (isUnic) + { + HANDLE hMutex = CreateMutex(NULL, FALSE, szName); + if (GetLastError() == ERROR_ALREADY_EXISTS) + { + CloseHandle(hMutex); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); + } + else + { + MLSet::MLInit(); + MLSet::ReCalcSize(); + ArrLights = new CLights(); + } + } + else + { + MLSet::MLInit(); + MLSet::ReCalcSize(); + ArrLights = new CLights(); + } + } + else + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); +} + +SX_LIB_API void SLight_AKill() +{ + mem_delete(ArrLights) +} + +SX_LIB_API void SLight_OnLostDevice() +{ + ML_PRECOND(_VOID); + ArrLights->onLostDevice(); +} + +SX_LIB_API void SLight_OnResetDevice() +{ + ML_PRECOND(_VOID); + + MLSet::ReCalcSize(); + ArrLights->onResetDevice(); +} + + + +SX_LIB_API void SLight_SettLCoefSizeDepth(float fCoef) +{ + ML_PRECOND(_VOID); + + MLSet::CoefSizeDepthMapForLocal = fCoef; + MLSet::ReCalcSize(); + SLight_OnLostDevice(); + SLight_OnResetDevice(); +} + +SX_LIB_API void SLight_SettGCoefSizeDepth(float fCoef) +{ + ML_PRECOND(_VOID); + + MLSet::CoefSizeDepthMapForGlobal = fCoef; + MLSet::ReCalcSize(); + SLight_OnLostDevice(); + SLight_OnResetDevice(); + +} + +SX_LIB_API float SLight_GettLCoefSizeDepth() +{ + ML_PRECOND(-1); + + return MLSet::CoefSizeDepthMapForLocal; +} + +SX_LIB_API float SLight_GettGCoefSizeDepth() +{ + ML_PRECOND(-1); + return MLSet::CoefSizeDepthMapForGlobal; +} + +//############################################################################# + +SX_LIB_API void SLight_Clear() +{ + ML_PRECOND(_VOID); + + ArrLights->clear(); +} + +SX_LIB_API void SLight_ClearIDArr() +{ + ML_PRECOND(_VOID); + + ArrLights->clearIDArr(); +} + +SX_LIB_API int SLight_GetCount() +{ + ML_PRECOND(-1); + + return ArrLights->getCountLights(); +} + +SX_LIB_API bool SLight_GetExists(ID id) +{ + ML_PRECOND(false); + + return ArrLights->getExists(id); +} + + +SX_LIB_API ID SLight_CreatePoint(const float3 *pCenter, float fDist, const float3 *pColor, bool isGlobal, bool isShadowed/*, const char* bound_volume*/) +{ + ML_PRECOND(-1); + return ArrLights->createPoint(-1, pCenter, fDist, pColor, isGlobal, isShadowed/*, 0*/); +} + +SX_LIB_API ID SLight_CreateDirection(const float3 *pPos, float fDist, const float3 *pColor, const SMQuaternion *qOrient, float fTopRadius, float fAngle, bool isShadow/*, const char* bound_volume*/) +{ + ML_PRECOND(-1); + return ArrLights->createDirection(-1, pPos, fDist, pColor, qOrient, fTopRadius, fAngle, isShadow/*, 0*/); +} + +SX_LIB_API void SLight_Render(ID id, DWORD timeDelta) +{ + ML_PRECOND(_VOID); + ArrLights->render(id, timeDelta); +} + +SX_LIB_API ID SLight_GetGlobal() +{ + ML_PRECOND(-1); + return ArrLights->getLightGlobal(); +} + +SX_LIB_API bool SLight_GetCastGlobalShadow() +{ + ML_PRECOND(false); + return ArrLights->getCastGlobalShadow(); +} + +SX_LIB_API void SLight_SetCastGlobalShadow(bool isShadowed) +{ + ML_PRECOND(_VOID); + return ArrLights->setCastGlobalShadow(isShadowed); +} + +SX_LIB_API void SLight_GetColor(ID id, float3 *pColor) +{ + ML_PRECOND(_VOID); + ArrLights->getLightColor(id, pColor); +} + +SX_LIB_API void SLight_SetColor(ID id, const float3 *pColor) +{ + ML_PRECOND(_VOID); + ArrLights->setLightColor(id, pColor); +} + +SX_LIB_API void SLight_GetPos(ID id, float3 *pPos, bool isGreal) +{ + ML_PRECOND(_VOID); + ArrLights->getLightPos(id, pPos, isGreal); +} + +SX_LIB_API float SLight_GetPower(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getLightPower(id); +} + +SX_LIB_API float SLight_GetDist(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getLightDist(id); +} + +SX_LIB_API void SLight_SetPos(ID id, const float3 *pPos, bool isGreal) +{ + ML_PRECOND(_VOID); + ArrLights->setLightPos(id, pPos, isGreal); +} + +SX_LIB_API void SLight_GetOrient(ID id, SMQuaternion *pQ) +{ + ML_PRECOND(_VOID); + ArrLights->getLightOrient(id, pQ); +} + +SX_LIB_API void SLight_SetOrient(ID id, const SMQuaternion *pQ) +{ + ML_PRECOND(_VOID); + ArrLights->setLightOrient(id, pQ); +} + +SX_LIB_API LTYPE_LIGHT SLight_GetType(ID id) +{ + ML_PRECOND(LTYPE_LIGHT_NONE); + return ArrLights->getLightType(id); +} + +SX_LIB_API bool SLight_ComVisibleForFrustum(ID id, const IFrustum *pFrustum) +{ + ML_PRECOND(false); + return ArrLights->comVisibleForFrustum(id, pFrustum); +} + +SX_LIB_API bool SLight_GetVisibleForFrustum(ID id) +{ + ML_PRECOND(false); + return ArrLights->getVisibleForFrustum(id); +} + +SX_LIB_API float SLight_ComDistFor(ID id, const float3 *pPos) +{ + ML_PRECOND(-1); + return ArrLights->comDistFor(id, pPos); +} + +SX_LIB_API float SLight_GetDistFor(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getDistFor(id); +} + +SX_LIB_API void SLight_ComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pPos) +{ + ML_PRECOND(_VOID); + return ArrLights->comVisibleFrustumDistFor(pFrustum, pPos); +} + +SX_LIB_API bool SLight_GetEnable(ID id) +{ + ML_PRECOND(false); + return ArrLights->getLightEnable(id); +} + +SX_LIB_API void SLight_SetEnable(ID id, bool isEnable) +{ + ML_PRECOND(_VOID); + return ArrLights->setLightEnable(id, isEnable); +} + +SX_LIB_API bool SLight_GetShadowed(ID id) +{ + ML_PRECOND(false); + return ArrLights->getLightShadowed(id); +} + +SX_LIB_API bool SLight_Get4Or3SplitsG(ID id) +{ + ML_PRECOND(0); + return ArrLights->get4Or3Splits(id); +} + +SX_LIB_API void SLight_Set4Or3SplitsG(ID id, bool is4or3) +{ + ML_PRECOND(_VOID); + + ArrLights->set4Or3Splits(id, is4or3); +} + +SX_LIB_API IDirect3DTexture9* SLight_GetShadow() +{ + ML_PRECOND(0); + return ArrLights->getShadow2(); +} + +SX_LIB_API void SLight_ShadowNull() +{ + ML_PRECOND(_VOID); + return ArrLights->shadowNull(); +} + +SX_LIB_API void SLight_ShadowRenderBegin(ID id) +{ + ML_PRECOND(_VOID); + ArrLights->shadowRenderBegin(id); +} + +SX_LIB_API void SLight_ShadowRenderEnd(ID id) +{ + ML_PRECOND(_VOID); + ArrLights->shadowRenderEnd(id); +} + +SX_LIB_API void SLight_ShadowRenderPre(ID id, int iCube) +{ + ML_PRECOND(_VOID); + ArrLights->shadowRenderPre(id, iCube); +} + +SX_LIB_API void SLight_ShadowRenderPost(ID id, int iCube) +{ + ML_PRECOND(_VOID); + ArrLights->shadowRenderPost(id, iCube); +} + +SX_LIB_API IFrustum* SLight_GetFrustum(ID id, int iHow) +{ + ML_PRECOND(0); + return ArrLights->getLightFrustum(id, iHow); +} + +SX_LIB_API void SLight_UpdateGFrustums(ID id, int iSplit, const float3 *pPos, const float3 *pDir) +{ + ML_PRECOND(_VOID); + return ArrLights->updateLightGFrustums(id, iSplit, pPos, pDir); +} + +SX_LIB_API void SLight_ShadowSetShaderOfTypeMat(ID id, int iTypeMaterial, const float4x4 *pWorld) +{ + ML_PRECOND(_VOID); + ArrLights->initShaderOfTypeMaterial(id, iTypeMaterial, pWorld); +} + +SX_LIB_API void SLight_ShadowGen(ID id) +{ + ML_PRECOND(_VOID); + ArrLights->shadowGen2(id); +} + +SX_LIB_API void SLight_ShadowSoft(bool isRandom, float fSize, bool isFirst) +{ + ML_PRECOND(_VOID); + ArrLights->shadowSoft(isRandom, fSize, isFirst); +} + + + +SX_LIB_API ID SLight_CreateCopy(ID id) +{ + ML_PRECOND(-1); + return ArrLights->createCopy(id); +} + +SX_LIB_API void SLight_DeleteLight(ID id) +{ + ML_PRECOND(_VOID); + ArrLights->deleteLight(id); +} + +SX_LIB_API char* SLight_GetName(ID id) +{ + ML_PRECOND(0); + return ArrLights->getLightName(id); +} + +SX_LIB_API void SLight_SetName(ID id, const char *szName) +{ + ML_PRECOND(_VOID); + ArrLights->setLightName(id, szName); +} + + +SX_LIB_API void SLight_SetAngle(ID id, float fAngle) +{ + ML_PRECOND(_VOID); + ArrLights->setLightAngle(id, fAngle, true); +} + +SX_LIB_API void SLight_SetTopRadius(ID id, float fTopRadius) +{ + ML_PRECOND(_VOID); + ArrLights->setLightTopRadius(id, fTopRadius); +} + +SX_LIB_API void SLight_SetDist(ID id, float fRadiusHeight, bool isCreate) +{ + ML_PRECOND(_VOID); + ArrLights->setLightDist(id, fRadiusHeight, isCreate); +} + + +SX_LIB_API float SLight_GetShadowBias(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getShadowBias(id); +} + +SX_LIB_API void SLight_SetShadowBias(ID id, float fBias) +{ + ML_PRECOND(_VOID); + return ArrLights->setShadowBias(id, fBias); +} + +SX_LIB_API void SLight_SetShadowBlurPixel(ID id, float fBlurPixel) +{ + ML_PRECOND(_VOID); + ArrLights->setShadowBlurPixel(id, fBlurPixel); +} + +SX_LIB_API float SLight_GetShadowBlurPixel(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getShadowBlurPixel(id); +} +SX_LIB_API void SLight_SetShadowLocalNear(ID id, float fNear) +{ + ML_PRECOND(_VOID); + ArrLights->setShadowLocalNear(id, fNear); +} + +SX_LIB_API float SLight_GetShadowLocalNear(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getShadowLocalNear(id); +} + +SX_LIB_API void SLight_SetShadowLocalFar(ID id, float fFar) +{ + ML_PRECOND(_VOID); + ArrLights->setShadowLocalFar(id, fFar); +} + +SX_LIB_API float SLight_GetShadowLocalFar(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getShadowLocalFar(id); +} + +SX_LIB_API void SLight_SetCubeEdgeEnable(ID id, int iEdge, bool isEnable) +{ + ML_PRECOND(_VOID); + ArrLights->setLightCubeEdgeEnable(id, iEdge, isEnable); +} + +SX_LIB_API bool SLight_GetCubeEdgeEnable(ID id, int iEdge) +{ + ML_PRECOND(false); + return ArrLights->getLightCubeEdgeEnable(id, iEdge); +} + + +SX_LIB_API float SLight_GetAngle(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getLightAngle(id); +} + +SX_LIB_API float SLight_GetTopRadius(ID id) +{ + ML_PRECOND(-1); + return ArrLights->getLightTopRadius(id); +} + +SX_LIB_API ID SLight_GetIDArr(ID id, ID idOwner, int iHow) +{ + ML_PRECOND(-1); + return ArrLights->getLightIDArr(id, idOwner, iHow); +} + +SX_LIB_API void SLight_SetIDArr(ID id, ID idOwner, int iHow, ID idArr) +{ + ML_PRECOND(_VOID); + ArrLights->setLightIDArr(id, idOwner, iHow, idArr); +} + +SX_LIB_API void SLight_SetTypeShadowed(ID id, LTYPE_SHADOW type) +{ + ML_PRECOND(_VOID); + ArrLights->setLightTypeShadowed(id, type); +} + +SX_LIB_API LTYPE_SHADOW SLight_GetTypeShadowed(ID id) +{ + ML_PRECOND(LTYPE_SHADOW_NONE); + return ArrLights->getLightTypeShadowed(id); +} + +SX_LIB_API bool SLight_CountUpdateUpdate(ID id, const float3 *pViewPos, int iHow) +{ + ML_PRECOND(false); + return ArrLights->lightCountUpdateUpdate(id, pViewPos, iHow); +} + +SX_LIB_API bool SLight_CountUpdateAllowed(ID id, int iHow) +{ + ML_PRECOND(false); + return ArrLights->lightCountUpdateAllowed(id, iHow); +} + +SX_LIB_API void SLight_CountUpdateNull(ID id) +{ + ML_PRECOND(_VOID); + ArrLights->lightCountUpdateNull(id); +} + +/*SX_LIB_API void SLight_ToneMappingCom(DWORD timeDelta, float fAdapted) +{ + ML_PRECOND(_VOID); + ArrLights->toneMappingCom(timeDelta, fAdapted); +}*/ + +SX_LIB_API int SLight_DelGetCount() +{ + ML_PRECOND(-1); + return ArrLights->delGetCount(); +} + +SX_LIB_API LTYPE_LIGHT SLight_DelGetType(ID idKey) +{ + ML_PRECOND(LTYPE_LIGHT_NONE); + return ArrLights->delGetType(idKey); +} + +SX_LIB_API void SLight_DelDel(ID idKey) +{ + ML_PRECOND(_VOID); + ArrLights->delDel(idKey); +} + +SX_LIB_API ID SLight_DelGetIDArr(ID idKey, ID idOwner, int iHow) +{ + ML_PRECOND(-1); + return ArrLights->delGetIDArr(idKey, idOwner, iHow); +} diff --git a/source/light/sxlight.h b/source/light/sxlight.h new file mode 100644 index 0000000000000000000000000000000000000000..19cbb2eeaa84aece644e5e3107eac03fb935f28c --- /dev/null +++ b/source/light/sxlight.h @@ -0,0 +1,560 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +/*! +\file +Заголовочный файл sxlight - библиотеки освещения +*/ + +/*! \defgroup sxlight sxlight - библиотека освещения +@{ +*/ + +#ifndef __SXLIGHT_H +#define __SXLIGHT_H + +#if defined(_DEBUG) +#pragma comment(lib, "sxgcore_d.lib") +#else +#pragma comment(lib, "sxgcore.lib") +#endif + +#undef SX_LIB_API +#define SX_LIB_API extern "C" __declspec (dllimport) +#include <gcore/sxgcore.h> + +#ifdef SX_DLL +#undef SX_LIB_API +#define SX_LIB_API extern "C" __declspec (dllexport) +#endif + +#include <gdefines.h> + +/*! \name Базовые функции библиотеки +@{*/ + +//! версия подсистемы +SX_LIB_API long SLight_0GetVersion(); + +//! установить функцию обработки сообщений +SX_LIB_API void SLight_Dbg_Set(report_func rf); + +//! инициализция подсистемы +SX_LIB_API void SLight_0Create( + const char *szName, //!< присваиваемое имя + bool isUnic = true //!< должна ли подсистема быть уникальной по имени + ); + +//! уничтожить подсистему +SX_LIB_API void SLight_AKill(); + +//!@} + +/*! \name Обработка потери/восстановления устройства +@{*/ + +//! вызывать при потрете устройства +SX_LIB_API void SLight_OnLostDevice(); + +//! вызывать при восстановлении устройства +SX_LIB_API void SLight_OnResetDevice(); + +//!@} + +//############################################################################# + +/*! \defgroup sxlight_light Освещение + \ingroup sxlight + \warning Обращение (идентификация) конкретного света осуществляется посредством идентификатора который выдают создающие функции: + - #SLight_CreatePoint + - #SLight_CreateDirection + Получить идентификатор уже созданного света можно, посредством ключа (key) который лежит в пределах [0, #SLight_GetCount), +передав этот ключ #SLight_GetIDOfKey, которая в случае успеха вернет идентификатор света. +@{*/ + +/*! максимальное количество обновлений статических источников света, в первый момент рендера */ +#define LIGHTS_UPDATE_MAX_COUNT_FOR_STATIC 3 + +/*! \name Дистанции (метрах) при которых будет сниженно или повышено количество отрисовок для локальных источников света +меньше #LIGHTS_UPDATE_L0_DIST - обновление будет каждый кадр\n +больше #LIGHTS_UPDATE_L2_DIST - обновления не будет +@{*/ + +#define LIGHTS_UPDATE_L0_DIST 10 +#define LIGHTS_UPDATE_L1_DIST 30 +#define LIGHTS_UPDATE_L2_DIST 70 + +//!@} + +/*! Коэфициент обновления сплитов глобального света. +Cчитается: LIGHTS_UPDATE_PSSM_SPLIT*number_split + \note Первый сплит обновляется каждый кадр, второй через кадр +*/ +#define LIGHTS_UPDATE_PSSM_SPLIT 1 + +/*! аналогичнен #LIGHTS_UPDATE_PSSM_SPLIT только для 5 сплита (для теней от облаков) */ +#define LIGHTS_UPDATE_PSSM_SPLIT_5 2 + + +/*! стандартное значение верхнего/начального радиуса для направленного света */ +#define LIGHTS_LOCAL_STD_TOP_RADIUS 0.1 + +/*! стандартное значение ближней плоскости отсечения для теней локального света */ +#define LIGHTS_LOCAL_STD_NEAR 0.1 + +/*! максимальная дистанция локального света */ +#define LIGHTS_LOCAL_MAX_DIST 200.f + + +/*! радиус глобального источника */ +#define LIGHTS_GLOBAL_STD_RADIUS 999999 + +/*! отдаленность глобального света (нужно для корректности теней), если не знаете, не трогайте */ +#define LIGHTS_POS_G_MAX 1000 + + +/*! базовое направление направленноого источника света */ +#define LIGHTS_DIR_BASE float3(0, -1, 0) + + +//! типы источников света +enum LTYPE_LIGHT +{ + //! не установленный + LTYPE_LIGHT_NONE = -1, + + //! глобальный + LTYPE_LIGHT_GLOBAL, + + //! точечный + LTYPE_LIGHT_POINT, + + //! направленный + LTYPE_LIGHT_DIR +}; + +//! типы теней источников света +enum LTYPE_SHADOW +{ + //! без теней + LTYPE_SHADOW_NONE = -1, + + //! статичные тени, тень обновляется первые несколько кадров (для корректности), далее не обновляется + LTYPE_SHADOW_STATIC, + + //! полностью динамические тени + LTYPE_SHADOW_DYNAMIC, +}; + +/*! \name Настройки размеров для теней + \note Коэфициента относительно размеров окна рендера, если 1.f то размеры экрана, если 0.5f то размеры экрана * 0.5f +@{*/ + +//! установка коэфициента для локального света +SX_LIB_API void SLight_SettLCoefSizeDepth(float fCoef); + +//! установка коэфициента для глобального света +SX_LIB_API void SLight_SettGCoefSizeDepth(float fCoef); + + +//! возвращение коэфициента для локальный свет +SX_LIB_API float SLight_GettLCoefSizeDepth(); + +//! возвращение коэфициента для глобальный свет +SX_LIB_API float SLight_GettGCoefSizeDepth(); + +//!@} + +//! очистить список света +SX_LIB_API void SLight_Clear(); + +//! очистка всех идентификаторов просчетов во всех источниках света +SX_LIB_API void SLight_ClearIDArr(); + +//! общее количество света +SX_LIB_API int SLight_GetCount(); + +//! возвращает true если свет с id существует +SX_LIB_API bool SLight_GetExists(ID id); + +//! создать точечный свет (светит во все стороны) +SX_LIB_API ID SLight_CreatePoint( + const float3 *pCenter, //!< центр света (мировая позиция) + float fDist, //!< дистанция, на которую распространяется свет + const float3 *pColor, //!< цвет в пределах 0-1 + bool isGlobal, //!< глобальный ли свет (типа солнца) + bool isShadowed //!< отбрасвыает ли тени свет + ); + +//! создать направленный свет +SX_LIB_API ID SLight_CreateDirection( + const float3 *pPos, //!< позиция света (мировая) + float fDist, //!< дистанция на которую распространяется свет + const float3 *pColor, //!< цвет + const SMQuaternion *qOrient,//!< ориентация + float fTopRadius, //!< верхний (начальный) радиус + float fAngle, //!< угол (в радианах) + bool isShadow //!< отбрасвыает ли тени свет + ); + +//! возвращает тип света +SX_LIB_API LTYPE_LIGHT SLight_GetType(ID id); + +//! создать копию объекта и вернуть на нее id +SX_LIB_API ID SLight_CreateCopy(ID id); + +//! удаление света +SX_LIB_API void SLight_DeleteLight(ID id); + +//! возвращает имя света +SX_LIB_API char* SLight_GetName(ID id); + +//! устанавливает имя света +SX_LIB_API void SLight_SetName(ID id, const char *szName); + +//! отрисовка ограничивающего объема +SX_LIB_API void SLight_Render(ID id, DWORD timeDelta); + +//! в color записывает цвет света +SX_LIB_API void SLight_GetColor(ID id, float3 *pColor); + +//! устанавливает цвет света +SX_LIB_API void SLight_SetColor(ID id, const float3 *pColor); + +//! получить в pos позицию света +SX_LIB_API void SLight_GetPos( + ID id, //!< идентификатор света + float3 *pPos, //!< инициализированный вектор в который будет записана позиция + bool isReal = false //!< true - нужны реальные координаты, false - нужны углы, только для глобального света, во всех остальных случаях не имеет смысла + ); + +//! установить позицию свету +SX_LIB_API void SLight_SetPos( + ID id, //!< идентификатор света + const float3 *pPos, //!< позиция в которую будет перемещен свет + bool isReal = false //!< true - установка реальных координат, false - установка углов, только для глобального света, во всех остальных случаях не имеет смысла + ); + +//! возвращает "значение силы света" для отправки в шейдер (максимальная компонента цвет * дистанция покрытия/#LIGHTS_LOCAL_MAX_DIST) +SX_LIB_API float SLight_GetPower(ID id); + +//! возвращает дистанцию, на которую распространяется свет +SX_LIB_API float SLight_GetDist(ID id); + +//! установка новой дистанции +SX_LIB_API void SLight_SetDist( + ID id, //!< идентификатор света + float fDist, //!< новая дистанция(радиус для точечного и высота для направленного) + bool isCreate = true //!< нужно ли пересоздание объема? (если новая дистанция больше чем текущий ограничивающий объем то надо, в других случаях по усмотрению) + ); + +//! записывает в q ориентацию света +SX_LIB_API void SLight_GetOrient(ID id, SMQuaternion *pQ); + +//! установка ориентации света +SX_LIB_API void SLight_SetOrient(ID id, const SMQuaternion *pQ); + + +//! включен ли свет с идентификатором id +SX_LIB_API bool SLight_GetEnable(ID id); + +//! установить всключен (true) или отключен (false) свет с идентификатором id +SX_LIB_API void SLight_SetEnable(ID id, bool isEnable); + +//! возвращает идентификатор глобального источника света, если он есть, иначе -1 +SX_LIB_API ID SLight_GetGlobal(); + +//! возвращает установлена ли общая тень от глобального источника (все ли в тени) +SX_LIB_API bool SLight_GetCastGlobalShadow(); + +//! установить общую тень для всего от глобального источника (все в тень) +SX_LIB_API void SLight_SetCastGlobalShadow(bool isShadowed); + +//----------------------------------------------------------------------------- + +/*! \name Управление видимостью + \note Отдельный просчет - считает индивидуально для света и тут же возвращает результат просчетов + \note Предварительный просчет - просчет для всего света (к примеру в другом потоке) +@{*/ + +//! виден ли свет в данном фрустуме (отдельный просчет) +SX_LIB_API bool SLight_ComVisibleForFrustum(ID id, const IFrustum *pFrustum); + +//! дистанция от viewpos до начала света (отдельный просчет) +SX_LIB_API float SLight_ComDistFor(ID id, const float3 *pViewPos); + +//! просчет видимости и расстояния от наблюдателя viewpos до начала света, для каждого света (предварительный просчет) +SX_LIB_API void SLight_ComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pViewPos); + + +//! виден ли свет в просчитанном фрустуме +SX_LIB_API bool SLight_GetVisibleForFrustum(ID id); + +//! просчитанная дистанция от позиции наблюдателя до начала света +SX_LIB_API float SLight_GetDistFor(ID id); + +//!@} + +//----------------------------------------------------------------------------- + +/*! \name Настройки для направленного света +@{*/ + +//! возвращает угол, актуально только для направленного и света +SX_LIB_API float SLight_GetAngle(ID id); + +//! установить угол, актуально только для направленного и света +SX_LIB_API void SLight_SetAngle(ID id, float fAngle); + +//! возвращает верхний радиус, актуально только для направленного и света +SX_LIB_API float SLight_GetTopRadius(ID id); + +//! устанавливает верхний радиус, актуально только для направленного и света +SX_LIB_API void SLight_SetTopRadius(ID id, float fTopRadius); + +//!@} + +//----------------------------------------------------------------------------- + +/*! \name Настройки для точечного света +@{*/ + +/*! установить "рисовать ли в указанную грань cubemap тени" + \warning Актуально только когда свет может отбрасывать тени + */ +SX_LIB_API void SLight_SetCubeEdgeEnable( + ID id, //!< идентификатор света + int iEdge, //!< номер стороны/грани cubemap [0,5] + bool iEnable //!< true - рисовать, false - не рисовать + ); + +//! получить текущее значение "рисовать ли в указанную грань cubemap тени" +SX_LIB_API bool SLight_GetCubeEdgeEnable( + ID id, //!< идентификатор света + int iEdge //!< номер стороны/грани cubemap [0,5] + ); + +//!@} + +//----------------------------------------------------------------------------- + +/*! \defgroup sxlight_light_shadow Управление тенями + \ingroup sxlight_light + \note Для генерации теней используется один render target full screen + \note Для сглаживания используется еще один аналогичный render target и первый render target. При сглаживании внутри меняется только счетчик, который меняет их местами + \note Так как используется всего один render target для генерации теней то есесно в текущий момент времени можно сгенерировать и сгладить тень только для одного света + \note Для теней от глобального света используется техника PSSM (Parallel-Split Shadow Mapping) на 3/4 сплита для объектов уровня (3 или 4 сплита можно настроить #SLight_Set4Or3SplitsG) + \note Для теней от локального света используется техника Shadow Mapping в двух вариациях: + - для точечного света используется cubemap + - для направленного света - обычная техника Shadow Mapping +@{*/ + +//! отбрасывает ли свет тени +SX_LIB_API bool SLight_GetShadowed(ID id); + +//! возвращает true в случае если установлено 4 сплита для PSSM, иначе (установлено 3 сплита) false +SX_LIB_API bool SLight_Get4Or3SplitsG(ID id); + +//! установка количества сплитов (false - 3, true - 4) для PSSM +SX_LIB_API void SLight_Set4Or3SplitsG(ID id, bool is4or3); + +/*! устанавливает шейдеры и передает им данные на основании типа материала, поддерживаются все типы MTL_TYPE_*/ +SX_LIB_API void SLight_ShadowSetShaderOfTypeMat(ID id, int typemat, const float4x4 *pWorld); + +/*! \name Управление обновлениями теней + \note Так как основная задумка это real-time рендер то для этого нужны упрощения, одним из таковых является обновление теней от света, которое может происходить не каждый кадр +@{*/ + +//! установка динамики обработки теней +SX_LIB_API void SLight_SetTypeShadowed( + ID id, //!< идентификатор света + LTYPE_SHADOW type //!< значение из перечисления #LTYPE_SHADOW + ); + +//! возвращает тип динамики теней (одно из значений #LTYPE_SHADOW) +SX_LIB_API LTYPE_SHADOW SLight_GetTypeShadowed(ID id); + +//! производит обработку данных затем возвращает разрешено ли обновлять тени, увеличивает внутрений счетчик, поэтому необходимо вызывать только когда надо +SX_LIB_API bool SLight_CountUpdateUpdate( + ID id, //!< идентификатор света + const float3 *pViewPos, //!< позиция камеры для которой обновляем, на основании расстояния будет произведен расчет обновления + int iHow = -1 //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного + ); + +//! разрешено ли обновлять тени, в отличии от #SLight_UpdateCountUpdate не увеличивает внутренний счетчик +SX_LIB_API bool SLight_CountUpdateAllowed( + ID id, //!< идентификатор света + int iHow = -1 //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного + ); + +//! сбросить счетчик обновлений и обновлять до предела тени +SX_LIB_API void SLight_CountUpdateNull(ID id); + +//!@} + + +/*! \name Управление циклами рендера в карты глубин + Для локального направленного света: + \code + SLight_ShadowRenderBegin(id); + //рендер того что должно отбросить тени + SLight_ShadowRenderEnd(id); + \endcode + Для глобального и точечного: + \code + SLight_ShadowRenderBegin(id); + SLight_ShadowRenderPre(id, cube); + //рендер того что должно отбросить тени + SLight_ShadowRenderPost(id, cube); + SLight_ShadowRenderEnd(id); + \endcode + Где cube для точечного это номер стороны cubemap [0-5] в которую будет осуществлен рендер, а для глобального это номер сплита. +@{*/ + +//! подготовительные процедуры +SX_LIB_API void SLight_ShadowRenderBegin(ID id); + +//! завершающие процедуры +SX_LIB_API void SLight_ShadowRenderEnd(ID id); + +//! подготовительные процедур перед рендером для сплита/стороны +SX_LIB_API void SLight_ShadowRenderPre( + ID id, //!< идентификатор света + int iCube //!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита + ); + +//! завершающие процедур перед рендером для сплита/стороны +SX_LIB_API void SLight_ShadowRenderPost( + ID id, //!< идентификатор света + int iCube //!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита + ); + +//!@} + +//! обнуление карты теней, необходимо вызывать перед генерацией теней посредством функции #SLight_GenShadow +SX_LIB_API void SLight_ShadowNull(); + +//! генерация тени на основе уже отработанной информации о затенении, перед вызовов этой функции необходимо вызывать #SLight_ShadowNull +SX_LIB_API void SLight_ShadowGen(ID id); + +//! возвращает текстуру с тенями (если вызывались функции сглаживания) то вренутся сглаженная +SX_LIB_API IDirect3DTexture9* SLight_GetShadow(); + +//! сглаживание текущей тени +SX_LIB_API void SLight_ShadowSoft( + bool isRandSam, //!< использовать ли смещение по случайному направлению + float fSize, //!< коэфициент увеличения размера пикселя для размытия + bool isFirst = false //!< впервые ли вызывается размытие для текущей тени, каждый раз когда тень еще не сглажена, но сгенерирована, нужно указывать false + ); + +//! возвращает указатель фрустума света +SX_LIB_API IFrustum* SLight_GetFrustum( + ID id, //!< идентификатор света + int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного + ); + +//! обновление фрустума глобального света +SX_LIB_API void SLight_UpdateGFrustums( + ID id, //!< идентификатор света + int iSplit, //!< номер сплита + const float3 *pPos, //!< позиция наблюдателя + const float3 *pDir //!< направление взгляда наблюдателя + ); + +/*! \name Управление настройками для генерации глубины/тени +@{*/ + +//! получить текущее смещение (bias) при генерации глубины +SX_LIB_API float SLight_GetShadowBias(ID id); + +//! установить текущее смещение (bias) при генерации глубины +SX_LIB_API void SLight_SetShadowBias(ID id, float fBias); + + +//! установить размерность размытия (в пикселя) при геренации тени +SX_LIB_API void SLight_SetShadowBlurPixel(ID id, float fBlurPixel); + +//! получить текущее значение размерности (в пикселях) при генерации тени +SX_LIB_API float SLight_GetShadowBlurPixel(ID id); + + +//! установить значение ближней плоскостью отсечения для теней (локальный свет) +SX_LIB_API void SLight_SetShadowLocalNear(ID id, float fNear); + +//! получить текущее значение ближней плоскостью отсечения для теней (локальный свет) +SX_LIB_API float SLight_GetShadowLocalNear(ID id); + +/*! установка дальней плоскостью отсечения для теней (локальный свет) + \note Иногда возникают артефакты и если отрегулировать это значение то все становится на свои места, тесты показали что в основном при ошибках, увеличение этого значения решало проблемы +*/ +SX_LIB_API void SLight_SetShadowLocalFar( + ID id, //!< идентификатор света + float fFar //!< значение дальней плоскости отсечения (дальность видимости теней), обычно это значение = дальность света + ); + +//! возвращает значение дальней плоскости отсечения (дальности видимости теней) +SX_LIB_API float SLight_GetShadowLocalFar(ID id); + +//!@} + +//----------------------------------------------------------------------------- + +/*! \name Управление массивами обработки данных для рендера (к примеру от геометрии, растительности и прочего) + Cделано для того чтобы отделить просчеты видимости (если они нужны) от рендера. + К примеру можно рассчитать видимости в одном потоке а рисовать в основном. +@{ +*/ + +//! возвращает идентификатор в случае успеха, иначе <0 +SX_LIB_API ID SLight_GetIDArr( + ID id, //!< идентификатор света + ID idOwner, //!< идентификатор объекта/системы вообще того что выдало идентификатор массива + int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного + ); + +//! установить идентификатор +SX_LIB_API void SLight_SetIDArr( + ID id, //!< идентификатор света + ID idOwner, //!< идентификатор объекта/системы вообще того что выдало идентификатор массива + int iHow, //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного + ID idArr //!< номер массива обработки от объекта который надо будет обрабатывать на видимость + ); + +//!@} + +//!@} sxlight_light_shadow + +/*! \name Функции обработки удаленного света + При удалении света он помещается в специальный массив удаленных объектов, +это связано с тем что свет может содержать в себе данные которые требуют очистки памяти вне данной реализации, +к примеру идентификаторы массивов просчетов видимости. \n + Поэтому необходимо вручную удалять (уже после удаленяи функцией #SLight_DeleteLight) удаленные объекты света. + \note Доступ к элементам массива удаленных объектов света осуществляется посредством порядкового номера в массиве (ключа key), то есть можно пройтись по массиву циклом. +@{*/ + +//! возвращает количество удаленных объектов света которые требуют удаления +SX_LIB_API int SLight_DelGetCount(); + +//! возвращает тип удаленного объекта света, значения из #LightsTypeLight +SX_LIB_API LTYPE_LIGHT SLight_DelGetType(ID key); + +//! удаляет (окончательно) удаленный объект света +SX_LIB_API void SLight_DelDel(ID key); + +//! возвращает идентификатор, если был передан, иначе <0 +SX_LIB_API ID SLight_DelGetIDArr( + ID key, //!< порядковый номер объекта света в массиве удаленного света + ID idOwner, //!< идентификатор того что выдало идентификатор массива + int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного + ); + +//!@} + +//!@} sxlight_light + +#endif + +//!@} sxlight diff --git a/source/mtllight/sxmtllight_dll.cpp b/source/light/sxlight_dll.cpp similarity index 100% rename from source/mtllight/sxmtllight_dll.cpp rename to source/light/sxlight_dll.cpp diff --git "a/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.cpp" "b/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.cpp" deleted file mode 100644 index 7a035cf3b59d4a9408218e81493e2c51918688b8..0000000000000000000000000000000000000000 --- "a/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.cpp" +++ /dev/null @@ -1,2179 +0,0 @@ - -/*********************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 -See the license in LICENSE -***********************************************************/ - -#include "material.h" - -CMaterials::CMaterials() -{ - CurrFirstFree = -1; - m_uiCountTimeDelta = 0; - m_uiCurrTimeDelta = 0; - m_useForceblyAlphaTest = false; - SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs", "mtrlgeom_base.vs", SHADER_CHECKDOUBLE_PATH); - SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps", "mtrlgeom_base.ps", SHADER_CHECKDOUBLE_PATH); - - SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs", "mtrlgreen_tree_base.vs", SHADER_CHECKDOUBLE_PATH); - SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs", "mtrlgreen_grass_base.vs", SHADER_CHECKDOUBLE_PATH); - SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps", "mtrlgreen_base.ps", SHADER_CHECKDOUBLE_PATH); - - SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlgeom_light.ps", "mtrlgeom_light.ps", SHADER_CHECKDOUBLE_PATH); - - SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlskin_base.vs", "mtrlskin_base.vs", SHADER_CHECKDOUBLE_PATH); - SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlskin_base.ps", "mtrlskin_base.ps", SHADER_CHECKDOUBLE_PATH); - - m_useCountSurface = false; - m_idCurrIdSurface = 0; - - CUnitMaterial* tmpumtl = new CUnitMaterial(); - CMaterial* tmpMtlDefaultLight = new CMaterial(); - addMaterial(tmpMtlDefaultLight); - tmpumtl->m_pMtrl = tmpMtlDefaultLight; - tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_light"; - tmpMtlDefaultLight->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs"); - tmpMtlDefaultLight->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_light.ps"); - - tmpMtlDefaultLight->m_oMainGraphics.m_idMainTexture = -1; - tmpMtlDefaultLight->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true; - - MtrlDefLight = addUnitMaterial(tmpumtl); - addName(tmpMtlDefaultLight->m_sName.c_str(), MtrlDefLight); - - - - tmpumtl = new CUnitMaterial(); - tmpMtlDefaultLight = new CMaterial(); - addMaterial(tmpMtlDefaultLight); - tmpumtl->m_pMtrl = tmpMtlDefaultLight; - tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_base"; - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs"); - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps"); - tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true; - - tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1; - tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true; - - MtrlDefStatic = addUnitMaterial(tmpumtl); - addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefStatic); - - - tmpumtl = new CUnitMaterial(); - tmpMtlDefaultLight = new CMaterial(); - addMaterial(tmpMtlDefaultLight); - tmpumtl->m_pMtrl = tmpMtlDefaultLight; - tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_tree"; - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs"); - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps"); - - tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1; - tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true; - - MtrlDefTree = addUnitMaterial(tmpumtl); - addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefTree); - - - tmpumtl = new CUnitMaterial(); - tmpMtlDefaultLight = new CMaterial(); - addMaterial(tmpMtlDefaultLight); - tmpumtl->m_pMtrl = tmpMtlDefaultLight; - tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_grass"; - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs"); - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps"); - - tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1; - tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true; - - MtrlDefGrass = addUnitMaterial(tmpumtl); - addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefGrass); - - - /*tmpumtl = new UnitMaterial(); - tmpMtlDefaultLight = new CMaterial(); - tmpumtl->m_pMtrl = tmpMtlDefaultLight; - sprintf(tmpMtlDefaultLight->Name, "%s", "mtrldef_skin"); - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(0, "mtrlskin_base.vs"); - tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(1, "mtrlskin_base.ps"); - tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true; - - tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1; - tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true; - - m_aUnitMtrls.push_back(tmpumtl); - AddName(tmpumtl->m_pMtrl->Name, m_aUnitMtrls.size() - 1); - MtrlDefSkin = m_aUnitMtrls.size() - 1;*/ - - BeginNonDef = m_aUnitMtrls.size(); -} - -CMaterials::~CMaterials() -{ - for (int i = 0; i < m_aMtrlPathes.size(); ++i) - { - for (int k = 0; k < m_aMtrlPathes[i]->m_aObjects.size(); ++k) - { - mem_delete(m_aMtrlPathes[i]->m_aObjects[k]); - } - - mem_delete(m_aMtrlPathes[i]); - } - - for (int i = 0; i < m_aUnitMtrls.size(); ++i) - { - mem_delete(m_aUnitMtrls[i]); - } - - for (int i = 0; i < m_aMtrls.size(); ++i) - { - mem_delete(m_aMtrls[i]); - } -} - -//************************************************************************** - -CMaterials::CMaterial::CMaterial() -{ - nulling(); -} - -void CMaterials::CMaterial::nulling() -{ - m_sName = ""; - - m_isDelete = false; - - m_oMainGraphics.m_idMainTexture = -1; - m_oMainGraphics.m_idShaderVS = -1; - m_oMainGraphics.m_idShaderPS = -1; - - m_oMicroDetail = CMaskDetailMicroRelief(); - m_oLightParam = CLightParam(); - - m_oMainGraphics = CMainGraphics(); - - m_oPhysics = CPhysics(); -} - -CMaterials::CMaterial::~CMaterial() -{ - if (m_oMainGraphics.m_idMainTexture >= 0) - SGCore_LoadTexDelete(m_oMainGraphics.m_idMainTexture); - - if (m_oLightParam.m_idTexParam >= 0) - SGCore_LoadTexDelete(m_oLightParam.m_idTexParam); - - if (m_oLightParam.m_idTexParamHand >= 0) - SGCore_LoadTexDelete(m_oLightParam.m_idTexParamHand); - - if (m_oMicroDetail.m_idMask >= 0) - SGCore_LoadTexDelete(m_oMicroDetail.m_idMask); - - for (int i = 0; i < 4; ++i) - { - if (m_oMicroDetail.m_aDetail[i] >= 0) - SGCore_LoadTexDelete(m_oMicroDetail.m_aDetail[i]); - - if (m_oMicroDetail.m_aMicroRelief[i] >= 0) - SGCore_LoadTexDelete(m_oMicroDetail.m_aMicroRelief[i]); - } -} - -//************************************************************************** - -CMaterials::CMaterial::CMainGraphics::CMainGraphics() -{ - m_idMainTexture = -1; - m_idShaderVS = -1; - m_idShaderPS = -1; - m_isUnlit = false; - m_useAlphaTest = false; - type_model = MTLTYPE_MODEL::MTLTYPE_MODEL_DEFAULT; - m_oDataVS = CMainGraphics::СDataShader(); - m_oDataPS = CMainGraphics::СDataShader(); - m_oDataVS.m_isTransUserDataInOtherShader = false; - m_oDataPS.m_isTransUserDataInOtherShader = false; -}; - -CMaterials::CMaterial::CMainGraphics::~CMainGraphics() -{ - -}; - -//************************************************************************** - -CMaterials::CMaterial::CMainGraphics::СDataShader::СDataShader() -{ - m_isTransWorld = false; - m_isTransView = false; - m_isTransProjection = false; - m_isTransWorldView = false; - m_isTransWorldViewProjection = false; - m_isTransPosCam = false; - m_isTransTimeDelta = false; - m_isTransUserData = false; - m_isTransWinSize = false; - m_vUserData = float4(0, 0, 0, 0); -}; - -CMaterials::CMaterial::CMainGraphics::СDataShader::~СDataShader() -{ - -}; - -//************************************************************************** - -CMaterials::CMaterial::CLightParam::CLightParam() -{ - m_idTexParam = -1; - m_idTexParamHand = -1; - - m_fRoughness = 0.f; - m_fF0 = 0.f; - m_fThickness = 1.f; - m_type_transparency = MTLTYPE_TRANSPARENCY_NONE; - - m_type_reflect = MTLTYPE_REFLECT_NONE; - m_isTextureParam = true; -} - -CMaterials::CMaterial::CLightParam::~CLightParam() -{ - -} - -//************************************************************************** - -CMaterials::CMaterial::CMaskDetailMicroRelief::CMaskDetailMicroRelief() -{ - m_idMask = -1; - m_aDetail[0] = -1; - m_aDetail[1] = -1; - m_aDetail[2] = -1; - m_aDetail[3] = -1; - - m_aMicroRelief[0] = -1; - m_aMicroRelief[1] = -1; - m_aMicroRelief[2] = -1; - m_aMicroRelief[3] = -1; -} - -CMaterials::CMaterial::CMaskDetailMicroRelief::~CMaskDetailMicroRelief() -{ - -} - -//************************************************************************** - -CMaterials::CMaterial::CPhysics::CPhysics() -{ - type_physics = MTLTYPE_PHYSIC_CONCRETE; - - m_fDurability = 10.f; - m_fHitChance = 1.f; - m_fDensity = 1000; -} - -CMaterials::CMaterial::CPhysics::~CPhysics() -{ - -} - -//************************************************************************** - -CMaterials::CUnitMaterial::CUnitMaterial() -{ - m_pMtrl = 0; - m_pReflect = 0; -} - -CMaterials::CUnitMaterial::~CUnitMaterial() -{ - m_pMtrl->m_isDelete = true; - m_pReflect = 0; - //mem_delete(Reflect); -} - -//########################################################################## - -ID CMaterials::exists(const char* name) -{ - char tmp_path[MTL_MAX_SIZE_DIR];//папка - char tmp_name[MTL_MAX_SIZE_NAME];//само имя текстыр с расширением - int id = -1; - bool IsTruePath = false; - //обрезаем имя текстуры и папку - for (int i = 0; i<strlen(name); i++) - { - if (name[i] == '_') - { - memcpy(tmp_path, name, sizeof(char)*i); - tmp_path[i] = 0; - sprintf(tmp_name, "%s", name + i + 1); - IsTruePath = true; - break; - } - } - - if (!IsTruePath) - { - return -2; - //LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", gen_msg_location, name); - } - - int tmpkey = -1; //переменная в которой храним ключ от массива в который записываем - for (int i = 0; i<m_aMtrlPathes.size(); ++i) - { - //TLPath* tmptlpath = m_aMtrlPathes[i]; - if (m_aMtrlPathes[i] && strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), tmp_path) == 0) - { - tmpkey = i; - break; - } - } - - //если мы не нашли совпадений значит путь уникален ... - if (tmpkey == -1) - { - return -1; - } - - //проверяем записано ли уже имя текстуры - for (int i = 0; i<m_aMtrlPathes[tmpkey]->m_aObjects.size(); i++) - { - if (strcmp(m_aMtrlPathes[tmpkey]->m_aObjects[i]->m_sName.c_str(), tmp_name) == 0) - { - id = m_aMtrlPathes[tmpkey]->m_aObjects[i]->m_id; - break; - } - } - - return id; -} - -ID CMaterials::addUnitMaterial(CUnitMaterial* umtl) -{ - ID tmpid = -1; - if (CurrFirstFree + 1 == m_aUnitMtrls.size()) - { - m_aUnitMtrls.push_back(umtl); - CurrFirstFree = tmpid = m_aUnitMtrls.size() - 1; - } - else - { - if (CurrFirstFree < 0 || m_aUnitMtrls[CurrFirstFree] != 0) - { - if (CurrFirstFree < 0) - CurrFirstFree = 0; - - for (int i = CurrFirstFree; i < m_aUnitMtrls.size(); ++i) - { - if (m_aUnitMtrls[i] == 0) - { - CurrFirstFree = i; - break; - } - } - } - - m_aUnitMtrls[CurrFirstFree] = umtl; - tmpid = CurrFirstFree; - ++CurrFirstFree; - } - - return tmpid; -} - -ID CMaterials::addMaterial(CMaterial* mtl) -{ - m_aMtrls.push_back(mtl); - return m_aMtrls.size() - 1; -} - -void CMaterials::addName(const char *szName, ID id) -{ - /*char tmp_path[MTL_MAX_SIZE_DIR];//папка - char tmp_name[MTL_MAX_SIZE_NAME];//само имя текстыр с расширением - - bool IsTruePath = false; - //обрезаем имя текстуры и папку - for (int i = 0; i<strlen(name); i++) - { - if (name[i] == '_') - { - memcpy(tmp_path, name, sizeof(char)*i); - tmp_path[i] = 0; - sprintf(tmp_name, "%s", name + i + 1); - IsTruePath = true; - break; - } - }*/ - - String sDir = StrSubstrSpre(szName, "_"); - String sName = StrSubstrSpost(szName, "_"); - - int tmpkey = -1; //переменная в которой храним ключ от массива в который записываем - for (int i = 0; i<m_aMtrlPathes.size(); ++i) - { - if (m_aMtrlPathes[i] && strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), sDir.c_str()) == 0) - { - tmpkey = i; - break; - } - } - - //если мы не нашли совпадений значит путь уникален ... - if (tmpkey == -1) - { - tmpkey = m_aMtrlPathes.size(); - CPath* tmpntlp = new CPath(); - m_aMtrlPathes.push_back(tmpntlp); - m_aMtrlPathes[tmpkey]->m_sPath = sDir; - } - - m_aMtrlPathes[tmpkey]->m_aObjects.push_back(new CPath::CObject(id, sName.c_str())); -} - -bool CMaterials::loadMtl(const char* name, CMaterial** mtl) -{ - char* ArrRGBA[4] = { "r", "g", "b", "a" }; - - char tmpVS[256]; - char tmpPS[256]; - - char tmpMask[256]; - char tmpMicroDiff[4][256]; - char tmpDetail[4][256]; - - char tmpParamLigth[256]; - - char tmp_path[256];//папка - char tmp_name[256];//само им¤ текстыр с расширением - - bool IsTruePath = false; - //обрезаем им¤ текстуры и папку - for (int k = 0; k< strlen(name); k++) - { - if (name[k] == '_') - { - memcpy(tmp_path, name, sizeof(char)*k); - tmp_path[k] = 0; - sprintf(tmp_name, "%s", name + k + 1); - IsTruePath = true; - break; - } - } - - char path[1024]; - - for (DWORD k = 0; k<strlen(name); k++) - { - if (name[k] == '.') - { - sprintf(tmp_name, "%s", name); - tmp_name[k] = 0; - IsTruePath = true; - break; - } - } - - CMaterial* tmpMtl = *mtl; - - sprintf(path, "%s%s\\%s.mtl", Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS), tmp_path, tmp_name); - if (FileExistsFile(path)) - { - ISXConfig* config = Core_OpConfig(path); - - //если в конфиге указана текстура то берем ее - if (config->keyExists(tmp_name, "texture")) - tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(config->getKey(tmp_name, "texture"), LOAD_TEXTURE_TYPE_LOAD); - else //если нет то тогда берем имя материала, может быть он имя текстуры, иначе будет -1 - tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD); - - tmpMtl->m_sName = tmp_name; - - tmpVS[0] = 0; - if (config->keyExists(tmp_name, "vs")) - sprintf(tmpVS, "%s", config->getKey(tmp_name, "vs")); - - tmpPS[0] = 0; - if (config->keyExists(tmp_name, "ps")) - sprintf(tmpPS, "%s", config->getKey(tmp_name, "ps")); - - - if (config->keyExists(tmp_name, "is_unlit")) - tmpMtl->m_oMainGraphics.m_isUnlit = String(config->getKey(tmp_name, "is_unlit")).toBool(); - else - tmpMtl->m_oMainGraphics.m_isUnlit = false; - - if (config->keyExists(tmp_name, "type")) - tmpMtl->m_oMainGraphics.type_model = (MTLTYPE_MODEL)String(config->getKey(tmp_name, "type")).toInt(); - else - tmpMtl->m_oMainGraphics.type_model = MTLTYPE_MODEL_DEFAULT; - - if (config->keyExists(tmp_name, "physmaterial")) - tmpMtl->m_oPhysics.type_physics = (MTLTYPE_PHYSIC)String(config->getKey(tmp_name, "physmaterial")).toInt(); - else - tmpMtl->m_oPhysics.type_physics = MTLTYPE_PHYSIC_DEFAULT; - - - if (STR_VALIDATE(tmpVS)) - tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, tmpVS, tmpVS, SHADER_CHECKDOUBLE_PATH); - else - tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs"); - - if (STR_VALIDATE(tmpPS)) - tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, tmpPS, tmpPS, SHADER_CHECKDOUBLE_PATH); - else - tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps"); - - tmpMicroDiff[0][0] = 0; - if (config->keyExists(tmp_name, "mirco_diff_r")) - sprintf(tmpMicroDiff[0], "%s", config->getKey(tmp_name, "mirco_diff_r")); - - if (tmpMicroDiff[0][0] != '0' && tmpMicroDiff[0][0] != 0) - tmpMtl->m_oMicroDetail.m_aMicroRelief[0] = SGCore_LoadTexAddName(tmpMicroDiff[0], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aMicroRelief[0] = -1; - - tmpMicroDiff[1][0] = 0; - 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->m_oMicroDetail.m_aMicroRelief[1] = SGCore_LoadTexAddName(tmpMicroDiff[1], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aMicroRelief[1] = -1; - - tmpMicroDiff[2][0] = 0; - 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->m_oMicroDetail.m_aMicroRelief[2] = SGCore_LoadTexAddName(tmpMicroDiff[2], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aMicroRelief[2] = -1; - - tmpMicroDiff[3][0] = 0; - 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->m_oMicroDetail.m_aMicroRelief[3] = SGCore_LoadTexAddName(tmpMicroDiff[3], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aMicroRelief[3] = -1; - - - tmpDetail[0][0] = 0; - 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->m_oMicroDetail.m_aDetail[0] = SGCore_LoadTexAddName(tmpDetail[0], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aDetail[0] = -1; - - tmpDetail[1][0] = 0; - 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->m_oMicroDetail.m_aDetail[1] = SGCore_LoadTexAddName(tmpDetail[1], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aDetail[1] = -1; - - tmpDetail[2][0] = 0; - 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->m_oMicroDetail.m_aDetail[2] = SGCore_LoadTexAddName(tmpDetail[2], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aDetail[2] = -1; - - tmpDetail[3][0] = 0; - 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->m_oMicroDetail.m_aDetail[3] = SGCore_LoadTexAddName(tmpDetail[3], LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_aDetail[3] = -1; - - tmpMask[0] = 0; - if (config->keyExists(tmp_name, "mask")) - sprintf(tmpMask, "%s", config->getKey(tmp_name, "mask")); - if (tmpMask[0] != '0' && tmpMask[0] != 0) - tmpMtl->m_oMicroDetail.m_idMask = SGCore_LoadTexAddName(tmpMask, LOAD_TEXTURE_TYPE_LOAD); - else - tmpMtl->m_oMicroDetail.m_idMask = -1; - - - tmpMtl->m_oLightParam.m_fRoughness = MTL_LIGHTING_DEFAULT_ROUGHNESS; - tmpMtl->m_oLightParam.m_fF0 = MTL_LIGHTING_DEFAULT_F0; - tmpMtl->m_oLightParam.m_fThickness = MTL_LIGHTING_DEFAULT_THICKNESS; - - if (config->keyExists(tmp_name, "roughness")) - tmpMtl->m_oLightParam.m_fRoughness = String(config->getKey(tmp_name, "roughness")).toDouble(); - - if (config->keyExists(tmp_name, "f0")) - tmpMtl->m_oLightParam.m_fF0 = String(config->getKey(tmp_name, "f0")).toDouble(); - - if (config->keyExists(tmp_name, "thickness")) - tmpMtl->m_oLightParam.m_fThickness = String(config->getKey(tmp_name, "thickness")).toDouble(); - - if (config->keyExists(tmp_name, "penetration")) - tmpMtl->m_oPhysics.m_fDurability = String(config->getKey(tmp_name, "penetration")).toDouble(); - - if (config->keyExists(tmp_name, "hit_chance")) - tmpMtl->m_oPhysics.m_fHitChance = String(config->getKey(tmp_name, "hit_chance")).toDouble(); - - if (config->keyExists(tmp_name, "density")) - tmpMtl->m_oPhysics.m_fDensity = String(config->getKey(tmp_name, "density")).toDouble(); - - tmpMtl->m_oLightParam.m_idTexParamHand = createTexParamLighting(tmpMtl->m_oLightParam.m_fRoughness, tmpMtl->m_oLightParam.m_fF0, tmpMtl->m_oLightParam.m_fThickness); - - //говорим что не установлено использовать ли текстуру или нет - int istexparam = -1; - - //если есть ключ использования текстуры то грузим - if (config->keyExists(tmp_name, "is_texture_param")) - istexparam = String(config->getKey(tmp_name, "is_texture_param")).toBool(); - - tmpParamLigth[0] = 0; - if (config->keyExists(tmp_name, "param_ligth")) - sprintf(tmpParamLigth, "%s", config->getKey(tmp_name, "param_ligth")); - - //если текстура с параметрами освещения была определена - if (tmpParamLigth[0] != '0' && tmpParamLigth[0] != 0) - { - tmpMtl->m_oLightParam.m_idTexParam = SGCore_LoadTexAddName(tmpParamLigth, LOAD_TEXTURE_TYPE_LOAD); - //если использование параметров освещения из текстуры не было определено - if (istexparam == -1) - tmpMtl->m_oLightParam.m_isTextureParam = true; - else - tmpMtl->m_oLightParam.m_isTextureParam = istexparam; - } - //если использование параметров освещения из текстуры не было определено - else if (istexparam == -1) - { - tmpMtl->m_oLightParam.m_isTextureParam = false; - } - - - if (config->keyExists(tmp_name, "refraction")) - tmpMtl->m_oLightParam.m_type_transparency = (MTLTYPE_TRANSPARENCY)String(config->getKey(tmp_name, "refraction")).toInt(); - else - tmpMtl->m_oLightParam.m_type_transparency = MTLTYPE_TRANSPARENCY_NONE; - - - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransView = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransProjection = - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransPosCam = - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserData = false; - - if (config->keyExists(tmp_name, "vs_world")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = String(config->getKey(tmp_name, "vs_world")).toInt(); - - if (config->keyExists(tmp_name, "vs_view")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransView = String(config->getKey(tmp_name, "vs_view")).toInt(); - - if (config->keyExists(tmp_name, "vs_projection")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransProjection = String(config->getKey(tmp_name, "vs_projection")).toInt(); - - if (config->keyExists(tmp_name, "vs_worldview")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = String(config->getKey(tmp_name, "vs_worldview")).toInt(); - - if (config->keyExists(tmp_name, "vs_worldviewprojection")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = String(config->getKey(tmp_name, "vs_worldviewprojection")).toInt(); - - if (config->keyExists(tmp_name, "vs_poscam")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransPosCam = String(config->getKey(tmp_name, "vs_poscam")).toInt(); - - if (config->keyExists(tmp_name, "vs_timedelta")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = String(config->getKey(tmp_name, "vs_timedelta")).toInt(); - - if (config->keyExists(tmp_name, "vs_winsize")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = String(config->getKey(tmp_name, "vs_winsize")).toInt(); - - if (config->keyExists(tmp_name, "vs_userdata")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserData = String(config->getKey(tmp_name, "vs_userdata")).toInt(); - - - tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData = float4(0, 0, 0, 0); - if (config->keyExists(tmp_name, "vs_userdata_value_x")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.x = String(config->getKey(tmp_name, "vs_userdata_value_x")).toDouble(); - - if (config->keyExists(tmp_name, "vs_userdata_value_y")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.y = String(config->getKey(tmp_name, "vs_userdata_value_y")).toDouble(); - - if (config->keyExists(tmp_name, "vs_userdata_value_z")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.z = String(config->getKey(tmp_name, "vs_userdata_value_z")).toDouble(); - - if (config->keyExists(tmp_name, "vs_userdata_value_w")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.w = String(config->getKey(tmp_name, "vs_userdata_value_w")).toDouble(); - - if (config->keyExists(tmp_name, "vs_userdata_trans_in_ps")) - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = String(config->getKey(tmp_name, "vs_userdata_trans_in_ps")).toBool(); - else - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = false; - - - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorld = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransView = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransProjection = - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransPosCam = - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = false; - - if (config->keyExists(tmp_name, "ps_world")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorld = String(config->getKey(tmp_name, "ps_world")).toInt(); - - if (config->keyExists(tmp_name, "ps_view")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransView = String(config->getKey(tmp_name, "ps_view")).toInt(); - - if (config->keyExists(tmp_name, "ps_projection")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransProjection = String(config->getKey(tmp_name, "ps_projection")).toInt(); - - if (config->keyExists(tmp_name, "ps_worldview")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = String(config->getKey(tmp_name, "ps_worldview")).toInt(); - - if (config->keyExists(tmp_name, "ps_worldviewprojection")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = String(config->getKey(tmp_name, "ps_worldviewprojection")).toInt(); - - if (config->keyExists(tmp_name, "ps_poscam")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransPosCam = String(config->getKey(tmp_name, "ps_poscam")).toInt(); - - if (config->keyExists(tmp_name, "ps_timedelta")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = String(config->getKey(tmp_name, "ps_timedelta")).toInt(); - - if (config->keyExists(tmp_name, "ps_winsize")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = String(config->getKey(tmp_name, "ps_winsize")).toInt(); - - if (config->keyExists(tmp_name, "ps_userdata")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = String(config->getKey(tmp_name, "ps_userdata")).toInt(); - - tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0); - - if (config->keyExists(tmp_name, "ps_userdata_value_x")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.x = String(config->getKey(tmp_name, "ps_userdata_value_x")).toDouble(); - - if (config->keyExists(tmp_name, "ps_userdata_value_y")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.y = String(config->getKey(tmp_name, "ps_userdata_value_y")).toDouble(); - - if (config->keyExists(tmp_name, "ps_userdata_value_z")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.z = String(config->getKey(tmp_name, "ps_userdata_value_z")).toDouble(); - - if (config->keyExists(tmp_name, "ps_userdata_value_w")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.w = String(config->getKey(tmp_name, "ps_userdata_value_w")).toDouble(); - - if (config->keyExists(tmp_name, "ps_userdata_trans_in_vs")) - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = String(config->getKey(tmp_name, "ps_userdata_trans_in_vs")).toBool(); - else - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = false; - - if (config->keyExists(tmp_name, "type_reflect")) - tmpMtl->m_oLightParam.m_type_reflect = (MTLTYPE_REFLECT)String(config->getKey(tmp_name, "type_reflect")).toInt(); - - if (config->keyExists(tmp_name, "alpha_test")) - tmpMtl->m_oMainGraphics.m_useAlphaTest = String(config->getKey(tmp_name, "alpha_test")).toBool(); - else - tmpMtl->m_oMainGraphics.m_useAlphaTest = false; - - return true; - } - - return false; -} - -ID CMaterials::createTexParamLighting(float roughness, float f0, float thickness) -{ - IDirect3DTexture9* TexMaterial; - MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &TexMaterial, NULL); - D3DLOCKED_RECT LockedRect; - uint32_t tmpColor = D3DCOLOR_ARGB(0, DWORD(roughness*255.f), DWORD(f0*255.f), DWORD(thickness*255.f)); - - TexMaterial->LockRect(0, &LockedRect, 0, 0); - - uint32_t* tmpOldColor = (uint32_t*)LockedRect.pBits + 0 * LockedRect.Pitch + 0 * sizeof(uint32_t); - memcpy(tmpOldColor, &tmpColor, sizeof(uint32_t)); - - TexMaterial->UnlockRect(0); - - //SGCore_LoadTexLoadTextures(); - - char nametex[64]; - sprintf(nametex, "%c_%d_%d_%d", MTL_VIRTUAL_DIR_HAND_MTL, m_aUnitMtrls.size(), rand() % 9999, rand() % 9999); - - return SGCore_LoadTexCreate(nametex, TexMaterial); -} - -void CMaterials::createMtl(const char* name, CMaterial** mtl, MTLTYPE_MODEL type) -{ - CMaterial* tmpMtl = *mtl; - new(tmpMtl)CMaterial*; - //если такого материала не существует, то мы должны были задать примерный тип материала - tmpMtl->m_oMainGraphics.type_model = type; - //обычна¤ геометри¤ - if (type == MTLTYPE_MODEL_STATIC) - { - tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs"); - tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps"); - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true; - } - //деревь¤ - else if (type == MTLTYPE_MODEL_TREE) - { - tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs"); - tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps"); - //tmpMtl->RenderStates.m_oMainGraphics.m_useAlphaTest = true; - } - //трава - else if (type == MTLTYPE_MODEL_GRASS) - { - tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs"); - tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps"); - //tmpMtl->RenderStates.m_oMainGraphics.m_useAlphaTest = true; - } - //анимационная модель - else if (type == MTLTYPE_MODEL_SKIN) - { - tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlskin_base.vs"); - tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlskin_base.ps"); - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true; - } - //источник света - /*else if (type == MTL_LIGHT) - { - tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(0, "mtrlgeom_base.vs"); - tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(1, "mtrlgeom_light.ps"); - tmpMtl->IsForwardRender = true; - tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = true; - tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0); - }*/ - - tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD); - tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true; - - tmpMtl->m_oLightParam.m_fRoughness = MTL_LIGHTING_DEFAULT_ROUGHNESS; - tmpMtl->m_oLightParam.m_fF0 = MTL_LIGHTING_DEFAULT_F0; - tmpMtl->m_oLightParam.m_fThickness = MTL_LIGHTING_DEFAULT_THICKNESS; - - tmpMtl->m_oLightParam.m_idTexParam = -1; - tmpMtl->m_oLightParam.m_isTextureParam = false; - tmpMtl->m_oLightParam.m_idTexParamHand = createTexParamLighting(tmpMtl->m_oLightParam.m_fRoughness, tmpMtl->m_oLightParam.m_fF0, tmpMtl->m_oLightParam.m_fThickness); - - //char path[1024]; - char tmp_name[256]; - bool IsTruePath = false; - - for (DWORD k = 0; k<strlen(name); k++) - { - if (name[k] == '.') - { - sprintf(tmp_name, "%s", name); - tmp_name[k] = 0; - IsTruePath = true; - break; - } - } - - tmpMtl->m_sName = tmp_name; -} - -ID CMaterials::mtlLoad(const char* name, MTLTYPE_MODEL type) -{ - ID IsLoad = exists(name); - - if (IsLoad >= 0) - { - CUnitMaterial* tmpumtl = new CUnitMaterial(); - tmpumtl->m_pMtrl = m_aUnitMtrls[IsLoad]->m_pMtrl; - - if (m_aUnitMtrls[IsLoad]->m_pReflect){ - CUnitMaterial* tmpmtl = m_aUnitMtrls[IsLoad]; - tmpumtl->m_pReflect = new CReflection(); - tmpumtl->m_pReflect->init(m_aUnitMtrls[IsLoad]->m_pReflect->getTypeReflect()); - } - - return addUnitMaterial(tmpumtl); - } - else - { - CUnitMaterial* tmpumtl = new CUnitMaterial(); - tmpumtl->m_pMtrl = new CMaterial(); - addMaterial(tmpumtl->m_pMtrl); - if (!loadMtl(name, &(tmpumtl->m_pMtrl))) - { - createMtl(name, &(tmpumtl->m_pMtrl), type); - } - else - { - if (tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE) - { - tmpumtl->m_pReflect = new CReflection(); - tmpumtl->m_pReflect->init(tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect); - } - } - - ID tmpid = addUnitMaterial(tmpumtl); - - addName(name, tmpid); - return tmpid; - } -} - -void CMaterials::mtlReLoad(ID id, const char* name) -{ - MTL_PRE_COND_ID(id); - CUnitMaterial* tmpumtl = m_aUnitMtrls[id]; - char tmpname[1024]; - if (name == 0) - sprintf(tmpname, "%s.dds", tmpumtl->m_pMtrl->m_sName.c_str()); - else - sprintf(tmpname, "%s", name); - - tmpumtl->m_pMtrl->nulling(); - if (!loadMtl(tmpname, &(tmpumtl->m_pMtrl))) - { - createMtl(name, &(tmpumtl->m_pMtrl), tmpumtl->m_pMtrl->m_oMainGraphics.type_model); - } - else - { - if (tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE) - { - tmpumtl->m_pReflect = new CReflection(); - tmpumtl->m_pReflect->init(tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect); - } - } -} - -void CMaterials::mtlSave(ID id) -{ - MTL_PRE_COND_ID(id, _VOID); - - char* ArrRGBA[4] = { "r", "g", "b", "a" }; - - CMaterial* mtrl = m_aUnitMtrls[id]->m_pMtrl; - - String sDir = StrSubstrSpre(mtrl->m_sName.c_str(), "_"); - String sPath = String(Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS)) + sDir + "/"; - - FileCreateDir(Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS)); - FileCreateDir(sPath.c_str()); - sPath += FileSetStrExt(mtrl->m_sName.c_str(), ".mtl"); - - FILE* file = 0; - file = fopen(sPath.c_str(), "w"); - - fprintf(file, "[%s]\n", mtrl->m_sName.c_str()); - - char tmpPathVSName[1024]; - char tmpPathPSName[1024]; - - char tmpPathMaskName[1024]; - - SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, mtrl->m_oMainGraphics.m_idShaderVS, tmpPathVSName); - SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, mtrl->m_oMainGraphics.m_idShaderPS, tmpPathPSName); - - fprintf(file, "type = %d\n", mtrl->m_oMainGraphics.type_model); - fprintf(file, "is_unlit = %d\n", mtrl->m_oMainGraphics.m_isUnlit); - fprintf(file, "%s%d%s", "physmaterial = ", mtrl->m_oPhysics.type_physics, "\n"); - - fprintf(file, "%s%s%s", "vs = ", tmpPathVSName, "\n"); - fprintf(file, "%s%s%s", "ps = ", tmpPathPSName, "\n"); - - fprintf(file, "%s%d%s", "alpha_test = ", mtrl->m_oMainGraphics.m_useAlphaTest, "\n"); - - char namebasetex[256]; - namebasetex[0] = '0'; - namebasetex[1] = '\0'; - SGCore_LoadTexGetName(mtrl->m_oMainGraphics.m_idMainTexture, namebasetex); - fprintf(file, "%s%s%s", "texture = ", namebasetex, "\n"); - - if (mtrl->m_oMicroDetail.m_idMask == -1) - { - tmpPathMaskName[0] = '0'; - tmpPathMaskName[1] = 0; - } - else - SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_idMask, tmpPathMaskName); - - fprintf(file, "%s%s%s", "mask = ", tmpPathMaskName, "\n"); - - for (int k = 0; k<4; k++) - { - if (mtrl->m_oMicroDetail.m_aMicroRelief[k] == -1) - { - tmpPathMaskName[0] = '0'; - tmpPathMaskName[1] = 0; - } - else - SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_aMicroRelief[k], tmpPathMaskName); - - fprintf(file, "mirco_diff_%s = %s\n", ArrRGBA[k], tmpPathMaskName); - } - - for (int k = 0; k<4; k++) - { - if (mtrl->m_oMicroDetail.m_aDetail[k] == -1) - { - tmpPathMaskName[0] = '0'; - tmpPathMaskName[1] = 0; - } - else - SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_aDetail[k], tmpPathMaskName); - - fprintf(file, "detail_%s = %s\n", ArrRGBA[k], tmpPathMaskName); - } - - if (mtrl->m_oLightParam.m_idTexParam == -1) - { - tmpPathMaskName[0] = '0'; - tmpPathMaskName[1] = 0; - } - else - SGCore_LoadTexGetName(mtrl->m_oLightParam.m_idTexParam, tmpPathMaskName); - - if (tmpPathMaskName[0] == MTL_VIRTUAL_DIR_HAND_MTL) - sprintf(tmpPathMaskName, "0"); - else - fprintf(file, "is_texture_param = %d\n", mtrl->m_oLightParam.m_isTextureParam); - - fprintf(file, "param_ligth = %s\n", tmpPathMaskName); - - fprintf(file, "roughness = %f\n", mtrl->m_oLightParam.m_fRoughness); - fprintf(file, "f0 = %f\n", mtrl->m_oLightParam.m_fF0); - fprintf(file, "thickness = %f\n", mtrl->m_oLightParam.m_fThickness); - fprintf(file, "penetration = %f\n", mtrl->m_oPhysics.m_fDurability); - fprintf(file, "hit_chance = %f\n", mtrl->m_oPhysics.m_fHitChance); - fprintf(file, "density = %f\n", mtrl->m_oPhysics.m_fDensity); - - fprintf(file, "refraction = %d\n", mtrl->m_oLightParam.m_type_transparency); - - fprintf(file, "vs_world = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld); - fprintf(file, "vs_view = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransView); - fprintf(file, "vs_projection = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection); - fprintf(file, "vs_worldview = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView); - fprintf(file, "vs_worldviewprojection = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection); - - fprintf(file, "vs_poscam = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam); - fprintf(file, "vs_timedelta = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta); - fprintf(file, "vs_winsize = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize); - fprintf(file, "vs_userdata = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData); - fprintf(file, "vs_userdata_value_x = %f\nvs_userdata_value_y = %f\nvs_userdata_value_z = %f\nvs_userdata_value_w = %f\n", mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.x, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.y, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.z, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.w); - fprintf(file, "vs_userdata_trans_in_ps = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader); - - fprintf(file, "ps_world = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld); - fprintf(file, "ps_view = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransView); - fprintf(file, "ps_projection = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection); - fprintf(file, "ps_worldview = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView); - fprintf(file, "ps_worldviewprojection = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection); - - fprintf(file, "ps_poscam = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam); - fprintf(file, "ps_timedelta = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta); - fprintf(file, "ps_winsize = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize); - fprintf(file, "ps_userdata = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData); - fprintf(file, "ps_userdata_value_x = %f\nps_userdata_value_y = %f\nps_userdata_value_z = %f\nps_userdata_value_w = %f\n", mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.x, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.y, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.z, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.w); - fprintf(file, "ps_userdata_trans_in_vs = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader); - - fprintf(file, "type_reflect = %d\n", mtrl->m_oLightParam.m_type_reflect); - - fprintf(file, "\n"); - fclose(file); -} - -//########################################################################## - -int CMaterials::delRefCount() -{ - return m_aReflections.size(); -} - -ID CMaterials::delRefGetIDArr(ID key, ID inid, int cube) -{ - if (!(key >= 0 && key < m_aReflections.size())) - return -1; - - return m_aReflections[key]->getIDArr(inid, cube); -} - -void CMaterials::delRefAllDel() -{ - for (int i = 0; i < m_aReflections.size(); ++i) - { - mem_delete(m_aReflections[i]); - } - - m_aReflections.clear(); -} - -//########################################################################## - -void CMaterials::clear(bool isClearRefDel) -{ - int tmpcountdel = 0; - - for (int i = 0; i < m_aMtrlPathes.size(); ++i) - { - if (strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), MTL_VIRTUAL_DIR_STD_MTL) != 0) - { - for (int k = 0; k < m_aMtrlPathes[i]->m_aObjects.size(); ++k) - { - mem_delete(m_aMtrlPathes[i]->m_aObjects[k]); - m_aMtrlPathes[i]->m_aObjects.erase(k); - --k; - ++tmpcountdel; - } - - if (m_aMtrlPathes.size() <= 0) - { - mem_delete(m_aMtrlPathes[i]); - m_aMtrlPathes.erase(i); - --i; - } - } - } - - tmpcountdel = 0; - - for (int i = BeginNonDef; i < m_aUnitMtrls.size(); ++i) - { - //если есть отражения, то записываем в очередь на удаление - if (m_aUnitMtrls[i]->m_pReflect) - m_aReflections.push_back(m_aUnitMtrls[i]->m_pReflect); - - mem_delete(m_aUnitMtrls[i]); - ++tmpcountdel; - } - - CurrFirstFree = BeginNonDef; - - tmpcountdel = 0; - - for (int i = 0; i < m_aMtrls.size(); ++i) - { - if (m_aMtrls[i]->m_isDelete) - { - mem_delete(m_aMtrls[i]); - m_aMtrls.erase(i); - --i; - ++tmpcountdel; - } - } - - if (isClearRefDel) - delRefAllDel(); -} - -//########################################################################## - -void CMaterials::onLostDevice() -{ - for (int i = 0; i < m_aUnitMtrls.size(); ++i) - { - if (m_aUnitMtrls[i] && m_aUnitMtrls[i]->m_pReflect) - m_aUnitMtrls[i]->m_pReflect->onLostDevice(); - } -} - -void CMaterials::onResetDevice() -{ - for (int i = 0; i < m_aUnitMtrls.size(); ++i) - { - if (m_aUnitMtrls[i] && m_aUnitMtrls[i]->m_pReflect) - m_aUnitMtrls[i]->m_pReflect->onResetDevice(); - } -} - -//########################################################################## - -ID CMaterials::getStdMtl(MTLTYPE_MODEL type_model) -{ - if (type_model == MTLTYPE_MODEL_STATIC) - { - return MtrlDefStatic; - } - else if (type_model == MTLTYPE_MODEL_GRASS) - { - return MtrlDefGrass; - } - else if (type_model == MTLTYPE_MODEL_TREE) - { - return MtrlDefTree; - } - else if (type_model == MTLTYPE_MODEL_SKIN) - { - return MtrlDefSkin; - } - return(-1); -} - -MTLTYPE_MODEL CMaterials::getTypeModel(ID id) -{ - MTL_PRE_COND_ID(id, MTLTYPE_MODEL_STATIC); - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.type_model; -} - -void CMaterials::setTypeModel(ID id, MTLTYPE_MODEL type_model) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.type_model = type_model; -} - -void CMaterials::update(UINT timeDelta) -{ - m_uiCurrTimeDelta = timeDelta; - m_uiCountTimeDelta += timeDelta; -} - -void CMaterials::setMainTexture(ID slot, ID id) -{ - if (id >= 0 && id < m_aUnitMtrls.size() && m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture != -1) - MLSet::DXDevice->SetTexture(slot, SGCore_LoadTexGetTex(m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture)); - else - MLSet::DXDevice->SetTexture(slot, 0); -} - -ID CMaterials::getID(const char* name) -{ - for (int i = 0; i < m_aUnitMtrls.size(); i++) - { - if (strcmp(m_aUnitMtrls[i]->m_pMtrl->m_sName.c_str(), name) == 0) - return i; - } - return -1; -} - -int CMaterials::getCount() -{ - return m_aUnitMtrls.size(); -} - - -void CMaterials::setForceblyAlphaTest(bool isat) -{ - m_useForceblyAlphaTest = isat; - if (!isat) - MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); -} - -bool CMaterials::getForceblyAlphaTest() -{ - return m_useForceblyAlphaTest; -} - -//########################################################################## - -bool CMaterials::mtlGetUsingAlphaTest(ID id) -{ - MTL_PRE_COND_ID(id, false); - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_useAlphaTest; -} - -void CMaterials::mtlSetUsingAlphaTest(ID id, bool is_using) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_useAlphaTest = is_using; -} - -MTLTYPE_REFLECT CMaterials::mtlTypeReflection(ID id) -{ - MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE); - return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect; -} - -//************************************************************************** - -void CMaterials::mtlRefSetIDArr(ID id, ID inid, int cube, ID idarr) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->setIDArr(inid, cube, idarr); -} - -ID CMaterials::mtlRefGetIDArr(ID id, ID inid, int cube) -{ - MTL_REF_PRE_COND_ID(id,- 1); - return m_aUnitMtrls[id]->m_pReflect->getIDArr(inid, cube); -} - -/*void CMaterials::mtlRefSetPlane(ID id, D3DXPLANE* plane) -{ - MTL_REF_PRE_COND_ID(id); - m_aUnitMtrls[id]->m_pReflect->Plane = *plane; -}*/ - -/*void CMaterials::mtlRefSetCenter(ID id, float3_t* center) -{ - MTL_REF_PRE_COND_ID(id); - m_aUnitMtrls[id]->m_pReflect->Position = *center; -}*/ - -void CMaterials::mtlRefPreRenderPlane(ID id, D3DXPLANE* plane) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->preRenderRefPlane(plane); -} - -const IFrustum* CMaterials::mtlRefGetfrustum(ID id, int cube) -{ - MTL_REF_PRE_COND_ID(id, 0); - if (cube == 0 || (cube > 0 && (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC))) - return m_aUnitMtrls[id]->m_pReflect->getFrustum(cube); - return 0; -} - -void CMaterials::mtlRefPostRenderPlane(ID id) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->postRenderRefPlane(); -} - -IDirect3DTexture9* CMaterials::mtlRefPlaneGetTex(ID id) -{ - MTL_REF_PRE_COND_ID(id, 0); - return m_aUnitMtrls[id]->m_pReflect->getRefPlaneTex(); -} - - -void CMaterials::mtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->setMinMax(pMin, pMax); -} - -bool CMaterials::mtlRefIsAllowedRender(ID id) -{ - MTL_REF_PRE_COND_ID(id, false); - if (m_aUnitMtrls[id]->m_pReflect) - return m_aUnitMtrls[id]->m_pReflect->allowedRender(); - - return false; -} - - -void CMaterials::mtlRefCubeBeginRender(ID id, const float3_t *pCenter) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->beginRenderRefCube(pCenter); -} - -void CMaterials::mtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->preRenderRefCube(iCube, pWorld); -} - -void CMaterials::mtlRefCubePostRender(ID id, int iCube) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->postRenderRefCube(iCube); -} - -void CMaterials::mtlRefCubeEndRender(ID id, const float3_t *pViewPos) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->endRenderRefCube(pViewPos); -} - -bool CMaterials::mtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos) -{ - MTL_REF_PRE_COND_ID(id, false); - return m_aUnitMtrls[id]->m_pReflect->updateCountUpdate(pViewPos); -} - -void CMaterials::mtlRefNullingCountUpdate(ID id) -{ - MTL_REF_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pReflect->nullingCountUpdate(); -} - -IDirect3DCubeTexture9* CMaterials::refCubeGetTex(ID id) -{ - MTL_REF_PRE_COND_ID(id, 0); - return m_aUnitMtrls[id]->m_pReflect->getRefCubeTex(); -} - -//************************************************************************** - -void CMaterials::mtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type) -{ - MTL_PRE_COND_ID(id); - m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.type_physics = type; -} - -MTLTYPE_PHYSIC CMaterials::mtlGetPhysicMaterial(ID id) -{ - MTL_PRE_COND_ID(id, MTLTYPE_PHYSIC_CONCRETE); - return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.type_physics; -} - -void CMaterials::mtlSetTexture(ID id, const char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); -} - -void CMaterials::mtlGetTexture(ID id, char* name) -{ - MTL_PRE_COND_ID(id, _VOID); - - if (name && m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture >= 0) - SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture, name); -} - -ID CMaterials::mtlGetTextureID(ID id) -{ - MTL_PRE_COND_ID(id, -1); - - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture; -} - -void CMaterials::mtlSetVS(ID id, const char* path_vs) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, path_vs, path_vs, SHADER_CHECKDOUBLE_PATH); -} - -void CMaterials::mtlGetVS(ID id, char* name) -{ - MTL_PRE_COND_ID(id, _VOID); - SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderVS, name); -} - -void CMaterials::mtlSetPS(ID id, const char* path_ps) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, path_ps, path_ps, SHADER_CHECKDOUBLE_PATH); -} - -void CMaterials::mtlGetPS(ID id, char* name) -{ - MTL_PRE_COND_ID(id, _VOID); - SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderPS, name); -} - - -void CMaterials::mtlSetLighting(ID id, bool is_lighting) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_isUnlit = !is_lighting; -} - -bool CMaterials::mtlGetLighting(ID id) -{ - MTL_PRE_COND_ID(id, false); - return !m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_isUnlit; -} - - -void CMaterials::mtlSetIsTextureLighting(ID id, bool is_tex_lighting) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTextureParam = is_tex_lighting; -} - -bool CMaterials::mtlGetIsTextureLighting(ID id) -{ - MTL_PRE_COND_ID(id, false); - return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTextureParam; -} - - -void CMaterials::mtlSetTextureLighting(ID id, const char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); -} - -void CMaterials::mtlGetTextureLighting(ID id, char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam >= 0) - { - SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam, path_tex); - if (path_tex[0] == MTL_VIRTUAL_DIR_HAND_MTL) - path_tex[0] = 0; - } - else if (path_tex) - path_tex[0] = 0; -} - - -void CMaterials::mtlSetRoughness(ID id, float roughness) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fRoughness = roughness; -} - -float CMaterials::mtlGetRoughness(ID id) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fRoughness; -} - - -void CMaterials::mtlSetF0(ID id, float f0) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fF0 = f0; -} - -float CMaterials::mtlGetF0(ID id) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fF0; -} - - -void CMaterials::mtlSetThickness(ID id, float thickness) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fThickness = thickness; -} - -float CMaterials::mtlGetThickness(ID id) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fThickness; -} - - -void CMaterials::mtlSetDurability(ID id, float fDurability) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDurability = fDurability; -} - -float CMaterials::mtlGetDurability(ID id) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDurability; -} - - -void CMaterials::mtlSetHitChance(ID id, float fHitChance) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fHitChance = fHitChance; -} - -float CMaterials::mtlGetHitChance(ID id) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fHitChance; -} - - -void CMaterials::mtlSetDensity(ID id, float fDensity) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDensity = fDensity; -} - -float CMaterials::mtlGetDensity(ID id) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDensity; -} - - - -void CMaterials::mtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_transparency = type; -} - -MTLTYPE_TRANSPARENCY CMaterials::mtlGetTypeTransparency(ID id) -{ - MTL_PRE_COND_ID(id, MTLTYPE_TRANSPARENCY_NONE); - return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_transparency; -} - - -void CMaterials::mtlSetTypeReflection(ID id, MTLTYPE_REFLECT type) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect = type; - - if (m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE) - { - if (!m_aUnitMtrls[id]->m_pReflect) - m_aUnitMtrls[id]->m_pReflect = new CReflection(); - - m_aUnitMtrls[id]->m_pReflect->init(m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect); - } -} - -MTLTYPE_REFLECT CMaterials::mtlGetTypeReflection(ID id) -{ - MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE); - return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect; -} - - -void CMaterials::mtlSetMaskTex(ID id, const char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); -} - -void CMaterials::mtlGetMaskTex(ID id, char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask >= 0) - SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask, path_tex); - else if (path_tex) - path_tex[0] = 0; -} - -void CMaterials::mtlSetMRTex(ID id, int channel, const char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); -} - -void CMaterials::mtlGetMRTex(ID id, int channel, char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel] >= 0) - SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel], path_tex); - else if (path_tex) - path_tex[0] = 0; -} - - -void CMaterials::mtlSetDTex(ID id, int channel, const char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD); -} - -void CMaterials::mtlGetDTex(ID id, int channel, char* path_tex) -{ - MTL_PRE_COND_ID(id, _VOID); - if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel] >= 0) - SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel], path_tex); - else if (path_tex) - path_tex[0] = 0; -} - - -void CMaterials::mtlSetStdVS(ID id, MTL_SHADERSTD type, bool is_send) -{ - MTL_PRE_COND_ID(id, _VOID); - if (type == MTL_SHADERSTD_MATRIX_WORLD) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = is_send; - else if (type == MTL_SHADERSTD_MATRIX_VIEW) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView = is_send; - else if (type == MTL_SHADERSTD_MATRIX_PROJECTION) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection = is_send; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = is_send; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = is_send; - - else if (type == MTL_SHADERSTD_CAMPOS) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam = is_send; - else if (type == MTL_SHADERSTD_TIMEDELTA) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = is_send; - - else if (type == MTL_SHADERSTD_USERDATA) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData = is_send; - - else if (type == MTL_SHADERSTD_WINSIZE) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = is_send; -} - -bool CMaterials::mtlGetStdVS(ID id, MTL_SHADERSTD type) -{ - MTL_PRE_COND_ID(id, false); - if (type == MTL_SHADERSTD_MATRIX_WORLD) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld; - else if (type == MTL_SHADERSTD_MATRIX_VIEW) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView; - else if (type == MTL_SHADERSTD_MATRIX_PROJECTION) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection; - - else if (type == MTL_SHADERSTD_CAMPOS) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam; - else if (type == MTL_SHADERSTD_TIMEDELTA) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta; - - else if (type == MTL_SHADERSTD_USERDATA) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData; - - else if (type == MTL_SHADERSTD_WINSIZE) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize; - - return(false); -} - -void CMaterials::mtlSetStdPS(ID id, MTL_SHADERSTD type, bool is_send) -{ - MTL_PRE_COND_ID(id, _VOID); - if (type == MTL_SHADERSTD_MATRIX_WORLD) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld = is_send; - else if (type == MTL_SHADERSTD_MATRIX_VIEW) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView = is_send; - else if (type == MTL_SHADERSTD_MATRIX_PROJECTION) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection = is_send; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = is_send; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = is_send; - - else if (type == MTL_SHADERSTD_CAMPOS) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam = is_send; - else if (type == MTL_SHADERSTD_TIMEDELTA) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = is_send; - - else if (type == MTL_SHADERSTD_USERDATA) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData = is_send; - - else if (type == MTL_SHADERSTD_WINSIZE) - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = is_send; -} - -bool CMaterials::mtlGetStdPS(ID id, MTL_SHADERSTD type) -{ - MTL_PRE_COND_ID(id, false); - if (type == MTL_SHADERSTD_MATRIX_WORLD) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld; - else if (type == MTL_SHADERSTD_MATRIX_VIEW) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView; - else if (type == MTL_SHADERSTD_MATRIX_PROJECTION) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView; - else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection; - - else if (type == MTL_SHADERSTD_CAMPOS) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam; - else if (type == MTL_SHADERSTD_TIMEDELTA) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta; - - else if (type == MTL_SHADERSTD_USERDATA) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData; - - else if (type == MTL_SHADERSTD_WINSIZE) - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize; - return(false); -} - - -void CMaterials::mtlSetUserDataVS(ID id, int component, float val) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData[component] = val; -} - -float CMaterials::mtlGetUserDataVS(ID id, int component) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData[component]; -} - -void CMaterials::mtlSetUserDataVS_InPS(ID id, bool is_send_ps) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = is_send_ps; -} - -bool CMaterials::mtlGetUserDataVS_InPS(ID id) -{ - MTL_PRE_COND_ID(id, false); - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader; -} - - -void CMaterials::mtlSetUserDataPS(ID id, int component, float val) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData[component] = val; -} - -float CMaterials::mtlGetUserDataPS(ID id, int component) -{ - MTL_PRE_COND_ID(id, -1); - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData[component]; -} - -void CMaterials::mtlSetUserDataPS_InPS(ID id, bool is_send_vs) -{ - MTL_PRE_COND_ID(id, _VOID); - m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = is_send_vs; -} - -bool CMaterials::mtlGetUserDataPS_InPS(ID id) -{ - MTL_PRE_COND_ID(id, false); - return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader; -} - -//########################################################################## - -void CMaterials::setIsIncrCountSurf(bool bf) -{ - m_useCountSurface = bf; -} - -bool CMaterials::getIsIncrCountSurf() -{ - return m_useCountSurface; -} - -void CMaterials::nullingCurrCountSurf() -{ - m_idCurrIdSurface = 0; -} - -int CMaterials::getCurrCountSurf() -{ - return m_idCurrIdSurface; -} - -void CMaterials::setCurrCountSurf(int count) -{ - m_idCurrIdSurface = count; -} - -//########################################################################## - -void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl) -{ - //может быть случай когда текстура в которую сейчас рисуем еще стоит в текстурных слотах - //из-за этого может быть необъяснимое поводенеие и как результат непонятные артефакты в самой текстуре в которую сейчас рисуем - //поэтому нужно обнулить слот в котором возможно была текстура - //такое явление может быть в случае когда в кадре только один материал который отражает - MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, 0); - - if (idMtl >= 0 && idMtl < m_aUnitMtrls.size()) - setMainTexture(idSlot, idMtl); - - if (type == MTLTYPE_MODEL_STATIC) - { - SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom); - - float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity()); - float4x4 wvpmat; - Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat); - wvpmat = SMMatrixTranspose(wmat * wvpmat); - wmat = SMMatrixTranspose(wmat); - - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "WorldViewProjection", &wvpmat); - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "World", &wmat); - - if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0)) - { - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP); - - float3 tmpnormal, tmppoint; - - Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal); - Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint); - - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "PlaneNormal", &tmpnormal); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "PlanePoint", &tmppoint); - } - else - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeom); - } - else if (type == MTLTYPE_MODEL_GRASS || type == MTLTYPE_MODEL_TREE) - { - ID tmpvs = (type == MTLTYPE_MODEL_GRASS ? MLSet::IDsShaders::VS::StdGrass : MLSet::IDsShaders::VS::StdTree); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, tmpvs); - - float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity()); - float4x4 wvpmat; - Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat); - wvpmat = SMMatrixTranspose(wmat * wvpmat); - wmat = SMMatrixTranspose(wmat); - - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "WorldViewProjection", &wvpmat); - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "World", &wmat); - - if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0)) - { - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP); - - float3 tmpnormal, tmppoint; - - Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal); - Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint); - - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "PlaneNormal", &tmpnormal); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "PlanePoint", &tmppoint); - } - else - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreen); - } - else if (type == MTLTYPE_MODEL_SKIN) - { - SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin); - - float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity()); - float4x4 wvpmat; - Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat); - wvpmat = SMMatrixTranspose(wmat * wvpmat); - wmat = SMMatrixTranspose(wmat); - - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "WorldViewProjection", &wvpmat); - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "World", &wmat); - - if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0)) - { - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP); - - float3 tmpnormal, tmppoint; - - Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal); - Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint); - - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "PlaneNormal", &tmpnormal); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "PlanePoint", &tmppoint); - } - else - SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkin); - } -} - -void CMaterials::render(ID id, const float4x4 *pWorld) -{ - MTL_PRE_COND_ID(id, _VOID); - - static const int *r_win_width = GET_PCVAR_INT("r_win_width"); - static const int *r_win_height = GET_PCVAR_INT("r_win_height"); - - static const float *r_near = GET_PCVAR_FLOAT("r_near"); - static const float *r_far = GET_PCVAR_FLOAT("r_far"); - - m_mWorld = (pWorld ? (*pWorld) : SMMatrixIdentity()); - - CMaterial *pMtrl = m_aUnitMtrls[id]->m_pMtrl; - - //если есть то устанавливаем текстуру материала - if (pMtrl->m_oMainGraphics.m_idMainTexture != -1) - MLSet::DXDevice->SetTexture(MTL_TEX_R_MAIN, SGCore_LoadTexGetTex(pMtrl->m_oMainGraphics.m_idMainTexture)); - - //если нет отражени¤ то отправл¤ем 0 - if (pMtrl->m_oLightParam.m_type_reflect == 0) - MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, 0); - else - { - if (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_PLANE) - MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, m_aUnitMtrls[id]->m_pReflect->getRefPlaneTex()); - else if (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC) - MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, m_aUnitMtrls[id]->m_pReflect->getRefCubeTex()); - } - - MLSet::DXDevice->SetTexture(MTL_TEX_R_CURR_DEPTH, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene0)); - - //если есть рефаркци¤, а она идет вторым проходом, то отправл¤ем, иначе посылаем 0 - /*if (pMtrl->m_oLightParam.m_type_transparency) - MLSet::DXDevice->SetTexture(MTL_TEX_R_REFRACTION, SGCore_RTGetTexture(SML_DSGetRT_ID(DS_RT_SCENE_LIGHT_COM_REF))); - else - MLSet::DXDevice->SetTexture(MTL_TEX_R_REFRACTION, 0);*/ - - if (pMtrl->m_oMicroDetail.m_idMask != -1) - MLSet::DXDevice->SetTexture(MTL_TEX_R_MASK, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_idMask)); - - for (int k = 0; k<4; k++) - { - if (pMtrl->m_oMicroDetail.m_aDetail[k] != -1) - MLSet::DXDevice->SetTexture(MTL_TEX_R_DETAIL + k, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_aDetail[k])); - else - MLSet::DXDevice->SetTexture(MTL_TEX_R_DETAIL + k, 0); - - if (pMtrl->m_oMicroDetail.m_aMicroRelief[k] != -1) - MLSet::DXDevice->SetTexture(MTL_TEX_R_MICRO + k, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_aMicroRelief[k])); - else - MLSet::DXDevice->SetTexture(MTL_TEX_R_MICRO + k, 0); - } - - //если есть текстура с параметрами освещени¤ и установлено что берем параметры из текстуры, то отправл¤ем текстуру с параметрами - if (pMtrl->m_oLightParam.m_idTexParam != -1 && pMtrl->m_oLightParam.m_isTextureParam) - { - MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParam)); - } - //иначе если берем параметры из ... редактора - else if (!pMtrl->m_oLightParam.m_isTextureParam) - { - if (pMtrl->m_oLightParam.m_fOldRoughness != pMtrl->m_oLightParam.m_fRoughness || pMtrl->m_oLightParam.m_fOldF0 != pMtrl->m_oLightParam.m_fF0 || pMtrl->m_oLightParam.m_fOldThickness != pMtrl->m_oLightParam.m_fThickness) - { - //блокируем текстуру 1х1 котора¤ есть параметры освещени¤, и запсиываем туда то что настроили - D3DLOCKED_RECT LockedRect; - IDirect3DTexture9* ParamLightModelTex = SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParamHand); - ParamLightModelTex->LockRect(0, &LockedRect, 0, 0); - DWORD *param = (DWORD*)LockedRect.pBits; - //DWORD param = D3DCOLOR_ARGB(0,0,0,0); - param[0] = D3DCOLOR_ARGB(0, DWORD(pMtrl->m_oLightParam.m_fRoughness*255.f), DWORD(pMtrl->m_oLightParam.m_fF0*255.f), DWORD(pMtrl->m_oLightParam.m_fThickness*255.f)); - ParamLightModelTex->UnlockRect(0); - - pMtrl->m_oLightParam.m_fOldRoughness = pMtrl->m_oLightParam.m_fRoughness; - pMtrl->m_oLightParam.m_fOldF0 = pMtrl->m_oLightParam.m_fF0; - pMtrl->m_oLightParam.m_fOldThickness = pMtrl->m_oLightParam.m_fThickness; - } - - MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParamHand)); - } - else - MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(MLSet::IDsTexs::NullMaterial)); - - - if (pMtrl->m_oMainGraphics.m_idShaderVS != -1) - SGCore_ShaderBind(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS); - - if (pMtrl->m_oMainGraphics.m_idShaderPS != -1) - SGCore_ShaderBind(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection) - m_mWorldTrans = SMMatrixTranspose(m_mWorld); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection) - { - //float4x4 view; - Core_RMatrixGet(G_RI_MATRIX_VIEW, &m_mViewTrans); - //MLSet::DXDevice->GetTransform(D3DTS_VIEW, &tmpView); - //view = float4x4(tmpView); - m_mViewTrans = SMMatrixTranspose(m_mViewTrans); - - //float4x4 proj; - Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &m_mProjTrans); - //MLSet::DXDevice->GetTransform(D3DTS_PROJECTION, &tmpProjection); - //proj = float4x4(tmpProjection); - m_mProjTrans = SMMatrixTranspose(m_mProjTrans); - } - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "World", &m_mWorldTrans); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "World", &m_mWorldTrans); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "View", &m_mViewTrans); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "View", &m_mViewTrans); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Projection", &m_mProjTrans); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Projection", &m_mProjTrans); - - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView) - { - float4x4 wv = m_mViewTrans * m_mWorldTrans; - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldView", &wv); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldView", &wv); - } - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection) - { - Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &m_mViewProj); - - float4x4 mWVP = m_mWorld * m_mViewProj; - mWVP = SMMatrixTranspose(mWVP); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldViewProjection", &mWVP); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldViewProjection", &mWVP); - } - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam) - { - float3 vObserverPos; - Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "PosCam", &vObserverPos); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "PosCam", &vObserverPos); - } - - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Param", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData)); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "ParamVS", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData)); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Param", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData)); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "ParamPS", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData)); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f)); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f)); - - if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize) - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WinSize", &float2_t(*r_win_width, *r_win_height)); - - if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize) - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WinSize", &float2_t(*r_win_width, *r_win_height)); - - //если материалом назначен альфа тест и не включен принудительный - if (pMtrl->m_oMainGraphics.m_useAlphaTest && !m_useForceblyAlphaTest) - { - MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); - MLSet::DXDevice->SetRenderState(D3DRS_ALPHAREF, MTL_ALPHATEST_FREE_VALUE); - MLSet::DXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); - } - //если не включен принудительный альфа тест - else if (!m_useForceblyAlphaTest) - { - MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - } - //иначе включен принудительный альфа тест - else - { - MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); - MLSet::DXDevice->SetRenderState(D3DRS_ALPHAREF, MTL_ALPHATEST_FORCEBLY_VALUE); - MLSet::DXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); - } - - //почти во всех пиксельных шейдерах материалов есть данна¤ NearFar, необходима¤ д¤л записи глубины - if (pMtrl->m_oMainGraphics.m_idShaderPS != -1) - { - //освещаемый ли тип материала или нет? Ппрозрачный освещаемый? - //0,0.33,0.66,1 - float fLayer; - if (pMtrl->m_oMainGraphics.m_isUnlit) - { - if (pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_NONE) - fLayer = MTLTYPE_LAYER_OPAQUE_UNLIT; - else - fLayer = MTLTYPE_LAYER_TRANSPARENT_UNLIT; - } - else - { - if (pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_NONE) - fLayer = MTLTYPE_LAYER_OPAQUE_LIGHT; - else - fLayer = MTLTYPE_LAYER_TRANSPARENT_LIGHT; - } - - if (m_useCountSurface && (pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_ALPHA_LIGHT || pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_ALPHA_UNLIT)) - ++(m_idCurrIdSurface); - - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "NearFarIsUnlit", &float4_t(*r_near, *r_far, fLayer, float(m_idCurrIdSurface) / 255.f)); - } -} - -void CMaterials::renderLight(const float4_t *pColor, const float4x4 *pWorld) -{ - MTL_PRE_COND_ID(MtrlDefLight, _VOID); - - m_aUnitMtrls[MtrlDefLight]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData = *pColor; - render(MtrlDefLight, pWorld); - m_aUnitMtrls[MtrlDefLight]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0); -} \ No newline at end of file diff --git "a/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.h" "b/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.h" deleted file mode 100644 index 097f3ea2dfa881db14c2569d698c8adc9f0e1981..0000000000000000000000000000000000000000 --- "a/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.h" +++ /dev/null @@ -1,431 +0,0 @@ - -/*********************************************************** -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 <common/file_utils.h> -#include "reflection.h" -#include <direct.h> - -#define MTL_PRE_COND_ID(id,stdval) \ -if (!(id >= 0 && id < m_aUnitMtrls.size()))\ -{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; }\ -else if (!m_aUnitMtrls[id])\ -{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 (!(m_aUnitMtrls[id]->m_pReflect))\ -{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material id = '%d', name = '%s' unsupported reflection", GEN_MSG_LOCATION, id, m_aUnitMtrls[id]->m_pMtrl->m_sName.c_str()); return stdval; } - -class CMaterials -{ -public: - CMaterials(); - ~CMaterials(); - - void onLostDevice(); - void onResetDevice(); - - SX_ALIGNED_OP_MEM - - void clear(bool isClearRefDel); - void update(UINT timeDelta); - void setMainTexture(ID idSlot, ID idTexure); - void render(ID id, const float4x4 *pWorld); - void renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl); - void renderLight(const float4_t *pColor, const float4x4 *pWorld); - int getCount(); - - void setForceblyAlphaTest(bool useAlphaTest); - bool getForceblyAlphaTest(); - - void setIsIncrCountSurf(bool bf); - bool getIsIncrCountSurf(); - void nullingCurrCountSurf(); - int getCurrCountSurf(); - void setCurrCountSurf(int iCount); - - ID mtlLoad(const char *szName, MTLTYPE_MODEL type = MTLTYPE_MODEL_STATIC); - void mtlReLoad(ID id, const char *szName = 0); - void mtlSave(ID id); - - ID getStdMtl(MTLTYPE_MODEL type_model); - ID exists(const char *szName); - MTLTYPE_MODEL getTypeModel(ID id); - void setTypeModel(ID id, MTLTYPE_MODEL type_model); - ID getID(const char *szName); - - //###################################################################### - - bool mtlGetUsingAlphaTest(ID id); - void mtlSetUsingAlphaTest(ID id, bool isUsing); - MTLTYPE_REFLECT mtlTypeReflection(ID id); - - void mtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type); - MTLTYPE_PHYSIC mtlGetPhysicMaterial(ID id); - - void mtlSetTexture(ID id, const char *szTexture); - void mtlGetTexture(ID id, char *szName); - ID mtlGetTextureID(ID id); - void mtlSetVS(ID id, const char *szNameVS); - void mtlGetVS(ID id, char *szNamePS); - void mtlSetPS(ID id, const char *szNamePS); - void mtlGetPS(ID id, char *szNamePS); - - - void mtlSetLighting(ID id, bool isLighting); - bool mtlGetLighting(ID id); - - void mtlSetIsTextureLighting(ID id, bool isTexLighting); - bool mtlGetIsTextureLighting(ID id); - - void mtlSetTextureLighting(ID id, const char *szTex); - void mtlGetTextureLighting(ID id, char *szTex); - - void mtlSetRoughness(ID id, float fRroughness); - float mtlGetRoughness(ID id); - - void mtlSetF0(ID id, float fF0); - float mtlGetF0(ID id); - - void mtlSetThickness(ID id, float fThickness); - float mtlGetThickness(ID id); - - void mtlSetDurability(ID id, float fDurability); - float mtlGetDurability(ID id); - - void mtlSetHitChance(ID id, float fHitChance); - float mtlGetHitChance(ID id); - - void mtlSetDensity(ID id, float fDensity); - float mtlGetDensity(ID id); - - void mtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type); - MTLTYPE_TRANSPARENCY mtlGetTypeTransparency(ID id); - - void mtlSetTypeReflection(ID id, MTLTYPE_REFLECT type); - MTLTYPE_REFLECT mtlGetTypeReflection(ID id); - - - void mtlSetMaskTex(ID id, const char *szTexture); - void mtlGetMaskTex(ID id, char *szTexture); - - void mtlSetMRTex(ID id, int iChannel, const char *szTexture); - void mtlGetMRTex(ID id, int iChannel, char *szTexture); - - void mtlSetDTex(ID id, int iChannel, const char *szTexture); - void mtlGetDTex(ID id, int iChannel, char *szTexture); - - - void mtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend); - bool mtlGetStdVS(ID id, MTL_SHADERSTD type); - void mtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend); - bool mtlGetStdPS(ID id, MTL_SHADERSTD type); - - - void mtlSetUserDataVS(ID id, int iComponent, float val); - float mtlGetUserDataVS(ID id, int iComponent); - void mtlSetUserDataVS_InPS(ID id, bool isSendPS); - bool mtlGetUserDataVS_InPS(ID id); - void mtlSetUserDataPS(ID id, int iComponent, float fValue); - float mtlGetUserDataPS(ID id, int iComponent); - void mtlSetUserDataPS_InPS(ID id, bool isSendVS); - bool mtlGetUserDataPS_InPS(ID id); - - //********************************************************************** - - void mtlRefSetIDArr(ID id, ID idOwner, int iCube, ID idArr); - ID mtlRefGetIDArr(ID id, ID idOwner, int iCube); - - void mtlRefPreRenderPlane(ID id, D3DXPLANE *pPlane); - const IFrustum* mtlRefGetfrustum(ID id, int iCube); - void mtlRefPostRenderPlane(ID id); - IDirect3DTexture9* mtlRefPlaneGetTex(ID id); - - void mtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax); - bool mtlRefIsAllowedRender(ID id); - - void mtlRefCubeBeginRender(ID id, const float3_t *pCenter); - void mtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld); - void mtlRefCubePostRender(ID id, int iCube); - void mtlRefCubeEndRender(ID id, const float3_t *pViewPos); - bool mtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos); - void mtlRefNullingCountUpdate(ID id); - IDirect3DCubeTexture9* refCubeGetTex(ID id); - - //###################################################################### - - int delRefCount(); - ID delRefGetIDArr(ID idKey, ID idOwner, int iCube); - void delRefAllDel(); - - //###################################################################### - - struct CMaterial - { - CMaterial(); - ~CMaterial(); - - SX_ALIGNED_OP_MEM - - //! обнуление всех данных в материале - void nulling(); - - //! удален ли материал - bool m_isDelete; - - //! основные графические свойства - struct CMainGraphics - { - CMainGraphics(); - ~CMainGraphics(); - - //! основная текстура - ID m_idMainTexture; - - //! вершинный шейдер - ID m_idShaderVS; - - //! пиксельный шейдер - ID m_idShaderPS; - - //! неосвещаемый материал - bool m_isUnlit; - - //! использовать ли альфа тест - bool m_useAlphaTest; - - //! тип модели для рендера - MTLTYPE_MODEL type_model; - - //! отправляемые данные в шейдеры - struct СDataShader - { - СDataShader(); - ~СDataShader(); - - SX_ALIGNED_OP_MEM - - //! отправлять ли мировую матрицу - bool m_isTransWorld; - - //! отправлять ли видову матрицу - bool m_isTransView; - - //! отправлять ли проекционную матрицу - bool m_isTransProjection; - - //! отправлять ли world * view - bool m_isTransWorldView; - - //! отправлять ли world * view * projection - bool m_isTransWorldViewProjection; - - //! отправлять ли позицию камеры/наблюдателя - bool m_isTransPosCam; - - //! отправлять время кадра - bool m_isTransTimeDelta; - - //! отправлять ли пользовательские данные - bool m_isTransUserData; - - //! отправлять ли пользовательские данные в другой шейдер - bool m_isTransUserDataInOtherShader; - - //! отправлять ли размер окна рендера - bool m_isTransWinSize; - - //! пользовательские данные, значения [0, 1] - float4 m_vUserData; - }; - - //! отправляемые данные в вершинный шейдер - СDataShader m_oDataVS; - - //! отправляемые данные в пиксельный шейдер - СDataShader m_oDataPS; - }; - - //! детализированные свойства, маска и 4 детальных и 4 микрорельефных карты - struct CMaskDetailMicroRelief - { - CMaskDetailMicroRelief(); - ~CMaskDetailMicroRelief(); - - //! идентификатор текстуры маски, где к каждому каналу привязаны 4 детальных и микрорельефных текстуры - ID m_idMask; - - //! массив идентификаторов детальных текстур, для каждого канала маски - ID m_aDetail[4]; - - //! массив идентификаторов микрорельефных текстур (normal map), для каждого канала маски - ID m_aMicroRelief[4]; - }; - - //! световые свойсвта, основные характеристики просчета освещения - struct CLightParam - { - CLightParam(); - ~CLightParam(); - - //! текстура с параметрами материала (созданная пользователем) - ID m_idTexParam; - - //! текстура с параметрами материала, размер 1х1, параметры взяты из текущей структуры - ID m_idTexParamHand; - - //! назначена ли (true) текстура для параметров материала (или данные берем из параметров и кладем в рабочую текстуру) - bool m_isTextureParam; - - //! шероховатость [0 - гладкий, 1 - полностью шершавый] - float m_fRoughness; - - //! отражательная способность [0 - ничего не отражает, 1 - все отражает] - float m_fF0; - - //! толщина/просвечиваемость [0 - просвечивается, 1 - не просвечивается] - float m_fThickness; - - float m_fOldRoughness; - float m_fOldF0; - float m_fOldThickness; - - //! тип отражений - MTLTYPE_REFLECT m_type_reflect; - - //! тип прозрачности - MTLTYPE_TRANSPARENCY m_type_transparency; - }; - - - - //! физические свойства - struct CPhysics - { - CPhysics(); - ~CPhysics(); - - //! тип физического материала - MTLTYPE_PHYSIC type_physics; - - //! коэффициент пробиваемости [0, ], чем больше тем сложнее пробить - float m_fDurability; - - //! шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется] - float m_fHitChance; - - //! плотность материала кг/м3 - float m_fDensity; - }; - - //! имя материала - String m_sName; - - //! основные графические свойства - CMainGraphics m_oMainGraphics; - - //! параметры детальности - CMaskDetailMicroRelief m_oMicroDetail; - - //! параметры освещения - CLightParam m_oLightParam; - - //! физические свойства - CPhysics m_oPhysics; - }; - - //! юнит материала - struct CUnitMaterial - { - CUnitMaterial(); - ~CUnitMaterial(); - - //! объект материала - CMaterial *m_pMtrl; - - //! объект отражений - CReflection *m_pReflect; - }; - -protected: - - //! использовать ли принудительный альфа тест - bool m_useForceblyAlphaTest; - - bool loadMtl(const char *szName, CMaterial **ppMtrl); - void createMtl(const char *szName, CMaterial **ppMtrl, MTLTYPE_MODEL type); - ID createTexParamLighting(float fRoughness, float fF0, float fThickness); - - void addName(const char *szName, ID id); - ID addUnitMaterial(CUnitMaterial *pUnitMtrl); - ID addMaterial(CMaterial *pMtrl); - - //! структура описывающая папку и все текстуры в ней, у каждой свой id для доступа - struct CPath - { - CPath(){} - - //! путь - String m_sPath; - - struct CObject - { - CObject(){ m_id = -1; } - CObject(ID id, const char *szName){ m_id = id; m_sName = szName; } - - //! идентификатор - ID m_id; - - //! имя - String m_sName; - }; - - //! массив CObject - Array<CObject*> m_aObjects; - }; - - //! массив путей до текстур/материалов - Array<CPath*> m_aMtrlPathes; - - //! массив юнитов материалов - Array<CUnitMaterial*> m_aUnitMtrls; - - //! массив материалов - Array<CMaterial*> m_aMtrls; - - //! массив отражений - Array<CReflection*> m_aReflections; - - //! использовать ли подсчет поверхностей - bool m_useCountSurface; - - //! текущий индентификатор поверхности - ID m_idCurrIdSurface; - - int CurrFirstFree; - - //! текущее время кадра в млсек - UINT m_uiCurrTimeDelta; - - //! общее время кадров в млсек - UINT m_uiCountTimeDelta; - - ID MtrlDefLight; - ID MtrlDefTree; - ID MtrlDefGrass; - ID MtrlDefStatic; - ID MtrlDefSkin; - ID BeginNonDef; - - float4x4 m_mWorld, m_mViewProj, m_mWorldTrans, m_mViewTrans, m_mProjTrans; -}; - -#endif \ No newline at end of file diff --git "a/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.cpp" "b/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.cpp" deleted file mode 100644 index e632478d2e45429952a41d6773df81bd6969c9a8..0000000000000000000000000000000000000000 --- "a/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.cpp" +++ /dev/null @@ -1,1170 +0,0 @@ - -/*********************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 -See the license in LICENSE -***********************************************************/ - -#define SXMATERIAL_LIGTH_VERSION 1 - -#include "sxmtllight.h" -#include "ml_data.h" - -#include "light.h" -#include "material.h" - -#if !defined(DEF_STD_REPORT) -#define DEF_STD_REPORT -report_func g_fnReportf = DefReport; -#endif - -CLights* ArrLights = 0; -CMaterials* ArrMaterials = 0; - -#define ML_PRECOND(retval) if(!ArrLights){LibReport(-1, "%s - sxmtlligth is not init", GEN_MSG_LOCATION); return retval;} - -//########################################################################## - -SX_LIB_API long SML_0GetVersion() -{ - return SXMATERIAL_LIGTH_VERSION; -} - -SX_LIB_API void SML_Dbg_Set(report_func rf) -{ - g_fnReportf = rf; -} - -SX_LIB_API void SML_0Create(const char *szName, bool isUnic) -{ - if (szName && strlen(szName) > 1) - { - if (isUnic) - { - HANDLE hMutex = CreateMutex(NULL, FALSE, szName); - if (GetLastError() == ERROR_ALREADY_EXISTS) - { - CloseHandle(hMutex); - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); - } - else - { - MLSet::MLInit(); - MLSet::ReCalcSize(); - ArrLights = new CLights(); - ArrMaterials = new CMaterials(); - } - } - else - { - MLSet::MLInit(); - MLSet::ReCalcSize(); - ArrLights = new CLights(); - ArrMaterials = new CMaterials(); - } - } - else - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); -} - -SX_LIB_API void SML_AKill() -{ - mem_delete(ArrLights) - mem_delete(ArrMaterials); -} - -SX_LIB_API void SML_OnLostDevice() -{ - ML_PRECOND(_VOID); - ArrLights->onLostDevice(); - ArrMaterials->onLostDevice(); -} - -SX_LIB_API void SML_OnResetDevice() -{ - ML_PRECOND(_VOID); - - MLSet::ReCalcSize(); - ArrLights->onResetDevice(); - ArrMaterials->onResetDevice(); - - MLSet::IDsRenderTargets::HowAdaptedLum = 0; -} - -SX_LIB_API void SML_Update(DWORD timeDelta) -{ - static const int *r_win_width = GET_PCVAR_INT("r_win_width"); - static const int *r_win_height = GET_PCVAR_INT("r_win_height"); - - static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); - - if (ArrMaterials) - ArrMaterials->update(timeDelta); - - MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*r_win_width) / float(*r_win_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); - MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); -} - -SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef) -{ - ML_PRECOND(_VOID); - - MLSet::CoefSizeDepthMapForLocal = fCoef; - MLSet::ReCalcSize(); - SML_OnLostDevice(); - SML_OnResetDevice(); -} - -SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef) -{ - ML_PRECOND(_VOID); - - MLSet::CoefSizeDepthMapForGlobal = fCoef; - MLSet::ReCalcSize(); - SML_OnLostDevice(); - SML_OnResetDevice(); - -} - -SX_LIB_API float SML_LigthsGettLCoefSizeDepth() -{ - ML_PRECOND(-1); - - return MLSet::CoefSizeDepthMapForLocal; -} - -SX_LIB_API float SML_LigthsGettGCoefSizeDepth() -{ - ML_PRECOND(-1); - return MLSet::CoefSizeDepthMapForGlobal; -} - -//############################################################################# - -SX_LIB_API void SML_LigthsClear() -{ - ML_PRECOND(_VOID); - - ArrLights->clear(); -} - -SX_LIB_API void SML_LigthsClearIDArr() -{ - ML_PRECOND(_VOID); - - ArrLights->clearIDArr(); -} - -SX_LIB_API int SML_LigthsGetCount() -{ - ML_PRECOND(-1); - - return ArrLights->getCountLights(); -} - -SX_LIB_API bool SML_LigthsGetExists(ID id) -{ - ML_PRECOND(false); - - return ArrLights->getExists(id); -} - - -SX_LIB_API ID SML_LigthsCreatePoint(const float3 *pCenter, float fDist, const float3 *pColor, bool isGlobal, bool isShadowed/*, const char* bound_volume*/) -{ - ML_PRECOND(-1); - return ArrLights->createPoint(-1, pCenter, fDist, pColor, isGlobal, isShadowed/*, 0*/); -} - -SX_LIB_API ID SML_LigthsCreateDirection(const float3 *pPos, float fDist, const float3 *pColor, const SMQuaternion *qOrient, float fTopRadius, float fAngle, bool isShadow/*, const char* bound_volume*/) -{ - ML_PRECOND(-1); - return ArrLights->createDirection(-1, pPos, fDist, pColor, qOrient, fTopRadius, fAngle, isShadow/*, 0*/); -} - -SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta) -{ - ML_PRECOND(_VOID); - ArrLights->render(id, timeDelta); -} - -SX_LIB_API ID SML_LigthsGetGlobal() -{ - ML_PRECOND(-1); - return ArrLights->getLightGlobal(); -} - -SX_LIB_API bool SML_LigthsGetCastGlobalShadow() -{ - ML_PRECOND(false); - return ArrLights->getCastGlobalShadow(); -} - -SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed) -{ - ML_PRECOND(_VOID); - return ArrLights->setCastGlobalShadow(isShadowed); -} - -SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor) -{ - ML_PRECOND(_VOID); - ArrLights->getLightColor(id, pColor); -} - -SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor) -{ - ML_PRECOND(_VOID); - ArrLights->setLightColor(id, pColor); -} - -SX_LIB_API void SML_LigthsGetPos(ID id, float3 *pPos, bool isGreal) -{ - ML_PRECOND(_VOID); - ArrLights->getLightPos(id, pPos, isGreal); -} - -SX_LIB_API float SML_LigthsGetPower(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightPower(id); -} - -SX_LIB_API float SML_LigthsGetDist(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightDist(id); -} - -SX_LIB_API void SML_LigthsSetPos(ID id, const float3 *pPos, bool isGreal) -{ - ML_PRECOND(_VOID); - ArrLights->setLightPos(id, pPos, isGreal); -} - -SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ) -{ - ML_PRECOND(_VOID); - ArrLights->getLightOrient(id, pQ); -} - -SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ) -{ - ML_PRECOND(_VOID); - ArrLights->setLightOrient(id, pQ); -} - -SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id) -{ - ML_PRECOND(LTYPE_LIGHT_NONE); - return ArrLights->getLightType(id); -} - -SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum) -{ - ML_PRECOND(-1); - return ArrLights->comVisibleForFrustum(id, pFrustum); -} - -SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id) -{ - ML_PRECOND(false); - return ArrLights->getVisibleForFrustum(id); -} - -SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pPos) -{ - ML_PRECOND(-1); - return ArrLights->comDistFor(id, pPos); -} - -SX_LIB_API float SML_LigthsGetDistFor(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getDistFor(id); -} - -SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pPos) -{ - ML_PRECOND(_VOID); - return ArrLights->comVisibleFrustumDistFor(pFrustum, pPos); -} - -SX_LIB_API bool SML_LigthsGetEnable(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightEnable(id); -} - -SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable) -{ - ML_PRECOND(_VOID); - return ArrLights->setLightEnable(id, isEnable); -} - -SX_LIB_API bool SML_LigthsGetShadowed(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightShadowed(id); -} - -SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id) -{ - ML_PRECOND(0); - return ArrLights->get4Or3Splits(id); -} - -SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3) -{ - ML_PRECOND(_VOID); - - ArrLights->set4Or3Splits(id, is4or3); -} - -SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow() -{ - ML_PRECOND(0); - return ArrLights->getShadow2(); -} - -SX_LIB_API void SML_LigthsShadowNull() -{ - ML_PRECOND(_VOID); - return ArrLights->shadowNull(); -} - -SX_LIB_API void SML_LigthsShadowRenderBegin(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderBegin(id); -} - -SX_LIB_API void SML_LigthsShadowRenderEnd(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderEnd(id); -} - -SX_LIB_API void SML_LigthsShadowRenderPre(ID id, int iCube) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderPre(id, iCube); -} - -SX_LIB_API void SML_LigthsShadowRenderPost(ID id, int iCube) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderPost(id, iCube); -} - -SX_LIB_API IFrustum* SML_LigthsGetFrustum(ID id, int iHow) -{ - ML_PRECOND(0); - return ArrLights->getLightFrustum(id, iHow); -} - -SX_LIB_API void SML_LigthsUpdateGFrustums(ID id, int iSplit, const float3 *pPos, const float3 *pDir) -{ - ML_PRECOND(_VOID); - return ArrLights->updateLightGFrustums(id, iSplit, pPos, pDir); -} - -SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int iTypeMaterial, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrLights->initShaderOfTypeMaterial(id, iTypeMaterial, pWorld); -} - -SX_LIB_API void SML_LigthsShadowGen(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->shadowGen2(id); -} - -SX_LIB_API void SML_LigthsShadowSoft(bool isRandom, float fSize, bool isFirst) -{ - ML_PRECOND(_VOID); - ArrLights->shadowSoft(isRandom, fSize, isFirst); -} - - - -SX_LIB_API ID SML_LigthsCreateCopy(ID id) -{ - ML_PRECOND(-1); - return ArrLights->createCopy(id); -} - -SX_LIB_API void SML_LigthsDeleteLight(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->deleteLight(id); -} - -SX_LIB_API char* SML_LigthsGetName(ID id) -{ - ML_PRECOND(0); - return ArrLights->getLightName(id); -} - -SX_LIB_API void SML_LigthsSetName(ID id, const char *szName) -{ - ML_PRECOND(_VOID); - ArrLights->setLightName(id, szName); -} - - -SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle) -{ - ML_PRECOND(_VOID); - ArrLights->setLightAngle(id, fAngle, true); -} - -SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius) -{ - ML_PRECOND(_VOID); - ArrLights->setLightTopRadius(id, fTopRadius); -} - -SX_LIB_API void SML_LigthsSetDist(ID id, float fRadiusHeight, bool isCreate) -{ - ML_PRECOND(_VOID); - ArrLights->setLightDist(id, fRadiusHeight, isCreate); -} - - -SX_LIB_API float SML_LigthsGetShadowBias(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowBias(id); -} - -SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias) -{ - ML_PRECOND(_VOID); - return ArrLights->setShadowBias(id, fBias); -} - -SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel) -{ - ML_PRECOND(_VOID); - ArrLights->setShadowBlurPixel(id, fBlurPixel); -} - -SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowBlurPixel(id); -} -SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear) -{ - ML_PRECOND(_VOID); - ArrLights->setShadowLocalNear(id, fNear); -} - -SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowLocalNear(id); -} - -SX_LIB_API void SML_LigthsSetShadowLocalFar(ID id, float fFar) -{ - ML_PRECOND(_VOID); - ArrLights->setShadowLocalFar(id, fFar); -} - -SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowLocalFar(id); -} - -SX_LIB_API void SML_LigthsSetCubeEdgeEnable(ID id, int iEdge, bool isEnable) -{ - ML_PRECOND(_VOID); - ArrLights->setLightCubeEdgeEnable(id, iEdge, isEnable); -} - -SX_LIB_API bool SML_LigthsGetCubeEdgeEnable(ID id, int iEdge) -{ - ML_PRECOND(false); - return ArrLights->getLightCubeEdgeEnable(id, iEdge); -} - - -SX_LIB_API float SML_LigthsGetAngle(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightAngle(id); -} - -SX_LIB_API float SML_LigthsGetTopRadius(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightTopRadius(id); -} - -SX_LIB_API ID SML_LigthsGetIDArr(ID id, ID idOwner, int iHow) -{ - ML_PRECOND(-1); - return ArrLights->getLightIDArr(id, idOwner, iHow); -} - -SX_LIB_API void SML_LigthsSetIDArr(ID id, ID idOwner, int iHow, ID idArr) -{ - ML_PRECOND(_VOID); - ArrLights->setLightIDArr(id, idOwner, iHow, idArr); -} - -SX_LIB_API void SML_LigthsSetTypeShadowed(ID id, LTYPE_SHADOW type) -{ - ML_PRECOND(_VOID); - ArrLights->setLightTypeShadowed(id, type); -} - -SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id) -{ - ML_PRECOND(LTYPE_SHADOW_NONE); - return ArrLights->getLightTypeShadowed(id); -} - -SX_LIB_API bool SML_LigthsCountUpdateUpdate(ID id, const float3 *pViewPos, int iHow) -{ - ML_PRECOND(false); - return ArrLights->lightCountUpdateUpdate(id, pViewPos, iHow); -} - -SX_LIB_API bool SML_LigthsCountUpdateAllowed(ID id, int iHow) -{ - ML_PRECOND(false); - return ArrLights->lightCountUpdateAllowed(id, iHow); -} - -SX_LIB_API void SML_LigthsCountUpdateNull(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->lightCountUpdateNull(id); -} - -SX_LIB_API void SML_LigthsToneMappingCom(DWORD timeDelta, float fAdapted) -{ - ML_PRECOND(_VOID); - ArrLights->toneMappingCom(timeDelta, fAdapted); -} - -SX_LIB_API int SML_LigthsDelGetCount() -{ - ML_PRECOND(-1); - return ArrLights->delGetCount(); -} - -SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID idKey) -{ - ML_PRECOND(LTYPE_LIGHT_NONE); - return ArrLights->delGetType(idKey); -} - -SX_LIB_API void SML_LigthsDelDel(ID idKey) -{ - ML_PRECOND(_VOID); - ArrLights->delDel(idKey); -} - -SX_LIB_API ID SML_LigthsDelGetIDArr(ID idKey, ID idOwner, int iHow) -{ - ML_PRECOND(-1); - return ArrLights->delGetIDArr(idKey, idOwner, iHow); -} - -//############################################################################# - -SX_LIB_API ID SML_DSGetRT_ID(DS_RT type) -{ - ML_PRECOND(-1); - if (type == DS_RT_COLOR) - return MLSet::IDsRenderTargets::ColorScene; - else if (type == DS_RT_NORMAL) - return MLSet::IDsRenderTargets::NormalScene; - else if (type == DS_RT_PARAM) - return MLSet::IDsRenderTargets::ParamsScene; - else if (type == DS_RT_DEPTH) - return MLSet::IDsRenderTargets::DepthScene; - else if (type == DS_RT_DEPTH0) - return MLSet::IDsRenderTargets::DepthScene0; - else if (type == DS_RT_DEPTH1) - return MLSet::IDsRenderTargets::DepthScene1; - - else if (type == DS_RT_AMBIENTDIFF) - return MLSet::IDsRenderTargets::LightAmbientDiff; - else if (type == DS_RT_SPECULAR) - return MLSet::IDsRenderTargets::LightSpecular; - - else if (type == DS_RT_SCENELIGHT) - return MLSet::IDsRenderTargets::LigthCom; - else if (type == DS_RT_SCENELIGHT2) - return MLSet::IDsRenderTargets::LigthCom2; - - else if (type == DS_RT_ADAPTEDLUM) - return MLSet::IDsRenderTargets::GetCurrAdaptedLum(); - - return -1; -} - -SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type) -{ - ML_PRECOND(0); - - ID tmpid = SML_DSGetRT_ID(type); - if (tmpid >= 0) - return SGCore_RTGetTexture(tmpid); - else - return 0; -} - -//############################################################################# - -SX_LIB_API ID SML_MtlLoad(const char *szName, MTLTYPE_MODEL mtl_type) -{ - ML_PRECOND(-1); - - return ArrMaterials->mtlLoad(szName, mtl_type); -} - -SX_LIB_API void SML_MtlSave(ID id) -{ - ML_PRECOND(_VOID); - - ArrMaterials->mtlSave(id); -} - -SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id) -{ - ML_PRECOND(MTLTYPE_MODEL_STATIC); - - return ArrMaterials->getTypeModel(id); -} - -SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model) -{ - ML_PRECOND(_VOID); - - ArrMaterials->setTypeModel(id, type_model); -} - -SX_LIB_API long SML_MtlGetCount() -{ - ML_PRECOND(-1); - - return ArrMaterials->getCount(); -} - -SX_LIB_API void SML_MtlRender(ID id, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrMaterials->render(id, pWorld); -} - -SX_LIB_API void SML_MtlRenderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl) -{ - ML_PRECOND(_VOID); - ArrMaterials->renderStd(type, pWorld, idSlot, idMtl); -} - -SX_LIB_API void SML_MtlRenderLight(const float4_t *pColor, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrMaterials->renderLight(pColor, pWorld); -} - -SX_LIB_API void SML_MtlSetMainTexture(ID slot, ID id) -{ - ML_PRECOND(_VOID); - ArrMaterials->setMainTexture(slot, id); -} - -SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf) -{ - ML_PRECOND(_VOID); - ArrMaterials->setIsIncrCountSurf(bf); -} - -SX_LIB_API bool SML_MtlGetIsIncrCountSurf() -{ - ML_PRECOND(false); - return ArrMaterials->getIsIncrCountSurf(); -} - -SX_LIB_API void SML_MtlNullingCurrCountSurf() -{ - ML_PRECOND(_VOID); - ArrMaterials->nullingCurrCountSurf(); -} - -SX_LIB_API int SML_MtlGetCurrCountSurf() -{ - ML_PRECOND(-1); - return ArrMaterials->getCurrCountSurf(); -} - -SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount) -{ - ML_PRECOND(_VOID); - ArrMaterials->setCurrCountSurf(iCount); -} - -SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isAlphaTest) -{ - ML_PRECOND(_VOID); - ArrMaterials->setForceblyAlphaTest(isAlphaTest); -} - -SX_LIB_API bool SML_MtlGetForceblyAlphaTest() -{ - ML_PRECOND(false); - return ArrMaterials->getForceblyAlphaTest(); -} - - -SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model) -{ - ML_PRECOND(-1); - return ArrMaterials->getStdMtl(type_model); -} - - -SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetPhysicMaterial(id, type); -} - -SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id) -{ - ML_PRECOND(MTLTYPE_PHYSIC_DEFAULT); - return ArrMaterials->mtlGetPhysicMaterial(id); -} - -SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetUsingAlphaTest(id); -} - -SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUsingAlphaTest(id, isUsing); -} - - - -SX_LIB_API void SML_MtlRefSetIDArr(ID id, ID idOwner, int iCube, ID idArr) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefSetIDArr(id, idOwner, iCube, idArr); -} - -SX_LIB_API ID SML_MtlRefGetIDArr(ID id, ID idOwner, int iCube) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlRefGetIDArr(id, idOwner, iCube); -} - -SX_LIB_API int SML_MtlDelRefGetCount() -{ - ML_PRECOND(-1); - return ArrMaterials->delRefCount(); -} - -SX_LIB_API ID SML_MtlDelRefGetIDArr(ID idKey, ID idOwner, int iCube) -{ - ML_PRECOND(-1); - return ArrMaterials->delRefGetIDArr(idKey, idOwner, iCube); -} - -SX_LIB_API void SML_MtlDelRefClear() -{ - ML_PRECOND(_VOID); - ArrMaterials->delRefAllDel(); -} - -SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefSetMinMax(id, pMin, pMax); -} - -SX_LIB_API void SML_MtlRefPreRenderPlane(ID id, D3DXPLANE *pPlane) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefPreRenderPlane(id, pPlane); -} - -SX_LIB_API const IFrustum* SML_MtlRefGetfrustum(ID id, int iCube) -{ - ML_PRECOND(0); - return ArrMaterials->mtlRefGetfrustum(id, iCube); -} - -SX_LIB_API bool SML_MtlRefIsAllowedRender(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlRefIsAllowedRender(id); -} - -SX_LIB_API void SML_MtlRefPostRenderPlane(ID id) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefPostRenderPlane(id); -} - -SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id) -{ - ML_PRECOND(0); - return ArrMaterials->mtlRefPlaneGetTex(id); -} - - - -SX_LIB_API void SML_MtlRefCubeBeginRender(ID id, const float3_t *pCenter) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubeBeginRender(id, pCenter); -} - -SX_LIB_API void SML_MtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubePreRender(id, iCube, pWorld); -} - -SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubePostRender(id, iCube); -} - -SX_LIB_API void SML_MtlRefCubeEndRender(ID id, const float3_t *pViewPos) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubeEndRender(id, pViewPos); -} - -SX_LIB_API bool SML_MtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos) -{ - ML_PRECOND(false); - return ArrMaterials->mtlRefUpdateCountUpdate(id, pViewPos); -} - -SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefNullingCountUpdate(id); -} - -SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id) -{ - ML_PRECOND(0); - return ArrMaterials->refCubeGetTex(id); -} - -//########################################################################## - -SX_LIB_API void SML_MtlReloadMaterial(ID id, const char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlReLoad(id, szName); -} - -SX_LIB_API void SML_MtlClear(bool isClearRefDel) -{ - ML_PRECOND(_VOID); - ArrMaterials->clear(isClearRefDel); -} - -SX_LIB_API void SML_MtlSetTexture(ID id, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTexture(id, szTexture); -} - -SX_LIB_API void SML_MtlGetTexture(ID id, char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetTexture(id, szName); -} - -SX_LIB_API ID SML_MtlGetTextureID(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetTextureID(id); -} - -SX_LIB_API void SML_MtlSetVS(ID id, const char *szPath) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetVS(id, szPath); -} - -SX_LIB_API void SML_MtlGetVS(ID id, char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetVS(id, szName); -} - -SX_LIB_API void SML_MtlSetPS(ID id, const char *szPath) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetPS(id, szPath); -} - -SX_LIB_API void SML_MtlGetPS(ID id, char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetPS(id, szName); -} - -SX_LIB_API float SML_MtlGetDurability(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetDurability(id); -} - -SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetDurability(id, fDurability); -} - -SX_LIB_API float SML_MtlGetHitChance(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetHitChance(id); -} - -SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetHitChance(id, fHitChance); -} - -SX_LIB_API float SML_MtlGetDensity(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetDensity(id); -} - -SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetDensity(id, fDensity); -} - -//########################################################################## - -SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetLighting(id, isLighting); -} - -SX_LIB_API bool SML_MtlGetLighting(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetLighting(id); -} - -SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetIsTextureLighting(id, isTexLighting); -} - -SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetIsTextureLighting(id); -} - -SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTextureLighting(id, szTexture); -} - -SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetTextureLighting(id, szTexture); -} - -SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetRoughness(id, fRoughness); -} - -SX_LIB_API float SML_MtlGetRoughness(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetRoughness(id); -} - -SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetThickness(id, fThickness); -} - -SX_LIB_API float SML_MtlGetThickness(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetThickness(id); -} - -SX_LIB_API void SML_MtlSetF0(ID id, float fF0) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetF0(id, fF0); -} - -SX_LIB_API float SML_MtlGetF0(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetF0(id); -} - -SX_LIB_API void SML_MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTypeTransparency(id, type); -} - -SX_LIB_API MTLTYPE_TRANSPARENCY SML_MtlGetTypeTransparency(ID id) -{ - ML_PRECOND(MTLTYPE_TRANSPARENCY_NONE); - return ArrMaterials->mtlGetTypeTransparency(id); -} - -SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTypeReflection(id, type); -} - -SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id) -{ - ML_PRECOND(MTLTYPE_REFLECT_NONE); - return ArrMaterials->mtlGetTypeReflection(id); -} - -//************************************************************************** - -SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetMaskTex(id, szTexture); -} - -SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetMaskTex(id, szTexture); -} - -SX_LIB_API void SML_MtlSetMRTex(ID id, int iChannel, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetMRTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlGetMRTex(ID id, int iChannel, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetMRTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlSetDTex(ID id, int iChannel, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetDTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetDTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetStdVS(id, type, isSend); -} - -SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetStdVS(id, type); -} - -SX_LIB_API void SML_MtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetStdPS(id, type, isSend); -} - -SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetStdPS(id, type); -} - - -SX_LIB_API void SML_MtlSetUserDataVS(ID id, int iComponent, float fValue) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataVS(id, iComponent, fValue); -} - -SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetUserDataVS(id, iComponent); -} - -SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPS) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataVS_InPS(id, isSendPS); -} - -SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetUserDataVS_InPS(id); -} - -SX_LIB_API void SML_MtlSetUserDataPS(ID id, int iComponent, float fValue) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataPS(id, iComponent, fValue); -} - -SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetUserDataPS(id, iComponent); -} - -SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVS) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataPS_InPS(id, isSendVS); -} - -SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetUserDataPS_InPS(id); -} diff --git "a/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.h" "b/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.h" deleted file mode 100644 index 6092009aa0964006a887c3f450af4e4e7800308d..0000000000000000000000000000000000000000 --- "a/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.h" +++ /dev/null @@ -1,1362 +0,0 @@ - -/*********************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 -See the license in LICENSE -***********************************************************/ - -/*! -\file -Заголовочный файл sxmtllight - библиотеки освещения и материалов -*/ - -/*! \defgroup sxmtllight sxmtllight - библиотека освещения и материалов -@{ -*/ - -#ifndef __SXMTLLIGHT_H -#define __SXMTLLIGHT_H - -#if defined(_DEBUG) -#pragma comment(lib, "sxgcore_d.lib") -#else -#pragma comment(lib, "sxgcore.lib") -#endif - -#undef SX_LIB_API -#define SX_LIB_API extern "C" __declspec (dllimport) -#include <gcore/sxgcore.h> - -#ifdef SX_DLL -#undef SX_LIB_API -#define SX_LIB_API extern "C" __declspec (dllexport) -#endif - -#include <gdefines.h> - -/*! \name Базовые функции библиотеки -@{*/ - -//! версия подсистемы -SX_LIB_API long SML_0GetVersion(); - -//! установить функцию обработки сообщений -SX_LIB_API void SML_Dbg_Set(report_func rf); - -//! инициализция подсистемы -SX_LIB_API void SML_0Create( - const char *szName, //!< присваиваемое имя - bool isUnic = true //!< должна ли подсистема быть уникальной по имени - ); - -//! уничтожить подсистему -SX_LIB_API void SML_AKill(); - -//!@} - -/*! \name Обработка потери/восстановления устройства -@{*/ - -//! вызывать при потрете устройства -SX_LIB_API void SML_OnLostDevice(); - -//! вызывать при восстановлении устройства -SX_LIB_API void SML_OnResetDevice(); - -//!@} - -//! обновление данных всей библиотеки -SX_LIB_API void SML_Update( - DWORD timeDelta //!< время рендера кадра в млсек - ); - -//############################################################################# - -/*! \defgroup sxmtllight_light Освещение - \ingroup sxmtllight - \warning Обращение (идентификация) конкретного света осуществляется посредством идентификатора который выдают создающие функции: - - #SML_LigthsCreatePoint - - #SML_LigthsCreateDirection - Получить идентификатор уже созданного света можно, посредством ключа (key) который лежит в пределах [0, #SML_LigthsGetCount), -передав этот ключ #SML_LigthsGetIDOfKey, которая в случае успеха вернет идентификатор света. -@{*/ - -/*! максимальное количество обновлений статических источников света, в первый момент рендера */ -#define LIGHTS_UPDATE_MAX_COUNT_FOR_STATIC 3 - -/*! \name Дистанции (метрах) при которых будет сниженно или повышено количество отрисовок для локальных источников света -меньше #LIGHTS_UPDATE_L0_DIST - обновление будет каждый кадр\n -больше #LIGHTS_UPDATE_L2_DIST - обновления не будет -@{*/ - -#define LIGHTS_UPDATE_L0_DIST 10 -#define LIGHTS_UPDATE_L1_DIST 30 -#define LIGHTS_UPDATE_L2_DIST 70 - -//!@} - -/*! Коэфициент обновления сплитов глобального света. -Cчитается: LIGHTS_UPDATE_PSSM_SPLIT*number_split - \note Первый сплит обновляется каждый кадр, второй через кадр -*/ -#define LIGHTS_UPDATE_PSSM_SPLIT 1 - -/*! аналогичнен #LIGHTS_UPDATE_PSSM_SPLIT только для 5 сплита (для теней от облаков) */ -#define LIGHTS_UPDATE_PSSM_SPLIT_5 2 - - -/*! стандартное значение верхнего/начального радиуса для направленного света */ -#define LIGHTS_LOCAL_STD_TOP_RADIUS 0.1 - -/*! стандартное значение ближней плоскости отсечения для теней локального света */ -#define LIGHTS_LOCAL_STD_NEAR 0.1 - -/*! максимальная дистанция локального света */ -#define LIGHTS_LOCAL_MAX_DIST 200.f - - -/*! радиус глобального источника */ -#define LIGHTS_GLOBAL_STD_RADIUS 999999 - -/*! отдаленность глобального света (нужно для корректности теней), если не знаете, не трогайте */ -#define LIGHTS_POS_G_MAX 1000 - - -/*! базовое направление направленноого источника света */ -#define LIGHTS_DIR_BASE float3(0, -1, 0) - - -//! типы источников света -enum LTYPE_LIGHT -{ - //! не установленный - LTYPE_LIGHT_NONE = -1, - - //! глобальный - LTYPE_LIGHT_GLOBAL, - - //! точечный - LTYPE_LIGHT_POINT, - - //! направленный - LTYPE_LIGHT_DIR -}; - -//! типы теней источников света -enum LTYPE_SHADOW -{ - //! без теней - LTYPE_SHADOW_NONE = -1, - - //! статичные тени, тень обновляется первые несколько кадров (для корректности), далее не обновляется - LTYPE_SHADOW_STATIC, - - //! полностью динамические тени - LTYPE_SHADOW_DYNAMIC, -}; - -/*! \name Настройки размеров для теней - \note Коэфициента относительно размеров окна рендера, если 1.f то размеры экрана, если 0.5f то размеры экрана * 0.5f -@{*/ - -//! установка коэфициента для локального света -SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef); - -//! установка коэфициента для глобального света -SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef); - - -//! возвращение коэфициента для локальный свет -SX_LIB_API float SML_LigthsGettLCoefSizeDepth(); - -//! возвращение коэфициента для глобальный свет -SX_LIB_API float SML_LigthsGettGCoefSizeDepth(); - -//!@} - -//! очистить список света -SX_LIB_API void SML_LigthsClear(); - -//! очистка всех идентификаторов просчетов во всех источниках света -SX_LIB_API void SML_LigthsClearIDArr(); - -//! общее количество света -SX_LIB_API int SML_LigthsGetCount(); - -//! возвращает true если свет с id существует -SX_LIB_API bool SML_LigthsGetExists(ID id); - -//! создать точечный свет (светит во все стороны) -SX_LIB_API ID SML_LigthsCreatePoint( - const float3 *pCenter, //!< центр света (мировая позиция) - float fDist, //!< дистанция, на которую распространяется свет - const float3 *pColor, //!< цвет в пределах 0-1 - bool isGlobal, //!< глобальный ли свет (типа солнца) - bool isShadowed //!< отбрасвыает ли тени свет - ); - -//! создать направленный свет -SX_LIB_API ID SML_LigthsCreateDirection( - const float3 *pPos, //!< позиция света (мировая) - float fDist, //!< дистанция на которую распространяется свет - const float3 *pColor, //!< цвет - const SMQuaternion *qOrient,//!< ориентация - float fTopRadius, //!< верхний (начальный) радиус - float fAngle, //!< угол (в радианах) - bool isShadow //!< отбрасвыает ли тени свет - ); - -//! возвращает тип света -SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id); - -//! создать копию объекта и вернуть на нее id -SX_LIB_API ID SML_LigthsCreateCopy(ID id); - -//! удаление света -SX_LIB_API void SML_LigthsDeleteLight(ID id); - -//! возвращает имя света -SX_LIB_API char* SML_LigthsGetName(ID id); - -//! устанавливает имя света -SX_LIB_API void SML_LigthsSetName(ID id, const char *szName); - -//! отрисовка ограничивающего объема -SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta); - -//! в color записывает цвет света -SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor); - -//! устанавливает цвет света -SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor); - -//! получить в pos позицию света -SX_LIB_API void SML_LigthsGetPos( - ID id, //!< идентификатор света - float3 *pPos, //!< инициализированный вектор в который будет записана позиция - bool isReal = false //!< true - нужны реальные координаты, false - нужны углы, только для глобального света, во всех остальных случаях не имеет смысла - ); - -//! установить позицию свету -SX_LIB_API void SML_LigthsSetPos( - ID id, //!< идентификатор света - const float3 *pPos, //!< позиция в которую будет перемещен свет - bool isReal = false //!< true - установка реальных координат, false - установка углов, только для глобального света, во всех остальных случаях не имеет смысла - ); - -//! возвращает "значение силы света" для отправки в шейдер (максимальная компонента цвет * дистанция покрытия/#LIGHTS_LOCAL_MAX_DIST) -SX_LIB_API float SML_LigthsGetPower(ID id); - -//! возвращает дистанцию, на которую распространяется свет -SX_LIB_API float SML_LigthsGetDist(ID id); - -//! установка новой дистанции -SX_LIB_API void SML_LigthsSetDist( - ID id, //!< идентификатор света - float fDist, //!< новая дистанция(радиус для точечного и высота для направленного) - bool isCreate = true //!< нужно ли пересоздание объема? (если новая дистанция больше чем текущий ограничивающий объем то надо, в других случаях по усмотрению) - ); - -//! записывает в q ориентацию света -SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ); - -//! установка ориентации света -SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ); - - -//! включен ли свет с идентификатором id -SX_LIB_API bool SML_LigthsGetEnable(ID id); - -//! установить всключен (true) или отключен (false) свет с идентификатором id -SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable); - -//! возвращает идентификатор глобального источника света, если он есть, иначе -1 -SX_LIB_API ID SML_LigthsGetGlobal(); - -//! возвращает установлена ли общая тень от глобального источника (все ли в тени) -SX_LIB_API bool SML_LigthsGetCastGlobalShadow(); - -//! установить общую тень для всего от глобального источника (все в тень) -SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed); - -//----------------------------------------------------------------------------- - -/*! \name Управление видимостью - \note Отдельный просчет - считает индивидуально для света и тут же возвращает результат просчетов - \note Предварительный просчет - просчет для всего света (к примеру в другом потоке) -@{*/ - -//! виден ли свет в данном фрустуме (отдельный просчет) -SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum); - -//! дистанция от viewpos до начала света (отдельный просчет) -SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pViewPos); - -//! просчет видимости и расстояния от наблюдателя viewpos до начала света, для каждого света (предварительный просчет) -SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pViewPos); - - -//! виден ли свет в просчитанном фрустуме -SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id); - -//! просчитанная дистанция от позиции наблюдателя до начала света -SX_LIB_API float SML_LigthsGetDistFor(ID id); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \name Настройки для направленного света -@{*/ - -//! возвращает угол, актуально только для направленного и света -SX_LIB_API float SML_LigthsGetAngle(ID id); - -//! установить угол, актуально только для направленного и света -SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle); - -//! возвращает верхний радиус, актуально только для направленного и света -SX_LIB_API float SML_LigthsGetTopRadius(ID id); - -//! устанавливает верхний радиус, актуально только для направленного и света -SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \name Настройки для точечного света -@{*/ - -/*! установить "рисовать ли в указанную грань cubemap тени" - \warning Актуально только когда свет может отбрасывать тени - */ -SX_LIB_API void SML_LigthsSetCubeEdgeEnable( - ID id, //!< идентификатор света - int iEdge, //!< номер стороны/грани cubemap [0,5] - bool iEnable //!< true - рисовать, false - не рисовать - ); - -//! получить текущее значение "рисовать ли в указанную грань cubemap тени" -SX_LIB_API bool SML_LigthsGetCubeEdgeEnable( - ID id, //!< идентификатор света - int iEdge //!< номер стороны/грани cubemap [0,5] - ); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \defgroup sxmtllight_light_shadow Управление тенями - \ingroup sxmtllight_light - \note Для генерации теней используется один render target full screen - \note Для сглаживания используется еще один аналогичный render target и первый render target. При сглаживании внутри меняется только счетчик, который меняет их местами - \note Так как используется всего один render target для генерации теней то есесно в текущий момент времени можно сгенерировать и сгладить тень только для одного света - \note Для теней от глобального света используется техника PSSM (Parallel-Split Shadow Mapping) на 3/4 сплита для объектов уровня (3 или 4 сплита можно настроить #SML_LigthsSet4Or3SplitsG) - \note Для теней от локального света используется техника Shadow Mapping в двух вариациях: - - для точечного света используется cubemap - - для направленного света - обычная техника Shadow Mapping -@{*/ - -//! отбрасывает ли свет тени -SX_LIB_API bool SML_LigthsGetShadowed(ID id); - -//! возвращает true в случае если установлено 4 сплита для PSSM, иначе (установлено 3 сплита) false -SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id); - -//! установка количества сплитов (false - 3, true - 4) для PSSM -SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3); - -/*! устанавливает шейдеры и передает им данные на основании типа материала, поддерживаются все типы MTL_TYPE_*/ -SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int typemat, const float4x4 *pWorld); - -/*! \name Управление обновлениями теней - \note Так как основная задумка это real-time рендер то для этого нужны упрощения, одним из таковых является обновление теней от света, которое может происходить не каждый кадр -@{*/ - -//! установка динамики обработки теней -SX_LIB_API void SML_LigthsSetTypeShadowed( - ID id, //!< идентификатор света - LTYPE_SHADOW type //!< значение из перечисления #LTYPE_SHADOW - ); - -//! возвращает тип динамики теней (одно из значений #LTYPE_SHADOW) -SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id); - -//! производит обработку данных затем возвращает разрешено ли обновлять тени, увеличивает внутрений счетчик, поэтому необходимо вызывать только когда надо -SX_LIB_API bool SML_LigthsCountUpdateUpdate( - ID id, //!< идентификатор света - const float3 *pViewPos, //!< позиция камеры для которой обновляем, на основании расстояния будет произведен расчет обновления - int iHow = -1 //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! разрешено ли обновлять тени, в отличии от #SML_LigthsUpdateCountUpdate не увеличивает внутренний счетчик -SX_LIB_API bool SML_LigthsCountUpdateAllowed( - ID id, //!< идентификатор света - int iHow = -1 //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! сбросить счетчик обновлений и обновлять до предела тени -SX_LIB_API void SML_LigthsCountUpdateNull(ID id); - -//!@} - - -/*! \name Управление циклами рендера в карты глубин - Для локального направленного света: - \code - SML_LigthsShadowRenderBegin(id); - //рендер того что должно отбросить тени - SML_LigthsShadowRenderEnd(id); - \endcode - Для глобального и точечного: - \code - SML_LigthsShadowRenderBegin(id); - SML_LigthsShadowRenderPre(id, cube); - //рендер того что должно отбросить тени - SML_LigthsShadowRenderPost(id, cube); - SML_LigthsShadowRenderEnd(id); - \endcode - Где cube для точечного это номер стороны cubemap [0-5] в которую будет осуществлен рендер, а для глобального это номер сплита. -@{*/ - -//! подготовительные процедуры -SX_LIB_API void SML_LigthsShadowRenderBegin(ID id); - -//! завершающие процедуры -SX_LIB_API void SML_LigthsShadowRenderEnd(ID id); - -//! подготовительные процедур перед рендером для сплита/стороны -SX_LIB_API void SML_LigthsShadowRenderPre( - ID id, //!< идентификатор света - int iCube //!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита - ); - -//! завершающие процедур перед рендером для сплита/стороны -SX_LIB_API void SML_LigthsShadowRenderPost( - ID id, //!< идентификатор света - int iCube //!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита - ); - -//!@} - -//! обнуление карты теней, необходимо вызывать перед генерацией теней посредством функции #SML_LigthsGenShadow -SX_LIB_API void SML_LigthsShadowNull(); - -//! генерация тени на основе уже отработанной информации о затенении, перед вызовов этой функции необходимо вызывать #SML_LigthsShadowNull -SX_LIB_API void SML_LigthsShadowGen(ID id); - -//! возвращает текстуру с тенями (если вызывались функции сглаживания) то вренутся сглаженная -SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow(); - -//! сглаживание текущей тени -SX_LIB_API void SML_LigthsShadowSoft( - bool isRandSam, //!< использовать ли смещение по случайному направлению - float fSize, //!< коэфициент увеличения размера пикселя для размытия - bool isFirst = false //!< впервые ли вызывается размытие для текущей тени, каждый раз когда тень еще не сглажена, но сгенерирована, нужно указывать false - ); - -//! возвращает указатель фрустума света -SX_LIB_API IFrustum* SML_LigthsGetFrustum( - ID id, //!< идентификатор света - int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! обновление фрустума глобального света -SX_LIB_API void SML_LigthsUpdateGFrustums( - ID id, //!< идентификатор света - int iSplit, //!< номер сплита - const float3 *pPos, //!< позиция наблюдателя - const float3 *pDir //!< направление взгляда наблюдателя - ); - -/*! \name Управление настройками для генерации глубины/тени -@{*/ - -//! получить текущее смещение (bias) при генерации глубины -SX_LIB_API float SML_LigthsGetShadowBias(ID id); - -//! установить текущее смещение (bias) при генерации глубины -SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias); - - -//! установить размерность размытия (в пикселя) при геренации тени -SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel); - -//! получить текущее значение размерности (в пикселях) при генерации тени -SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id); - - -//! установить значение ближней плоскостью отсечения для теней (локальный свет) -SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear); - -//! получить текущее значение ближней плоскостью отсечения для теней (локальный свет) -SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id); - -/*! установка дальней плоскостью отсечения для теней (локальный свет) - \note Иногда возникают артефакты и если отрегулировать это значение то все становится на свои места, тесты показали что в основном при ошибках, увеличение этого значения решало проблемы -*/ -SX_LIB_API void SML_LigthsSetShadowLocalFar( - ID id, //!< идентификатор света - float fFar //!< значение дальней плоскости отсечения (дальность видимости теней), обычно это значение = дальность света - ); - -//! возвращает значение дальней плоскости отсечения (дальности видимости теней) -SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \name Управление массивами обработки данных для рендера (к примеру от геометрии, растительности и прочего) - Cделано для того чтобы отделить просчеты видимости (если они нужны) от рендера. - К примеру можно рассчитать видимости в одном потоке а рисовать в основном. -@{ -*/ - -//! возвращает идентификатор в случае успеха, иначе <0 -SX_LIB_API ID SML_LigthsGetIDArr( - ID id, //!< идентификатор света - ID idOwner, //!< идентификатор объекта/системы вообще того что выдало идентификатор массива - int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! установить идентификатор -SX_LIB_API void SML_LigthsSetIDArr( - ID id, //!< идентификатор света - ID idOwner, //!< идентификатор объекта/системы вообще того что выдало идентификатор массива - int iHow, //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ID idArr //!< номер массива обработки от объекта который надо будет обрабатывать на видимость - ); - -//!@} - -//!@} sxmtllight_light_shadow - -//! обработка tone mapping -SX_LIB_API void SML_LigthsToneMappingCom( - DWORD timeDelta, //!< время рендера кадра в млсек - float fFactorAdapted = 0.3 //!< на сколько быстро "глаз" привыкнет к освещению (0,1] (медленно, быстро] - ); - -/*! \name Функции обработки удаленного света - При удалении света он помещается в специальный массив удаленных объектов, -это связано с тем что свет может содержать в себе данные которые требуют очистки памяти вне данной реализации, -к примеру идентификаторы массивов просчетов видимости. \n - Поэтому необходимо вручную удалять (уже после удаленяи функцией #SML_LigthsDeleteLight) удаленные объекты света. - \note Доступ к элементам массива удаленных объектов света осуществляется посредством порядкового номера в массиве (ключа key), то есть можно пройтись по массиву циклом. -@{*/ - -//! возвращает количество удаленных объектов света которые требуют удаления -SX_LIB_API int SML_LigthsDelGetCount(); - -//! возвращает тип удаленного объекта света, значения из #LightsTypeLight -SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID key); - -//! удаляет (окончательно) удаленный объект света -SX_LIB_API void SML_LigthsDelDel(ID key); - -//! возвращает идентификатор, если был передан, иначе <0 -SX_LIB_API ID SML_LigthsDelGetIDArr( - ID key, //!< порядковый номер объекта света в массиве удаленного света - ID idOwner, //!< идентификатор того что выдало идентификатор массива - int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//!@} - -//!@} sxmtllight_light - -//############################################################################# - -/*! \defgroup sxmtllight_ds Render targets для deferred shading - \ingroup sxmtllight -@{*/ - -//! типы render targets -enum DS_RT -{ - //! цвет rgba8 - DS_RT_COLOR = 0, - - //! нормали (включая микрорельеф) rfb10a2 - DS_RT_NORMAL, - - //! параметры освещения rgba8 - DS_RT_PARAM, - - //! глубина r16f, непрозрачные материалы - DS_RT_DEPTH, - - //! глубина r16f, непрозрачные материалы - DS_RT_DEPTH0, - - //! глубина r16f, непрозрачные и полупрозрачные пиксели, однако прозрачные (если есть) будут перекрывать непрозрачные, и в этом случае их глубина будет 1 то есть максимальной(для идентификации) - DS_RT_DEPTH1, - - - //! эмбиент цвет (цвет света rgb) и диффузное освещение (a) rgba16f - DS_RT_AMBIENTDIFF, - - //! блики r16f - DS_RT_SPECULAR, - - //! освещенная сцена rgba16 - DS_RT_SCENELIGHT, - - //! освещенная сцена rgba16 - DS_RT_SCENELIGHT2, - - //! текущий rt адаптации глаза к освещению r16f - DS_RT_ADAPTEDLUM -}; - -//! id render target по его типу -SX_LIB_API ID SML_DSGetRT_ID(DS_RT type); - -//! текстура render target по его типу -SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type); - -//!@} sxmtllight_ds - -//############################################################################# - -/*! \defgroup sxmtllight_mtl Система материалов - \ingroup sxmtllight -@{*/ - -/*! максимальная длина имени директории материала */ -#define MTL_MAX_SIZE_DIR SXGC_LOADTEX_MAX_SIZE_DIR - -/*! максимальная длина имени материала (без директории) */ -#define MTL_MAX_SIZE_NAME SXGC_LOADTEX_MAX_SIZE_NAME - -/*! максимальное количество обновлений статических отражений, в первый момент рендера */ -#define MTL_REF_UPDATE_MAX_COUNT_FOR_STATIC 3 - -/*! \name Дистанции при которых будут сниженно или повышено количество отрисовок для отражений -меньше #MTL_REF_UPDATE_L0_DIST - обновление будет каждый кадр -больше #MTL_REF_UPDATE_L2_DIST - обновления не будет -@{*/ - -#define MTL_REF_UPDATE_L0_DIST 10 -#define MTL_REF_UPDATE_L1_DIST 30 -#define MTL_REF_UPDATE_L2_DIST 70 - -//!@} - -/*! \name Параметры альфа теста - В данной реалзиации 2 вида альфа теста, принудительный (#SML_MtlSetForceblyAlphaTest) и назначаемый непосредственно материалом - \note функция альфа теста D3DCMP_GREATEREQUAL -@{*/ - -/*! значение свободного альфа теста (назначаемого материалом) */ -#define MTL_ALPHATEST_FREE_VALUE 64 - -/*! значение принудительного альфа теста */ -#define MTL_ALPHATEST_FORCEBLY_VALUE 8 - -//!@} - -/*! \name Значения параметров освещения по умолчанию - Данные значения по умолчанию будут применены к материалами которые не удалось загрузить, либо к стандартным материалам -@{*/ - -//! занчение шероховатости по умолчанию -#define MTL_LIGHTING_DEFAULT_ROUGHNESS 250.f/255.f - -//! значение f0 (отражательной способности поверхности) по умолчанию -#define MTL_LIGHTING_DEFAULT_F0 2.f/255.f - -//! значение thickness (толщина - на сколько будет использована диффузная составляющая, для твердых поверхностей - 1, для листьев деревьев и травы <1) по умолчанию -#define MTL_LIGHTING_DEFAULT_THICKNESS 255.f/255.f - -//!@} - -/*! \name Параметры отражений -@{*/ - -/*! размер текстур с отражениями */ -#define MTL_REF_TEX_SIZE 512 - -/*! ближняя плоскость отсечения */ -#define MTl_REF_PROJ_NEAR 0.25 - -/*! дальняя плоскость отсечения, или дистанция на которую будет рендер всего в текстуру отражений */ -#define MTl_REF_PROJ_FAR 100 - -//!@} - -/*! \name Виртуальные директории - \warning Имя виртуальной директории должно быть единичным символом (сделано для простоты сравнения), -и как следствие нежелательно использоавть реальную директорию с таким именем для текстур либо материалов, -и реальные директории не должны начинаться с данных символов -@{*/ - -//! имя виртуальной директории по умолчанию для "ручных" текстур с параметрами освещения -#define MTL_VIRTUAL_DIR_HAND_MTL '0' - -//! имя виртуальной директории по умолчанию для стандартных (встроенных) материалов -#define MTL_VIRTUAL_DIR_STD_MTL "mtrldef" - -//!@} - -/*! \name Текстурные регистры -Распределение регистров между текстурами которые будут отправляться для формирования данных -@{*/ - -/*!< основная текстура */ -#define MTL_TEX_R_MAIN 0 - -/*!< маска */ -#define MTL_TEX_R_MASK 1 - -/*! стартовый регистр для детальных текстур - \warning 4 следующих (включая указанный) будует заполнены детальными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL+3] не должны отправляться - \note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a - MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL + 1, MTL_TEX_R_DETAIL + 2, MTL_TEX_R_DETAIL + 3 -*/ -#define MTL_TEX_R_DETAIL 2 - -/*! стартовый регистр для микрорельефных текстур -\warning 4 следующих (включая указанный) будует заполнены микрорельефными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_MICRO, MTL_TEX_R_MICRO+3] не должны отправляться -\note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a - MTL_TEX_R_MICRO, MTL_TEX_R_MICRO + 1, MTL_TEX_R_MICRO + 2, MTL_TEX_R_MICRO + 3 -*/ -#define MTL_TEX_R_MICRO 6 - - -/*! текстура с параметрами освещения */ -#define MTL_TEX_R_PARAM_LIGHT 10 - -/*! текстура с отражениями */ -#define MTL_TEX_R_REFLECTION 12 - -/*! текстура с преломлениями */ -#define MTL_TEX_R_REFRACTION 13 - -/*! текстура с текущей глубиной */ -#define MTL_TEX_R_CURR_DEPTH 14 - -//!@} - -//! типы отражений -enum MTLTYPE_REFLECT -{ - //! нет отражения - MTLTYPE_REFLECT_NONE, - - //! плоское - MTLTYPE_REFLECT_PLANE, - - //! объемное динамическое - MTLTYPE_REFLECT_CUBE_DYNAMIC, - - //! объемное статическое, обработка идет первые несколько кадров, затем не обновляется - MTLTYPE_REFLECT_CUBE_STATIC -}; - -//! типы прозрачности -enum MTLTYPE_TRANSPARENCY -{ - //! нет прозрачности - MTLTYPE_TRANSPARENCY_NONE, - - //! освещаяемая прозрачность - MTLTYPE_TRANSPARENCY_ALPHA_LIGHT, - - //! неосвещаяемая прозрачность - MTLTYPE_TRANSPARENCY_ALPHA_UNLIT, -}; - -/*! \name Возможные слои -@{*/ - -//! непрозрачные неосвещаемые -#define MTLTYPE_LAYER_OPAQUE_UNLIT 0.0f - -//! прозрачные неосвещаемые -#define MTLTYPE_LAYER_TRANSPARENT_UNLIT 0.66f - -//! непрозрачные освещаемые -#define MTLTYPE_LAYER_OPAQUE_LIGHT 0.33f - -//! прозрачные освещаемые -#define MTLTYPE_LAYER_TRANSPARENT_LIGHT 1.0f - -//!@} - -//! тип модели материала -enum MTLTYPE_MODEL -{ - //! статическая геометрия - MTLTYPE_MODEL_STATIC = 0, - - //! растительность трава - MTLTYPE_MODEL_GRASS, - - //! растительность дерево - MTLTYPE_MODEL_TREE, - - //! анимационная модель - MTLTYPE_MODEL_SKIN, - - //! значение по умолчанию - MTLTYPE_MODEL_DEFAULT = MTLTYPE_MODEL_STATIC -}; - -//! физический тип материала -enum MTLTYPE_PHYSIC -{ - MTLTYPE_PHYSIC_CONCRETE = 0, //!< бетон - - //! значение по умолчанию - MTLTYPE_PHYSIC_DEFAULT = MTLTYPE_PHYSIC_CONCRETE, - - //! металл - MTLTYPE_PHYSIC_METAL, - - //! стекло - MTLTYPE_PHYSIC_GLASS, - - //! пластик - MTLTYPE_PHYSIC_PLASTIC, - - //! дерево - MTLTYPE_PHYSIC_TREE, - - //! плоть - MTLTYPE_PHYSIC_FLESH, - - //! земля/песок - MTLTYPE_PHYSIC_GROUD_SAND, - - //! вода - MTLTYPE_PHYSIC_WATER, - - //! листва/трава - MTLTYPE_PHYSIC_LEAF_GRASS, - - //! количество типов - MPT_COUNT -}; - -//! данные отправляемые в шейдеры -enum MTL_SHADERSTD -{ - //! мировая матрица (трансформации модели), world - MTL_SHADERSTD_MATRIX_WORLD = 0, - - //! матрица вида, view - MTL_SHADERSTD_MATRIX_VIEW, - - //! матрица проекции, projection - MTL_SHADERSTD_MATRIX_PROJECTION, - - //! world * view - MTL_SHADERSTD_MATRIX_WORLDVIEW, - - //! world * view * projection - MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, - - //! позиция камеры/наблюдателя - MTL_SHADERSTD_CAMPOS, - - //! данные о времени float2(CountTimeRender,TimeDelta) - MTL_SHADERSTD_TIMEDELTA, - - //! размеры окна рендера - MTL_SHADERSTD_WINSIZE, - - //! пользовательские данные (float4) - MTL_SHADERSTD_USERDATA -}; - -/*! \name Загрузка/сохранение - \note Файл загрузки/сохранения представлен простым конфигурационным файлом (ini) который можно обрабатывать посредством #ISXLConfig - \todo Расписать организацию конфигурационного файла загрузки/сохранения для материала -@{*/ - -/*! загрузка материала, возвращает уникальный идентификатора материала, - \note все материалы оборачиваются в специальную структуру, поэтому дубликатов среди идентификаторов материалов нет - \note любой повторно загружаемый материал не загружается, а лишь дублирует обертку, со ссылкой на внутренности оберкти - */ -SX_LIB_API ID SML_MtlLoad( - const char *szName, //!< имя_материала.расширение - MTLTYPE_MODEL mtl_type = MTLTYPE_MODEL_STATIC //!< тип модели материала на случай если материал не будет загружен/найден - ); - -//! перезагрузка материала -SX_LIB_API void SML_MtlReloadMaterial( - ID id, //!< идентификатор материала - const char *szName = 0 //!< на случай замены существующего материала другим - ); - -/*! сохранить материал по id - \note Сохранение происходит по отноительному пути в директория/директория_имяфайла.mtl -*/ -SX_LIB_API void SML_MtlSave(ID id); - -//!@} - -/*! очитска, удаляет все загруженные материалы (но место в массиве под них остается), все стандартные остаются - \warning Отражения не удаляются а помещаются в очередь удаления, так как могут сожеражть в себе идентификаторы, которые необходимы очистить, -для полной очистки необходимо вызывать функцию #SML_MtlDelRefClear. Однако во избежания утечек памяти необходимо очистить идентификаторы, для их получения вызыва функцию #SML_MtlDelRefGetIDArr -*/ -SX_LIB_API void SML_MtlClear( - bool isClearRefDel //!< очищать ли очередь удаления отражений, на тот случай если идентификаторы в отражениях больше не действительны - ); - -//! возвращает общее количество материалов -SX_LIB_API long SML_MtlGetCount(); - -//! возвращает тип модели материала по id -SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id); - -/*! установка типа модели материала по id - \warning меняется только внутренний флаг (определение)!!! все остальное для данного типа надо загружать вручную, сделано для больших возможностей построения материалов -*/ -SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model); - -//! установка параметров материала по id, вызывается перед DIP -SX_LIB_API void SML_MtlRender( - ID id, //!< идентификатор материала - const float4x4 *pWorld //!< указатель на мировую матрицу модели, либо 0 - тогда будет принята единичная матрица - ); - -//! стандартная отрисовка материала, используются стандартные шейдеры, нужно для теней, отражений и прочего -SX_LIB_API void SML_MtlRenderStd( - MTLTYPE_MODEL type, //!< тип материала из MtlTypeModel - const float4x4 *pWorld, //!< мировая матрица трансформации, либо 0 и будет применена единичная матрица - ID idSlot, //!< текстурный слот в который установить текстуру - ID idMtl //!< идентификатор материала из которого будет браться текстура - ); - -//! установка параметров материала для рендера источника света -SX_LIB_API void SML_MtlRenderLight( - const float4_t *pColor, //!< rgb - цвет, w зарезервирован - const float4x4 *pWorld //!< аналогично #SML_MtlRender - ); - -//! установить текстуру из материала id в текстурный слот slot -SX_LIB_API void SML_MtlSetMainTexture(ID idSlot, ID id); - - -//! установка физического типа материала -SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type); - -//! возвращает текущий тип физического материала -SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id); - -//! возвращает id стандартного материала для определенной модели материалов указанной в #MtlTypeModel -SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model); - -/*! \name Управление полупрозрачными поверхностями -Каждый выводимый пиксель помечается номером поверхности к которой он относится - - 0 - пусто - - 1 - непрозрачная геометрия - - все что больше 1 значит полупрозрачная геометрия - \note Если инкремент установлен то отрисовка каждого материала будет инкрементировать внутренний счетчик, присваивая каждому пикселю поверхности идентификатор поверхности. - \note На данный момент максимальное значение полупрозрачных поверхностей может быть только 255 (8 бит) -@{*/ - -/*! установка инкремента идентификатора поверхностей - \note К примеру для диференциации (разделения) пикселей при смешивании всех слоев изображения, -без разделения по принадлжености к определнной поверхности будет трудно/невозможно (пока выхода нет) корректно смешать все слои -*/ -SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf); - -//! установлен ли инкремент поверхностей -SX_LIB_API bool SML_MtlGetIsIncrCountSurf(); - -//! обнуление идентификатора отрисованных поверхностей (к примеру при новом кадре) -SX_LIB_API void SML_MtlNullingCurrCountSurf(); - -//! текущее количество отрисованных полупрозрачных поверхностей -SX_LIB_API int SML_MtlGetCurrCountSurf(); - -//! установить текущее количество отрисованных полупрозрачных поверхностей -SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount); - -/*! принудительное включение альфа теста (isat - true - включить, false - выключить) при устновке параметров материала, -к примеру для рендера полупрозрачных поверхностей, чтобы отсечь (условно) полностью прозрачные пиксели -*/ -SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isEnable); - -//! включен ли принудительный альфа тест -SX_LIB_API bool SML_MtlGetForceblyAlphaTest(); - -//!@} - -/*! \defgroup sxmtllight_mtl_reflect Отражения - \ingroup sxmtllight_mtl - \note Поддерживается 2 вида отражений: - - плоские - - объемные/кубические -@{*/ -//{{ - -//! записать в отражения идентификатор (idArr) для определнной стороны куба/сплита (iCube), соотнести его с идентификатором сущности (idOwner) -SX_LIB_API void SML_MtlRefSetIDArr( - ID id, //!< идентификатор материала - ID idOwner, //!< идентификатор сущности для которой записываем (геометрия, растительность и прочее) - int iCube, //!< условно - сторона куба/сплита для которой записываем - ID idArr //!< идентификатор который надо записать - ); - -//! возвращает идентификатор который был записан для сущности (idOwner) для стороны куба/сплита (iCube), если вообще записывался, если не записывался то <0 -SX_LIB_API ID SML_MtlRefGetIDArr( - ID id, //!< идентификатор материала - ID idOwner, //!< идентификатор сущности для которой было записывано (геометрия, растительность и прочее) - int iCube //!< условно - сторона куба/сплита для которой было записывано - ); - -/*! \name Управление удаленными отражениями -@{*/ - -//! возвращает количество удаленных материалов с отражениями -SX_LIB_API int SML_MtlDelRefGetCount(); - -//! возвращает идентификатор который был записан для сущности (inid) для стороны куба/сплита (cube) -SX_LIB_API ID SML_MtlDelRefGetIDArr( - ID idKey, //!< порядковый номер удаленного материала с отражением - ID idOwner, //!< идентификатор сущности для которой было записано (геометрия, растительность и прочее) - int iCube //!< условно - сторона куба/сплита для которой было записывано - ); - -//! очистка массива удаленных материалов с отражениями -SX_LIB_API void SML_MtlDelRefClear(); - -//!@} - -//! обработка статистики рендера для текущего матриала с отражением -SX_LIB_API bool SML_MtlRefUpdateCountUpdate( - ID id, //!< идентификатора материала - const float3_t *pViewPos //!< позиция наблюдателя, viewpos == 0 вернет false - ); - -/*! обнуление статистикки рендера для данного материала с отражением, -полезно в случаях каких-либо изменений, чтобы эти изменения были видны и в отражениях (актуально для статических отражений) -*/ -SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id); - -//! установка экстремумов материала -SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax); - -//! возвращает фрустум отражения, cube - сторона куба -SX_LIB_API const IFrustum* SML_MtlRefGetfrustum( - ID id, //!< идентификатора материала - int iCube //!< сторона куба, если отражение плоское то необходимо указать в cube передать 0, иначе вернет NULL - ); - -SX_LIB_API bool SML_MtlRefIsAllowedRender(ID id); //!< разрешен ли рендер отражений для данного материала в текущий момент - -/*! \name Рендер плоского отражения - \note Перед началом рендера плоских отражений необходимо в регистры матриц в #G_RI_MATRIX_VIEW поместить матрицу вида наблюдателя - \note Порядок рендера: - \code - SML_MtlRefPreRenderPlane(id, plane); - //код рендера всего того что необходимо поместить в текстуру отражений - SML_MtlRefPostRenderPlane(id); - \endcode -@{*/ - -//! первоначальные настройки данных для генерации отражения -SX_LIB_API void SML_MtlRefPreRenderPlane( - ID id, //!< идентификатор материала - D3DXPLANE *pPlane //!< плоскость относительно которой будет считаться отражение - ); - -//! завершающие операции -SX_LIB_API void SML_MtlRefPostRenderPlane(ID id); - -//! возвращает текстуру с плоским отражением (если оно есть, иначе 0) -SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id); - -//!@} - -/*! \name Рендер объемного (кубического) отражения - \note Порядок рендера: - \code - SML_MtlRefCubeBeginRender(id, center); - SML_MtlRefCubePreRender(id, cube, world); - //код рендера всего того что необходимо поместить в текстуру отражений - SML_MtlRefCubePostRender(id, cube); - SML_MtlRefCubeEndRender(id, viewpos); - \endcode -@{*/ - -//! установка общих настроек -SX_LIB_API void SML_MtlRefCubeBeginRender( - ID id, //!< идентификатор материала - const float3_t *pCenter //!< центр (позиция) подгруппы модели - откуда будет рендер отражений - ); - -//! установка частных настроек для стороны куба (cube) -SX_LIB_API void SML_MtlRefCubePreRender( - ID id, //!< идентификатор материала - int iCube, //!< сторона куба [0,5] - const float4x4 *pWorld //!< мировая матрица модели - ); - -//! завершающие частные моменты для стороны куба -SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube); - -/*! завершающие общие моменты - \note если viewpos == 0 обновления статисктики рендера для текущего материала с отражением не произойдет, -и дабы рационально обрабатывать и статические и динамические отражения необходимо до следующего рендера отражений вызвать SML_MtlRefUpdateCountUpdate -*/ -SX_LIB_API void SML_MtlRefCubeEndRender( - ID id, //!< идентификатор материала - const float3_t *pViewPos //!< позиция наблюдателя, необходимо для обработки разрешения на следующий рендер - ); - -//! возвращает cube текстуру отражением (если оно есть, иначе 0) -SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id); - -//!@} - -//!@} sxmtllight_mtl_reflect - - -/*! \defgroup sxmtllight_mtl_propslayer Cвойства поверхности - \ingroup sxmtllight_mtl -@{*/ - -//! установка основной текстуры (загрузка текстуры по имени) -SX_LIB_API void SML_MtlSetTexture(ID id, const char *szPathTex); - -//! в name записывает имя текстуры -SX_LIB_API void SML_MtlGetTexture(ID id, char *szName); - -//! возвращает id текстуры материала -SX_LIB_API ID SML_MtlGetTextureID(ID id); - - -/*! \name Шейдеры для рендера материала - \warning В текущей версии все шейдеры загружаются в версии 3.0 и требуют в качестве старта указывать функцию main - \warning Рекомендуется устанавливать и вершинный и пиксельный шейдеры, так как во врем тестов одно из устройств требовало наличия обоих шейдеров либо отсутствия обоих - \note В аргументах path_vs/path_ps указывается только имя шейдера с расширением, есесно возвращается тоже самое -@{*/ - -//! установка вершинного шейдера -SX_LIB_API void SML_MtlSetVS(ID id, const char *szPathVS); - -//! в name записывает имя текущего вершинного шейдера -SX_LIB_API void SML_MtlGetVS(ID id, char *szName); - -//! установка пиксельного шейдера -SX_LIB_API void SML_MtlSetPS(ID id, const char *szPathPS); - -//! в name записывает имя текущего пикельного шейдера -SX_LIB_API void SML_MtlGetPS(ID id, char *szName); - -//!@} - -//! возвращает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить -SX_LIB_API float SML_MtlGetDurability(ID id); - -//! устанавливает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить -SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability); - - -//! возвращает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется] -SX_LIB_API float SML_MtlGetHitChance(ID id); - -//! устанавливает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется] -SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance); - - -//! возвращает плотность материала кг/м3 -SX_LIB_API float SML_MtlGetDensity(ID id); - -//! устанавливает плотность материала кг/м3 -SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity); - - -//! используется ли альфа тест для материала -SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id); - -//! установка использования альфа теста -SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing); - -/*! освещение материала id - \note если материал не освещается то будет выведен в цвете накладываемым материалом -*/ -SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting); - -//! освещается ли материал -SX_LIB_API bool SML_MtlGetLighting(ID id); - -/*! \name Параметры освещения. - \note Для более точной/тонкой настройки освещения материала рекомендуется использовать текстуру с параметрами освещения -(к прмиеру когда в одной поверхности разные материалы, к примеру дерево, метал и камень, то в текстуре можно указать параметры освещения для каждого пикселя), -однако если текстуры нет то будут использованы установленные парметры освещения для всей поверхности -@{*/ - -//! установка использования текстуры с параметрами освещения -SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting); - -//! используется ли текстура с параметрами для освещения -SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id); - - -//! загрузка текстуры с парамтерами освещения -SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szPathTex); - -//! в path_tex записывает имя текстуры с параметрами освещения -SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szPathTex); - - -//! установка шероховатости (0-1) -SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness); - -//! возвращает текущее значение шероховатости поверхности -SX_LIB_API float SML_MtlGetRoughness(ID id); - - -//! установка просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение -SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness); - -//! возвращает просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение -SX_LIB_API float SML_MtlGetThickness(ID id); - -//! установка отражательной способности поверхности (0-1) -SX_LIB_API void SML_MtlSetF0(ID id, float fF0); - -//! возвращает текущее значение отражательной способности поверхности -SX_LIB_API float SML_MtlGetF0(ID id); - -//!@} - -/*! \name Полупрозрачность, типы из #MtlTypeTransparency -Под полупрозрачными материалами следует понимать такие материалы, прозрачность которых в среднем находится в пределах 0.5 и минимальный процент полупрозрачного периметра 50% -@{*/ - -//! установка типа полупрозрачности -SX_LIB_API void SML_MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type); - -//! возвращает текущий тип полупрозрачности для материала -SX_LIB_API MTLTYPE_TRANSPARENCY SML_MtlGetTypeTransparency(ID id); - -//!@} - -/*! \name Отражения окружения, типы из #MtlTypeReflect -@{*/ - -//! установка типа отражений -SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type); - -//! возвращает текущий тип отражений для материала -SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id); - -//!@} - -/*! \name Детальность и микрорельеф -Поверхность может содержать до 4 детальных текстур и до 4 текстур с микрорельефом. -Данные для определения наложения текстур (детальных и микрорельефных) указываются в маске - -на каждый канал текстуры маски по одной детальной и микрорельефной текстуре, -то есть канал маски определет связанные между собой и детальную и микрорельефную текстуры - \note В аргументах channel - RGBA - 0,1,2,3 -@{*/ - -//! загрузка маски наложения -SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szPathTex); - -//! в path_tex записывает текущее имя маски наложения -SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szPathTex); - -//! загрузка текстуры микрорельефа, на каждый канал -SX_LIB_API void SML_MtlSetMRTex( - ID id, //!< идентификатор материала - int iChannel, //!< номер канала RGBA - 0,1,2,3 - const char *szPathTex //!< имя текстуры с расширением - ); - -//! в path_tex запишет текущее имя текстуры микрорельефа для канала channel -SX_LIB_API void SML_MtlGetMRTex(ID id, int iChannel, char *szPathTex); - -//! загрузка детальной текстуры, на каждый канал -SX_LIB_API void SML_MtlSetDTex( - ID id, //!< идентификатор материала - int iChannel, //!< номер канала RGBA - 0,1,2,3 - const char *szPathTex //!< имя текстуры с расширением - ); - -//! в path_tex запишет текущее имя детальной текстуры для канала channel -SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szPathTex); - -//!@} - -/*! \name Стандартные параметры для отправки в шейдер (в вершинный и пиксельный раздельно), данные из #MtlTransShaderStd -@{*/ - -//! отправка стадартных данных в вершинный шейдер -SX_LIB_API void SML_MtlSetStdVS( - ID id, //!< идентификатор материала - MTL_SHADERSTD type, //!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd - bool isSend //!< true - отправлять, false - не отправлять - ); - -//! установлена ли отпрвка значения type в вершинный шейдер -SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type); - -//! отправка стадартных данных в пиксельный шейдер -SX_LIB_API void SML_MtlSetStdPS( - ID id, //!< идентификатор материала - MTL_SHADERSTD type, //!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd - bool isSend //!< true - отправлять, false - не отправлять - ); - -//! установлена ли отпрвка значения type в пиксельный шейдер -SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type); - -//!@} - -/*! \name Дополнительные пользовательские данные в виде float4 (предел [0-1] для стандарта, иное вне стандарта, но допустимо) - \note Данные для вершинного и пиксельного шейдера раздельны. Отправляется float4. -Однако данные и из пиксельного могут быть отправленны в вершинный и наоборот. -В итоге в шейдере может быть 2 float4 пользовательских вектора с данными. -Но если вектор определен для пиксельного то он все-равно будет отправлен в пиксельный шейдер, даже если и придназначалася для вершинного. - \note В аргументах component - xyzw - 0,1,2,3 -@{*/ - -//! установка значения компоненты вектора для вершинного шейдера -SX_LIB_API void SML_MtlSetUserDataVS( - ID id, //!< идентификатор материала - int iComponent, //!< компонента вектора xyzw - 0,1,2,3 - float fValue //!< значение компоненты - ); - -//! возвращает значение компоненты вектора, который отправляется в вершинный шейдер -SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent); - -//! установка отправки float4 вектора, предназначенного для вершинного шейдера, в пиксельный шейдер -SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPs); - -//! отправляется ли float4 вектор, предназначенный для вершинного шейдера, в пиксельный шейдер -SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id); - - -//! установка значения компоненты вектора для пиксельного шейдера -SX_LIB_API void SML_MtlSetUserDataPS( - ID id, //!< идентификатор материала - int iComponent, //!< компонента вектора xyzw - 0,1,2,3 - float fValue //!< значение компоненты - ); - -//! возвращает значение компоненты вектора, который отправляется в пиксельный шейдер -SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent); - -//! установка отправки float4 вектора, предназначенного для пиксельного шейдера, в вершинный шейдер -SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVs); - -//! отправляется ли float4 вектор, предназначенный для пиксельного шейдера, в вершинный шейдер -SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id); - -//!@} - -//!@} sxmtllight_mtl_propslayer - -//!@} sxmtllight_mtl - -#endif - -//!@} sxmtllight diff --git a/source/mtllight/sxmtllight.cpp b/source/mtllight/sxmtllight.cpp deleted file mode 100644 index 3c6f545aad5c8d345a9b01f0cc91f12a3206cfe4..0000000000000000000000000000000000000000 --- a/source/mtllight/sxmtllight.cpp +++ /dev/null @@ -1,1177 +0,0 @@ - -/*********************************************************** -Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 -See the license in LICENSE -***********************************************************/ - -#define SXMATERIAL_LIGTH_VERSION 1 - -#include "sxmtllight.h" -#include "ml_data.h" - -#include "light.h" -#include "material.h" - -#if !defined(DEF_STD_REPORT) -#define DEF_STD_REPORT -report_func g_fnReportf = DefReport; -#endif - -CLights* ArrLights = 0; -CMaterials* ArrMaterials = 0; - -#define ML_PRECOND(retval) if(!ArrLights){LibReport(-1, "%s - sxmtlligth is not init", GEN_MSG_LOCATION); return retval;} - -//########################################################################## - -SX_LIB_API long SML_0GetVersion() -{ - return SXMATERIAL_LIGTH_VERSION; -} - -SX_LIB_API void SML_Dbg_Set(report_func rf) -{ - g_fnReportf = rf; -} - -SX_LIB_API void SML_0Create(const char *szName, bool isUnic) -{ - if (szName && strlen(szName) > 1) - { - if (isUnic) - { - HANDLE hMutex = CreateMutex(NULL, FALSE, szName); - if (GetLastError() == ERROR_ALREADY_EXISTS) - { - CloseHandle(hMutex); - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); - } - else - { - MLSet::MLInit(); - MLSet::ReCalcSize(); - ArrLights = new CLights(); - ArrMaterials = new CMaterials(); - } - } - else - { - MLSet::MLInit(); - MLSet::ReCalcSize(); - ArrLights = new CLights(); - ArrMaterials = new CMaterials(); - } - } - else - LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); -} - -SX_LIB_API void SML_AKill() -{ - mem_delete(ArrLights) - mem_delete(ArrMaterials); -} - -SX_LIB_API void SML_OnLostDevice() -{ - ML_PRECOND(_VOID); - ArrLights->onLostDevice(); - ArrMaterials->onLostDevice(); -} - -SX_LIB_API void SML_OnResetDevice() -{ - ML_PRECOND(_VOID); - - MLSet::ReCalcSize(); - ArrLights->onResetDevice(); - ArrMaterials->onResetDevice(); - - MLSet::IDsRenderTargets::HowAdaptedLum = 0; -} - -SX_LIB_API void SML_Update(DWORD timeDelta) -{ - static const int *r_win_width = GET_PCVAR_INT("r_win_width"); - static const int *r_win_height = GET_PCVAR_INT("r_win_height"); - - static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); - - if (ArrMaterials) - ArrMaterials->update(timeDelta); - - MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*r_win_width) / float(*r_win_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); - MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); -} - -SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef) -{ - ML_PRECOND(_VOID); - - MLSet::CoefSizeDepthMapForLocal = fCoef; - MLSet::ReCalcSize(); - SML_OnLostDevice(); - SML_OnResetDevice(); -} - -SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef) -{ - ML_PRECOND(_VOID); - - MLSet::CoefSizeDepthMapForGlobal = fCoef; - MLSet::ReCalcSize(); - SML_OnLostDevice(); - SML_OnResetDevice(); - -} - -SX_LIB_API float SML_LigthsGettLCoefSizeDepth() -{ - ML_PRECOND(-1); - - return MLSet::CoefSizeDepthMapForLocal; -} - -SX_LIB_API float SML_LigthsGettGCoefSizeDepth() -{ - ML_PRECOND(-1); - return MLSet::CoefSizeDepthMapForGlobal; -} - -//############################################################################# - -SX_LIB_API void SML_LigthsClear() -{ - ML_PRECOND(_VOID); - - ArrLights->clear(); -} - -SX_LIB_API void SML_LigthsClearIDArr() -{ - ML_PRECOND(_VOID); - - ArrLights->clearIDArr(); -} - -SX_LIB_API int SML_LigthsGetCount() -{ - ML_PRECOND(-1); - - return ArrLights->getCountLights(); -} - -SX_LIB_API bool SML_LigthsGetExists(ID id) -{ - ML_PRECOND(false); - - return ArrLights->getExists(id); -} - - -SX_LIB_API ID SML_LigthsCreatePoint(const float3 *pCenter, float fDist, const float3 *pColor, bool isGlobal, bool isShadowed/*, const char* bound_volume*/) -{ - ML_PRECOND(-1); - return ArrLights->createPoint(-1, pCenter, fDist, pColor, isGlobal, isShadowed/*, 0*/); -} - -SX_LIB_API ID SML_LigthsCreateDirection(const float3 *pPos, float fDist, const float3 *pColor, const SMQuaternion *qOrient, float fTopRadius, float fAngle, bool isShadow/*, const char* bound_volume*/) -{ - ML_PRECOND(-1); - return ArrLights->createDirection(-1, pPos, fDist, pColor, qOrient, fTopRadius, fAngle, isShadow/*, 0*/); -} - -SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta) -{ - ML_PRECOND(_VOID); - ArrLights->render(id, timeDelta); -} - -SX_LIB_API ID SML_LigthsGetGlobal() -{ - ML_PRECOND(-1); - return ArrLights->getLightGlobal(); -} - -SX_LIB_API bool SML_LigthsGetCastGlobalShadow() -{ - ML_PRECOND(false); - return ArrLights->getCastGlobalShadow(); -} - -SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed) -{ - ML_PRECOND(_VOID); - return ArrLights->setCastGlobalShadow(isShadowed); -} - -SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor) -{ - ML_PRECOND(_VOID); - ArrLights->getLightColor(id, pColor); -} - -SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor) -{ - ML_PRECOND(_VOID); - ArrLights->setLightColor(id, pColor); -} - -SX_LIB_API void SML_LigthsGetPos(ID id, float3 *pPos, bool isGreal) -{ - ML_PRECOND(_VOID); - ArrLights->getLightPos(id, pPos, isGreal); -} - -SX_LIB_API float SML_LigthsGetPower(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightPower(id); -} - -SX_LIB_API float SML_LigthsGetDist(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightDist(id); -} - -SX_LIB_API void SML_LigthsSetPos(ID id, const float3 *pPos, bool isGreal) -{ - ML_PRECOND(_VOID); - ArrLights->setLightPos(id, pPos, isGreal); -} - -SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ) -{ - ML_PRECOND(_VOID); - ArrLights->getLightOrient(id, pQ); -} - -SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ) -{ - ML_PRECOND(_VOID); - ArrLights->setLightOrient(id, pQ); -} - -SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id) -{ - ML_PRECOND(LTYPE_LIGHT_NONE); - return ArrLights->getLightType(id); -} - -SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum) -{ - ML_PRECOND(false); - return ArrLights->comVisibleForFrustum(id, pFrustum); -} - -SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id) -{ - ML_PRECOND(false); - return ArrLights->getVisibleForFrustum(id); -} - -SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pPos) -{ - ML_PRECOND(-1); - return ArrLights->comDistFor(id, pPos); -} - -SX_LIB_API float SML_LigthsGetDistFor(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getDistFor(id); -} - -SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pPos) -{ - ML_PRECOND(_VOID); - return ArrLights->comVisibleFrustumDistFor(pFrustum, pPos); -} - -SX_LIB_API bool SML_LigthsGetEnable(ID id) -{ - ML_PRECOND(false); - return ArrLights->getLightEnable(id); -} - -SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable) -{ - ML_PRECOND(_VOID); - return ArrLights->setLightEnable(id, isEnable); -} - -SX_LIB_API bool SML_LigthsGetShadowed(ID id) -{ - ML_PRECOND(false); - return ArrLights->getLightShadowed(id); -} - -SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id) -{ - ML_PRECOND(0); - return ArrLights->get4Or3Splits(id); -} - -SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3) -{ - ML_PRECOND(_VOID); - - ArrLights->set4Or3Splits(id, is4or3); -} - -SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow() -{ - ML_PRECOND(0); - return ArrLights->getShadow2(); -} - -SX_LIB_API void SML_LigthsShadowNull() -{ - ML_PRECOND(_VOID); - return ArrLights->shadowNull(); -} - -SX_LIB_API void SML_LigthsShadowRenderBegin(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderBegin(id); -} - -SX_LIB_API void SML_LigthsShadowRenderEnd(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderEnd(id); -} - -SX_LIB_API void SML_LigthsShadowRenderPre(ID id, int iCube) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderPre(id, iCube); -} - -SX_LIB_API void SML_LigthsShadowRenderPost(ID id, int iCube) -{ - ML_PRECOND(_VOID); - ArrLights->shadowRenderPost(id, iCube); -} - -SX_LIB_API IFrustum* SML_LigthsGetFrustum(ID id, int iHow) -{ - ML_PRECOND(0); - return ArrLights->getLightFrustum(id, iHow); -} - -SX_LIB_API void SML_LigthsUpdateGFrustums(ID id, int iSplit, const float3 *pPos, const float3 *pDir) -{ - ML_PRECOND(_VOID); - return ArrLights->updateLightGFrustums(id, iSplit, pPos, pDir); -} - -SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int iTypeMaterial, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrLights->initShaderOfTypeMaterial(id, iTypeMaterial, pWorld); -} - -SX_LIB_API void SML_LigthsShadowGen(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->shadowGen2(id); -} - -SX_LIB_API void SML_LigthsShadowSoft(bool isRandom, float fSize, bool isFirst) -{ - ML_PRECOND(_VOID); - ArrLights->shadowSoft(isRandom, fSize, isFirst); -} - - - -SX_LIB_API ID SML_LigthsCreateCopy(ID id) -{ - ML_PRECOND(-1); - return ArrLights->createCopy(id); -} - -SX_LIB_API void SML_LigthsDeleteLight(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->deleteLight(id); -} - -SX_LIB_API char* SML_LigthsGetName(ID id) -{ - ML_PRECOND(0); - return ArrLights->getLightName(id); -} - -SX_LIB_API void SML_LigthsSetName(ID id, const char *szName) -{ - ML_PRECOND(_VOID); - ArrLights->setLightName(id, szName); -} - - -SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle) -{ - ML_PRECOND(_VOID); - ArrLights->setLightAngle(id, fAngle, true); -} - -SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius) -{ - ML_PRECOND(_VOID); - ArrLights->setLightTopRadius(id, fTopRadius); -} - -SX_LIB_API void SML_LigthsSetDist(ID id, float fRadiusHeight, bool isCreate) -{ - ML_PRECOND(_VOID); - ArrLights->setLightDist(id, fRadiusHeight, isCreate); -} - - -SX_LIB_API float SML_LigthsGetShadowBias(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowBias(id); -} - -SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias) -{ - ML_PRECOND(_VOID); - return ArrLights->setShadowBias(id, fBias); -} - -SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel) -{ - ML_PRECOND(_VOID); - ArrLights->setShadowBlurPixel(id, fBlurPixel); -} - -SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowBlurPixel(id); -} -SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear) -{ - ML_PRECOND(_VOID); - ArrLights->setShadowLocalNear(id, fNear); -} - -SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowLocalNear(id); -} - -SX_LIB_API void SML_LigthsSetShadowLocalFar(ID id, float fFar) -{ - ML_PRECOND(_VOID); - ArrLights->setShadowLocalFar(id, fFar); -} - -SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getShadowLocalFar(id); -} - -SX_LIB_API void SML_LigthsSetCubeEdgeEnable(ID id, int iEdge, bool isEnable) -{ - ML_PRECOND(_VOID); - ArrLights->setLightCubeEdgeEnable(id, iEdge, isEnable); -} - -SX_LIB_API bool SML_LigthsGetCubeEdgeEnable(ID id, int iEdge) -{ - ML_PRECOND(false); - return ArrLights->getLightCubeEdgeEnable(id, iEdge); -} - - -SX_LIB_API float SML_LigthsGetAngle(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightAngle(id); -} - -SX_LIB_API float SML_LigthsGetTopRadius(ID id) -{ - ML_PRECOND(-1); - return ArrLights->getLightTopRadius(id); -} - -SX_LIB_API ID SML_LigthsGetIDArr(ID id, ID idOwner, int iHow) -{ - ML_PRECOND(-1); - return ArrLights->getLightIDArr(id, idOwner, iHow); -} - -SX_LIB_API void SML_LigthsSetIDArr(ID id, ID idOwner, int iHow, ID idArr) -{ - ML_PRECOND(_VOID); - ArrLights->setLightIDArr(id, idOwner, iHow, idArr); -} - -SX_LIB_API void SML_LigthsSetTypeShadowed(ID id, LTYPE_SHADOW type) -{ - ML_PRECOND(_VOID); - ArrLights->setLightTypeShadowed(id, type); -} - -SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id) -{ - ML_PRECOND(LTYPE_SHADOW_NONE); - return ArrLights->getLightTypeShadowed(id); -} - -SX_LIB_API bool SML_LigthsCountUpdateUpdate(ID id, const float3 *pViewPos, int iHow) -{ - ML_PRECOND(false); - return ArrLights->lightCountUpdateUpdate(id, pViewPos, iHow); -} - -SX_LIB_API bool SML_LigthsCountUpdateAllowed(ID id, int iHow) -{ - ML_PRECOND(false); - return ArrLights->lightCountUpdateAllowed(id, iHow); -} - -SX_LIB_API void SML_LigthsCountUpdateNull(ID id) -{ - ML_PRECOND(_VOID); - ArrLights->lightCountUpdateNull(id); -} - -SX_LIB_API void SML_LigthsToneMappingCom(DWORD timeDelta, float fAdapted) -{ - ML_PRECOND(_VOID); - ArrLights->toneMappingCom(timeDelta, fAdapted); -} - -SX_LIB_API int SML_LigthsDelGetCount() -{ - ML_PRECOND(-1); - return ArrLights->delGetCount(); -} - -SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID idKey) -{ - ML_PRECOND(LTYPE_LIGHT_NONE); - return ArrLights->delGetType(idKey); -} - -SX_LIB_API void SML_LigthsDelDel(ID idKey) -{ - ML_PRECOND(_VOID); - ArrLights->delDel(idKey); -} - -SX_LIB_API ID SML_LigthsDelGetIDArr(ID idKey, ID idOwner, int iHow) -{ - ML_PRECOND(-1); - return ArrLights->delGetIDArr(idKey, idOwner, iHow); -} - -//############################################################################# - -SX_LIB_API ID SML_DSGetRT_ID(DS_RT type) -{ - ML_PRECOND(-1); - if (type == DS_RT_COLOR) - return MLSet::IDsRenderTargets::ColorScene; - else if (type == DS_RT_NORMAL) - return MLSet::IDsRenderTargets::NormalScene; - else if (type == DS_RT_PARAM) - return MLSet::IDsRenderTargets::ParamsScene; - else if (type == DS_RT_DEPTH) - return MLSet::IDsRenderTargets::DepthScene; - else if (type == DS_RT_DEPTH0) - return MLSet::IDsRenderTargets::DepthScene0; - else if (type == DS_RT_DEPTH1) - return MLSet::IDsRenderTargets::DepthScene1; - - else if (type == DS_RT_AMBIENTDIFF) - return MLSet::IDsRenderTargets::LightAmbientDiff; - else if (type == DS_RT_SPECULAR) - return MLSet::IDsRenderTargets::LightSpecular; - - else if (type == DS_RT_SCENELIGHT) - return MLSet::IDsRenderTargets::LigthCom; - else if (type == DS_RT_SCENELIGHT2) - return MLSet::IDsRenderTargets::LigthCom2; - - else if (type == DS_RT_ADAPTEDLUM) - return MLSet::IDsRenderTargets::GetCurrAdaptedLum(); - - return -1; -} - -SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type) -{ - ML_PRECOND(0); - - ID tmpid = SML_DSGetRT_ID(type); - if (tmpid >= 0) - return SGCore_RTGetTexture(tmpid); - else - return 0; -} - -//############################################################################# - -SX_LIB_API ID SML_MtlLoad(const char *szName, MTLTYPE_MODEL mtl_type) -{ - ML_PRECOND(-1); - - return ArrMaterials->mtlLoad(szName, mtl_type); -} - -SX_LIB_API void SML_MtlSave(ID id) -{ - ML_PRECOND(_VOID); - - ArrMaterials->mtlSave(id); -} - -SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id) -{ - ML_PRECOND(MTLTYPE_MODEL_STATIC); - - return ArrMaterials->getTypeModel(id); -} - -SX_LIB_API UINT SML_MtlGetSort(ID id) -{ - ML_PRECOND(0); - - return ArrMaterials->mtlGetSort(id); -} - -SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model) -{ - ML_PRECOND(_VOID); - - ArrMaterials->setTypeModel(id, type_model); -} - -SX_LIB_API long SML_MtlGetCount() -{ - ML_PRECOND(-1); - - return ArrMaterials->getCount(); -} - -SX_LIB_API void SML_MtlRender(ID id, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrMaterials->render(id, pWorld); -} - -SX_LIB_API void SML_MtlRenderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl) -{ - ML_PRECOND(_VOID); - ArrMaterials->renderStd(type, pWorld, idSlot, idMtl); -} - -SX_LIB_API void SML_MtlRenderLight(const float4_t *pColor, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrMaterials->renderLight(pColor, pWorld); -} - -SX_LIB_API void SML_MtlSetMainTexture(ID slot, ID id) -{ - ML_PRECOND(_VOID); - ArrMaterials->setMainTexture(slot, id); -} - -SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf) -{ - ML_PRECOND(_VOID); - ArrMaterials->setIsIncrCountSurf(bf); -} - -SX_LIB_API bool SML_MtlGetIsIncrCountSurf() -{ - ML_PRECOND(false); - return ArrMaterials->getIsIncrCountSurf(); -} - -SX_LIB_API void SML_MtlNullingCurrCountSurf() -{ - ML_PRECOND(_VOID); - ArrMaterials->nullingCurrCountSurf(); -} - -SX_LIB_API int SML_MtlGetCurrCountSurf() -{ - ML_PRECOND(-1); - return ArrMaterials->getCurrCountSurf(); -} - -SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount) -{ - ML_PRECOND(_VOID); - ArrMaterials->setCurrCountSurf(iCount); -} - -SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isAlphaTest) -{ - ML_PRECOND(_VOID); - ArrMaterials->setForceblyAlphaTest(isAlphaTest); -} - -SX_LIB_API bool SML_MtlGetForceblyAlphaTest() -{ - ML_PRECOND(false); - return ArrMaterials->getForceblyAlphaTest(); -} - - -SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model) -{ - ML_PRECOND(-1); - return ArrMaterials->getStdMtl(type_model); -} - - -SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetPhysicMaterial(id, type); -} - -SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id) -{ - ML_PRECOND(MTLTYPE_PHYSIC_DEFAULT); - return ArrMaterials->mtlGetPhysicMaterial(id); -} - -SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetUsingAlphaTest(id); -} - -SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUsingAlphaTest(id, isUsing); -} - - - -SX_LIB_API void SML_MtlRefSetIDArr(ID id, ID idOwner, int iCube, ID idArr) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefSetIDArr(id, idOwner, iCube, idArr); -} - -SX_LIB_API ID SML_MtlRefGetIDArr(ID id, ID idOwner, int iCube) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlRefGetIDArr(id, idOwner, iCube); -} - -SX_LIB_API int SML_MtlDelRefGetCount() -{ - ML_PRECOND(-1); - return ArrMaterials->delRefCount(); -} - -SX_LIB_API ID SML_MtlDelRefGetIDArr(ID idKey, ID idOwner, int iCube) -{ - ML_PRECOND(-1); - return ArrMaterials->delRefGetIDArr(idKey, idOwner, iCube); -} - -SX_LIB_API void SML_MtlDelRefClear() -{ - ML_PRECOND(_VOID); - ArrMaterials->delRefAllDel(); -} - -SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefSetMinMax(id, pMin, pMax); -} - -SX_LIB_API void SML_MtlRefPreRenderPlane(ID id, D3DXPLANE *pPlane) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefPreRenderPlane(id, pPlane); -} - -SX_LIB_API const IFrustum* SML_MtlRefGetfrustum(ID id, int iCube) -{ - ML_PRECOND(0); - return ArrMaterials->mtlRefGetfrustum(id, iCube); -} - -SX_LIB_API bool SML_MtlRefIsAllowedRender(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlRefIsAllowedRender(id); -} - -SX_LIB_API void SML_MtlRefPostRenderPlane(ID id) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefPostRenderPlane(id); -} - -SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id) -{ - ML_PRECOND(0); - return ArrMaterials->mtlRefPlaneGetTex(id); -} - - - -SX_LIB_API void SML_MtlRefCubeBeginRender(ID id, const float3_t *pCenter) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubeBeginRender(id, pCenter); -} - -SX_LIB_API void SML_MtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubePreRender(id, iCube, pWorld); -} - -SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubePostRender(id, iCube); -} - -SX_LIB_API void SML_MtlRefCubeEndRender(ID id, const float3_t *pViewPos) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefCubeEndRender(id, pViewPos); -} - -SX_LIB_API bool SML_MtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos) -{ - ML_PRECOND(false); - return ArrMaterials->mtlRefUpdateCountUpdate(id, pViewPos); -} - -SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlRefNullingCountUpdate(id); -} - -SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id) -{ - ML_PRECOND(0); - return ArrMaterials->refCubeGetTex(id); -} - -//########################################################################## - -SX_LIB_API void SML_MtlReloadMaterial(ID id, const char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlReLoad(id, szName); -} - -SX_LIB_API void SML_MtlClear(bool isClearRefDel) -{ - ML_PRECOND(_VOID); - ArrMaterials->clear(isClearRefDel); -} - -SX_LIB_API void SML_MtlSetTexture(ID id, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTexture(id, szTexture); -} - -SX_LIB_API void SML_MtlGetTexture(ID id, char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetTexture(id, szName); -} - -SX_LIB_API ID SML_MtlGetTextureID(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetTextureID(id); -} - -SX_LIB_API void SML_MtlSetVS(ID id, const char *szPath) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetVS(id, szPath); -} - -SX_LIB_API void SML_MtlGetVS(ID id, char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetVS(id, szName); -} - -SX_LIB_API void SML_MtlSetPS(ID id, const char *szPath) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetPS(id, szPath); -} - -SX_LIB_API void SML_MtlGetPS(ID id, char *szName) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetPS(id, szName); -} - -SX_LIB_API float SML_MtlGetDurability(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetDurability(id); -} - -SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetDurability(id, fDurability); -} - -SX_LIB_API float SML_MtlGetHitChance(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetHitChance(id); -} - -SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetHitChance(id, fHitChance); -} - -SX_LIB_API float SML_MtlGetDensity(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetDensity(id); -} - -SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetDensity(id, fDensity); -} - -//########################################################################## - -SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetLighting(id, isLighting); -} - -SX_LIB_API bool SML_MtlGetLighting(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetLighting(id); -} - -SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetIsTextureLighting(id, isTexLighting); -} - -SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetIsTextureLighting(id); -} - -SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTextureLighting(id, szTexture); -} - -SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetTextureLighting(id, szTexture); -} - -SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetRoughness(id, fRoughness); -} - -SX_LIB_API float SML_MtlGetRoughness(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetRoughness(id); -} - -SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetThickness(id, fThickness); -} - -SX_LIB_API float SML_MtlGetThickness(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetThickness(id); -} - -SX_LIB_API void SML_MtlSetF0(ID id, float fF0) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetF0(id, fF0); -} - -SX_LIB_API float SML_MtlGetF0(ID id) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetF0(id); -} - -SX_LIB_API void SML_MtlSetTransparency(ID id, bool isTransparent) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTransparency(id, isTransparent); -} - -SX_LIB_API bool SML_MtlGetTransparency(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetTransparency(id); -} - -SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetTypeReflection(id, type); -} - -SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id) -{ - ML_PRECOND(MTLTYPE_REFLECT_NONE); - return ArrMaterials->mtlGetTypeReflection(id); -} - -//************************************************************************** - -SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetMaskTex(id, szTexture); -} - -SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetMaskTex(id, szTexture); -} - -SX_LIB_API void SML_MtlSetMRTex(ID id, int iChannel, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetMRTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlGetMRTex(ID id, int iChannel, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetMRTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlSetDTex(ID id, int iChannel, const char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetDTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szTexture) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlGetDTex(id, iChannel, szTexture); -} - -SX_LIB_API void SML_MtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetStdVS(id, type, isSend); -} - -SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetStdVS(id, type); -} - -SX_LIB_API void SML_MtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetStdPS(id, type, isSend); -} - -SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetStdPS(id, type); -} - - -SX_LIB_API void SML_MtlSetUserDataVS(ID id, int iComponent, float fValue) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataVS(id, iComponent, fValue); -} - -SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetUserDataVS(id, iComponent); -} - -SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPS) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataVS_InPS(id, isSendPS); -} - -SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetUserDataVS_InPS(id); -} - -SX_LIB_API void SML_MtlSetUserDataPS(ID id, int iComponent, float fValue) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataPS(id, iComponent, fValue); -} - -SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent) -{ - ML_PRECOND(-1); - return ArrMaterials->mtlGetUserDataPS(id, iComponent); -} - -SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVS) -{ - ML_PRECOND(_VOID); - ArrMaterials->mtlSetUserDataPS_InPS(id, isSendVS); -} - -SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id) -{ - ML_PRECOND(false); - return ArrMaterials->mtlGetUserDataPS_InPS(id); -} diff --git a/source/mtllight/sxmtllight.h b/source/mtllight/sxmtllight.h deleted file mode 100644 index edd34cb0c245e1e34a2c065af0fc6f1e3385f0b7..0000000000000000000000000000000000000000 --- a/source/mtllight/sxmtllight.h +++ /dev/null @@ -1,1381 +0,0 @@ - -/*********************************************************** -Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 -See the license in LICENSE -***********************************************************/ - -/*! -\file -Заголовочный файл sxmtllight - библиотеки освещения и материалов -*/ - -/*! \defgroup sxmtllight sxmtllight - библиотека освещения и материалов -@{ -*/ - -#ifndef __SXMTLLIGHT_H -#define __SXMTLLIGHT_H - -#if defined(_DEBUG) -#pragma comment(lib, "sxgcore_d.lib") -#else -#pragma comment(lib, "sxgcore.lib") -#endif - -#undef SX_LIB_API -#define SX_LIB_API extern "C" __declspec (dllimport) -#include <gcore/sxgcore.h> - -#ifdef SX_DLL -#undef SX_LIB_API -#define SX_LIB_API extern "C" __declspec (dllexport) -#endif - -#include <gdefines.h> - -/*! \name Базовые функции библиотеки -@{*/ - -//! версия подсистемы -SX_LIB_API long SML_0GetVersion(); - -//! установить функцию обработки сообщений -SX_LIB_API void SML_Dbg_Set(report_func rf); - -//! инициализция подсистемы -SX_LIB_API void SML_0Create( - const char *szName, //!< присваиваемое имя - bool isUnic = true //!< должна ли подсистема быть уникальной по имени - ); - -//! уничтожить подсистему -SX_LIB_API void SML_AKill(); - -//!@} - -/*! \name Обработка потери/восстановления устройства -@{*/ - -//! вызывать при потрете устройства -SX_LIB_API void SML_OnLostDevice(); - -//! вызывать при восстановлении устройства -SX_LIB_API void SML_OnResetDevice(); - -//!@} - -//! обновление данных всей библиотеки -SX_LIB_API void SML_Update( - DWORD timeDelta //!< время рендера кадра в млсек - ); - -//############################################################################# - -/*! \defgroup sxmtllight_light Освещение - \ingroup sxmtllight - \warning Обращение (идентификация) конкретного света осуществляется посредством идентификатора который выдают создающие функции: - - #SML_LigthsCreatePoint - - #SML_LigthsCreateDirection - Получить идентификатор уже созданного света можно, посредством ключа (key) который лежит в пределах [0, #SML_LigthsGetCount), -передав этот ключ #SML_LigthsGetIDOfKey, которая в случае успеха вернет идентификатор света. -@{*/ - -/*! максимальное количество обновлений статических источников света, в первый момент рендера */ -#define LIGHTS_UPDATE_MAX_COUNT_FOR_STATIC 3 - -/*! \name Дистанции (метрах) при которых будет сниженно или повышено количество отрисовок для локальных источников света -меньше #LIGHTS_UPDATE_L0_DIST - обновление будет каждый кадр\n -больше #LIGHTS_UPDATE_L2_DIST - обновления не будет -@{*/ - -#define LIGHTS_UPDATE_L0_DIST 10 -#define LIGHTS_UPDATE_L1_DIST 30 -#define LIGHTS_UPDATE_L2_DIST 70 - -//!@} - -/*! Коэфициент обновления сплитов глобального света. -Cчитается: LIGHTS_UPDATE_PSSM_SPLIT*number_split - \note Первый сплит обновляется каждый кадр, второй через кадр -*/ -#define LIGHTS_UPDATE_PSSM_SPLIT 1 - -/*! аналогичнен #LIGHTS_UPDATE_PSSM_SPLIT только для 5 сплита (для теней от облаков) */ -#define LIGHTS_UPDATE_PSSM_SPLIT_5 2 - - -/*! стандартное значение верхнего/начального радиуса для направленного света */ -#define LIGHTS_LOCAL_STD_TOP_RADIUS 0.1 - -/*! стандартное значение ближней плоскости отсечения для теней локального света */ -#define LIGHTS_LOCAL_STD_NEAR 0.1 - -/*! максимальная дистанция локального света */ -#define LIGHTS_LOCAL_MAX_DIST 200.f - - -/*! радиус глобального источника */ -#define LIGHTS_GLOBAL_STD_RADIUS 999999 - -/*! отдаленность глобального света (нужно для корректности теней), если не знаете, не трогайте */ -#define LIGHTS_POS_G_MAX 1000 - - -/*! базовое направление направленноого источника света */ -#define LIGHTS_DIR_BASE float3(0, -1, 0) - - -//! типы источников света -enum LTYPE_LIGHT -{ - //! не установленный - LTYPE_LIGHT_NONE = -1, - - //! глобальный - LTYPE_LIGHT_GLOBAL, - - //! точечный - LTYPE_LIGHT_POINT, - - //! направленный - LTYPE_LIGHT_DIR -}; - -//! типы теней источников света -enum LTYPE_SHADOW -{ - //! без теней - LTYPE_SHADOW_NONE = -1, - - //! статичные тени, тень обновляется первые несколько кадров (для корректности), далее не обновляется - LTYPE_SHADOW_STATIC, - - //! полностью динамические тени - LTYPE_SHADOW_DYNAMIC, -}; - -/*! \name Настройки размеров для теней - \note Коэфициента относительно размеров окна рендера, если 1.f то размеры экрана, если 0.5f то размеры экрана * 0.5f -@{*/ - -//! установка коэфициента для локального света -SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef); - -//! установка коэфициента для глобального света -SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef); - - -//! возвращение коэфициента для локальный свет -SX_LIB_API float SML_LigthsGettLCoefSizeDepth(); - -//! возвращение коэфициента для глобальный свет -SX_LIB_API float SML_LigthsGettGCoefSizeDepth(); - -//!@} - -//! очистить список света -SX_LIB_API void SML_LigthsClear(); - -//! очистка всех идентификаторов просчетов во всех источниках света -SX_LIB_API void SML_LigthsClearIDArr(); - -//! общее количество света -SX_LIB_API int SML_LigthsGetCount(); - -//! возвращает true если свет с id существует -SX_LIB_API bool SML_LigthsGetExists(ID id); - -//! создать точечный свет (светит во все стороны) -SX_LIB_API ID SML_LigthsCreatePoint( - const float3 *pCenter, //!< центр света (мировая позиция) - float fDist, //!< дистанция, на которую распространяется свет - const float3 *pColor, //!< цвет в пределах 0-1 - bool isGlobal, //!< глобальный ли свет (типа солнца) - bool isShadowed //!< отбрасвыает ли тени свет - ); - -//! создать направленный свет -SX_LIB_API ID SML_LigthsCreateDirection( - const float3 *pPos, //!< позиция света (мировая) - float fDist, //!< дистанция на которую распространяется свет - const float3 *pColor, //!< цвет - const SMQuaternion *qOrient,//!< ориентация - float fTopRadius, //!< верхний (начальный) радиус - float fAngle, //!< угол (в радианах) - bool isShadow //!< отбрасвыает ли тени свет - ); - -//! возвращает тип света -SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id); - -//! создать копию объекта и вернуть на нее id -SX_LIB_API ID SML_LigthsCreateCopy(ID id); - -//! удаление света -SX_LIB_API void SML_LigthsDeleteLight(ID id); - -//! возвращает имя света -SX_LIB_API char* SML_LigthsGetName(ID id); - -//! устанавливает имя света -SX_LIB_API void SML_LigthsSetName(ID id, const char *szName); - -//! отрисовка ограничивающего объема -SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta); - -//! в color записывает цвет света -SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor); - -//! устанавливает цвет света -SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor); - -//! получить в pos позицию света -SX_LIB_API void SML_LigthsGetPos( - ID id, //!< идентификатор света - float3 *pPos, //!< инициализированный вектор в который будет записана позиция - bool isReal = false //!< true - нужны реальные координаты, false - нужны углы, только для глобального света, во всех остальных случаях не имеет смысла - ); - -//! установить позицию свету -SX_LIB_API void SML_LigthsSetPos( - ID id, //!< идентификатор света - const float3 *pPos, //!< позиция в которую будет перемещен свет - bool isReal = false //!< true - установка реальных координат, false - установка углов, только для глобального света, во всех остальных случаях не имеет смысла - ); - -//! возвращает "значение силы света" для отправки в шейдер (максимальная компонента цвет * дистанция покрытия/#LIGHTS_LOCAL_MAX_DIST) -SX_LIB_API float SML_LigthsGetPower(ID id); - -//! возвращает дистанцию, на которую распространяется свет -SX_LIB_API float SML_LigthsGetDist(ID id); - -//! установка новой дистанции -SX_LIB_API void SML_LigthsSetDist( - ID id, //!< идентификатор света - float fDist, //!< новая дистанция(радиус для точечного и высота для направленного) - bool isCreate = true //!< нужно ли пересоздание объема? (если новая дистанция больше чем текущий ограничивающий объем то надо, в других случаях по усмотрению) - ); - -//! записывает в q ориентацию света -SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ); - -//! установка ориентации света -SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ); - - -//! включен ли свет с идентификатором id -SX_LIB_API bool SML_LigthsGetEnable(ID id); - -//! установить всключен (true) или отключен (false) свет с идентификатором id -SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable); - -//! возвращает идентификатор глобального источника света, если он есть, иначе -1 -SX_LIB_API ID SML_LigthsGetGlobal(); - -//! возвращает установлена ли общая тень от глобального источника (все ли в тени) -SX_LIB_API bool SML_LigthsGetCastGlobalShadow(); - -//! установить общую тень для всего от глобального источника (все в тень) -SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed); - -//----------------------------------------------------------------------------- - -/*! \name Управление видимостью - \note Отдельный просчет - считает индивидуально для света и тут же возвращает результат просчетов - \note Предварительный просчет - просчет для всего света (к примеру в другом потоке) -@{*/ - -//! виден ли свет в данном фрустуме (отдельный просчет) -SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum); - -//! дистанция от viewpos до начала света (отдельный просчет) -SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pViewPos); - -//! просчет видимости и расстояния от наблюдателя viewpos до начала света, для каждого света (предварительный просчет) -SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pViewPos); - - -//! виден ли свет в просчитанном фрустуме -SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id); - -//! просчитанная дистанция от позиции наблюдателя до начала света -SX_LIB_API float SML_LigthsGetDistFor(ID id); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \name Настройки для направленного света -@{*/ - -//! возвращает угол, актуально только для направленного и света -SX_LIB_API float SML_LigthsGetAngle(ID id); - -//! установить угол, актуально только для направленного и света -SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle); - -//! возвращает верхний радиус, актуально только для направленного и света -SX_LIB_API float SML_LigthsGetTopRadius(ID id); - -//! устанавливает верхний радиус, актуально только для направленного и света -SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \name Настройки для точечного света -@{*/ - -/*! установить "рисовать ли в указанную грань cubemap тени" - \warning Актуально только когда свет может отбрасывать тени - */ -SX_LIB_API void SML_LigthsSetCubeEdgeEnable( - ID id, //!< идентификатор света - int iEdge, //!< номер стороны/грани cubemap [0,5] - bool iEnable //!< true - рисовать, false - не рисовать - ); - -//! получить текущее значение "рисовать ли в указанную грань cubemap тени" -SX_LIB_API bool SML_LigthsGetCubeEdgeEnable( - ID id, //!< идентификатор света - int iEdge //!< номер стороны/грани cubemap [0,5] - ); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \defgroup sxmtllight_light_shadow Управление тенями - \ingroup sxmtllight_light - \note Для генерации теней используется один render target full screen - \note Для сглаживания используется еще один аналогичный render target и первый render target. При сглаживании внутри меняется только счетчик, который меняет их местами - \note Так как используется всего один render target для генерации теней то есесно в текущий момент времени можно сгенерировать и сгладить тень только для одного света - \note Для теней от глобального света используется техника PSSM (Parallel-Split Shadow Mapping) на 3/4 сплита для объектов уровня (3 или 4 сплита можно настроить #SML_LigthsSet4Or3SplitsG) - \note Для теней от локального света используется техника Shadow Mapping в двух вариациях: - - для точечного света используется cubemap - - для направленного света - обычная техника Shadow Mapping -@{*/ - -//! отбрасывает ли свет тени -SX_LIB_API bool SML_LigthsGetShadowed(ID id); - -//! возвращает true в случае если установлено 4 сплита для PSSM, иначе (установлено 3 сплита) false -SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id); - -//! установка количества сплитов (false - 3, true - 4) для PSSM -SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3); - -/*! устанавливает шейдеры и передает им данные на основании типа материала, поддерживаются все типы MTL_TYPE_*/ -SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int typemat, const float4x4 *pWorld); - -/*! \name Управление обновлениями теней - \note Так как основная задумка это real-time рендер то для этого нужны упрощения, одним из таковых является обновление теней от света, которое может происходить не каждый кадр -@{*/ - -//! установка динамики обработки теней -SX_LIB_API void SML_LigthsSetTypeShadowed( - ID id, //!< идентификатор света - LTYPE_SHADOW type //!< значение из перечисления #LTYPE_SHADOW - ); - -//! возвращает тип динамики теней (одно из значений #LTYPE_SHADOW) -SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id); - -//! производит обработку данных затем возвращает разрешено ли обновлять тени, увеличивает внутрений счетчик, поэтому необходимо вызывать только когда надо -SX_LIB_API bool SML_LigthsCountUpdateUpdate( - ID id, //!< идентификатор света - const float3 *pViewPos, //!< позиция камеры для которой обновляем, на основании расстояния будет произведен расчет обновления - int iHow = -1 //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! разрешено ли обновлять тени, в отличии от #SML_LigthsUpdateCountUpdate не увеличивает внутренний счетчик -SX_LIB_API bool SML_LigthsCountUpdateAllowed( - ID id, //!< идентификатор света - int iHow = -1 //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! сбросить счетчик обновлений и обновлять до предела тени -SX_LIB_API void SML_LigthsCountUpdateNull(ID id); - -//!@} - - -/*! \name Управление циклами рендера в карты глубин - Для локального направленного света: - \code - SML_LigthsShadowRenderBegin(id); - //рендер того что должно отбросить тени - SML_LigthsShadowRenderEnd(id); - \endcode - Для глобального и точечного: - \code - SML_LigthsShadowRenderBegin(id); - SML_LigthsShadowRenderPre(id, cube); - //рендер того что должно отбросить тени - SML_LigthsShadowRenderPost(id, cube); - SML_LigthsShadowRenderEnd(id); - \endcode - Где cube для точечного это номер стороны cubemap [0-5] в которую будет осуществлен рендер, а для глобального это номер сплита. -@{*/ - -//! подготовительные процедуры -SX_LIB_API void SML_LigthsShadowRenderBegin(ID id); - -//! завершающие процедуры -SX_LIB_API void SML_LigthsShadowRenderEnd(ID id); - -//! подготовительные процедур перед рендером для сплита/стороны -SX_LIB_API void SML_LigthsShadowRenderPre( - ID id, //!< идентификатор света - int iCube //!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита - ); - -//! завершающие процедур перед рендером для сплита/стороны -SX_LIB_API void SML_LigthsShadowRenderPost( - ID id, //!< идентификатор света - int iCube //!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита - ); - -//!@} - -//! обнуление карты теней, необходимо вызывать перед генерацией теней посредством функции #SML_LigthsGenShadow -SX_LIB_API void SML_LigthsShadowNull(); - -//! генерация тени на основе уже отработанной информации о затенении, перед вызовов этой функции необходимо вызывать #SML_LigthsShadowNull -SX_LIB_API void SML_LigthsShadowGen(ID id); - -//! возвращает текстуру с тенями (если вызывались функции сглаживания) то вренутся сглаженная -SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow(); - -//! сглаживание текущей тени -SX_LIB_API void SML_LigthsShadowSoft( - bool isRandSam, //!< использовать ли смещение по случайному направлению - float fSize, //!< коэфициент увеличения размера пикселя для размытия - bool isFirst = false //!< впервые ли вызывается размытие для текущей тени, каждый раз когда тень еще не сглажена, но сгенерирована, нужно указывать false - ); - -//! возвращает указатель фрустума света -SX_LIB_API IFrustum* SML_LigthsGetFrustum( - ID id, //!< идентификатор света - int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! обновление фрустума глобального света -SX_LIB_API void SML_LigthsUpdateGFrustums( - ID id, //!< идентификатор света - int iSplit, //!< номер сплита - const float3 *pPos, //!< позиция наблюдателя - const float3 *pDir //!< направление взгляда наблюдателя - ); - -/*! \name Управление настройками для генерации глубины/тени -@{*/ - -//! получить текущее смещение (bias) при генерации глубины -SX_LIB_API float SML_LigthsGetShadowBias(ID id); - -//! установить текущее смещение (bias) при генерации глубины -SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias); - - -//! установить размерность размытия (в пикселя) при геренации тени -SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel); - -//! получить текущее значение размерности (в пикселях) при генерации тени -SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id); - - -//! установить значение ближней плоскостью отсечения для теней (локальный свет) -SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear); - -//! получить текущее значение ближней плоскостью отсечения для теней (локальный свет) -SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id); - -/*! установка дальней плоскостью отсечения для теней (локальный свет) - \note Иногда возникают артефакты и если отрегулировать это значение то все становится на свои места, тесты показали что в основном при ошибках, увеличение этого значения решало проблемы -*/ -SX_LIB_API void SML_LigthsSetShadowLocalFar( - ID id, //!< идентификатор света - float fFar //!< значение дальней плоскости отсечения (дальность видимости теней), обычно это значение = дальность света - ); - -//! возвращает значение дальней плоскости отсечения (дальности видимости теней) -SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id); - -//!@} - -//----------------------------------------------------------------------------- - -/*! \name Управление массивами обработки данных для рендера (к примеру от геометрии, растительности и прочего) - Cделано для того чтобы отделить просчеты видимости (если они нужны) от рендера. - К примеру можно рассчитать видимости в одном потоке а рисовать в основном. -@{ -*/ - -//! возвращает идентификатор в случае успеха, иначе <0 -SX_LIB_API ID SML_LigthsGetIDArr( - ID id, //!< идентификатор света - ID idOwner, //!< идентификатор объекта/системы вообще того что выдало идентификатор массива - int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//! установить идентификатор -SX_LIB_API void SML_LigthsSetIDArr( - ID id, //!< идентификатор света - ID idOwner, //!< идентификатор объекта/системы вообще того что выдало идентификатор массива - int iHow, //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ID idArr //!< номер массива обработки от объекта который надо будет обрабатывать на видимость - ); - -//!@} - -//!@} sxmtllight_light_shadow - -//! обработка tone mapping -SX_LIB_API void SML_LigthsToneMappingCom( - DWORD timeDelta, //!< время рендера кадра в млсек - float fFactorAdapted = 0.3 //!< на сколько быстро "глаз" привыкнет к освещению (0,1] (медленно, быстро] - ); - -/*! \name Функции обработки удаленного света - При удалении света он помещается в специальный массив удаленных объектов, -это связано с тем что свет может содержать в себе данные которые требуют очистки памяти вне данной реализации, -к примеру идентификаторы массивов просчетов видимости. \n - Поэтому необходимо вручную удалять (уже после удаленяи функцией #SML_LigthsDeleteLight) удаленные объекты света. - \note Доступ к элементам массива удаленных объектов света осуществляется посредством порядкового номера в массиве (ключа key), то есть можно пройтись по массиву циклом. -@{*/ - -//! возвращает количество удаленных объектов света которые требуют удаления -SX_LIB_API int SML_LigthsDelGetCount(); - -//! возвращает тип удаленного объекта света, значения из #LightsTypeLight -SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID key); - -//! удаляет (окончательно) удаленный объект света -SX_LIB_API void SML_LigthsDelDel(ID key); - -//! возвращает идентификатор, если был передан, иначе <0 -SX_LIB_API ID SML_LigthsDelGetIDArr( - ID key, //!< порядковый номер объекта света в массиве удаленного света - ID idOwner, //!< идентификатор того что выдало идентификатор массива - int iHow //!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного - ); - -//!@} - -//!@} sxmtllight_light - -//############################################################################# - -/*! \defgroup sxmtllight_ds Render targets для deferred shading - \ingroup sxmtllight -@{*/ - -//! типы render targets -enum DS_RT -{ - //! цвет rgba8 - DS_RT_COLOR = 0, - - //! нормали (включая микрорельеф) rfb10a2 - DS_RT_NORMAL, - - //! параметры освещения rgba8 - DS_RT_PARAM, - - //! глубина r16f, непрозрачные материалы - DS_RT_DEPTH, - - //! глубина r16f, непрозрачные материалы - DS_RT_DEPTH0, - - //! глубина r16f, непрозрачные и полупрозрачные пиксели, однако прозрачные (если есть) будут перекрывать непрозрачные, и в этом случае их глубина будет 1 то есть максимальной(для идентификации) - DS_RT_DEPTH1, - - - //! эмбиент цвет (цвет света rgb) и диффузное освещение (a) rgba16f - DS_RT_AMBIENTDIFF, - - //! блики r16f - DS_RT_SPECULAR, - - //! освещенная сцена rgba16 - DS_RT_SCENELIGHT, - - //! освещенная сцена rgba16 - DS_RT_SCENELIGHT2, - - //! текущий rt адаптации глаза к освещению r16f - DS_RT_ADAPTEDLUM -}; - -//! id render target по его типу -SX_LIB_API ID SML_DSGetRT_ID(DS_RT type); - -//! текстура render target по его типу -SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type); - -//!@} sxmtllight_ds - -//############################################################################# - -/*! \defgroup sxmtllight_mtl Система материалов - \ingroup sxmtllight -@{*/ - -/*! максимальная длина имени директории материала */ -#define MTL_MAX_SIZE_DIR SXGC_LOADTEX_MAX_SIZE_DIR - -/*! максимальная длина имени материала (без директории) */ -#define MTL_MAX_SIZE_NAME SXGC_LOADTEX_MAX_SIZE_NAME - -/*! максимальное количество обновлений статических отражений, в первый момент рендера */ -#define MTL_REF_UPDATE_MAX_COUNT_FOR_STATIC 3 - -/*! \name Дистанции при которых будут сниженно или повышено количество отрисовок для отражений -меньше #MTL_REF_UPDATE_L0_DIST - обновление будет каждый кадр -больше #MTL_REF_UPDATE_L2_DIST - обновления не будет -@{*/ - -#define MTL_REF_UPDATE_L0_DIST 10 -#define MTL_REF_UPDATE_L1_DIST 30 -#define MTL_REF_UPDATE_L2_DIST 70 - -//!@} - -/*! \name Параметры альфа теста - В данной реалзиации 2 вида альфа теста, принудительный (#SML_MtlSetForceblyAlphaTest) и назначаемый непосредственно материалом - \note функция альфа теста D3DCMP_GREATEREQUAL -@{*/ - -/*! значение свободного альфа теста (назначаемого материалом) */ -#define MTL_ALPHATEST_FREE_VALUE 64 - -/*! значение принудительного альфа теста */ -#define MTL_ALPHATEST_FORCEBLY_VALUE 8 - -//!@} - -/*! \name Значения параметров освещения по умолчанию - Данные значения по умолчанию будут применены к материалами которые не удалось загрузить, либо к стандартным материалам -@{*/ - -//! занчение шероховатости по умолчанию -#define MTL_LIGHTING_DEFAULT_ROUGHNESS 250.f/255.f - -//! значение f0 (отражательной способности поверхности) по умолчанию -#define MTL_LIGHTING_DEFAULT_F0 2.f/255.f - -//! значение thickness (толщина - на сколько будет использована диффузная составляющая, для твердых поверхностей - 1, для листьев деревьев и травы <1) по умолчанию -#define MTL_LIGHTING_DEFAULT_THICKNESS 255.f/255.f - -//!@} - -/*! \name Параметры отражений -@{*/ - -/*! размер текстур с отражениями */ -#define MTL_REF_TEX_SIZE 512 - -/*! ближняя плоскость отсечения */ -#define MTl_REF_PROJ_NEAR 0.25 - -/*! дальняя плоскость отсечения, или дистанция на которую будет рендер всего в текстуру отражений */ -#define MTl_REF_PROJ_FAR 100 - -//!@} - -/*! \name Виртуальные директории - \warning Имя виртуальной директории должно быть единичным символом (сделано для простоты сравнения), -и как следствие нежелательно использоавть реальную директорию с таким именем для текстур либо материалов, -и реальные директории не должны начинаться с данных символов -@{*/ - -//! имя виртуальной директории по умолчанию для "ручных" текстур с параметрами освещения -#define MTL_VIRTUAL_DIR_HAND_MTL '0' - -//! имя виртуальной директории по умолчанию для стандартных (встроенных) материалов -#define MTL_VIRTUAL_DIR_STD_MTL "mtrldef" - -//!@} - -/*! \name Текстурные регистры -Распределение регистров между текстурами которые будут отправляться для формирования данных -@{*/ - -/*!< основная текстура */ -#define MTL_TEX_R_MAIN 0 - -/*!< маска */ -#define MTL_TEX_R_MASK 1 - -/*! стартовый регистр для детальных текстур - \warning 4 следующих (включая указанный) будует заполнены детальными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL+3] не должны отправляться - \note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a - MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL + 1, MTL_TEX_R_DETAIL + 2, MTL_TEX_R_DETAIL + 3 -*/ -#define MTL_TEX_R_DETAIL 2 - -/*! стартовый регистр для микрорельефных текстур -\warning 4 следующих (включая указанный) будует заполнены микрорельефными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_MICRO, MTL_TEX_R_MICRO+3] не должны отправляться -\note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a - MTL_TEX_R_MICRO, MTL_TEX_R_MICRO + 1, MTL_TEX_R_MICRO + 2, MTL_TEX_R_MICRO + 3 -*/ -#define MTL_TEX_R_MICRO 6 - - -/*! текстура с параметрами освещения */ -#define MTL_TEX_R_PARAM_LIGHT 10 - -/*! текстура с отражениями */ -#define MTL_TEX_R_REFLECTION 12 - -/*! текстура с преломлениями */ -#define MTL_TEX_R_REFRACTION 13 - -/*! текстура с текущей глубиной */ -#define MTL_TEX_R_CURR_DEPTH 14 - -//!@} - -//! типы отражений -enum MTLTYPE_REFLECT -{ - //! нет отражения - MTLTYPE_REFLECT_NONE, - - //! плоское - MTLTYPE_REFLECT_PLANE, - - //! объемное динамическое - MTLTYPE_REFLECT_CUBE_DYNAMIC, - - //! объемное статическое, обработка идет первые несколько кадров, затем не обновляется - MTLTYPE_REFLECT_CUBE_STATIC -}; - -//! сорт материала -enum MTLSORT -{ - //! непрозрачный - MTLSORT_OPAQUE = 0x00000001, - - //! прозрачный - MTLTYPE_TRANSPARENCY = 0x00000010, - - //! непрозрачный - MTLSORT_LIGHTED = 0x00000100, - - //! прозрачный - MTLTYPE_ULIT = 0x00001000, - - //! непрозрачный освещаемый - /*MTLSORT_OPAQUE_LIGHTED, - - //! непрозрачный не освещаемый - MTLSORT_OPAQUE_UNLIT,*/ - - - //! полупрозрачный освещаемый - /*MTLTYPE_TRANSPARENCY_LIGHTED, - - //! полупрозрачный не освещаемый - MTLTYPE_TRANSPARENCY_UNLIT,*/ -}; - -/*! \name Возможные слои -@{*/ - -//! непрозрачные неосвещаемые -#define MTLTYPE_LAYER_OPAQUE_UNLIT 0.0f - -//! прозрачные неосвещаемые -#define MTLTYPE_LAYER_TRANSPARENT_UNLIT 0.666667f - -//! непрозрачные освещаемые -#define MTLTYPE_LAYER_OPAQUE_LIGHT 0.333333f - -//! прозрачные освещаемые -#define MTLTYPE_LAYER_TRANSPARENT_LIGHT 1.0f - -//!@} - -//! тип модели материала -enum MTLTYPE_MODEL -{ - //! статическая геометрия - MTLTYPE_MODEL_STATIC = 0, - - //! растительность трава - MTLTYPE_MODEL_GRASS, - - //! растительность дерево - MTLTYPE_MODEL_TREE, - - //! анимационная модель - MTLTYPE_MODEL_SKIN, - - //! значение по умолчанию - MTLTYPE_MODEL_DEFAULT = MTLTYPE_MODEL_STATIC -}; - -//! физический тип материала -enum MTLTYPE_PHYSIC -{ - MTLTYPE_PHYSIC_CONCRETE = 0, //!< бетон - - //! значение по умолчанию - MTLTYPE_PHYSIC_DEFAULT = MTLTYPE_PHYSIC_CONCRETE, - - //! металл - MTLTYPE_PHYSIC_METAL, - - //! стекло - MTLTYPE_PHYSIC_GLASS, - - //! пластик - MTLTYPE_PHYSIC_PLASTIC, - - //! дерево - MTLTYPE_PHYSIC_TREE, - - //! плоть - MTLTYPE_PHYSIC_FLESH, - - //! земля/песок - MTLTYPE_PHYSIC_GROUD_SAND, - - //! вода - MTLTYPE_PHYSIC_WATER, - - //! листва/трава - MTLTYPE_PHYSIC_LEAF_GRASS, - - //! количество типов - MPT_COUNT -}; - -//! данные отправляемые в шейдеры -enum MTL_SHADERSTD -{ - //! мировая матрица (трансформации модели), world - MTL_SHADERSTD_MATRIX_WORLD = 0, - - //! матрица вида, view - MTL_SHADERSTD_MATRIX_VIEW, - - //! матрица проекции, projection - MTL_SHADERSTD_MATRIX_PROJECTION, - - //! world * view - MTL_SHADERSTD_MATRIX_WORLDVIEW, - - //! world * view * projection - MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, - - //! позиция камеры/наблюдателя - MTL_SHADERSTD_CAMPOS, - - //! данные о времени float2(CountTimeRender,TimeDelta) - MTL_SHADERSTD_TIMEDELTA, - - //! размеры окна рендера - MTL_SHADERSTD_WINSIZE, - - //! пользовательские данные (float4) - MTL_SHADERSTD_USERDATA -}; - -/*! \name Загрузка/сохранение - \note Файл загрузки/сохранения представлен простым конфигурационным файлом (ini) который можно обрабатывать посредством #ISXLConfig - \todo Расписать организацию конфигурационного файла загрузки/сохранения для материала -@{*/ - -/*! загрузка материала, возвращает уникальный идентификатора материала, - \note все материалы оборачиваются в специальную структуру, поэтому дубликатов среди идентификаторов материалов нет - \note любой повторно загружаемый материал не загружается, а лишь дублирует обертку, со ссылкой на внутренности оберкти - */ -SX_LIB_API ID SML_MtlLoad( - const char *szName, //!< имя_материала.расширение - MTLTYPE_MODEL mtl_type = MTLTYPE_MODEL_STATIC //!< тип модели материала на случай если материал не будет загружен/найден - ); - -//! перезагрузка материала -SX_LIB_API void SML_MtlReloadMaterial( - ID id, //!< идентификатор материала - const char *szName = 0 //!< на случай замены существующего материала другим - ); - -/*! сохранить материал по id - \note Сохранение происходит по отноительному пути в директория/директория_имяфайла.mtl -*/ -SX_LIB_API void SML_MtlSave(ID id); - -//!@} - -/*! очитска, удаляет все загруженные материалы (но место в массиве под них остается), все стандартные остаются - \warning Отражения не удаляются а помещаются в очередь удаления, так как могут сожеражть в себе идентификаторы, которые необходимы очистить, -для полной очистки необходимо вызывать функцию #SML_MtlDelRefClear. Однако во избежания утечек памяти необходимо очистить идентификаторы, для их получения вызыва функцию #SML_MtlDelRefGetIDArr -*/ -SX_LIB_API void SML_MtlClear( - bool isClearRefDel //!< очищать ли очередь удаления отражений, на тот случай если идентификаторы в отражениях больше не действительны - ); - -//! возвращает общее количество материалов -SX_LIB_API long SML_MtlGetCount(); - -//! возвращает тип модели материала по id -SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id); - -//! возвращает сорт материала по id -SX_LIB_API UINT SML_MtlGetSort(ID id); - -/*! установка типа модели материала по id - \warning меняется только внутренний флаг (определение)!!! все остальное для данного типа надо загружать вручную, сделано для больших возможностей построения материалов -*/ -SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model); - -//! установка параметров материала по id, вызывается перед DIP -SX_LIB_API void SML_MtlRender( - ID id, //!< идентификатор материала - const float4x4 *pWorld //!< указатель на мировую матрицу модели, либо 0 - тогда будет принята единичная матрица - ); - -//! стандартная отрисовка материала, используются стандартные шейдеры, нужно для теней, отражений и прочего -SX_LIB_API void SML_MtlRenderStd( - MTLTYPE_MODEL type, //!< тип материала из MtlTypeModel - const float4x4 *pWorld, //!< мировая матрица трансформации, либо 0 и будет применена единичная матрица - ID idSlot, //!< текстурный слот в который установить текстуру - ID idMtl //!< идентификатор материала из которого будет браться текстура - ); - -//! установка параметров материала для рендера источника света -SX_LIB_API void SML_MtlRenderLight( - const float4_t *pColor, //!< rgb - цвет, w зарезервирован - const float4x4 *pWorld //!< аналогично #SML_MtlRender - ); - -//! установить текстуру из материала id в текстурный слот slot -SX_LIB_API void SML_MtlSetMainTexture(ID idSlot, ID id); - - -//! установка физического типа материала -SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type); - -//! возвращает текущий тип физического материала -SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id); - -//! возвращает id стандартного материала для определенной модели материалов указанной в #MtlTypeModel -SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model); - -/*! \name Управление полупрозрачными поверхностями -Каждый выводимый пиксель помечается номером поверхности к которой он относится - - 0 - пусто - - 1 - непрозрачная геометрия - - все что больше 1 значит полупрозрачная геометрия - \note Если инкремент установлен то отрисовка каждого материала будет инкрементировать внутренний счетчик, присваивая каждому пикселю поверхности идентификатор поверхности. - \note На данный момент максимальное значение полупрозрачных поверхностей может быть только 255 (8 бит) -@{*/ - -/*! установка инкремента идентификатора поверхностей - \note К примеру для диференциации (разделения) пикселей при смешивании всех слоев изображения, -без разделения по принадлжености к определнной поверхности будет трудно/невозможно (пока выхода нет) корректно смешать все слои -*/ -SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf); - -//! установлен ли инкремент поверхностей -SX_LIB_API bool SML_MtlGetIsIncrCountSurf(); - -//! обнуление идентификатора отрисованных поверхностей (к примеру при новом кадре) -SX_LIB_API void SML_MtlNullingCurrCountSurf(); - -//! текущее количество отрисованных полупрозрачных поверхностей -SX_LIB_API int SML_MtlGetCurrCountSurf(); - -//! установить текущее количество отрисованных полупрозрачных поверхностей -SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount); - -/*! принудительное включение альфа теста (isat - true - включить, false - выключить) при устновке параметров материала, -к примеру для рендера полупрозрачных поверхностей, чтобы отсечь (условно) полностью прозрачные пиксели -*/ -SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isEnable); - -//! включен ли принудительный альфа тест -SX_LIB_API bool SML_MtlGetForceblyAlphaTest(); - -//!@} - -/*! \defgroup sxmtllight_mtl_reflect Отражения - \ingroup sxmtllight_mtl - \note Поддерживается 2 вида отражений: - - плоские - - объемные/кубические -@{*/ -//{{ - -//! записать в отражения идентификатор (idArr) для определнной стороны куба/сплита (iCube), соотнести его с идентификатором сущности (idOwner) -SX_LIB_API void SML_MtlRefSetIDArr( - ID id, //!< идентификатор материала - ID idOwner, //!< идентификатор сущности для которой записываем (геометрия, растительность и прочее) - int iCube, //!< условно - сторона куба/сплита для которой записываем - ID idArr //!< идентификатор который надо записать - ); - -//! возвращает идентификатор который был записан для сущности (idOwner) для стороны куба/сплита (iCube), если вообще записывался, если не записывался то <0 -SX_LIB_API ID SML_MtlRefGetIDArr( - ID id, //!< идентификатор материала - ID idOwner, //!< идентификатор сущности для которой было записывано (геометрия, растительность и прочее) - int iCube //!< условно - сторона куба/сплита для которой было записывано - ); - -/*! \name Управление удаленными отражениями -@{*/ - -//! возвращает количество удаленных материалов с отражениями -SX_LIB_API int SML_MtlDelRefGetCount(); - -//! возвращает идентификатор который был записан для сущности (inid) для стороны куба/сплита (cube) -SX_LIB_API ID SML_MtlDelRefGetIDArr( - ID idKey, //!< порядковый номер удаленного материала с отражением - ID idOwner, //!< идентификатор сущности для которой было записано (геометрия, растительность и прочее) - int iCube //!< условно - сторона куба/сплита для которой было записывано - ); - -//! очистка массива удаленных материалов с отражениями -SX_LIB_API void SML_MtlDelRefClear(); - -//!@} - -//! обработка статистики рендера для текущего матриала с отражением -SX_LIB_API bool SML_MtlRefUpdateCountUpdate( - ID id, //!< идентификатора материала - const float3_t *pViewPos //!< позиция наблюдателя, viewpos == 0 вернет false - ); - -/*! обнуление статистикки рендера для данного материала с отражением, -полезно в случаях каких-либо изменений, чтобы эти изменения были видны и в отражениях (актуально для статических отражений) -*/ -SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id); - -//! установка экстремумов материала -SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax); - -//! возвращает фрустум отражения, cube - сторона куба -SX_LIB_API const IFrustum* SML_MtlRefGetfrustum( - ID id, //!< идентификатора материала - int iCube //!< сторона куба, если отражение плоское то необходимо указать в cube передать 0, иначе вернет NULL - ); - -SX_LIB_API bool SML_MtlRefIsAllowedRender(ID id); //!< разрешен ли рендер отражений для данного материала в текущий момент - -/*! \name Рендер плоского отражения - \note Перед началом рендера плоских отражений необходимо в регистры матриц в #G_RI_MATRIX_VIEW поместить матрицу вида наблюдателя - \note Порядок рендера: - \code - SML_MtlRefPreRenderPlane(id, plane); - //код рендера всего того что необходимо поместить в текстуру отражений - SML_MtlRefPostRenderPlane(id); - \endcode -@{*/ - -//! первоначальные настройки данных для генерации отражения -SX_LIB_API void SML_MtlRefPreRenderPlane( - ID id, //!< идентификатор материала - D3DXPLANE *pPlane //!< плоскость относительно которой будет считаться отражение - ); - -//! завершающие операции -SX_LIB_API void SML_MtlRefPostRenderPlane(ID id); - -//! возвращает текстуру с плоским отражением (если оно есть, иначе 0) -SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id); - -//!@} - -/*! \name Рендер объемного (кубического) отражения - \note Порядок рендера: - \code - SML_MtlRefCubeBeginRender(id, center); - SML_MtlRefCubePreRender(id, cube, world); - //код рендера всего того что необходимо поместить в текстуру отражений - SML_MtlRefCubePostRender(id, cube); - SML_MtlRefCubeEndRender(id, viewpos); - \endcode -@{*/ - -//! установка общих настроек -SX_LIB_API void SML_MtlRefCubeBeginRender( - ID id, //!< идентификатор материала - const float3_t *pCenter //!< центр (позиция) подгруппы модели - откуда будет рендер отражений - ); - -//! установка частных настроек для стороны куба (cube) -SX_LIB_API void SML_MtlRefCubePreRender( - ID id, //!< идентификатор материала - int iCube, //!< сторона куба [0,5] - const float4x4 *pWorld //!< мировая матрица модели - ); - -//! завершающие частные моменты для стороны куба -SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube); - -/*! завершающие общие моменты - \note если viewpos == 0 обновления статисктики рендера для текущего материала с отражением не произойдет, -и дабы рационально обрабатывать и статические и динамические отражения необходимо до следующего рендера отражений вызвать SML_MtlRefUpdateCountUpdate -*/ -SX_LIB_API void SML_MtlRefCubeEndRender( - ID id, //!< идентификатор материала - const float3_t *pViewPos //!< позиция наблюдателя, необходимо для обработки разрешения на следующий рендер - ); - -//! возвращает cube текстуру отражением (если оно есть, иначе 0) -SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id); - -//!@} - -//!@} sxmtllight_mtl_reflect - - -/*! \defgroup sxmtllight_mtl_propslayer Cвойства поверхности - \ingroup sxmtllight_mtl -@{*/ - -//! установка основной текстуры (загрузка текстуры по имени) -SX_LIB_API void SML_MtlSetTexture(ID id, const char *szPathTex); - -//! в name записывает имя текстуры -SX_LIB_API void SML_MtlGetTexture(ID id, char *szName); - -//! возвращает id текстуры материала -SX_LIB_API ID SML_MtlGetTextureID(ID id); - - -/*! \name Шейдеры для рендера материала - \warning В текущей версии все шейдеры загружаются в версии 3.0 и требуют в качестве старта указывать функцию main - \warning Рекомендуется устанавливать и вершинный и пиксельный шейдеры, так как во врем тестов одно из устройств требовало наличия обоих шейдеров либо отсутствия обоих - \note В аргументах path_vs/path_ps указывается только имя шейдера с расширением, есесно возвращается тоже самое -@{*/ - -//! установка вершинного шейдера -SX_LIB_API void SML_MtlSetVS(ID id, const char *szPathVS); - -//! в name записывает имя текущего вершинного шейдера -SX_LIB_API void SML_MtlGetVS(ID id, char *szName); - -//! установка пиксельного шейдера -SX_LIB_API void SML_MtlSetPS(ID id, const char *szPathPS); - -//! в name записывает имя текущего пикельного шейдера -SX_LIB_API void SML_MtlGetPS(ID id, char *szName); - -//!@} - -//! возвращает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить -SX_LIB_API float SML_MtlGetDurability(ID id); - -//! устанавливает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить -SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability); - - -//! возвращает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется] -SX_LIB_API float SML_MtlGetHitChance(ID id); - -//! устанавливает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется] -SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance); - - -//! возвращает плотность материала кг/м3 -SX_LIB_API float SML_MtlGetDensity(ID id); - -//! устанавливает плотность материала кг/м3 -SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity); - - -//! используется ли альфа тест для материала -SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id); - -//! установка использования альфа теста -SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing); - -/*! освещение материала id - \note если материал не освещается то будет выведен в цвете накладываемым материалом -*/ -SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting); - -//! освещается ли материал -SX_LIB_API bool SML_MtlGetLighting(ID id); - -/*! \name Параметры освещения. - \note Для более точной/тонкой настройки освещения материала рекомендуется использовать текстуру с параметрами освещения -(к прмиеру когда в одной поверхности разные материалы, к примеру дерево, метал и камень, то в текстуре можно указать параметры освещения для каждого пикселя), -однако если текстуры нет то будут использованы установленные парметры освещения для всей поверхности -@{*/ - -//! установка использования текстуры с параметрами освещения -SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting); - -//! используется ли текстура с параметрами для освещения -SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id); - - -//! загрузка текстуры с парамтерами освещения -SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szPathTex); - -//! в path_tex записывает имя текстуры с параметрами освещения -SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szPathTex); - - -//! установка шероховатости (0-1) -SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness); - -//! возвращает текущее значение шероховатости поверхности -SX_LIB_API float SML_MtlGetRoughness(ID id); - - -//! установка просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение -SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness); - -//! возвращает просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение -SX_LIB_API float SML_MtlGetThickness(ID id); - -//! установка отражательной способности поверхности (0-1) -SX_LIB_API void SML_MtlSetF0(ID id, float fF0); - -//! возвращает текущее значение отражательной способности поверхности -SX_LIB_API float SML_MtlGetF0(ID id); - -//!@} - -/*! \name Полупрозрачность -Под полупрозрачными материалами следует понимать такие материалы, прозрачность которых в среднем находится в пределах [0.5, 1) и минимальный процент полупрозрачного периметра 50% -@{*/ - -//! установка свойства полупрозрачности -SX_LIB_API void SML_MtlSetTransparency(ID id, bool isTransparent); - -//! возвращает текущее значение свойства полупрозрачности для материала -SX_LIB_API bool SML_MtlGetTransparency(ID id); - -//!@} - -/*! \name Отражения окружения, типы из #MtlTypeReflect -@{*/ - -//! установка типа отражений -SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type); - -//! возвращает текущий тип отражений для материала -SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id); - -//!@} - -/*! \name Детальность и микрорельеф -Поверхность может содержать до 4 детальных текстур и до 4 текстур с микрорельефом. -Данные для определения наложения текстур (детальных и микрорельефных) указываются в маске - -на каждый канал текстуры маски по одной детальной и микрорельефной текстуре, -то есть канал маски определет связанные между собой и детальную и микрорельефную текстуры - \note В аргументах channel - RGBA - 0,1,2,3 -@{*/ - -//! загрузка маски наложения -SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szPathTex); - -//! в path_tex записывает текущее имя маски наложения -SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szPathTex); - -//! загрузка текстуры микрорельефа, на каждый канал -SX_LIB_API void SML_MtlSetMRTex( - ID id, //!< идентификатор материала - int iChannel, //!< номер канала RGBA - 0,1,2,3 - const char *szPathTex //!< имя текстуры с расширением - ); - -//! в path_tex запишет текущее имя текстуры микрорельефа для канала channel -SX_LIB_API void SML_MtlGetMRTex(ID id, int iChannel, char *szPathTex); - -//! загрузка детальной текстуры, на каждый канал -SX_LIB_API void SML_MtlSetDTex( - ID id, //!< идентификатор материала - int iChannel, //!< номер канала RGBA - 0,1,2,3 - const char *szPathTex //!< имя текстуры с расширением - ); - -//! в path_tex запишет текущее имя детальной текстуры для канала channel -SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szPathTex); - -//!@} - -/*! \name Стандартные параметры для отправки в шейдер (в вершинный и пиксельный раздельно), данные из #MtlTransShaderStd -@{*/ - -//! отправка стадартных данных в вершинный шейдер -SX_LIB_API void SML_MtlSetStdVS( - ID id, //!< идентификатор материала - MTL_SHADERSTD type, //!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd - bool isSend //!< true - отправлять, false - не отправлять - ); - -//! установлена ли отпрвка значения type в вершинный шейдер -SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type); - -//! отправка стадартных данных в пиксельный шейдер -SX_LIB_API void SML_MtlSetStdPS( - ID id, //!< идентификатор материала - MTL_SHADERSTD type, //!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd - bool isSend //!< true - отправлять, false - не отправлять - ); - -//! установлена ли отпрвка значения type в пиксельный шейдер -SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type); - -//!@} - -/*! \name Дополнительные пользовательские данные в виде float4 (предел [0-1] для стандарта, иное вне стандарта, но допустимо) - \note Данные для вершинного и пиксельного шейдера раздельны. Отправляется float4. -Однако данные и из пиксельного могут быть отправленны в вершинный и наоборот. -В итоге в шейдере может быть 2 float4 пользовательских вектора с данными. -Но если вектор определен для пиксельного то он все-равно будет отправлен в пиксельный шейдер, даже если и придназначалася для вершинного. - \note В аргументах component - xyzw - 0,1,2,3 -@{*/ - -//! установка значения компоненты вектора для вершинного шейдера -SX_LIB_API void SML_MtlSetUserDataVS( - ID id, //!< идентификатор материала - int iComponent, //!< компонента вектора xyzw - 0,1,2,3 - float fValue //!< значение компоненты - ); - -//! возвращает значение компоненты вектора, который отправляется в вершинный шейдер -SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent); - -//! установка отправки float4 вектора, предназначенного для вершинного шейдера, в пиксельный шейдер -SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPs); - -//! отправляется ли float4 вектор, предназначенный для вершинного шейдера, в пиксельный шейдер -SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id); - - -//! установка значения компоненты вектора для пиксельного шейдера -SX_LIB_API void SML_MtlSetUserDataPS( - ID id, //!< идентификатор материала - int iComponent, //!< компонента вектора xyzw - 0,1,2,3 - float fValue //!< значение компоненты - ); - -//! возвращает значение компоненты вектора, который отправляется в пиксельный шейдер -SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent); - -//! установка отправки float4 вектора, предназначенного для пиксельного шейдера, в вершинный шейдер -SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVs); - -//! отправляется ли float4 вектор, предназначенный для пиксельного шейдера, в вершинный шейдер -SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id); - -//!@} - -//!@} sxmtllight_mtl_propslayer - -//!@} sxmtllight_mtl - -#endif - -//!@} sxmtllight diff --git a/source/mtllight/material.cpp b/source/mtrl/material.cpp similarity index 99% rename from source/mtllight/material.cpp rename to source/mtrl/material.cpp index daa847424ffdbab06f891e37712142b658e4a54d..1a6db03f16623fb995e3a91743b67f4a03a4608d 100644 --- a/source/mtllight/material.cpp +++ b/source/mtrl/material.cpp @@ -1949,7 +1949,7 @@ void CMaterials::render(ID id, const float4x4 *pWorld) MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, m_aUnitMtrls[id]->m_pReflect->getRefCubeTex()); } - MLSet::DXDevice->SetTexture(MTL_TEX_R_CURR_DEPTH, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene0)); + MLSet::DXDevice->SetTexture(MTL_TEX_R_CURR_DEPTH, SGCore_GbufferGetRT(DS_RT_DEPTH0)); //если есть рефаркци¤, а она идет вторым проходом, то отправл¤ем, иначе посылаем 0 /*if (pMtrl->m_oLightParam.m_type_transparency) diff --git a/source/mtllight/material.h b/source/mtrl/material.h similarity index 100% rename from source/mtllight/material.h rename to source/mtrl/material.h diff --git a/source/mtrl/ml_data.cpp b/source/mtrl/ml_data.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7da1be985b41251e03cb4fa3f1109fadaafa0e86 --- /dev/null +++ b/source/mtrl/ml_data.cpp @@ -0,0 +1,116 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include "ml_data.h" + +namespace MLSet +{ + void MLInit(); + IDirect3DDevice9* DXDevice = 0; + + + float2_t SizeTexReflection = float2_t(MTL_REF_TEX_SIZE, MTL_REF_TEX_SIZE); + + //ориентаци¤ и верхний вектор дл¤ рендера в кубическую текстуру + float3 OrientedCube[6] = { float3(1, 0, 0), float3(-1, 0, 0), float3(0, 1, 0), float3(0, -1, 0), float3(0, 0, 1), float3(0, 0, -1) }; + float3 UpVectorsCube[6] = { float3(0, 1, 0), float3(0, 1, 0), float3(0, 0, -1), float3(0, 0, 1), float3(0, 1, 0), float3(0, 1, 0) }; + + float4x4 RefMProjPlane; + float4x4 RefMProjCube; + + namespace IDsShaders + { + namespace VS + { + ID ResPosDepth; + + ID ScreenOut; + + ID StdGeom; + ID StdTree; + ID StdGrass; + ID StdSkin; + }; + + namespace PS + { + ID ScreenOut; + + ID StdGeom; + ID StdGeomCP; + ID StdGreen; + ID StdGreenCP; + ID StdSkin; + ID StdSkinCP; + }; + }; + + namespace IDsTexs + { + ID Tex_NoiseTex; + }; +}; + +void MLSet::MLInit() +{ + MLSet::DXDevice = SGCore_GetDXDevice(); + + const int *r_win_width = GET_PCVAR_INT("r_win_width"); + const int *r_win_height = GET_PCVAR_INT("r_win_height"); + + const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); + + //MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST); + + D3DLOCKED_RECT LockedRect; + uint32_t* tmpOldColor; + IDirect3DTexture9 *pRnsSampler; + MLSet::DXDevice->CreateTexture(4, 4, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pRnsSampler, NULL); + + uint32_t aRndColors[16];// = D3DCOLOR_ARGB(0, 250, 2, 255); + + for (int i = 0; i < 16; ++i) + aRndColors[i] = D3DCOLOR_ARGB(255, rand() % 255, rand() % 255, rand() % 255); + + pRnsSampler->LockRect(0, &LockedRect, 0, 0); + memcpy(LockedRect.pBits, aRndColors, sizeof(uint32_t)); + pRnsSampler->UnlockRect(0); + + //SGCore_LoadTexLoadTextures(); + MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexCreate("noise_rottex__", pRnsSampler); + + + MLSet::IDsShaders::VS::ResPosDepth = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_res_pos.vs", "pp_quad_render_res_pos.vs", SHADER_CHECKDOUBLE_PATH); + + MLSet::IDsShaders::VS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs", SHADER_CHECKDOUBLE_PATH); + MLSet::IDsShaders::PS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps", SHADER_CHECKDOUBLE_PATH); + + + MLSet::IDsShaders::VS::StdGeom = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "stdr_geom.vs", "stdr_geom.vs", SHADER_CHECKDOUBLE_NAME); + MLSet::IDsShaders::PS::StdGeom = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "stdr_geom.ps", "stdr_geom.ps", SHADER_CHECKDOUBLE_NAME); + + D3DXMACRO Defines_CP[] = { { "_CLIP_PLANE_", "" }, { 0, 0 } }; + MLSet::IDsShaders::PS::StdGeomCP = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "stdr_geom.ps", "stdr_geom_cp.ps", SHADER_CHECKDOUBLE_NAME, Defines_CP); + + D3DXMACRO Defines_GRASS[] = { { "_GRASS_", "" }, { 0, 0 } }; + MLSet::IDsShaders::VS::StdGrass = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "stdr_green.vs", "stdr_grass.vs", SHADER_CHECKDOUBLE_NAME, Defines_GRASS); + MLSet::IDsShaders::VS::StdTree = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "stdr_green.vs", "stdr_tree.vs", SHADER_CHECKDOUBLE_NAME); + + MLSet::IDsShaders::PS::StdGreen = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "stdr_green.ps", "stdr_green.ps", SHADER_CHECKDOUBLE_NAME); + MLSet::IDsShaders::PS::StdGreenCP = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "stdr_green.ps", "stdr_green_cp.ps", SHADER_CHECKDOUBLE_NAME, Defines_CP); + + + MLSet::IDsShaders::VS::StdSkin = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "stdr_skin.vs", "stdr_skin.vs", SHADER_CHECKDOUBLE_NAME); + MLSet::IDsShaders::PS::StdSkin = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "stdr_skin.ps", "stdr_skin.ps", SHADER_CHECKDOUBLE_NAME); + + MLSet::IDsShaders::PS::StdSkinCP = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "stdr_skin.ps", "stdr_skin_cp.ps", SHADER_CHECKDOUBLE_NAME, Defines_CP); + + + + + MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*r_win_width) / float(*r_win_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); + MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); +} \ No newline at end of file diff --git a/source/mtrl/ml_data.h b/source/mtrl/ml_data.h new file mode 100644 index 0000000000000000000000000000000000000000..c9dc1cabb74a9f53f0ad74f9d2154e0507880c1b --- /dev/null +++ b/source/mtrl/ml_data.h @@ -0,0 +1,72 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#ifndef __ML_DATA_H +#define __ML_DATA_H + +#include <gdefines.h> + +#define SM_D3D_CONVERSIONS +#include <common/SXMath.h> +#include <common/array.h> + +#include <GRegisterIndex.h> + +#include "sxmtrl.h" + +namespace MLSet +{ + void MLInit(); + + extern IDirect3DDevice9* DXDevice; + + extern float2_t SizeTexReflection; + + //ориентаци¤ и верхний вектор дл¤ рендера в кубическую текстуру + extern float3 OrientedCube[6]; + extern float3 UpVectorsCube[6]; + + extern float4x4 RefMProjPlane; + extern float4x4 RefMProjCube; + + namespace IDsShaders + { + namespace VS + { + extern ID ResPosDepth; + + extern ID ScreenOut; + + extern ID StdGeom; + extern ID StdTree; + extern ID StdGrass; + extern ID StdSkin; + }; + + namespace PS + { + extern ID CalcAdaptedLum; + extern ID SampleLumInit; + extern ID SampleLumIterative; + + extern ID ScreenOut; + + extern ID StdGeom; + extern ID StdGeomCP; + extern ID StdGreen; + extern ID StdGreenCP; + extern ID StdSkin; + extern ID StdSkinCP; + }; + }; + + namespace IDsTexs + { + extern ID Tex_NoiseTex; + }; +}; + +#endif \ No newline at end of file diff --git a/source/mtllight/reflection.cpp b/source/mtrl/reflection.cpp similarity index 100% rename from source/mtllight/reflection.cpp rename to source/mtrl/reflection.cpp diff --git a/source/mtllight/reflection.h b/source/mtrl/reflection.h similarity index 99% rename from source/mtllight/reflection.h rename to source/mtrl/reflection.h index f4bf34729c9f5db41e4e0044299cdc904f9dfa05..916b83fc79a9ef1a5bcf6f46d1c05d6dfc991664 100644 --- a/source/mtllight/reflection.h +++ b/source/mtrl/reflection.h @@ -14,7 +14,7 @@ See the license in LICENSE #include <common/Array.h> #include <d3d9.h> -#include "sxmtllight.h" +#include "sxmtrl.h" #include "ml_data.h" /*! класс отражений, возможны плоские отражения и кубические diff --git a/source/mtrl/sxmtrl.cpp b/source/mtrl/sxmtrl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a6577294691e7d00db12d1bfc049343f71f1e961 --- /dev/null +++ b/source/mtrl/sxmtrl.cpp @@ -0,0 +1,650 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#define SXMATERIAL_LIGTH_VERSION 1 + +#include "sxmtrl.h" +#include "ml_data.h" + +#include "material.h" + +#if !defined(DEF_STD_REPORT) +#define DEF_STD_REPORT +report_func g_fnReportf = DefReport; +#endif + +CMaterials* ArrMaterials = 0; + +#define ML_PRECOND(retval) if(!ArrMaterials){LibReport(-1, "%s - sxmtrl is not init", GEN_MSG_LOCATION); return retval;} + +//########################################################################## + +SX_LIB_API long SMtrl_0GetVersion() +{ + return SXMATERIAL_LIGTH_VERSION; +} + +SX_LIB_API void SMtrl_Dbg_Set(report_func rf) +{ + g_fnReportf = rf; +} + +SX_LIB_API void SMtrl_0Create(const char *szName, bool isUnic) +{ + if (szName && strlen(szName) > 1) + { + if (isUnic) + { + HANDLE hMutex = CreateMutex(NULL, FALSE, szName); + if (GetLastError() == ERROR_ALREADY_EXISTS) + { + CloseHandle(hMutex); + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION); + } + else + { + MLSet::MLInit(); + ArrMaterials = new CMaterials(); + } + } + else + { + MLSet::MLInit(); + ArrMaterials = new CMaterials(); + } + } + else + LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION); +} + +SX_LIB_API void SMtrl_AKill() +{ + mem_delete(ArrMaterials); +} + +SX_LIB_API void SMtrl_OnLostDevice() +{ + ML_PRECOND(_VOID); + ArrMaterials->onLostDevice(); +} + +SX_LIB_API void SMtrl_OnResetDevice() +{ + ML_PRECOND(_VOID); + + ArrMaterials->onResetDevice(); + + //MLSet::rt_id::HowAdaptedLum = 0; +} + +SX_LIB_API void SMtrl_Update(DWORD timeDelta) +{ + static const int *r_win_width = GET_PCVAR_INT("r_win_width"); + static const int *r_win_height = GET_PCVAR_INT("r_win_height"); + + static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); + + if (ArrMaterials) + ArrMaterials->update(timeDelta); + + MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*r_win_width) / float(*r_win_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); + MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR); +} + +//############################################################################# + +SX_LIB_API ID SMtrl_MtlLoad(const char *szName, MTLTYPE_MODEL mtl_type) +{ + ML_PRECOND(-1); + + return ArrMaterials->mtlLoad(szName, mtl_type); +} + +SX_LIB_API void SMtrl_MtlSave(ID id) +{ + ML_PRECOND(_VOID); + + ArrMaterials->mtlSave(id); +} + +SX_LIB_API MTLTYPE_MODEL SMtrl_MtlGetTypeModel(ID id) +{ + ML_PRECOND(MTLTYPE_MODEL_STATIC); + + return ArrMaterials->getTypeModel(id); +} + +SX_LIB_API UINT SMtrl_MtlGetSort(ID id) +{ + ML_PRECOND(0); + + return ArrMaterials->mtlGetSort(id); +} + +SX_LIB_API void SMtrl_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model) +{ + ML_PRECOND(_VOID); + + ArrMaterials->setTypeModel(id, type_model); +} + +SX_LIB_API long SMtrl_MtlGetCount() +{ + ML_PRECOND(-1); + + return ArrMaterials->getCount(); +} + +SX_LIB_API void SMtrl_MtlRender(ID id, const float4x4 *pWorld) +{ + ML_PRECOND(_VOID); + ArrMaterials->render(id, pWorld); +} + +SX_LIB_API void SMtrl_MtlRenderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl) +{ + ML_PRECOND(_VOID); + ArrMaterials->renderStd(type, pWorld, idSlot, idMtl); +} + +SX_LIB_API void SMtrl_MtlRenderLight(const float4_t *pColor, const float4x4 *pWorld) +{ + ML_PRECOND(_VOID); + ArrMaterials->renderLight(pColor, pWorld); +} + +SX_LIB_API void SMtrl_MtlSetMainTexture(ID slot, ID id) +{ + ML_PRECOND(_VOID); + ArrMaterials->setMainTexture(slot, id); +} + +SX_LIB_API void SMtrl_MtlSetIsIncrCountSurf(bool bf) +{ + ML_PRECOND(_VOID); + ArrMaterials->setIsIncrCountSurf(bf); +} + +SX_LIB_API bool SMtrl_MtlGetIsIncrCountSurf() +{ + ML_PRECOND(false); + return ArrMaterials->getIsIncrCountSurf(); +} + +SX_LIB_API void SMtrl_MtlNullingCurrCountSurf() +{ + ML_PRECOND(_VOID); + ArrMaterials->nullingCurrCountSurf(); +} + +SX_LIB_API int SMtrl_MtlGetCurrCountSurf() +{ + ML_PRECOND(-1); + return ArrMaterials->getCurrCountSurf(); +} + +SX_LIB_API void SMtrl_MtlSetCurrCountSurf(int iCount) +{ + ML_PRECOND(_VOID); + ArrMaterials->setCurrCountSurf(iCount); +} + +SX_LIB_API void SMtrl_MtlSetForceblyAlphaTest(bool isAlphaTest) +{ + ML_PRECOND(_VOID); + ArrMaterials->setForceblyAlphaTest(isAlphaTest); +} + +SX_LIB_API bool SMtrl_MtlGetForceblyAlphaTest() +{ + ML_PRECOND(false); + return ArrMaterials->getForceblyAlphaTest(); +} + + +SX_LIB_API ID SMtrl_MtlGetStdMtl(MTLTYPE_MODEL type_model) +{ + ML_PRECOND(-1); + return ArrMaterials->getStdMtl(type_model); +} + + +SX_LIB_API void SMtrl_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetPhysicMaterial(id, type); +} + +SX_LIB_API MTLTYPE_PHYSIC SMtrl_MtlGetPhysicMaterial(ID id) +{ + ML_PRECOND(MTLTYPE_PHYSIC_DEFAULT); + return ArrMaterials->mtlGetPhysicMaterial(id); +} + +SX_LIB_API bool SMtrl_MtlGetUsingAlphaTest(ID id) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetUsingAlphaTest(id); +} + +SX_LIB_API void SMtrl_MtlSetUsingAlphaTest(ID id, bool isUsing) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetUsingAlphaTest(id, isUsing); +} + + + +SX_LIB_API void SMtrl_RefSetIDArr(ID id, ID idOwner, int iCube, ID idArr) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefSetIDArr(id, idOwner, iCube, idArr); +} + +SX_LIB_API ID SMtrl_RefGetIDArr(ID id, ID idOwner, int iCube) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlRefGetIDArr(id, idOwner, iCube); +} + +SX_LIB_API int SMtrl_RefDelGetCount() +{ + ML_PRECOND(-1); + return ArrMaterials->delRefCount(); +} + +SX_LIB_API ID SMtrl_RefDelGetIDArr(ID idKey, ID idOwner, int iCube) +{ + ML_PRECOND(-1); + return ArrMaterials->delRefGetIDArr(idKey, idOwner, iCube); +} + +SX_LIB_API void SMtrl_RefDelClear() +{ + ML_PRECOND(_VOID); + ArrMaterials->delRefAllDel(); +} + +SX_LIB_API void SMtrl_RefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefSetMinMax(id, pMin, pMax); +} + +SX_LIB_API void SMtrl_RefPreRenderPlane(ID id, D3DXPLANE *pPlane) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefPreRenderPlane(id, pPlane); +} + +SX_LIB_API const IFrustum* SMtrl_RefGetfrustum(ID id, int iCube) +{ + ML_PRECOND(0); + return ArrMaterials->mtlRefGetfrustum(id, iCube); +} + +SX_LIB_API bool SMtrl_RefIsAllowedRender(ID id) +{ + ML_PRECOND(false); + return ArrMaterials->mtlRefIsAllowedRender(id); +} + +SX_LIB_API void SMtrl_RefPostRenderPlane(ID id) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefPostRenderPlane(id); +} + +SX_LIB_API IDirect3DTexture9* SMtrl_RefGetTexPlane(ID id) +{ + ML_PRECOND(0); + return ArrMaterials->mtlRefPlaneGetTex(id); +} + + + +SX_LIB_API void SMtrl_RefCubeBeginRender(ID id, const float3_t *pCenter) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefCubeBeginRender(id, pCenter); +} + +SX_LIB_API void SMtrl_RefCubePreRender(ID id, int iCube, const float4x4 *pWorld) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefCubePreRender(id, iCube, pWorld); +} + +SX_LIB_API void SMtrl_RefCubePostRender(ID id, int iCube) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefCubePostRender(id, iCube); +} + +SX_LIB_API void SMtrl_RefCubeEndRender(ID id, const float3_t *pViewPos) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefCubeEndRender(id, pViewPos); +} + +SX_LIB_API bool SMtrl_RefUpdateCountUpdate(ID id, const float3_t *pViewPos) +{ + ML_PRECOND(false); + return ArrMaterials->mtlRefUpdateCountUpdate(id, pViewPos); +} + +SX_LIB_API void SMtrl_RefNullingCountUpdate(ID id) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlRefNullingCountUpdate(id); +} + +SX_LIB_API IDirect3DCubeTexture9* SMtrl_RefCubeGetTex(ID id) +{ + ML_PRECOND(0); + return ArrMaterials->refCubeGetTex(id); +} + +//########################################################################## + +SX_LIB_API void SMtrl_MtlReloadMaterial(ID id, const char *szName) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlReLoad(id, szName); +} + +SX_LIB_API void SMtrl_MtlClear(bool isClearRefDel) +{ + ML_PRECOND(_VOID); + ArrMaterials->clear(isClearRefDel); +} + +SX_LIB_API void SMtrl_MtlSetTexture(ID id, const char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetTexture(id, szTexture); +} + +SX_LIB_API void SMtrl_MtlGetTexture(ID id, char *szName) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlGetTexture(id, szName); +} + +SX_LIB_API ID SMtrl_MtlGetTextureID(ID id) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetTextureID(id); +} + +SX_LIB_API void SMtrl_MtlSetVS(ID id, const char *szPath) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetVS(id, szPath); +} + +SX_LIB_API void SMtrl_MtlGetVS(ID id, char *szName) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlGetVS(id, szName); +} + +SX_LIB_API void SMtrl_MtlSetPS(ID id, const char *szPath) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetPS(id, szPath); +} + +SX_LIB_API void SMtrl_MtlGetPS(ID id, char *szName) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlGetPS(id, szName); +} + +SX_LIB_API float SMtrl_MtlGetDurability(ID id) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetDurability(id); +} + +SX_LIB_API void SMtrl_MtlSetDurability(ID id, float fDurability) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetDurability(id, fDurability); +} + +SX_LIB_API float SMtrl_MtlGetHitChance(ID id) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetHitChance(id); +} + +SX_LIB_API void SMtrl_MtlSetHitChance(ID id, float fHitChance) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetHitChance(id, fHitChance); +} + +SX_LIB_API float SMtrl_MtlGetDensity(ID id) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetDensity(id); +} + +SX_LIB_API void SMtrl_MtlSetDensity(ID id, float fDensity) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetDensity(id, fDensity); +} + +//########################################################################## + +SX_LIB_API void SMtrl_MtlSetLighting(ID id, bool isLighting) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetLighting(id, isLighting); +} + +SX_LIB_API bool SMtrl_MtlGetLighting(ID id) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetLighting(id); +} + +SX_LIB_API void SMtrl_MtlSetIsTextureLighting(ID id, bool isTexLighting) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetIsTextureLighting(id, isTexLighting); +} + +SX_LIB_API bool SMtrl_MtlGetIsTextureLighting(ID id) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetIsTextureLighting(id); +} + +SX_LIB_API void SMtrl_MtlSetTextureLighting(ID id, const char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetTextureLighting(id, szTexture); +} + +SX_LIB_API void SMtrl_MtlGetTextureLighting(ID id, char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlGetTextureLighting(id, szTexture); +} + +SX_LIB_API void SMtrl_MtlSetRoughness(ID id, float fRoughness) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetRoughness(id, fRoughness); +} + +SX_LIB_API float SMtrl_MtlGetRoughness(ID id) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetRoughness(id); +} + +SX_LIB_API void SMtrl_MtlSetThickness(ID id, float fThickness) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetThickness(id, fThickness); +} + +SX_LIB_API float SMtrl_MtlGetThickness(ID id) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetThickness(id); +} + +SX_LIB_API void SMtrl_MtlSetF0(ID id, float fF0) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetF0(id, fF0); +} + +SX_LIB_API float SMtrl_MtlGetF0(ID id) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetF0(id); +} + +SX_LIB_API void SMtrl_MtlSetTransparency(ID id, bool isTransparent) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetTransparency(id, isTransparent); +} + +SX_LIB_API bool SMtrl_MtlGetTransparency(ID id) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetTransparency(id); +} + +SX_LIB_API void SMtrl_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetTypeReflection(id, type); +} + +SX_LIB_API MTLTYPE_REFLECT SMtrl_MtlGetTypeReflection(ID id) +{ + ML_PRECOND(MTLTYPE_REFLECT_NONE); + return ArrMaterials->mtlGetTypeReflection(id); +} + +//************************************************************************** + +SX_LIB_API void SMtrl_MtlSetMaskTex(ID id, const char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetMaskTex(id, szTexture); +} + +SX_LIB_API void SMtrl_MtlGetMaskTex(ID id, char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlGetMaskTex(id, szTexture); +} + +SX_LIB_API void SMtrl_MtlSetMRTex(ID id, int iChannel, const char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetMRTex(id, iChannel, szTexture); +} + +SX_LIB_API void SMtrl_MtlGetMRTex(ID id, int iChannel, char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlGetMRTex(id, iChannel, szTexture); +} + +SX_LIB_API void SMtrl_MtlSetDTex(ID id, int iChannel, const char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetDTex(id, iChannel, szTexture); +} + +SX_LIB_API void SMtrl_MtlGetDTex(ID id, int iChannel, char *szTexture) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlGetDTex(id, iChannel, szTexture); +} + +SX_LIB_API void SMtrl_MtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetStdVS(id, type, isSend); +} + +SX_LIB_API bool SMtrl_MtlGetStdVS(ID id, MTL_SHADERSTD type) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetStdVS(id, type); +} + +SX_LIB_API void SMtrl_MtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetStdPS(id, type, isSend); +} + +SX_LIB_API bool SMtrl_MtlGetStdPS(ID id, MTL_SHADERSTD type) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetStdPS(id, type); +} + + +SX_LIB_API void SMtrl_MtlSetUserDataVS(ID id, int iComponent, float fValue) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetUserDataVS(id, iComponent, fValue); +} + +SX_LIB_API float SMtrl_MtlGetUserDataVS(ID id, int iComponent) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetUserDataVS(id, iComponent); +} + +SX_LIB_API void SMtrl_MtlSetUserDataVS_InPS(ID id, bool isSendPS) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetUserDataVS_InPS(id, isSendPS); +} + +SX_LIB_API bool SMtrl_MtlGetUserDataVS_InPS(ID id) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetUserDataVS_InPS(id); +} + +SX_LIB_API void SMtrl_MtlSetUserDataPS(ID id, int iComponent, float fValue) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetUserDataPS(id, iComponent, fValue); +} + +SX_LIB_API float SMtrl_MtlGetUserDataPS(ID id, int iComponent) +{ + ML_PRECOND(-1); + return ArrMaterials->mtlGetUserDataPS(id, iComponent); +} + +SX_LIB_API void SMtrl_MtlSetUserDataPS_InVS(ID id, bool isSendVS) +{ + ML_PRECOND(_VOID); + ArrMaterials->mtlSetUserDataPS_InPS(id, isSendVS); +} + +SX_LIB_API bool SMtrl_MtlGetUserDataPS_InVS(ID id) +{ + ML_PRECOND(false); + return ArrMaterials->mtlGetUserDataPS_InPS(id); +} diff --git a/source/mtrl/sxmtrl.h b/source/mtrl/sxmtrl.h new file mode 100644 index 0000000000000000000000000000000000000000..153afb63a3ec565f08018a0501edad5e44cd875f --- /dev/null +++ b/source/mtrl/sxmtrl.h @@ -0,0 +1,832 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +/*! +\file +Заголовочный файл sxmtrl - библиотеки материалов +*/ + +/*! \defgroup sxmtrl sxmtrl - библиотека материалов +@{ +*/ + +#ifndef __SXMTRL_H +#define __SXMTRL_H + +#if defined(_DEBUG) +#pragma comment(lib, "sxgcore_d.lib") +#else +#pragma comment(lib, "sxgcore.lib") +#endif + +#undef SX_LIB_API +#define SX_LIB_API extern "C" __declspec (dllimport) +#include <gcore/sxgcore.h> + +#ifdef SX_DLL +#undef SX_LIB_API +#define SX_LIB_API extern "C" __declspec (dllexport) +#endif + +#include <gdefines.h> + +/*! \name Базовые функции библиотеки +@{*/ + +//! версия подсистемы +SX_LIB_API long SMtrl_0GetVersion(); + +//! установить функцию обработки сообщений +SX_LIB_API void SMtrl_Dbg_Set(report_func rf); + +//! инициализция подсистемы +SX_LIB_API void SMtrl_0Create( + const char *szName, //!< присваиваемое имя + bool isUnic = true //!< должна ли подсистема быть уникальной по имени + ); + +//! уничтожить подсистему +SX_LIB_API void SMtrl_AKill(); + +//!@} + +/*! \name Обработка потери/восстановления устройства +@{*/ + +//! вызывать при потрете устройства +SX_LIB_API void SMtrl_OnLostDevice(); + +//! вызывать при восстановлении устройства +SX_LIB_API void SMtrl_OnResetDevice(); + +//!@} + +//! обновление данных всей библиотеки +SX_LIB_API void SMtrl_Update( + DWORD timeDelta //!< время рендера кадра в млсек + ); + +//############################################################################# + +/*! \defgroup sxmtrl_mtl Система материалов + \ingroup sxmtrl +@{*/ + +/*! максимальная длина имени директории материала */ +#define MTL_MAX_SIZE_DIR SXGC_LOADTEX_MAX_SIZE_DIR + +/*! максимальная длина имени материала (без директории) */ +#define MTL_MAX_SIZE_NAME SXGC_LOADTEX_MAX_SIZE_NAME + +/*! максимальное количество обновлений статических отражений, в первый момент рендера */ +#define MTL_REF_UPDATE_MAX_COUNT_FOR_STATIC 3 + +/*! \name Дистанции при которых будут сниженно или повышено количество отрисовок для отражений +меньше #MTL_REF_UPDATE_L0_DIST - обновление будет каждый кадр +больше #MTL_REF_UPDATE_L2_DIST - обновления не будет +@{*/ + +#define MTL_REF_UPDATE_L0_DIST 10 +#define MTL_REF_UPDATE_L1_DIST 30 +#define MTL_REF_UPDATE_L2_DIST 70 + +//!@} + +/*! \name Параметры альфа теста + В данной реалзиации 2 вида альфа теста, принудительный (#SMtrl_MtlSetForceblyAlphaTest) и назначаемый непосредственно материалом + \note функция альфа теста D3DCMP_GREATEREQUAL +@{*/ + +/*! значение свободного альфа теста (назначаемого материалом) */ +#define MTL_ALPHATEST_FREE_VALUE 64 + +/*! значение принудительного альфа теста */ +#define MTL_ALPHATEST_FORCEBLY_VALUE 8 + +//!@} + +/*! \name Значения параметров освещения по умолчанию + Данные значения по умолчанию будут применены к материалами которые не удалось загрузить, либо к стандартным материалам +@{*/ + +//! занчение шероховатости по умолчанию +#define MTL_LIGHTING_DEFAULT_ROUGHNESS 250.f/255.f + +//! значение f0 (отражательной способности поверхности) по умолчанию +#define MTL_LIGHTING_DEFAULT_F0 2.f/255.f + +//! значение thickness (толщина - на сколько будет использована диффузная составляющая, для твердых поверхностей - 1, для листьев деревьев и травы <1) по умолчанию +#define MTL_LIGHTING_DEFAULT_THICKNESS 255.f/255.f + +//!@} + +/*! \name Параметры отражений +@{*/ + +/*! размер текстур с отражениями */ +#define MTL_REF_TEX_SIZE 512 + +/*! ближняя плоскость отсечения */ +#define MTl_REF_PROJ_NEAR 0.25 + +/*! дальняя плоскость отсечения, или дистанция на которую будет рендер всего в текстуру отражений */ +#define MTl_REF_PROJ_FAR 100 + +//!@} + +/*! \name Виртуальные директории + \warning Имя виртуальной директории должно быть единичным символом (сделано для простоты сравнения), +и как следствие нежелательно использоавть реальную директорию с таким именем для текстур либо материалов, +и реальные директории не должны начинаться с данных символов +@{*/ + +//! имя виртуальной директории по умолчанию для "ручных" текстур с параметрами освещения +#define MTL_VIRTUAL_DIR_HAND_MTL '0' + +//! имя виртуальной директории по умолчанию для стандартных (встроенных) материалов +#define MTL_VIRTUAL_DIR_STD_MTL "mtrldef" + +//!@} + +/*! \name Текстурные регистры +Распределение регистров между текстурами которые будут отправляться для формирования данных +@{*/ + +/*!< основная текстура */ +#define MTL_TEX_R_MAIN 0 + +/*!< маска */ +#define MTL_TEX_R_MASK 1 + +/*! стартовый регистр для детальных текстур + \warning 4 следующих (включая указанный) будует заполнены детальными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL+3] не должны отправляться + \note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a - MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL + 1, MTL_TEX_R_DETAIL + 2, MTL_TEX_R_DETAIL + 3 +*/ +#define MTL_TEX_R_DETAIL 2 + +/*! стартовый регистр для микрорельефных текстур +\warning 4 следующих (включая указанный) будует заполнены микрорельефными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_MICRO, MTL_TEX_R_MICRO+3] не должны отправляться +\note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a - MTL_TEX_R_MICRO, MTL_TEX_R_MICRO + 1, MTL_TEX_R_MICRO + 2, MTL_TEX_R_MICRO + 3 +*/ +#define MTL_TEX_R_MICRO 6 + + +/*! текстура с параметрами освещения */ +#define MTL_TEX_R_PARAM_LIGHT 10 + +/*! текстура с отражениями */ +#define MTL_TEX_R_REFLECTION 12 + +/*! текстура с преломлениями */ +#define MTL_TEX_R_REFRACTION 13 + +/*! текстура с текущей глубиной */ +#define MTL_TEX_R_CURR_DEPTH 14 + +//!@} + +//! типы отражений +enum MTLTYPE_REFLECT +{ + //! нет отражения + MTLTYPE_REFLECT_NONE, + + //! плоское + MTLTYPE_REFLECT_PLANE, + + //! объемное динамическое + MTLTYPE_REFLECT_CUBE_DYNAMIC, + + //! объемное статическое, обработка идет первые несколько кадров, затем не обновляется + MTLTYPE_REFLECT_CUBE_STATIC +}; + +//! сорт материала +enum MTLSORT +{ + //! непрозрачный + MTLSORT_OPAQUE = 0x00000001, + + //! прозрачный + MTLTYPE_TRANSPARENCY = 0x00000010, + + //! непрозрачный + MTLSORT_LIGHTED = 0x00000100, + + //! прозрачный + MTLTYPE_ULIT = 0x00001000, + + //! непрозрачный освещаемый + /*MTLSORT_OPAQUE_LIGHTED, + + //! непрозрачный не освещаемый + MTLSORT_OPAQUE_UNLIT,*/ + + + //! полупрозрачный освещаемый + /*MTLTYPE_TRANSPARENCY_LIGHTED, + + //! полупрозрачный не освещаемый + MTLTYPE_TRANSPARENCY_UNLIT,*/ +}; + +/*! \name Возможные слои +@{*/ + +//! непрозрачные неосвещаемые +#define MTLTYPE_LAYER_OPAQUE_UNLIT 0.0f + +//! прозрачные неосвещаемые +#define MTLTYPE_LAYER_TRANSPARENT_UNLIT 0.666667f + +//! непрозрачные освещаемые +#define MTLTYPE_LAYER_OPAQUE_LIGHT 0.333333f + +//! прозрачные освещаемые +#define MTLTYPE_LAYER_TRANSPARENT_LIGHT 1.0f + +//!@} + +//! тип модели материала +enum MTLTYPE_MODEL +{ + //! статическая геометрия + MTLTYPE_MODEL_STATIC = 0, + + //! растительность трава + MTLTYPE_MODEL_GRASS, + + //! растительность дерево + MTLTYPE_MODEL_TREE, + + //! анимационная модель + MTLTYPE_MODEL_SKIN, + + //! значение по умолчанию + MTLTYPE_MODEL_DEFAULT = MTLTYPE_MODEL_STATIC +}; + +//! физический тип материала +enum MTLTYPE_PHYSIC +{ + MTLTYPE_PHYSIC_CONCRETE = 0, //!< бетон + + //! значение по умолчанию + MTLTYPE_PHYSIC_DEFAULT = MTLTYPE_PHYSIC_CONCRETE, + + //! металл + MTLTYPE_PHYSIC_METAL, + + //! стекло + MTLTYPE_PHYSIC_GLASS, + + //! пластик + MTLTYPE_PHYSIC_PLASTIC, + + //! дерево + MTLTYPE_PHYSIC_TREE, + + //! плоть + MTLTYPE_PHYSIC_FLESH, + + //! земля/песок + MTLTYPE_PHYSIC_GROUD_SAND, + + //! вода + MTLTYPE_PHYSIC_WATER, + + //! листва/трава + MTLTYPE_PHYSIC_LEAF_GRASS, + + //! количество типов + MPT_COUNT +}; + +//! данные отправляемые в шейдеры +enum MTL_SHADERSTD +{ + //! мировая матрица (трансформации модели), world + MTL_SHADERSTD_MATRIX_WORLD = 0, + + //! матрица вида, view + MTL_SHADERSTD_MATRIX_VIEW, + + //! матрица проекции, projection + MTL_SHADERSTD_MATRIX_PROJECTION, + + //! world * view + MTL_SHADERSTD_MATRIX_WORLDVIEW, + + //! world * view * projection + MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, + + //! позиция камеры/наблюдателя + MTL_SHADERSTD_CAMPOS, + + //! данные о времени float2(CountTimeRender,TimeDelta) + MTL_SHADERSTD_TIMEDELTA, + + //! размеры окна рендера + MTL_SHADERSTD_WINSIZE, + + //! пользовательские данные (float4) + MTL_SHADERSTD_USERDATA +}; + +/*! \name Загрузка/сохранение + \note Файл загрузки/сохранения представлен простым конфигурационным файлом (ini) который можно обрабатывать посредством #ISXLConfig + \todo Расписать организацию конфигурационного файла загрузки/сохранения для материала +@{*/ + +/*! загрузка материала, возвращает уникальный идентификатора материала, + \note все материалы оборачиваются в специальную структуру, поэтому дубликатов среди идентификаторов материалов нет + \note любой повторно загружаемый материал не загружается, а лишь дублирует обертку, со ссылкой на внутренности оберкти + */ +SX_LIB_API ID SMtrl_MtlLoad( + const char *szName, //!< имя_материала.расширение + MTLTYPE_MODEL mtl_type = MTLTYPE_MODEL_STATIC //!< тип модели материала на случай если материал не будет загружен/найден + ); + +//! перезагрузка материала +SX_LIB_API void SMtrl_MtlReloadMaterial( + ID id, //!< идентификатор материала + const char *szName = 0 //!< на случай замены существующего материала другим + ); + +/*! сохранить материал по id + \note Сохранение происходит по отноительному пути в директория/директория_имяфайла.mtl +*/ +SX_LIB_API void SMtrl_MtlSave(ID id); + +//!@} + +/*! очитска, удаляет все загруженные материалы (но место в массиве под них остается), все стандартные остаются + \warning Отражения не удаляются а помещаются в очередь удаления, так как могут сожеражть в себе идентификаторы, которые необходимы очистить, +для полной очистки необходимо вызывать функцию #SMtrl_MtlDelRefClear. Однако во избежания утечек памяти необходимо очистить идентификаторы, для их получения вызыва функцию #SMtrl_MtlDelRefGetIDArr +*/ +SX_LIB_API void SMtrl_MtlClear( + bool isClearRefDel //!< очищать ли очередь удаления отражений, на тот случай если идентификаторы в отражениях больше не действительны + ); + +//! возвращает общее количество материалов +SX_LIB_API long SMtrl_MtlGetCount(); + +//! возвращает тип модели материала по id +SX_LIB_API MTLTYPE_MODEL SMtrl_MtlGetTypeModel(ID id); + +//! возвращает сорт материала по id +SX_LIB_API UINT SMtrl_MtlGetSort(ID id); + +/*! установка типа модели материала по id + \warning меняется только внутренний флаг (определение)!!! все остальное для данного типа надо загружать вручную, сделано для больших возможностей построения материалов +*/ +SX_LIB_API void SMtrl_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model); + +//! установка параметров материала по id, вызывается перед DIP +SX_LIB_API void SMtrl_MtlRender( + ID id, //!< идентификатор материала + const float4x4 *pWorld //!< указатель на мировую матрицу модели, либо 0 - тогда будет принята единичная матрица + ); + +//! стандартная отрисовка материала, используются стандартные шейдеры, нужно для теней, отражений и прочего +SX_LIB_API void SMtrl_MtlRenderStd( + MTLTYPE_MODEL type, //!< тип материала из MtlTypeModel + const float4x4 *pWorld, //!< мировая матрица трансформации, либо 0 и будет применена единичная матрица + ID idSlot, //!< текстурный слот в который установить текстуру + ID idMtl //!< идентификатор материала из которого будет браться текстура + ); + +//! установка параметров материала для рендера источника света +SX_LIB_API void SMtrl_MtlRenderLight( + const float4_t *pColor, //!< rgb - цвет, w зарезервирован + const float4x4 *pWorld //!< аналогично #SMtrl_MtlRender + ); + +//! установить текстуру из материала id в текстурный слот slot +SX_LIB_API void SMtrl_MtlSetMainTexture(ID idSlot, ID id); + + +//! установка физического типа материала +SX_LIB_API void SMtrl_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type); + +//! возвращает текущий тип физического материала +SX_LIB_API MTLTYPE_PHYSIC SMtrl_MtlGetPhysicMaterial(ID id); + +//! возвращает id стандартного материала для определенной модели материалов указанной в #MtlTypeModel +SX_LIB_API ID SMtrl_MtlGetStdMtl(MTLTYPE_MODEL type_model); + +/*! \name Управление полупрозрачными поверхностями +Каждый выводимый пиксель помечается номером поверхности к которой он относится + - 0 - пусто + - 1 - непрозрачная геометрия + - все что больше 1 значит полупрозрачная геометрия + \note Если инкремент установлен то отрисовка каждого материала будет инкрементировать внутренний счетчик, присваивая каждому пикселю поверхности идентификатор поверхности. + \note На данный момент максимальное значение полупрозрачных поверхностей может быть только 255 (8 бит) +@{*/ + +/*! установка инкремента идентификатора поверхностей + \note К примеру для диференциации (разделения) пикселей при смешивании всех слоев изображения, +без разделения по принадлжености к определнной поверхности будет трудно/невозможно (пока выхода нет) корректно смешать все слои +*/ +SX_LIB_API void SMtrl_MtlSetIsIncrCountSurf(bool bf); + +//! установлен ли инкремент поверхностей +SX_LIB_API bool SMtrl_MtlGetIsIncrCountSurf(); + +//! обнуление идентификатора отрисованных поверхностей (к примеру при новом кадре) +SX_LIB_API void SMtrl_MtlNullingCurrCountSurf(); + +//! текущее количество отрисованных полупрозрачных поверхностей +SX_LIB_API int SMtrl_MtlGetCurrCountSurf(); + +//! установить текущее количество отрисованных полупрозрачных поверхностей +SX_LIB_API void SMtrl_MtlSetCurrCountSurf(int iCount); + +/*! принудительное включение альфа теста (isat - true - включить, false - выключить) при устновке параметров материала, +к примеру для рендера полупрозрачных поверхностей, чтобы отсечь (условно) полностью прозрачные пиксели +*/ +SX_LIB_API void SMtrl_MtlSetForceblyAlphaTest(bool isEnable); + +//! включен ли принудительный альфа тест +SX_LIB_API bool SMtrl_MtlGetForceblyAlphaTest(); + +//!@} + +/*! \defgroup sxmtrl_mtl_reflect Отражения + \ingroup sxmtrl_mtl + \note Поддерживается 2 вида отражений: + - плоские + - объемные/кубические +@{*/ +//{{ + +//! записать в отражения идентификатор (idArr) для определнной стороны куба/сплита (iCube), соотнести его с идентификатором сущности (idOwner) +SX_LIB_API void SMtrl_RefSetIDArr( + ID id, //!< идентификатор материала + ID idOwner, //!< идентификатор сущности для которой записываем (геометрия, растительность и прочее) + int iCube, //!< условно - сторона куба/сплита для которой записываем + ID idArr //!< идентификатор который надо записать + ); + +//! возвращает идентификатор который был записан для сущности (idOwner) для стороны куба/сплита (iCube), если вообще записывался, если не записывался то <0 +SX_LIB_API ID SMtrl_RefGetIDArr( + ID id, //!< идентификатор материала + ID idOwner, //!< идентификатор сущности для которой было записывано (геометрия, растительность и прочее) + int iCube //!< условно - сторона куба/сплита для которой было записывано + ); + +/*! \name Управление удаленными отражениями +@{*/ + +//! возвращает количество удаленных материалов с отражениями +SX_LIB_API int SMtrl_RefDelGetCount(); + +//! возвращает идентификатор который был записан для сущности (inid) для стороны куба/сплита (cube) +SX_LIB_API ID SMtrl_RefDelGetIDArr( + ID idKey, //!< порядковый номер удаленного материала с отражением + ID idOwner, //!< идентификатор сущности для которой было записано (геометрия, растительность и прочее) + int iCube //!< условно - сторона куба/сплита для которой было записывано + ); + +//! очистка массива удаленных материалов с отражениями +SX_LIB_API void SMtrl_RefDelClear(); + +//!@} + +//! обработка статистики рендера для текущего матриала с отражением +SX_LIB_API bool SMtrl_RefUpdateCountUpdate( + ID id, //!< идентификатора материала + const float3_t *pViewPos //!< позиция наблюдателя, viewpos == 0 вернет false + ); + +/*! обнуление статистикки рендера для данного материала с отражением, +полезно в случаях каких-либо изменений, чтобы эти изменения были видны и в отражениях (актуально для статических отражений) +*/ +SX_LIB_API void SMtrl_RefNullingCountUpdate(ID id); + +//! установка экстремумов материала +SX_LIB_API void SMtrl_RefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax); + +//! возвращает фрустум отражения, cube - сторона куба +SX_LIB_API const IFrustum* SMtrl_RefGetfrustum( + ID id, //!< идентификатора материала + int iCube //!< сторона куба, если отражение плоское то необходимо указать в cube передать 0, иначе вернет NULL + ); + +SX_LIB_API bool SMtrl_RefIsAllowedRender(ID id); //!< разрешен ли рендер отражений для данного материала в текущий момент + +/*! \name Рендер плоского отражения + \note Перед началом рендера плоских отражений необходимо в регистры матриц в #G_RI_MATRIX_VIEW поместить матрицу вида наблюдателя + \note Порядок рендера: + \code + SMtrl_MtlRefPreRenderPlane(id, plane); + //код рендера всего того что необходимо поместить в текстуру отражений + SMtrl_MtlRefPostRenderPlane(id); + \endcode +@{*/ + +//! первоначальные настройки данных для генерации отражения +SX_LIB_API void SMtrl_RefPreRenderPlane( + ID id, //!< идентификатор материала + D3DXPLANE *pPlane //!< плоскость относительно которой будет считаться отражение + ); + +//! завершающие операции +SX_LIB_API void SMtrl_RefPostRenderPlane(ID id); + +//! возвращает текстуру с плоским отражением (если оно есть, иначе 0) +SX_LIB_API IDirect3DTexture9* SMtrl_RefGetTexPlane(ID id); + +//!@} + +/*! \name Рендер объемного (кубического) отражения + \note Порядок рендера: + \code + SMtrl_RefCubeBeginRender(id, center); + SMtrl_RefCubePreRender(id, cube, world); + //код рендера всего того что необходимо поместить в текстуру отражений + SMtrl_RefCubePostRender(id, cube); + SMtrl_RefCubeEndRender(id, viewpos); + \endcode +@{*/ + +//! установка общих настроек +SX_LIB_API void SMtrl_RefCubeBeginRender( + ID id, //!< идентификатор материала + const float3_t *pCenter //!< центр (позиция) подгруппы модели - откуда будет рендер отражений + ); + +//! установка частных настроек для стороны куба (cube) +SX_LIB_API void SMtrl_RefCubePreRender( + ID id, //!< идентификатор материала + int iCube, //!< сторона куба [0,5] + const float4x4 *pWorld //!< мировая матрица модели + ); + +//! завершающие частные моменты для стороны куба +SX_LIB_API void SMtrl_RefCubePostRender(ID id, int iCube); + +/*! завершающие общие моменты + \note если viewpos == 0 обновления статисктики рендера для текущего материала с отражением не произойдет, +и дабы рационально обрабатывать и статические и динамические отражения необходимо до следующего рендера отражений вызвать SMtrl_MtlRefUpdateCountUpdate +*/ +SX_LIB_API void SMtrl_RefCubeEndRender( + ID id, //!< идентификатор материала + const float3_t *pViewPos //!< позиция наблюдателя, необходимо для обработки разрешения на следующий рендер + ); + +//! возвращает cube текстуру отражением (если оно есть, иначе 0) +SX_LIB_API IDirect3DCubeTexture9* SMtrl_RefCubeGetTex(ID id); + +//!@} + +//!@} sxmtrl_mtl_reflect + + +/*! \defgroup sxmtrl_mtl_propslayer Cвойства поверхности + \ingroup sxmtrl_mtl +@{*/ + +//! установка основной текстуры (загрузка текстуры по имени) +SX_LIB_API void SMtrl_MtlSetTexture(ID id, const char *szPathTex); + +//! в name записывает имя текстуры +SX_LIB_API void SMtrl_MtlGetTexture(ID id, char *szName); + +//! возвращает id текстуры материала +SX_LIB_API ID SMtrl_MtlGetTextureID(ID id); + + +/*! \name Шейдеры для рендера материала + \warning В текущей версии все шейдеры загружаются в версии 3.0 и требуют в качестве старта указывать функцию main + \warning Рекомендуется устанавливать и вершинный и пиксельный шейдеры, так как во врем тестов одно из устройств требовало наличия обоих шейдеров либо отсутствия обоих + \note В аргументах path_vs/path_ps указывается только имя шейдера с расширением, есесно возвращается тоже самое +@{*/ + +//! установка вершинного шейдера +SX_LIB_API void SMtrl_MtlSetVS(ID id, const char *szPathVS); + +//! в name записывает имя текущего вершинного шейдера +SX_LIB_API void SMtrl_MtlGetVS(ID id, char *szName); + +//! установка пиксельного шейдера +SX_LIB_API void SMtrl_MtlSetPS(ID id, const char *szPathPS); + +//! в name записывает имя текущего пикельного шейдера +SX_LIB_API void SMtrl_MtlGetPS(ID id, char *szName); + +//!@} + +//! возвращает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить +SX_LIB_API float SMtrl_MtlGetDurability(ID id); + +//! устанавливает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить +SX_LIB_API void SMtrl_MtlSetDurability(ID id, float fDurability); + + +//! возвращает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется] +SX_LIB_API float SMtrl_MtlGetHitChance(ID id); + +//! устанавливает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется] +SX_LIB_API void SMtrl_MtlSetHitChance(ID id, float fHitChance); + + +//! возвращает плотность материала кг/м3 +SX_LIB_API float SMtrl_MtlGetDensity(ID id); + +//! устанавливает плотность материала кг/м3 +SX_LIB_API void SMtrl_MtlSetDensity(ID id, float fDensity); + + +//! используется ли альфа тест для материала +SX_LIB_API bool SMtrl_MtlGetUsingAlphaTest(ID id); + +//! установка использования альфа теста +SX_LIB_API void SMtrl_MtlSetUsingAlphaTest(ID id, bool isUsing); + +/*! освещение материала id + \note если материал не освещается то будет выведен в цвете накладываемым материалом +*/ +SX_LIB_API void SMtrl_MtlSetLighting(ID id, bool isLighting); + +//! освещается ли материал +SX_LIB_API bool SMtrl_MtlGetLighting(ID id); + +/*! \name Параметры освещения. + \note Для более точной/тонкой настройки освещения материала рекомендуется использовать текстуру с параметрами освещения +(к прмиеру когда в одной поверхности разные материалы, к примеру дерево, метал и камень, то в текстуре можно указать параметры освещения для каждого пикселя), +однако если текстуры нет то будут использованы установленные парметры освещения для всей поверхности +@{*/ + +//! установка использования текстуры с параметрами освещения +SX_LIB_API void SMtrl_MtlSetIsTextureLighting(ID id, bool isTexLighting); + +//! используется ли текстура с параметрами для освещения +SX_LIB_API bool SMtrl_MtlGetIsTextureLighting(ID id); + + +//! загрузка текстуры с парамтерами освещения +SX_LIB_API void SMtrl_MtlSetTextureLighting(ID id, const char *szPathTex); + +//! в path_tex записывает имя текстуры с параметрами освещения +SX_LIB_API void SMtrl_MtlGetTextureLighting(ID id, char *szPathTex); + + +//! установка шероховатости (0-1) +SX_LIB_API void SMtrl_MtlSetRoughness(ID id, float fRoughness); + +//! возвращает текущее значение шероховатости поверхности +SX_LIB_API float SMtrl_MtlGetRoughness(ID id); + + +//! установка просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение +SX_LIB_API void SMtrl_MtlSetThickness(ID id, float fThickness); + +//! возвращает просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение +SX_LIB_API float SMtrl_MtlGetThickness(ID id); + +//! установка отражательной способности поверхности (0-1) +SX_LIB_API void SMtrl_MtlSetF0(ID id, float fF0); + +//! возвращает текущее значение отражательной способности поверхности +SX_LIB_API float SMtrl_MtlGetF0(ID id); + +//!@} + +/*! \name Полупрозрачность +Под полупрозрачными материалами следует понимать такие материалы, прозрачность которых в среднем находится в пределах [0.5, 1) и минимальный процент полупрозрачного периметра 50% +@{*/ + +//! установка свойства полупрозрачности +SX_LIB_API void SMtrl_MtlSetTransparency(ID id, bool isTransparent); + +//! возвращает текущее значение свойства полупрозрачности для материала +SX_LIB_API bool SMtrl_MtlGetTransparency(ID id); + +//!@} + +/*! \name Отражения окружения, типы из #MtlTypeReflect +@{*/ + +//! установка типа отражений +SX_LIB_API void SMtrl_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type); + +//! возвращает текущий тип отражений для материала +SX_LIB_API MTLTYPE_REFLECT SMtrl_MtlGetTypeReflection(ID id); + +//!@} + +/*! \name Детальность и микрорельеф +Поверхность может содержать до 4 детальных текстур и до 4 текстур с микрорельефом. +Данные для определения наложения текстур (детальных и микрорельефных) указываются в маске - +на каждый канал текстуры маски по одной детальной и микрорельефной текстуре, +то есть канал маски определет связанные между собой и детальную и микрорельефную текстуры + \note В аргументах channel - RGBA - 0,1,2,3 +@{*/ + +//! загрузка маски наложения +SX_LIB_API void SMtrl_MtlSetMaskTex(ID id, const char *szPathTex); + +//! в path_tex записывает текущее имя маски наложения +SX_LIB_API void SMtrl_MtlGetMaskTex(ID id, char *szPathTex); + +//! загрузка текстуры микрорельефа, на каждый канал +SX_LIB_API void SMtrl_MtlSetMRTex( + ID id, //!< идентификатор материала + int iChannel, //!< номер канала RGBA - 0,1,2,3 + const char *szPathTex //!< имя текстуры с расширением + ); + +//! в path_tex запишет текущее имя текстуры микрорельефа для канала channel +SX_LIB_API void SMtrl_MtlGetMRTex(ID id, int iChannel, char *szPathTex); + +//! загрузка детальной текстуры, на каждый канал +SX_LIB_API void SMtrl_MtlSetDTex( + ID id, //!< идентификатор материала + int iChannel, //!< номер канала RGBA - 0,1,2,3 + const char *szPathTex //!< имя текстуры с расширением + ); + +//! в path_tex запишет текущее имя детальной текстуры для канала channel +SX_LIB_API void SMtrl_MtlGetDTex(ID id, int iChannel, char *szPathTex); + +//!@} + +/*! \name Стандартные параметры для отправки в шейдер (в вершинный и пиксельный раздельно), данные из #MtlTransShaderStd +@{*/ + +//! отправка стадартных данных в вершинный шейдер +SX_LIB_API void SMtrl_MtlSetStdVS( + ID id, //!< идентификатор материала + MTL_SHADERSTD type, //!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd + bool isSend //!< true - отправлять, false - не отправлять + ); + +//! установлена ли отпрвка значения type в вершинный шейдер +SX_LIB_API bool SMtrl_MtlGetStdVS(ID id, MTL_SHADERSTD type); + +//! отправка стадартных данных в пиксельный шейдер +SX_LIB_API void SMtrl_MtlSetStdPS( + ID id, //!< идентификатор материала + MTL_SHADERSTD type, //!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd + bool isSend //!< true - отправлять, false - не отправлять + ); + +//! установлена ли отпрвка значения type в пиксельный шейдер +SX_LIB_API bool SMtrl_MtlGetStdPS(ID id, MTL_SHADERSTD type); + +//!@} + +/*! \name Дополнительные пользовательские данные в виде float4 (предел [0-1] для стандарта, иное вне стандарта, но допустимо) + \note Данные для вершинного и пиксельного шейдера раздельны. Отправляется float4. +Однако данные и из пиксельного могут быть отправленны в вершинный и наоборот. +В итоге в шейдере может быть 2 float4 пользовательских вектора с данными. +Но если вектор определен для пиксельного то он все-равно будет отправлен в пиксельный шейдер, даже если и придназначалася для вершинного. + \note В аргументах component - xyzw - 0,1,2,3 +@{*/ + +//! установка значения компоненты вектора для вершинного шейдера +SX_LIB_API void SMtrl_MtlSetUserDataVS( + ID id, //!< идентификатор материала + int iComponent, //!< компонента вектора xyzw - 0,1,2,3 + float fValue //!< значение компоненты + ); + +//! возвращает значение компоненты вектора, который отправляется в вершинный шейдер +SX_LIB_API float SMtrl_MtlGetUserDataVS(ID id, int iComponent); + +//! установка отправки float4 вектора, предназначенного для вершинного шейдера, в пиксельный шейдер +SX_LIB_API void SMtrl_MtlSetUserDataVS_InPS(ID id, bool isSendPs); + +//! отправляется ли float4 вектор, предназначенный для вершинного шейдера, в пиксельный шейдер +SX_LIB_API bool SMtrl_MtlGetUserDataVS_InPS(ID id); + + +//! установка значения компоненты вектора для пиксельного шейдера +SX_LIB_API void SMtrl_MtlSetUserDataPS( + ID id, //!< идентификатор материала + int iComponent, //!< компонента вектора xyzw - 0,1,2,3 + float fValue //!< значение компоненты + ); + +//! возвращает значение компоненты вектора, который отправляется в пиксельный шейдер +SX_LIB_API float SMtrl_MtlGetUserDataPS(ID id, int iComponent); + +//! установка отправки float4 вектора, предназначенного для пиксельного шейдера, в вершинный шейдер +SX_LIB_API void SMtrl_MtlSetUserDataPS_InVS(ID id, bool isSendVs); + +//! отправляется ли float4 вектор, предназначенный для пиксельного шейдера, в вершинный шейдер +SX_LIB_API bool SMtrl_MtlGetUserDataPS_InVS(ID id); + +//!@} + +//!@} sxmtrl_mtl_propslayer + +//!@} sxmtrl_mtl + +#endif + +//!@} sxmtrl diff --git a/source/mtrl/sxmtrl_dll.cpp b/source/mtrl/sxmtrl_dll.cpp new file mode 100644 index 0000000000000000000000000000000000000000..88b1ec58eac1f5e48ba53b6f764552b3f797850d --- /dev/null +++ b/source/mtrl/sxmtrl_dll.cpp @@ -0,0 +1,24 @@ + +/*********************************************************** +Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include <windows.h> + +BOOL APIENTRY DllMain(HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/source/particles/emitter.cpp b/source/particles/emitter.cpp index 5f511defca65042420362cbd0d38819c7a5f936d..f890270b5b2513f25e91f7933fa9ec42f0d7583a 100644 --- a/source/particles/emitter.cpp +++ b/source/particles/emitter.cpp @@ -219,21 +219,21 @@ void Emitter::computeLighting() { Arr[i].Ambient.x = Arr[i].Ambient.y = Arr[i].Ambient.z = Arr[i].Ambient.w = 0; - for (int k = 0; k<SML_LigthsGetCount(); ++k) + for (int k = 0; k<SLight_GetCount(); ++k) { //если свет виден фрустуму камеры (это надо было заранее просчитать) и если свет включен - if (SML_LigthsGetVisibleForFrustum(k) && SML_LigthsGetEnable(k)) + if (SLight_GetVisibleForFrustum(k) && SLight_GetEnable(k)) { - SML_LigthsGetColor(k, &tmpColor); + SLight_GetColor(k, &tmpColor); float intens = 1; - if (SML_LigthsGetType(k) != LTYPE_LIGHT_GLOBAL) + if (SLight_GetType(k) != LTYPE_LIGHT_GLOBAL) { - SML_LigthsGetPos(k, &tmpPosition, true); + SLight_GetPos(k, &tmpPosition, true); float dist = SMVector3Dot(Arr[i].Pos - float3(tmpPosition.x, tmpPosition.y, tmpPosition.z)); - float invdist = 1.f - (dist / (SML_LigthsGetDist(k))); + float invdist = 1.f - (dist / (SLight_GetDist(k))); if (invdist > 1.f) invdist = 1.f; else if (invdist < 0.f) diff --git a/source/particles/sxparticles.h b/source/particles/sxparticles.h index c931ca4be67139916e27b4d447217207dbab29cd..79cee824269aa1b1608b856c9516d59c09cfd3a1 100644 --- a/source/particles/sxparticles.h +++ b/source/particles/sxparticles.h @@ -35,12 +35,12 @@ See the license in LICENSE #include <gcore/sxgcore.h> #if defined(_DEBUG) -#pragma comment(lib, "sxmtllight_d.lib") +#pragma comment(lib, "sxlight_d.lib") #else -#pragma comment(lib, "sxmtllight.lib") +#pragma comment(lib, "sxlight.lib") #endif -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #ifdef SX_DLL #undef SX_LIB_API diff --git a/source/physics/PhyWorld.cpp b/source/physics/PhyWorld.cpp index bfad99dbdb3a73f680618568141c4d7e17fcb689..131da221d402550269707f53c2368f54a337b2f9 100644 --- a/source/physics/PhyWorld.cpp +++ b/source/physics/PhyWorld.cpp @@ -8,7 +8,7 @@ See the license in LICENSE #include <core/sxcore.h> #include <geom/sxgeom.h> #include <gcore/sxgcore.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include <../Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h> @@ -118,6 +118,9 @@ void CPhyWorld::loadGeom(const char * file) { return; } + + unloadGeom(); + float3_t ** ppVertices; int32_t * pVertexCount; uint32_t ** ppIndices; @@ -162,7 +165,7 @@ void CPhyWorld::loadGeom(const char * file) } for(int i = 0; i < pIndexCount[tc]; i += 3) { - //m_pGeomMtlTypes[iFace++] = SML_MtlGetPhysicMaterial(ppMtls[tc][i]); + //m_pGeomMtlTypes[iFace++] = SMtrl_MtlGetPhysicMaterial(ppMtls[tc][i]); m_pGeomMtlIDs[iFace++] = ppMtls[tc][i]; m_pGeomStaticCollideMesh->addTriangleIndices(ppIndices[tc][i] + VC, ppIndices[tc][i + 1] + VC, ppIndices[tc][i + 2] + VC); } @@ -218,7 +221,7 @@ void CPhyWorld::loadGeom(const char * file) int iIC = 0; for(int i = 0; i < green_arr_count_index[num_green]; i += 3) { - MTLTYPE_PHYSIC type = SML_MtlGetPhysicMaterial(green_arr_mtl[num_green][i]); + MTLTYPE_PHYSIC type = SMtrl_MtlGetPhysicMaterial(green_arr_mtl[num_green][i]); if (type != MTLTYPE_PHYSIC_LEAF_GRASS) { iIC += 3; @@ -235,7 +238,7 @@ void CPhyWorld::loadGeom(const char * file) for(int i = 0; i < green_arr_count_index[num_green]; ++i) { idx = green_arr_index[num_green][i]; - type = SML_MtlGetPhysicMaterial(green_arr_mtl[num_green][idx]); + type = SMtrl_MtlGetPhysicMaterial(green_arr_mtl[num_green][idx]); if (type != MTLTYPE_PHYSIC_LEAF_GRASS) { found = false; @@ -259,7 +262,7 @@ void CPhyWorld::loadGeom(const char * file) float3 a, b, c, x, y, z; for(int i = 0; i < green_arr_count_index[num_green]; i += 3) { - type = SML_MtlGetPhysicMaterial(green_arr_mtl[num_green][i]); + type = SMtrl_MtlGetPhysicMaterial(green_arr_mtl[num_green][i]); if (type == MTLTYPE_PHYSIC_LEAF_GRASS) { continue; @@ -503,11 +506,11 @@ bool CPhyWorld::importGeom(const char * file) AssotiativeArray<String, ID> mMatMap; const AssotiativeArray<String, ID>::Node *pMatMapNode; - int iMatCount = SML_MtlGetCount(); + int iMatCount = SMtrl_MtlGetCount(); for(int i = 0; i < iMatCount; ++i) { szTmp[0] = 0; - SML_MtlGetTexture(i, szTmp); + SMtrl_MtlGetTexture(i, szTmp); mMatMap[szTmp] = i; } @@ -639,7 +642,7 @@ bool CPhyWorld::exportGeom(const char * _file) if(!aszMatNames[m_pGeomMtlIDs[i]]) { szTmp[0] = 0; - SML_MtlGetTexture(m_pGeomMtlIDs[i], szTmp); + SMtrl_MtlGetTexture(m_pGeomMtlIDs[i], szTmp); aszMatNames[m_pGeomMtlIDs[i]] = _allocStr(szTmp); } } @@ -681,7 +684,7 @@ MTLTYPE_PHYSIC CPhyWorld::getMtlType(const btCollisionObject *pBody, const btCol ID idMtl = getMtlID(pBody, pShapeInfo); if(ID_VALID(idMtl)) { - return(SML_MtlGetPhysicMaterial(idMtl)); + return(SMtrl_MtlGetPhysicMaterial(idMtl)); } return(MTLTYPE_PHYSIC_DEFAULT); } diff --git a/source/physics/PhyWorld.h b/source/physics/PhyWorld.h index 5d4c64d116ea9e4498521911726d0e4b050ad512..1cb6ee3bd7e695f60396c8710bf7810a0390ba90 100644 --- a/source/physics/PhyWorld.h +++ b/source/physics/PhyWorld.h @@ -19,7 +19,7 @@ See the license in LICENSE #include <gdefines.h> #include <common/SXMath.h> -#include <mtllight/sxmtllight.h> +#include <mtrl/sxmtrl.h> #define PHY_MAT_FILE_MAGICK 3630267958475905107 diff --git a/source/physics/sxphysics.h b/source/physics/sxphysics.h index 0b5994b9839b0fbecefb3971cc7a1d7c7666436c..0529ed069964046d849eb35331e089797d709dd8 100644 --- a/source/physics/sxphysics.h +++ b/source/physics/sxphysics.h @@ -21,7 +21,6 @@ See the license in LICENSE #undef SX_LIB_API #define SX_LIB_API extern "C" __declspec (dllimport) -//#include <mtllight\\sxmtllight.h> #ifdef SX_DLL #undef SX_LIB_API diff --git a/source/physics/sxphysics_dll.cpp b/source/physics/sxphysics_dll.cpp index 7edc184f79fa48066256ddedde5bef68d9662c52..48322e35911d9321578843c19ea0337861d1daea 100644 --- a/source/physics/sxphysics_dll.cpp +++ b/source/physics/sxphysics_dll.cpp @@ -15,7 +15,8 @@ See the license in LICENSE #if defined(_DEBUG) # pragma comment(lib, "sxcore_d.lib") # pragma comment(lib, "sxgeom_d.lib") -# pragma comment(lib, "sxmtllight_d.lib") +# pragma comment(lib, "sxlight_d.lib") +# pragma comment(lib, "sxmtrl_d.lib") # pragma comment(lib, "BulletDynamics_vs2010_debug.lib") # pragma comment(lib, "BulletCollision_vs2010_debug.lib") # pragma comment(lib, "LinearMath_vs2010_debug.lib") @@ -23,7 +24,8 @@ See the license in LICENSE #else # pragma comment(lib, "sxcore.lib") # pragma comment(lib, "sxgeom.lib") -# pragma comment(lib, "sxmtllight.lib") +# pragma comment(lib, "sxlight.lib") +# pragma comment(lib, "sxmtrl.lib") # pragma comment(lib, "BulletDynamics_vs2010.lib") # pragma comment(lib, "BulletCollision_vs2010.lib") # pragma comment(lib, "LinearMath_vs2010.lib") diff --git a/source/render/camera_update.cpp b/source/render/camera_update.cpp index 13465dd5bf62be07fc5b066346b4780b92c0d069..838864d10e33ec3a418cf748388dd5be39be8948 100644 --- a/source/render/camera_update.cpp +++ b/source/render/camera_update.cpp @@ -11,30 +11,30 @@ void CameraUpdate::UpdateInputKeyBoard(DWORD timeDelta) { //обработка ходьбы if(SSInput_GetKeyState(SIK_W)) - GData::ObjCamera->posFrontBack( - GData::CamWalkParamEditor.x * - (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * + gdata::pCamera->posFrontBack( + gdata::vCamWalkParamEditor.x * + (SSInput_GetKeyState(SIK_LSHIFT) ? gdata::vCamWalkParamEditor.y : 1) * float(timeDelta) * 0.001f ); if(SSInput_GetKeyState(SIK_S)) - GData::ObjCamera->posFrontBack( - -GData::CamWalkParamEditor.x * - (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * GData::CamWalkParamEditor.w * + gdata::pCamera->posFrontBack( + -gdata::vCamWalkParamEditor.x * + (SSInput_GetKeyState(SIK_LSHIFT) ? gdata::vCamWalkParamEditor.y : 1) * gdata::vCamWalkParamEditor.w * float(timeDelta) * 0.001f ); if(SSInput_GetKeyState(SIK_A)) - GData::ObjCamera->posLeftRight( - -GData::CamWalkParamEditor.x * - (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * GData::CamWalkParamEditor.z * + gdata::pCamera->posLeftRight( + -gdata::vCamWalkParamEditor.x * + (SSInput_GetKeyState(SIK_LSHIFT) ? gdata::vCamWalkParamEditor.y : 1) * gdata::vCamWalkParamEditor.z * float(timeDelta) * 0.001f ); if(SSInput_GetKeyState(SIK_D)) - GData::ObjCamera->posLeftRight( - GData::CamWalkParamEditor.x * - (SSInput_GetKeyState(SIK_LSHIFT) ? GData::CamWalkParamEditor.y : 1) * GData::CamWalkParamEditor.z * + gdata::pCamera->posLeftRight( + gdata::vCamWalkParamEditor.x * + (SSInput_GetKeyState(SIK_LSHIFT) ? gdata::vCamWalkParamEditor.y : 1) * gdata::vCamWalkParamEditor.z * float(timeDelta) * 0.001f ); } @@ -50,13 +50,13 @@ void CameraUpdate::UpdateInputMouseRotate(DWORD timeDelta) if(dx) { - GData::ObjCamera->rotRightLeft(float(timeDelta) * *sense * float(dx)); + gdata::pCamera->rotRightLeft(float(timeDelta) * (*sense) * float(dx)); //SetCursorPos(centr.x,cy); } if(dy) { - GData::ObjCamera->rotUpDown(float(timeDelta) * *sense * float(dy)); + gdata::pCamera->rotUpDown(float(timeDelta) * *sense * float(dy)); //SetCursorPos(cx,centr.y); } } @@ -72,7 +72,7 @@ void CameraUpdate::UpdateInputMouseUpDown(DWORD timeDelta) if(dy) { - GData::ObjCamera->posUpDown(5 * float(timeDelta) * *sense * float(-dy)); + gdata::pCamera->posUpDown(5 * float(timeDelta) * *sense * float(-dy)); } } diff --git a/source/render/editor/axes_static.cpp b/source/render/editor/axes_static.cpp index 1a84aedca9743b01295710a17dd1fe66e15a1cb1..33aa3b1b77f5ae3e6019ab556f8f170b25d891be 100644 --- a/source/render/editor/axes_static.cpp +++ b/source/render/editor/axes_static.cpp @@ -19,7 +19,7 @@ CAxesStatic::CAxesStatic() D3DDECL_END() }; - GData::DXDevice->CreateVertexDeclaration(DeclGrid, &m_pVertexDeclaration); + gdata::pDXDevice->CreateVertexDeclaration(DeclGrid, &m_pVertexDeclaration); } CAxesStatic::~CAxesStatic() @@ -30,7 +30,7 @@ CAxesStatic::~CAxesStatic() void CAxesStatic::create(float len) { - GData::DXDevice->CreateVertexBuffer( + gdata::pDXDevice->CreateVertexBuffer( 3 * 2 * sizeof(CVertex), D3DUSAGE_WRITEONLY, 0, @@ -64,11 +64,11 @@ void CAxesStatic::create(float len) void CAxesStatic::render() { - GData::DXDevice->SetTexture(0, 0); - //GData::DXDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + gdata::pDXDevice->SetTexture(0, 0); + //gdata::pDXDevice->SetRenderState(D3DRS_LIGHTING, FALSE); SGCore_ShaderUnBind(); - GData::DXDevice->SetVertexDeclaration(m_pVertexDeclaration); - //GData::DXDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); - GData::DXDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(CVertex)); - GData::DXDevice->DrawPrimitive(D3DPT_LINELIST, 0, 3); + gdata::pDXDevice->SetVertexDeclaration(m_pVertexDeclaration); + //gdata::pDXDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); + gdata::pDXDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(CVertex)); + gdata::pDXDevice->DrawPrimitive(D3DPT_LINELIST, 0, 3); } \ No newline at end of file diff --git a/source/render/editor/grid.cpp b/source/render/editor/grid.cpp index 34c438a8871491a6bca5efbf79befc4545400a12..8838b68d261033db77aaf80bbabc75333f362171 100644 --- a/source/render/editor/grid.cpp +++ b/source/render/editor/grid.cpp @@ -19,7 +19,7 @@ CGrid::CGrid() D3DDECL_END() }; - GData::DXDevice->CreateVertexDeclaration(DeclGrid, &m_pVertexDeclaration); + gdata::pDXDevice->CreateVertexDeclaration(DeclGrid, &m_pVertexDeclaration); } CGrid::~CGrid() @@ -30,7 +30,7 @@ CGrid::~CGrid() void CGrid::create(int width, int depth, DWORD color) { - GData::DXDevice->CreateVertexBuffer( + gdata::pDXDevice->CreateVertexBuffer( width * depth * 2 * sizeof(CVertex), D3DUSAGE_WRITEONLY, 0, @@ -70,11 +70,11 @@ void CGrid::create(int width, int depth, DWORD color) void CGrid::render() { - GData::DXDevice->SetTexture(0, 0); - //GData::DXDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + gdata::pDXDevice->SetTexture(0, 0); + SGCore_ShaderUnBind(); - GData::DXDevice->SetVertexDeclaration(m_pVertexDeclaration); - //GData::DXDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); - GData::DXDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(CVertex)); - GData::DXDevice->DrawPrimitive(D3DPT_LINELIST, 0, m_iCountPoly); + gdata::pDXDevice->SetVertexDeclaration(m_pVertexDeclaration); + + gdata::pDXDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(CVertex)); + gdata::pDXDevice->DrawPrimitive(D3DPT_LINELIST, 0, m_iCountPoly); } \ No newline at end of file diff --git a/source/render/gdata.cpp b/source/render/gdata.cpp index 8b20bccc5cf9753a51640f1732f817773533e9b1..00430164dd35f36d2b041b8cad1a5c4f95efad40 100644 --- a/source/render/gdata.cpp +++ b/source/render/gdata.cpp @@ -6,31 +6,28 @@ See the license in LICENSE #include "gdata.h" -namespace GData +namespace gdata { - IDirect3DDevice9* DXDevice = 0; - - HWND HandleParent3D = 0; - HWND Handle3D = 0; - - //bool IsWindowed = true; + IDirect3DDevice9 *pDXDevice = 0; + HWND hHandleParent3D = 0; + HWND hHandle3D = 0; DS_RT FinalImage = DS_RT_SCENELIGHT; - ICamera* ObjCamera = 0; - ID IDSelectTex = -1; + ICamera *pCamera = 0; + ID idSelectTex = -1; - float2_t NearFar = float2_t(0.025, 400); - float ProjFov = SM_PIDIV4; + float2_t vNearFar = float2_t(0.025, 400); + float fProjFov = SM_PIDIV4; - ID DefaultGeomIDArr = -1; - ID DefaultGreenIDArr = -1; - ID DefaultAnimIDArr = -1; + ID idDefaultGeomArr = -1; + ID idDefaultGreenArr = -1; + ID idDefaultAnimArr = -1; - float3 ConstCurrCamPos; - float3 ConstCurrCamDir; + float3 vConstCurrCamPos; + float3 vConstCurrCamDir; - float4_t CamWalkParamEditor = float4_t( + float4_t vCamWalkParamEditor = float4_t( 10.f, //!< простое движенеи вперед 5.f, //!< коэфициент ускорения 0.7f, //!< коэфициент от основного движения в стороны @@ -39,60 +36,58 @@ namespace GData //матрицы void InitAllMatrix(); - float4x4 MCamView; - float4x4 MCamProj; - float4x4 MLightProj; - float4x4 MRefPlaneSkyProj; - float4x4 MRefCubeSkyProj; + float4x4 mCamView; + float4x4 mCamProj; + float4x4 mLightProj; + float4x4 mRefPlaneSkyProj; + float4x4 mRefCubeSkyProj; //********************************************************************** //! пространство имен с идентификаторами шейдеров - namespace IDsShaders + namespace shaders_id { //! загрузка всех необходимых шейдеров void InitAllShaders(); //! вершинные шейдеры - namespace VS + namespace vs { - ID ScreenOut; - ID ResPos; + ID idScreenOut; + ID idResPos; }; //! пиксельные шейдеры - namespace PS + namespace ps { - ID ScreenOut; - ID ComLightingNonShadow; - ID ComLightingShadow; - - ID BlendAmbientSpecDiffColor; + ID idScreenOut; + ID idComLightingNonShadow; + ID idComLightingShadow; - //ID ToneMapping; + ID idBlendAmbientSpecDiffColor; - ID StencilStr; - ID StencilColumn; - ID StencilStrColumn; - ID UnionAlpha; + ID idStencilStr; + ID idStencilColumn; + ID idStencilStrColumn; + ID idUnionAlpha; }; }; namespace Editors { - bool MoveCamera = true; - CSimulationModel* SimModel = 0; - CGrid* ObjGrid = 0; - CAxesStatic* ObjAxesStatic = 0; + bool canMoveCamera = true; + CSimulationModel *pSimModel = 0; + CGrid *pGrid = 0; + CAxesStatic *pAxesStatic = 0; - bool RenderGrid = false; - bool RenderAxesStatic = false; + bool canRenderGrid = false; + bool canRenderAxesStatic = false; } }; //########################################################################## -void GData::InitAllMatrix() +void gdata::InitAllMatrix() { static const int *r_win_width = GET_PCVAR_INT("r_win_width"); static const int *r_win_height = GET_PCVAR_INT("r_win_height"); @@ -103,47 +98,44 @@ void GData::InitAllMatrix() static const float *r_far = GET_PCVAR_FLOAT("r_far"); static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov"); - GData::NearFar.x = *r_near; - GData::NearFar.y = *r_far; - GData::ProjFov = *r_default_fov; + gdata::vNearFar.x = *r_near; + gdata::vNearFar.y = *r_far; + gdata::fProjFov = *r_default_fov; - GData::MCamProj = SMMatrixPerspectiveFovLH(GData::ProjFov, vWinSize.x / vWinSize.y, GData::NearFar.x, GData::NearFar.y); - //GData::MCamProj = SMMatrixOrthographicLH(vWinSize.x / 4, vWinSize.y / 4, GData::NearFar.x, GData::NearFar.y); - GData::MLightProj = SMMatrixPerspectiveFovLH(GData::ProjFov, vWinSize.x / vWinSize.y, GData::NearFar.x, G_DATA_LIGHT_FAR); - //GData::MLightProj = SMMatrixOrthographicLH(vWinSize.x / 4, vWinSize.y / 4, GData::NearFar.x, G_DATA_LIGHT_FAR); + gdata::mCamProj = SMMatrixPerspectiveFovLH(gdata::fProjFov, vWinSize.x / vWinSize.y, gdata::vNearFar.x, gdata::vNearFar.y); + //gdata::MCamProj = SMMatrixOrthographicLH(vWinSize.x / 4, vWinSize.y / 4, gdata::NearFar.x, gdata::NearFar.y); + gdata::mLightProj = SMMatrixPerspectiveFovLH(gdata::fProjFov, vWinSize.x / vWinSize.y, gdata::vNearFar.x, G_DATA_LIGHT_FAR); + //gdata::MLightProj = SMMatrixOrthographicLH(vWinSize.x / 4, vWinSize.y / 4, gdata::NearFar.x, G_DATA_LIGHT_FAR); - GData::MRefPlaneSkyProj = SMMatrixPerspectiveFovLH(GData::ProjFov, vWinSize.x / vWinSize.y, GData::NearFar.x, G_DATA_LIGHT_FAR); - GData::MRefCubeSkyProj = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, GData::NearFar.x, G_DATA_LIGHT_FAR); + gdata::mRefPlaneSkyProj = SMMatrixPerspectiveFovLH(gdata::fProjFov, vWinSize.x / vWinSize.y, gdata::vNearFar.x, G_DATA_LIGHT_FAR); + gdata::mRefCubeSkyProj = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, gdata::vNearFar.x, G_DATA_LIGHT_FAR); - Core_RMatrixSet(G_RI_MATRIX_OBSERVER_PROJ, &GData::MCamProj); - Core_RMatrixSet(G_RI_MATRIX_LIGHT_PROJ, &GData::MLightProj); + Core_RMatrixSet(G_RI_MATRIX_OBSERVER_PROJ, &gdata::mCamProj); + Core_RMatrixSet(G_RI_MATRIX_LIGHT_PROJ, &gdata::mLightProj); - /*Core_RFloatSet(G_RI_FLOAT_OBSERVER_NEAR, GData::NearFar.x); - Core_RFloatSet(G_RI_FLOAT_OBSERVER_FAR, GData::NearFar.y); - Core_RFloatSet(G_RI_FLOAT_OBSERVER_FOV, GData::ProjFov);*/ + /*Core_RFloatSet(G_RI_FLOAT_OBSERVER_NEAR, gdata::NearFar.x); + Core_RFloatSet(G_RI_FLOAT_OBSERVER_FAR, gdata::NearFar.y); + Core_RFloatSet(G_RI_FLOAT_OBSERVER_FOV, gdata::ProjFov);*/ } -void GData::IDsShaders::InitAllShaders() +void gdata::shaders_id::InitAllShaders() { - GData::IDsShaders::VS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs",SHADER_CHECKDOUBLE_PATH); - GData::IDsShaders::PS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps",SHADER_CHECKDOUBLE_PATH); - - //GData::IDsShaders::PS::ToneMapping = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_tone_mapping.ps", "lighting_tone_mapping.ps",SHADER_CHECKDOUBLE_PATH); - - GData::IDsShaders::VS::ResPos = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_res_pos.vs", "pp_quad_render_res_pos.vs",SHADER_CHECKDOUBLE_PATH); + gdata::shaders_id::vs::idScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs", SHADER_CHECKDOUBLE_PATH); + gdata::shaders_id::ps::idScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps", SHADER_CHECKDOUBLE_PATH); + gdata::shaders_id::vs::idResPos = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_res_pos.vs", "pp_quad_render_res_pos.vs", SHADER_CHECKDOUBLE_PATH); - GData::IDsShaders::PS::ComLightingNonShadow = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_com.ps", "lighting_com_nonshadow.ps", SHADER_CHECKDOUBLE_NAME); + gdata::shaders_id::ps::idComLightingNonShadow = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_com.ps", "lighting_com_nonshadow.ps", SHADER_CHECKDOUBLE_NAME); D3DXMACRO Defines_IS_SHADOWED[] = { { "IS_SHADOWED", "" }, { 0, 0 } }; - GData::IDsShaders::PS::ComLightingShadow = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_com.ps", "lighting_com_shadow.ps", SHADER_CHECKDOUBLE_NAME, Defines_IS_SHADOWED); - GData::IDsShaders::PS::BlendAmbientSpecDiffColor = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_blend.ps", "lighting_blend.ps",SHADER_CHECKDOUBLE_PATH); + gdata::shaders_id::ps::idComLightingShadow = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_com.ps", "lighting_com_shadow.ps", SHADER_CHECKDOUBLE_NAME, Defines_IS_SHADOWED); + gdata::shaders_id::ps::idBlendAmbientSpecDiffColor = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_blend.ps", "lighting_blend.ps", SHADER_CHECKDOUBLE_PATH); - GData::IDsShaders::PS::UnionAlpha = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_union_alpha.ps", "pp_union_alpha.ps",SHADER_CHECKDOUBLE_PATH); + gdata::shaders_id::ps::idUnionAlpha = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_union_alpha.ps", "pp_union_alpha.ps", SHADER_CHECKDOUBLE_PATH); D3DXMACRO Defines_STR[] = { { "_STR_", "" }, { 0, 0 } }; - GData::IDsShaders::PS::StencilStr = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_alpha_stencil_mark.ps", "pp_stencil_str.ps", SHADER_CHECKDOUBLE_NAME, Defines_STR); + gdata::shaders_id::ps::idStencilStr = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_alpha_stencil_mark.ps", "pp_stencil_str.ps", SHADER_CHECKDOUBLE_NAME, Defines_STR); D3DXMACRO Defines_COLUMN[] = { { "_COLUMN_", "" }, { 0, 0 } }; - GData::IDsShaders::PS::StencilColumn = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_alpha_stencil_mark.ps", "pp_stencil_column.ps", SHADER_CHECKDOUBLE_NAME, Defines_COLUMN); + gdata::shaders_id::ps::idStencilColumn = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_alpha_stencil_mark.ps", "pp_stencil_column.ps", SHADER_CHECKDOUBLE_NAME, Defines_COLUMN); D3DXMACRO Defines_COLUMN_STR[] = { { "_COLUMN_STR_", "" }, { 0, 0 } }; - GData::IDsShaders::PS::StencilStrColumn = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_alpha_stencil_mark.ps", "pp_stencil_str_column.ps", SHADER_CHECKDOUBLE_NAME, Defines_COLUMN_STR); + gdata::shaders_id::ps::idStencilStrColumn = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_alpha_stencil_mark.ps", "pp_stencil_str_column.ps", SHADER_CHECKDOUBLE_NAME, Defines_COLUMN_STR); } diff --git a/source/render/gdata.h b/source/render/gdata.h index 0de64672834baced60072a098b674f81858ab4a4..7195dc3a5e9f90acd8f5fa949d75da9e98266343 100644 --- a/source/render/gdata.h +++ b/source/render/gdata.h @@ -32,129 +32,124 @@ class CGrid; */ //! пространство имен для хранения данных цикла рендера -namespace GData +namespace gdata { //! dx устройство - extern IDirect3DDevice9* DXDevice; + extern IDirect3DDevice9* pDXDevice; //! хэндл окна родителя окна рендера, на случай редакторов - extern HWND HandleParent3D; + extern HWND hHandleParent3D; //! хэндл окна рендера - extern HWND Handle3D; - - //! использовать ли оконный режим рендера? - //extern bool IsWindowed; - + extern HWND hHandle3D; //!< финальное изображение - extern DS_RT FinalImage; + extern DS_RT typeFinalImage; //!< камера для которой будет рендер - extern ICamera* ObjCamera; + extern ICamera *pCamera; //! id текстуры с цветмо выделения (для редакторов) - extern ID IDSelectTex; + extern ID idSelectTex; //! значение дальней и ближней плоскостей отсечения - extern float2_t NearFar; + extern float2_t vNearFar; //! fov камеры - extern float ProjFov; + extern float fProjFov; //! дефолтный id массива просчетов видимости для геометрии - extern ID DefaultGeomIDArr; + extern ID idDefaultGeomArr; //! дефолтный id массива просчетов видимости для растительности - extern ID DefaultGreenIDArr; + extern ID idDefaultGreenArr; //! дефолтный id массива просчетов видимости для анимационных моделей - extern ID DefaultAnimIDArr; + extern ID idDefaultAnimArr; //! позиция камеры - extern float3 ConstCurrCamPos; + extern float3 vConstCurrCamPos; //! направление взгляда камеры - extern float3 ConstCurrCamDir; + extern float3 vConstCurrCamDir; //! параметры перемещения камеры по умолчанию - extern float4_t CamWalkParamEditor; + extern float4_t vCamWalkParamEditor; //! инициализация матриц void InitAllMatrix(); //! матрица вида камеры - extern float4x4 MCamView; + extern float4x4 mCamView; //! матрица проекции камеры - extern float4x4 MCamProj; + extern float4x4 mCamProj; //! матрица проекции аналогичная камере, только дальнаяя плоскость дальше - extern float4x4 MLightProj; + extern float4x4 mLightProj; //! матрица проекции для рендера skybox и sky clouds, для плоских отражений, аналогична MCamProj - extern float4x4 MRefPlaneSkyProj; + extern float4x4 mRefPlaneSkyProj; //! матрица проекции для рендера skybox и sky clouds, для кубических отражений - extern float4x4 MRefCubeSkyProj; + extern float4x4 mRefCubeSkyProj; //********************************************************************** //! пространство имен с идентификаторами шейдеров - namespace IDsShaders + namespace shaders_id { //! загрузка всех необходимых шейдеров void InitAllShaders(); //! вершинные шейдеры - namespace VS + namespace vs { - extern ID ScreenOut; - extern ID ResPos; + extern ID idScreenOut; + extern ID idResPos; }; //! пиксельные шейдеры - namespace PS + namespace ps { - extern ID ScreenOut; - extern ID ComLightingNonShadow; - extern ID ComLightingShadow; - - extern ID BlendAmbientSpecDiffColor; + extern ID idScreenOut; + extern ID idComLightingNonShadow; + extern ID idComLightingShadow; - //extern ID ToneMapping; + extern ID idBlendAmbientSpecDiffColor; - extern ID StencilStr; - extern ID StencilColumn; - extern ID StencilStrColumn; - extern ID UnionAlpha; + + extern ID idStencilStr; + extern ID idStencilColumn; + extern ID idStencilStrColumn; + extern ID idUnionAlpha; }; }; namespace Editors { //! возможно управлять камерой - extern bool MoveCamera; + extern bool canMoveCamera; //! указатель симуляционной модели - extern CSimulationModel* SimModel; + extern CSimulationModel *pSimModel; //! сетка дял редакторов - extern CGrid* ObjGrid; + extern CGrid *pGrid; //! рендер статический осей в центре координат - extern CAxesStatic* ObjAxesStatic; + extern CAxesStatic *pAxesStatic; - //! рисовать ли #ObjGrid - extern bool RenderGrid; + //! рисовать ли #pGrid + extern bool canRenderGrid; - //! рисовать ли #ObjAxesStatic - extern bool RenderAxesStatic; + //! рисовать ли #pAxesStatic + extern bool canRenderAxesStatic; } }; diff --git a/source/render/render_func.cpp b/source/render/render_func.cpp index cb5d69e905f02b651b7a0250751c5bc4c6857971..5ce1f92ef25cdd7ff21445b7d598c5580dfc012b 100644 --- a/source/render/render_func.cpp +++ b/source/render/render_func.cpp @@ -6,43 +6,43 @@ See the license in LICENSE #include "render_func.h" -inline void SXRenderFunc::SetSamplerFilter(DWORD id, DWORD value) +inline void rfunc::SetSamplerFilter(DWORD dwId, DWORD dwValue) { - GData::DXDevice->SetSamplerState(id, D3DSAMP_MAGFILTER, value); - GData::DXDevice->SetSamplerState(id, D3DSAMP_MINFILTER, value); - GData::DXDevice->SetSamplerState(id, D3DSAMP_MIPFILTER, value); + gdata::pDXDevice->SetSamplerState(dwId, D3DSAMP_MAGFILTER, dwValue); + gdata::pDXDevice->SetSamplerState(dwId, D3DSAMP_MINFILTER, dwValue); + gdata::pDXDevice->SetSamplerState(dwId, D3DSAMP_MIPFILTER, dwValue); } -inline void SXRenderFunc::SetSamplerAddress(DWORD id, DWORD value) +inline void rfunc::SetSamplerAddress(DWORD dwId, DWORD dwValue) { - GData::DXDevice->SetSamplerState(id, D3DSAMP_ADDRESSU, value); - GData::DXDevice->SetSamplerState(id, D3DSAMP_ADDRESSV, value); - GData::DXDevice->SetSamplerState(id, D3DSAMP_ADDRESSW, value); + gdata::pDXDevice->SetSamplerState(dwId, D3DSAMP_ADDRESSU, dwValue); + gdata::pDXDevice->SetSamplerState(dwId, D3DSAMP_ADDRESSV, dwValue); + gdata::pDXDevice->SetSamplerState(dwId, D3DSAMP_ADDRESSW, dwValue); } -inline void SXRenderFunc::SetSamplerFilter(DWORD begin_id, DWORD end_id, DWORD value) +inline void rfunc::SetSamplerFilter(DWORD dwStartId, DWORD dwFinishEnd, DWORD dwValue) { - if (begin_id >= 0 && end_id <= 16) + if (dwStartId >= 0 && dwFinishEnd <= 16) { - for(DWORD i = begin_id; i <= end_id; i++) - SXRenderFunc::SetSamplerFilter(i, value); + for (DWORD i = dwStartId; i <= dwFinishEnd; ++i) + rfunc::SetSamplerFilter(i, dwValue); } } -inline void SXRenderFunc::SetSamplerAddress(DWORD begin_id, DWORD end_id, DWORD value) +inline void rfunc::SetSamplerAddress(DWORD dwStartId, DWORD dwFinishEnd, DWORD dwValue) { - if (begin_id >= 0 && end_id <= 16) + if (dwStartId >= 0 && dwFinishEnd <= 16) { - for (DWORD i = begin_id; i<=end_id; i++) - SXRenderFunc::SetSamplerAddress(i, value); + for (DWORD i = dwStartId; i <= dwFinishEnd; ++i) + rfunc::SetSamplerAddress(i, dwValue); } } -void SXRenderFunc::SetRenderSceneFilter() +void rfunc::SetRenderSceneFilter() { - static const int * r_texfilter_type = GET_PCVAR_INT("r_texfilter_type"); - static const int * r_texfilter_max_anisotropy = GET_PCVAR_INT("r_texfilter_max_anisotropy"); - static const int * r_texfilter_max_miplevel = GET_PCVAR_INT("r_texfilter_max_miplevel"); + static const int *r_texfilter_type = GET_PCVAR_INT("r_texfilter_type"); + static const int *r_texfilter_max_anisotropy = GET_PCVAR_INT("r_texfilter_max_anisotropy"); + static const int *r_texfilter_max_miplevel = GET_PCVAR_INT("r_texfilter_max_miplevel"); static int r_texfilter_type2 = 1; static int r_texfilter_max_anisotropy2 = 0; @@ -62,31 +62,31 @@ void SXRenderFunc::SetRenderSceneFilter() r_texfilter_max_miplevel2 = (*r_texfilter_max_miplevel); else r_texfilter_max_miplevel2 = 1; - + if (r_texfilter_type2 == 0) SetSamplerFilter(0, 16, D3DTEXF_POINT); else if (r_texfilter_type2 == 2) { for (int i = 0; i<16; ++i) - GData::DXDevice->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, r_texfilter_max_anisotropy2); + gdata::pDXDevice->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, r_texfilter_max_anisotropy2); SetSamplerFilter(0, 16, D3DTEXF_ANISOTROPIC); } else SetSamplerFilter(0, 16, D3DTEXF_LINEAR); - GData::DXDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, r_texfilter_max_miplevel2); + gdata::pDXDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, r_texfilter_max_miplevel2); SetSamplerAddress(0, 16, D3DTADDRESS_WRAP); } -void SXRenderFunc::SetRenderSceneFilterUn() +void rfunc::SetRenderSceneFilterUn() { - GData::DXDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, 0); + gdata::pDXDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, 0); } //########################################################################## -void SXRenderFunc::ComDeviceLost(bool isSetWindowSize) +void rfunc::ComDeviceLost(bool isSetWindowSize) { static int *r_resize = (int*)GET_PCVAR_INT("r_resize"); @@ -98,7 +98,7 @@ void SXRenderFunc::ComDeviceLost(bool isSetWindowSize) { //получаем текущий размер окна в которое рисовали RECT rect_scene; - GetClientRect(GData::Handle3D, &rect_scene); + GetClientRect(gdata::hHandle3D, &rect_scene); *r_win_width = rect_scene.right; *r_win_height = rect_scene.bottom; @@ -107,12 +107,13 @@ void SXRenderFunc::ComDeviceLost(bool isSetWindowSize) //сбрасываем все что необходимо для восстановления устройства SGCore_OnLostDevice(); SGeom_OnLostDevice(); - SML_OnLostDevice(); + SLight_OnLostDevice(); + SMtrl_OnLostDevice(); SPE_OnLostDevice(); SPP_OnLostDevice(); SXGame_OnLostDevice(); - SXRenderFunc::InitModeWindow(); + rfunc::InitModeWindow(); bool bf = SGCore_OnDeviceReset(*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); @@ -123,89 +124,89 @@ void SXRenderFunc::ComDeviceLost(bool isSetWindowSize) } else { - GData::InitAllMatrix(); + gdata::InitAllMatrix(); *r_resize = RENDER_RESIZE_NONE; SGCore_OnResetDevice(); - SML_OnResetDevice(); + SLight_OnResetDevice(); + SMtrl_OnResetDevice(); SGeom_OnResetDevice(); SPE_OnResetDevice(); SXGame_OnResetDevice(); SPP_OnDeviceReset(); - GData::DXDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_LIGHTING, FALSE); } } - -void SXRenderFunc::ComVisibleForLight() +void rfunc::ComVisibleForLight() { - for (int i = 0; i<SML_LigthsGetCount(); i++) + for (int i = 0; i<SLight_GetCount(); ++i) { - if (!SML_LigthsGetExists(i)) + if (!SLight_GetExists(i)) continue; - 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 (SLight_GetShadowed(i) && (SLight_ComVisibleForFrustum(i, gdata::pCamera->getFrustum()) && SLight_GetEnable(i))) { - if (SML_LigthsGetType(i) == LTYPE_LIGHT_GLOBAL) + if (SLight_GetType(i) == LTYPE_LIGHT_GLOBAL) { - for (int k = 0; k<4; k++) + for (int k = 0; k<4; ++k) { - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_GEOM, k, SGeom_ModelsAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_GEOM, k, SGeom_ModelsAddArrForCom()); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_GREEN, k, SGeom_GreenAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_GREEN, k, SGeom_GreenAddArrForCom()); - if(SML_LigthsGetIDArr(i, RENDER_IDARRCOM_ANIM, k) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_ANIM, k, SXAnim_ModelsAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_ANIM, k) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_ANIM, k, SXAnim_ModelsAddArrForCom()); - if (SML_LigthsCountUpdateUpdate(i, &GData::ConstCurrCamPos, k)) + if (SLight_CountUpdateUpdate(i, &gdata::vConstCurrCamPos, k)) { - SML_LigthsUpdateGFrustums(i, k, &GData::ConstCurrCamPos, &GData::ConstCurrCamDir); - SGeom_ModelsComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k)); - SGeom_GreenComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k)); - SXAnim_ModelsComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_ANIM, k)); + SLight_UpdateGFrustums(i, k, &gdata::vConstCurrCamPos, &gdata::vConstCurrCamDir); + SGeom_ModelsComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k)); + SGeom_GreenComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k)); + SXAnim_ModelsComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_ANIM, k)); } } } - else if (SML_LigthsGetType(i) == LTYPE_LIGHT_DIR) + else if (SLight_GetType(i) == LTYPE_LIGHT_DIR) { - if (SML_LigthsGetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) + if (SLight_GetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) { - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, 0) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_GEOM, 0, SGeom_ModelsAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, 0) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_GEOM, 0, SGeom_ModelsAddArrForCom()); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, 0) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_GREEN, 0, SGeom_GreenAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, 0) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_GREEN, 0, SGeom_GreenAddArrForCom()); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_ANIM, 0) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_ANIM, 0, SXAnim_ModelsAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_ANIM, 0) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_ANIM, 0, SXAnim_ModelsAddArrForCom()); - SGeom_ModelsComVisible(SML_LigthsGetFrustum(i, 0), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, 0)); - SGeom_GreenComVisible(SML_LigthsGetFrustum(i, 0), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, 0)); - SXAnim_ModelsComVisible(SML_LigthsGetFrustum(i, 0), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_ANIM, 0)); + SGeom_ModelsComVisible(SLight_GetFrustum(i, 0), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, 0)); + SGeom_GreenComVisible(SLight_GetFrustum(i, 0), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, 0)); + SXAnim_ModelsComVisible(SLight_GetFrustum(i, 0), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_ANIM, 0)); } } - else if (SML_LigthsGetType(i) == LTYPE_LIGHT_POINT) + else if (SLight_GetType(i) == LTYPE_LIGHT_POINT) { - if (SML_LigthsGetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) + if (SLight_GetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) { for (int k = 0; k < 6; k++) { - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_GEOM, k, SGeom_ModelsAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_GEOM, k, SGeom_ModelsAddArrForCom()); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_GREEN, k, SGeom_GreenAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_GREEN, k, SGeom_GreenAddArrForCom()); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_ANIM, k) <= -1) - SML_LigthsSetIDArr(i, RENDER_IDARRCOM_ANIM, k, SXAnim_ModelsAddArrForCom()); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_ANIM, k) <= -1) + SLight_SetIDArr(i, RENDER_IDARRCOM_ANIM, k, SXAnim_ModelsAddArrForCom()); - if (SML_LigthsGetCubeEdgeEnable(i, k)) + if (SLight_GetCubeEdgeEnable(i, k)) { - SGeom_ModelsComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k)); - SGeom_GreenComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k)); - SXAnim_ModelsComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_ANIM, k)); + SGeom_ModelsComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k)); + SGeom_GreenComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k)); + SXAnim_ModelsComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, SLight_GetIDArr(i, RENDER_IDARRCOM_ANIM, k)); } } } @@ -213,67 +214,67 @@ void SXRenderFunc::ComVisibleForLight() } } - ID tmpidarr = -1; - while (SML_LigthsDelGetCount() > 0) + ID idTempArr = -1; + while (SLight_DelGetCount() > 0) { int iCurrKey = 0; - if (SML_LigthsDelGetType(iCurrKey) == LTYPE_LIGHT_GLOBAL) + if (SLight_DelGetType(iCurrKey) == LTYPE_LIGHT_GLOBAL) { - for (int k = 0; k<4; k++) + for (int k = 0; k<4; ++k) { - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_GEOM, k)) >= 0 && SGeom_ModelsExistsArrForCom(tmpidarr)) - SGeom_ModelsDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_GEOM, k)) >= 0 && SGeom_ModelsExistsArrForCom(idTempArr)) + SGeom_ModelsDelArrForCom(idTempArr); - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_GREEN, k)) >= 0 && SGeom_GreenExistsArrForCom(tmpidarr)) - SGeom_GreenDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_GREEN, k)) >= 0 && SGeom_GreenExistsArrForCom(idTempArr)) + SGeom_GreenDelArrForCom(idTempArr); - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_ANIM, k)) >= 0) - SXAnim_ModelsDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_ANIM, k)) >= 0) + SXAnim_ModelsDelArrForCom(idTempArr); } } - else if (SML_LigthsDelGetType(iCurrKey) == LTYPE_LIGHT_DIR) + else if (SLight_DelGetType(iCurrKey) == LTYPE_LIGHT_DIR) { - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_GEOM, 0)) >= 0 && SGeom_ModelsExistsArrForCom(tmpidarr)) - SGeom_ModelsDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_GEOM, 0)) >= 0 && SGeom_ModelsExistsArrForCom(idTempArr)) + SGeom_ModelsDelArrForCom(idTempArr); - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_GREEN, 0)) >= 0 && SGeom_GreenExistsArrForCom(tmpidarr)) - SGeom_GreenDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_GREEN, 0)) >= 0 && SGeom_GreenExistsArrForCom(idTempArr)) + SGeom_GreenDelArrForCom(idTempArr); - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_ANIM, 0)) >= 0) - SXAnim_ModelsDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_ANIM, 0)) >= 0) + SXAnim_ModelsDelArrForCom(idTempArr); } - else if (SML_LigthsDelGetType(iCurrKey) == LTYPE_LIGHT_POINT) + else if (SLight_DelGetType(iCurrKey) == LTYPE_LIGHT_POINT) { for (int k = 0; k<6; k++) { - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_GEOM, k)) >= 0 && SGeom_ModelsExistsArrForCom(tmpidarr)) - SGeom_ModelsDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_GEOM, k)) >= 0 && SGeom_ModelsExistsArrForCom(idTempArr)) + SGeom_ModelsDelArrForCom(idTempArr); - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_GREEN, k)) >= 0 && SGeom_GreenExistsArrForCom(tmpidarr)) - SGeom_GreenDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_GREEN, k)) >= 0 && SGeom_GreenExistsArrForCom(idTempArr)) + SGeom_GreenDelArrForCom(idTempArr); - if ((tmpidarr = SML_LigthsDelGetIDArr(iCurrKey, RENDER_IDARRCOM_ANIM, k)) >= 0) - SXAnim_ModelsDelArrForCom(tmpidarr); + if ((idTempArr = SLight_DelGetIDArr(iCurrKey, RENDER_IDARRCOM_ANIM, k)) >= 0) + SXAnim_ModelsDelArrForCom(idTempArr); } } - SML_LigthsDelDel(iCurrKey); + SLight_DelDel(iCurrKey); } } -void SXRenderFunc::ComVisibleForCamera() +void rfunc::ComVisibleForCamera() { if (SGeom_ModelsGetCount() > 0) - SGeom_ModelsComVisible(GData::ObjCamera->getFrustum(), &GData::ConstCurrCamPos); + SGeom_ModelsComVisible(gdata::pCamera->getFrustum(), &gdata::vConstCurrCamPos); if (SGeom_GreenGetCount() > 0) - SGeom_GreenComVisible(GData::ObjCamera->getFrustum(), &GData::ConstCurrCamPos); + SGeom_GreenComVisible(gdata::pCamera->getFrustum(), &gdata::vConstCurrCamPos); - SXAnim_ModelsComVisible(GData::ObjCamera->getFrustum(), &GData::ConstCurrCamPos); + SXAnim_ModelsComVisible(gdata::pCamera->getFrustum(), &gdata::vConstCurrCamPos); } -void SXRenderFunc::ComVisibleReflection() +void rfunc::ComVisibleReflection() { static const int *r_reflection_render = GET_PCVAR_INT("r_reflection_render"); @@ -284,90 +285,90 @@ void SXRenderFunc::ComVisibleReflection() { for (int k = 0; k < SGeom_ModelsMGetCountGroups(i); ++k) { - ID idmat = SGeom_ModelsMGetGroupIDMat(i, k); - MTLTYPE_REFLECT typeref = SML_MtlGetTypeReflection(SGeom_ModelsMGetGroupIDMat(i, k)); + ID idMat = SGeom_ModelsMGetGroupIDMat(i, k); + MTLTYPE_REFLECT typeReflection = SMtrl_MtlGetTypeReflection(SGeom_ModelsMGetGroupIDMat(i, k)); float3_t center; - if (typeref == MTLTYPE_REFLECT_PLANE) + if (typeReflection == MTLTYPE_REFLECT_PLANE) { - if (!SML_MtlRefIsAllowedRender(idmat)) + if (!SMtrl_RefIsAllowedRender(idMat)) continue; SGeom_ModelsMGetGroupCenter(i, k, ¢er); - + if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0) < 0) - SML_MtlRefSetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0, SGeom_ModelsAddArrForCom()); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, 0) < 0) + SMtrl_RefSetIDArr(idMat, RENDER_IDARRCOM_GEOM, 0, SGeom_ModelsAddArrForCom()); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GREEN, 0) < 0) - SML_MtlRefSetIDArr(idmat, RENDER_IDARRCOM_GREEN, 0, SGeom_GreenAddArrForCom()); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GREEN, 0) < 0) + SMtrl_RefSetIDArr(idMat, RENDER_IDARRCOM_GREEN, 0, SGeom_GreenAddArrForCom()); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_ANIM) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_ANIM, 0) < 0) - SML_MtlRefSetIDArr(idmat, RENDER_IDARRCOM_ANIM, 0, SXAnim_ModelsAddArrForCom()); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_ANIM, 0) < 0) + SMtrl_RefSetIDArr(idMat, RENDER_IDARRCOM_ANIM, 0, SXAnim_ModelsAddArrForCom()); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM) - SGeom_ModelsComVisible(SML_MtlRefGetfrustum(idmat, 0), &float3(center), SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0)); + SGeom_ModelsComVisible(SMtrl_RefGetfrustum(idMat, 0), &float3(center), SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, 0)); if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN) - SGeom_GreenComVisible(SML_MtlRefGetfrustum(idmat, 0), &float3(center), SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GREEN, 0)); - + SGeom_GreenComVisible(SMtrl_RefGetfrustum(idMat, 0), &float3(center), SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GREEN, 0)); + if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_ANIM) - SXAnim_ModelsComVisible(SML_MtlRefGetfrustum(idmat, 0), &float3(center), SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_ANIM, 0)); + SXAnim_ModelsComVisible(SMtrl_RefGetfrustum(idMat, 0), &float3(center), SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_ANIM, 0)); } - else if (typeref == MTLTYPE_REFLECT_CUBE_DYNAMIC) + else if (typeReflection == MTLTYPE_REFLECT_CUBE_DYNAMIC) { SGeom_ModelsMGetGroupCenter(i, k, ¢er); - if (!SML_MtlRefIsAllowedRender(idmat)) + if (!SMtrl_RefIsAllowedRender(idMat)) continue; for (int j = 0; j<6; j++) { if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k) < 0) - SML_MtlRefSetIDArr(idmat, RENDER_IDARRCOM_GEOM, k, SGeom_ModelsAddArrForCom()); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, k) < 0) + SMtrl_RefSetIDArr(idMat, RENDER_IDARRCOM_GEOM, k, SGeom_ModelsAddArrForCom()); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GREEN, k) < 0) - SML_MtlRefSetIDArr(idmat, RENDER_IDARRCOM_GREEN, k, SGeom_GreenAddArrForCom()); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GREEN, k) < 0) + SMtrl_RefSetIDArr(idMat, RENDER_IDARRCOM_GREEN, k, SGeom_GreenAddArrForCom()); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_ANIM) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_ANIM, k) < 0) - SML_MtlRefSetIDArr(idmat, RENDER_IDARRCOM_ANIM, k, SXAnim_ModelsAddArrForCom()); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_ANIM, k) < 0) + SMtrl_RefSetIDArr(idMat, RENDER_IDARRCOM_ANIM, k, SXAnim_ModelsAddArrForCom()); } - + if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM) - SGeom_ModelsComVisible(SML_MtlRefGetfrustum(idmat, j), &float3(center), SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k)); - + SGeom_ModelsComVisible(SMtrl_RefGetfrustum(idMat, j), &float3(center), SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, k)); + if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN) - SGeom_GreenComVisible(SML_MtlRefGetfrustum(idmat, j), &float3(center), SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k)); - + SGeom_GreenComVisible(SMtrl_RefGetfrustum(idMat, j), &float3(center), SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, k)); + if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_ANIM) - SXAnim_ModelsComVisible(SML_MtlRefGetfrustum(idmat, j), &float3(center), SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_ANIM, k)); + SXAnim_ModelsComVisible(SMtrl_RefGetfrustum(idMat, j), &float3(center), SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_ANIM, k)); } } } } } -void SXRenderFunc::SaveScreenShot() +void rfunc::SaveScreenShot() { char tmppath[1024]; static int numscreen = 0; - + if (!FileExistsFile(Core_RStringGet(G_RI_STRING_PATH_SCREENSHOTS))) { CreateDirectoryA(Core_RStringGet(G_RI_STRING_PATH_SCREENSHOTS), NULL); @@ -380,66 +381,66 @@ void SXRenderFunc::SaveScreenShot() } while (FileExistsFile(tmppath)); LPDIRECT3DSURFACE9 BackBuf; - GData::DXDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuf); + gdata::pDXDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuf); D3DXSaveSurfaceToFile(tmppath, D3DXIFF_JPG, BackBuf, NULL, NULL); mem_release(BackBuf); } -void SXRenderFunc::SaveWorkTex() +void rfunc::SaveWorkTex() { char tmppath[1024]; sprintf(tmppath, "%scolor.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_COLOR), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_COLOR), NULL); sprintf(tmppath, "%snormal.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_NORMAL), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_NORMAL), NULL); sprintf(tmppath, "%sdepth.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_DEPTH), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_DEPTH), NULL); sprintf(tmppath, "%sdepth0.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_DEPTH0), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_DEPTH0), NULL); sprintf(tmppath, "%sparam.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_PARAM), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_PARAM), NULL); sprintf(tmppath, "%sambient_diff.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_AMBIENTDIFF), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_AMBIENTDIFF), NULL); sprintf(tmppath, "%sspecular.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_SPECULAR), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_SPECULAR), NULL); sprintf(tmppath, "%slight_com_1.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_SCENELIGHT), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_SCENELIGHT), NULL); sprintf(tmppath, "%slight_com_2.png", Core_RStringGet(G_RI_STRING_PATH_WORKTEX)); - D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SML_DSGetRT(DS_RT_SCENELIGHT2), NULL); + D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_GbufferGetRT(DS_RT_SCENELIGHT2), NULL); } -void SXRenderFunc::InitModeWindow() +void rfunc::InitModeWindow() { static int * r_win_width = (int*)GET_PCVAR_INT("r_win_width"); static int * r_win_height = (int*)GET_PCVAR_INT("r_win_height"); static const bool *r_win_windowed = GET_PCVAR_BOOL("r_win_windowed"); - static DWORD dwStyle = GetWindowLong(GData::Handle3D, GWL_STYLE); + static DWORD dwStyle = GetWindowLong(gdata::hHandle3D, GWL_STYLE); if (r_win_windowed == NULL) return; if (!(*r_win_windowed)) { - SetWindowLong(GData::Handle3D, GWL_STYLE, dwStyle | WS_POPUP); - ShowWindow(GData::Handle3D, SW_MAXIMIZE); + SetWindowLong(gdata::hHandle3D, GWL_STYLE, dwStyle | WS_POPUP); + ShowWindow(gdata::hHandle3D, SW_MAXIMIZE); } else { - SetWindowLong(GData::Handle3D, GWL_STYLE, dwStyle); + SetWindowLong(gdata::hHandle3D, GWL_STYLE, dwStyle); /*RECT rc; - GetWindowRect(GData::Handle3D, &rc);*/ + GetWindowRect(gdata::hHandle3D, &rc);*/ RECT rc2 = { 0, 0, *r_win_width, *r_win_height }; AdjustWindowRect(&rc2, dwStyle, false); @@ -448,22 +449,14 @@ void SXRenderFunc::InitModeWindow() int iHeight = rc2.bottom - rc2.top; int iPosX = (GetSystemMetrics(SM_CXSCREEN) - iWidth) / 2; int iPosY = (GetSystemMetrics(SM_CYSCREEN) - iHeight) / 2; - SetWindowPos(GData::Handle3D, HWND_NOTOPMOST, iPosX, iPosY, iWidth, iHeight, SWP_SHOWWINDOW); + SetWindowPos(gdata::hHandle3D, HWND_NOTOPMOST, iPosX, iPosY, iWidth, iHeight, SWP_SHOWWINDOW); - SetForegroundWindow(GData::Handle3D); + SetForegroundWindow(gdata::hHandle3D); } } -void SXRenderFunc::ChangeModeWindow() +void rfunc::ChangeModeWindow() { - /*static int * r_win_width = (int*)GET_PCVAR_INT("r_win_width"); - *r_win_width = 1280; - - static int * r_win_height = (int*)GET_PCVAR_INT("r_win_height"); - *r_win_height = 768; - - return;*/ - static bool *r_win_windowed = (bool*)GET_PCVAR_BOOL("r_win_windowed"); if (r_win_windowed == NULL) @@ -471,13 +464,13 @@ void SXRenderFunc::ChangeModeWindow() *r_win_windowed = !(*r_win_windowed); - SXRenderFunc::InitModeWindow(); + rfunc::InitModeWindow(); static int *r_resize = (int*)GET_PCVAR_INT("r_resize"); *r_resize = RENDER_RESIZE_CHANGE; } -void SXRenderFunc::FullScreenChangeSizeAbs() +void rfunc::FullScreenChangeSizeAbs() { static bool *r_win_windowed = (bool*)GET_PCVAR_BOOL("r_win_windowed"); @@ -528,54 +521,54 @@ void SXRenderFunc::FullScreenChangeSizeAbs() //########################################################################## -void SXRenderFunc::UpdateView() +void rfunc::UpdateView() { - GData::InitAllMatrix(); + gdata::InitAllMatrix(); + + gdata::pCamera->getViewMatrix(&gdata::mCamView); - GData::ObjCamera->getViewMatrix(&GData::MCamView); - Core_RMatrixSet(G_RI_MATRIX_WORLD, &SMMatrixIdentity()); - Core_RMatrixSet(G_RI_MATRIX_VIEW, &GData::MCamView); - Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &GData::MLightProj); - Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &(GData::MCamView * GData::MLightProj)); - Core_RMatrixSet(G_RI_MATRIX_TRANSP_VIEWPROJ, &SMMatrixTranspose(GData::MCamView * GData::MLightProj)); + Core_RMatrixSet(G_RI_MATRIX_VIEW, &gdata::mCamView); + Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &gdata::mLightProj); + 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::pCamera->getPosition(&gdata::vConstCurrCamPos); + gdata::pCamera->getLook(&gdata::vConstCurrCamDir); - Core_RFloat3Set(G_RI_FLOAT3_OBSERVER_POSITION, &GData::ConstCurrCamPos); - Core_RFloat3Set(G_RI_FLOAT3_OBSERVER_DIRECTION, &GData::ConstCurrCamDir); + Core_RFloat3Set(G_RI_FLOAT3_OBSERVER_POSITION, &gdata::vConstCurrCamPos); + Core_RFloat3Set(G_RI_FLOAT3_OBSERVER_DIRECTION, &gdata::vConstCurrCamDir); - Core_RMatrixSet(G_RI_MATRIX_OBSERVER_VIEW, &GData::MCamView); - Core_RMatrixSet(G_RI_MATRIX_OBSERVER_PROJ, &GData::MCamProj); - Core_RMatrixSet(G_RI_MATRIX_LIGHT_PROJ, &GData::MLightProj); + Core_RMatrixSet(G_RI_MATRIX_OBSERVER_VIEW, &gdata::mCamView); + Core_RMatrixSet(G_RI_MATRIX_OBSERVER_PROJ, &gdata::mCamProj); + Core_RMatrixSet(G_RI_MATRIX_LIGHT_PROJ, &gdata::mLightProj); - /*Core_RFloatSet(G_RI_FLOAT_OBSERVER_NEAR, GData::NearFar.x); - Core_RFloatSet(G_RI_FLOAT_OBSERVER_FAR, GData::NearFar.y); - Core_RFloatSet(G_RI_FLOAT_OBSERVER_FOV, GData::ProjFov);*/ + /*Core_RFloatSet(G_RI_FLOAT_OBSERVER_NEAR, gdata::vNearFar.x); + Core_RFloatSet(G_RI_FLOAT_OBSERVER_FAR, gdata::vNearFar.y); + Core_RFloatSet(G_RI_FLOAT_OBSERVER_FOV, gdata::fProjFov);*/ - GData::ObjCamera->updateFrustum(&GData::MCamProj); + gdata::pCamera->updateFrustum(&gdata::mCamProj); - if (GData::DefaultGeomIDArr < 0) - GData::DefaultGeomIDArr = SGeom_ModelsAddArrForCom(); + if (gdata::idDefaultGeomArr < 0) + gdata::idDefaultGeomArr = SGeom_ModelsAddArrForCom(); - if (GData::DefaultGreenIDArr < 0) - GData::DefaultGreenIDArr = SGeom_GreenAddArrForCom(); + if (gdata::idDefaultGreenArr < 0) + gdata::idDefaultGreenArr = SGeom_GreenAddArrForCom(); - if (GData::DefaultAnimIDArr < 0) - GData::DefaultAnimIDArr = SXAnim_ModelsAddArrForCom(); + if (gdata::idDefaultAnimArr < 0) + gdata::idDefaultAnimArr = SXAnim_ModelsAddArrForCom(); } -int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char *szStr) +int rfunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char *szStr) { - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); static int FrameCount = 0; static int FrameCount2 = 0; - static float TimeElapsed=0; + static float TimeElapsed = 0; static float FpsValue = 0; static char FpsStr[1024]; static char debugstr[SXGC_STR_SIZE_DBG_MSG]; @@ -585,7 +578,7 @@ int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char static const int * r_stats = GET_PCVAR_INT("r_stats"); static bool isNulled = false; - + if (TimeElapsed >= 1.0f && r_stats) { FpsValue = (float)FrameCount / TimeElapsed; @@ -617,7 +610,7 @@ int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char } else isNulled = false; - + if (r_stats && (*r_stats) > 0) SGCore_DbgMsg(debugstr); @@ -626,7 +619,7 @@ int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char //########################################################################## -void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) +void rfunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) { static const int *r_win_width = GET_PCVAR_INT("r_win_width"); static const int *r_win_height = GET_PCVAR_INT("r_win_height"); @@ -636,46 +629,46 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) SGCore_ShaderUnBind(); Core_RIntSet(G_RI_INT_RENDERSTATE, RENDER_STATE_MATERIAL); - + Core_RMatrixGet(G_RI_MATRIX_WORLD, &SMMatrixIdentity()); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - SXRenderFunc::SetRenderSceneFilter(); + rfunc::SetRenderSceneFilter(); LPDIRECT3DSURFACE9 BackBuf, ColorSurf, NormalSurf, ParamSurf, DepthMapLinearSurf; - SML_DSGetRT(DS_RT_COLOR)->GetSurfaceLevel(0, &ColorSurf); - SML_DSGetRT(DS_RT_NORMAL)->GetSurfaceLevel(0, &NormalSurf); - SML_DSGetRT(DS_RT_PARAM)->GetSurfaceLevel(0, &ParamSurf); - SML_DSGetRT(DS_RT_DEPTH)->GetSurfaceLevel(0, &DepthMapLinearSurf); + SGCore_GbufferGetRT(DS_RT_COLOR)->GetSurfaceLevel(0, &ColorSurf); + SGCore_GbufferGetRT(DS_RT_NORMAL)->GetSurfaceLevel(0, &NormalSurf); + SGCore_GbufferGetRT(DS_RT_PARAM)->GetSurfaceLevel(0, &ParamSurf); + SGCore_GbufferGetRT(DS_RT_DEPTH)->GetSurfaceLevel(0, &DepthMapLinearSurf); //очищаем рт глубины максимальным значением //чтобы там где нет окружения к примеру был скайбокс, а значит в рт глубины было максимальное значение - максимальная отдаленность - GData::DXDevice->SetRenderTarget(3, DepthMapLinearSurf); - GData::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 255, 255, 255), 1.0f, 0); - GData::DXDevice->SetRenderTarget(3, 0); //убираем рт глубины + gdata::pDXDevice->SetRenderTarget(3, DepthMapLinearSurf); + gdata::pDXDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 255, 255, 255), 1.0f, 0); + gdata::pDXDevice->SetRenderTarget(3, 0); //убираем рт глубины - GData::DXDevice->SetRenderTarget(1, NormalSurf); - GData::DXDevice->SetRenderTarget(2, ParamSurf); - GData::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); - GData::DXDevice->SetRenderTarget(1, 0); - GData::DXDevice->SetRenderTarget(2, 0); + gdata::pDXDevice->SetRenderTarget(1, NormalSurf); + gdata::pDXDevice->SetRenderTarget(2, ParamSurf); + gdata::pDXDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); + gdata::pDXDevice->SetRenderTarget(1, 0); + gdata::pDXDevice->SetRenderTarget(2, 0); - GData::DXDevice->GetRenderTarget(0, &BackBuf); - GData::DXDevice->SetRenderTarget(0, ColorSurf); - GData::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, RENDER_DEFAUL_BACKGROUND_COLOR/*D3DCOLOR_ARGB(0, 0, 0, 0)*/, 1.0f, 0); - - GData::DXDevice->SetRenderTarget(1, NormalSurf); - GData::DXDevice->SetRenderTarget(2, ParamSurf); - GData::DXDevice->SetRenderTarget(3, DepthMapLinearSurf); //ставим рт глубины + gdata::pDXDevice->GetRenderTarget(0, &BackBuf); + gdata::pDXDevice->SetRenderTarget(0, ColorSurf); + gdata::pDXDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, RENDER_DEFAUL_BACKGROUND_COLOR/*D3DCOLOR_ARGB(0, 0, 0, 0)*/, 1.0f, 0); - SML_MtlNullingCurrCountSurf(); - SML_MtlSetCurrCountSurf(RENDER_LAYER_UNTRANSPARENT); + gdata::pDXDevice->SetRenderTarget(1, NormalSurf); + gdata::pDXDevice->SetRenderTarget(2, ParamSurf); + gdata::pDXDevice->SetRenderTarget(3, DepthMapLinearSurf); //ставим рт глубины + + SMtrl_MtlNullingCurrCountSurf(); + SMtrl_MtlSetCurrCountSurf(RENDER_LAYER_UNTRANSPARENT); if (!isRenderSimulation) @@ -687,7 +680,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) SXAnim_Render(); if (SGeom_GreenGetCount() > 0) - SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_ALL); + SGeom_GreenRender(timeDelta, &gdata::vConstCurrCamPos, GREEN_TYPE_ALL); SGCore_ShaderUnBind(); } @@ -695,39 +688,39 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) //копируем глубину нулевого слоя (непрозрачной геометрии) в рт непрозрачной глубины //{ //mem_release_del(DepthMapLinearSurf); - //GData::DXDevice->SetRenderTarget(0, BackBuf); - GData::DXDevice->SetRenderTarget(1, 0); - GData::DXDevice->SetRenderTarget(2, 0); - GData::DXDevice->SetRenderTarget(3, 0); + //gdata::pDXDevice->SetRenderTarget(0, BackBuf); + gdata::pDXDevice->SetRenderTarget(1, 0); + gdata::pDXDevice->SetRenderTarget(2, 0); + gdata::pDXDevice->SetRenderTarget(3, 0); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); SGCore_SetSamplerFilter(0, D3DTEXF_NONE); SGCore_SetSamplerAddress(0, D3DTADDRESS_CLAMP); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); LPDIRECT3DSURFACE9 DepthSurf2; - SML_DSGetRT(DS_RT_DEPTH0)->GetSurfaceLevel(0, &DepthSurf2); + SGCore_GbufferGetRT(DS_RT_DEPTH0)->GetSurfaceLevel(0, &DepthSurf2); - GData::DXDevice->SetRenderTarget(0, DepthSurf2); + gdata::pDXDevice->SetRenderTarget(0, DepthSurf2); - GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_DEPTH)); + gdata::pDXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_DEPTH)); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::ScreenOut); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idScreenOut); SGCore_ScreenQuadDraw(); - SXRenderFunc::SetRenderSceneFilter(); - //SML_DSGetRT(DS_RT_DEPTH)->GetSurfaceLevel(0, &DepthMapLinearSurf); - GData::DXDevice->SetRenderTarget(0, ColorSurf); - GData::DXDevice->SetRenderTarget(1, NormalSurf); - GData::DXDevice->SetRenderTarget(2, ParamSurf); - GData::DXDevice->SetRenderTarget(3, DepthMapLinearSurf); + rfunc::SetRenderSceneFilter(); + //SGCore_GbufferGetRT(DS_RT_DEPTH)->GetSurfaceLevel(0, &DepthMapLinearSurf); + gdata::pDXDevice->SetRenderTarget(0, ColorSurf); + gdata::pDXDevice->SetRenderTarget(1, NormalSurf); + gdata::pDXDevice->SetRenderTarget(2, ParamSurf); + gdata::pDXDevice->SetRenderTarget(3, DepthMapLinearSurf); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); mem_release_del(DepthSurf2); //}} @@ -746,99 +739,99 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) //второй случай логичнее, однако на двух дальних плоскостях иногда наблюдается переход одной плоскости на передний план, что слегка заметно //пересмотреть этот момент как будет время, а пока оставить второй вариант как наиболее логичный - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, FALSE); - GData::DXDevice->Clear(0, 0, D3DCLEAR_STENCIL, 0, 1.0f, 0); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, FALSE); + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_STENCIL, 0, 1.0f, 0); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - GData::DXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); - GData::DXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); + gdata::pDXDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); - GData::DXDevice->SetRenderState(D3DRS_STENCILREF, 1); - GData::DXDevice->SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF); - GData::DXDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILREF, 1); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStr); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStr, "g_vWinSize", &vWinSize); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idStencilStr); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idStencilStr, "g_vWinSize", &vWinSize); SGCore_ScreenQuadDraw(); - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); - GData::DXDevice->SetRenderState(D3DRS_STENCILREF, 2); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILREF, 2); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilColumn); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilColumn, "g_vWinSize", &vWinSize); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idStencilColumn); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idStencilColumn, "g_vWinSize", &vWinSize); SGCore_ScreenQuadDraw(); - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); - GData::DXDevice->SetRenderState(D3DRS_STENCILREF, 3); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILREF, 3); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStrColumn); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStrColumn, "g_vWinSize", &vWinSize); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idStencilStrColumn); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idStencilStrColumn, "g_vWinSize", &vWinSize); SGCore_ScreenQuadDraw(); - GData::DXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); - GData::DXDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); - GData::DXDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); SGCore_ShaderUnBind(); - SML_MtlSetForceblyAlphaTest(true); + SMtrl_MtlSetForceblyAlphaTest(true); - GData::DXDevice->SetRenderState(D3DRS_STENCILREF, 0); - GData::DXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_NOTEQUAL); - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_DECR); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILREF, 0); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_NOTEQUAL); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_DECR); if (SGeom_ModelsGetCount() > 0) { - SML_MtlSetIsIncrCountSurf(true); - SML_MtlSetCurrCountSurf(RENDER_LAYER_TRANSPARENT); + SMtrl_MtlSetIsIncrCountSurf(true); + SMtrl_MtlSetCurrCountSurf(RENDER_LAYER_TRANSPARENT); SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY, 0, true); } - SML_MtlSetForceblyAlphaTest(false); - GData::DXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); + SMtrl_MtlSetForceblyAlphaTest(false); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); SGCore_ShaderUnBind(); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); } SXDecals_Render(); } else { - if (SML_MtlGetSort(GData::Editors::SimModel->getIdMtl()) != MTLSORT_OPAQUE) - SML_MtlSetForceblyAlphaTest(true); - GData::Editors::SimModel->render(timeDelta); - if (SML_MtlGetSort(GData::Editors::SimModel->getIdMtl()) != MTLSORT_OPAQUE) - SML_MtlSetForceblyAlphaTest(false); + if (SMtrl_MtlGetSort(gdata::Editors::pSimModel->getIdMtl()) != MTLSORT_OPAQUE) + SMtrl_MtlSetForceblyAlphaTest(true); + gdata::Editors::pSimModel->render(timeDelta); + if (SMtrl_MtlGetSort(gdata::Editors::pSimModel->getIdMtl()) != MTLSORT_OPAQUE) + SMtrl_MtlSetForceblyAlphaTest(false); } - GData::DXDevice->SetRenderTarget(0, BackBuf); - GData::DXDevice->SetRenderTarget(1, 0); - GData::DXDevice->SetRenderTarget(2, 0); - GData::DXDevice->SetRenderTarget(3, 0); + gdata::pDXDevice->SetRenderTarget(0, BackBuf); + gdata::pDXDevice->SetRenderTarget(1, 0); + gdata::pDXDevice->SetRenderTarget(2, 0); + gdata::pDXDevice->SetRenderTarget(3, 0); mem_release(BackBuf); @@ -847,188 +840,188 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation) mem_release(ParamSurf); mem_release(DepthMapLinearSurf); - SXRenderFunc::SetRenderSceneFilterUn(); + rfunc::SetRenderSceneFilterUn(); } -void SXRenderFunc::UpdateShadow(DWORD timeDelta) +void rfunc::UpdateShadow(DWORD timeDelta) { Core_RIntSet(G_RI_INT_RENDERSTATE, RENDER_STATE_SHADOW); - 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); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + SLight_ComVisibleFrustumDistFor(gdata::pCamera->getFrustum(), &gdata::vConstCurrCamPos); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); SetSamplerFilter(0, D3DTEXF_LINEAR); SetSamplerAddress(0, D3DTADDRESS_WRAP); - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED); - for (int i = 0; i<SML_LigthsGetCount(); i++) + for (int i = 0; i<SLight_GetCount(); i++) { - if (!SML_LigthsGetExists(i)) + if (!SLight_GetExists(i)) continue; Core_RIntSet(G_RI_INT_CURRIDLIGHT, i); - 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 (SLight_GetShadowed(i) && (SLight_ComVisibleForFrustum(i, gdata::pCamera->getFrustum()) && SLight_GetEnable(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) + if (SLight_GetType(i) == LTYPE_LIGHT_GLOBAL) { - SML_LigthsShadowRenderBegin(i); - int countsplits = (SML_LigthsGet4Or3SplitsG(i) ? 4 : 3); - for (int k = 0; k<countsplits; k++) + SLight_ShadowRenderBegin(i); + int countsplits = (SLight_Get4Or3SplitsG(i) ? 4 : 3); + for (int k = 0; k<countsplits; k++) + { + if (SLight_CountUpdateAllowed(i, k)) { - if (SML_LigthsCountUpdateAllowed(i, k)) - { - SML_LigthsShadowRenderPre(i, k); + SLight_ShadowRenderPre(i, k); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k) > -1) - SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k)); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k) > -1) + SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k)); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k) > -1) - SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k)); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k) > -1) + SGeom_GreenRender(timeDelta, &gdata::vConstCurrCamPos, GREEN_TYPE_TREE, SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k)); - SXAnim_Render(); - } + SXAnim_Render(); } + } //КОГДА ИСТОЧНИК БЛИЗОК К ГОРИЗОНТУ ИЗ-ЗА ОБЛАКОВ ВОЗНИКАЕТ БАГ С ТЕНЯМИ В ВИДЕ ФЕЙКОВЫХ ТЕНЕЙ if (SGCore_SkyCloudsIsCr()) { - SML_LigthsUpdateGFrustums(i, 4, &GData::ConstCurrCamPos, &GData::ConstCurrCamDir); - SML_LigthsShadowRenderPre(i, 4); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + SLight_UpdateGFrustums(i, 4, &gdata::vConstCurrCamPos, &gdata::vConstCurrCamDir); + SLight_ShadowRenderPre(i, 4); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); SetSamplerFilter(0, D3DTEXF_LINEAR); SetSamplerFilter(1, D3DTEXF_LINEAR); SetSamplerAddress(0, D3DTADDRESS_MIRROR); SetSamplerAddress(1, D3DTADDRESS_MIRROR); if (SGCore_SkyCloudsIsLoadTex()) - SGCore_SkyCloudsRender(timeDelta, &float3(GData::ConstCurrCamPos.x, GData::ConstCurrCamPos.y + 150, GData::ConstCurrCamPos.z), true); + SGCore_SkyCloudsRender(timeDelta, &float3(gdata::vConstCurrCamPos.x, gdata::vConstCurrCamPos.y + 150, gdata::vConstCurrCamPos.z), true); else - GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, 0, 1.0f, 0); + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_TARGET, 0, 1.0f, 0); SetSamplerAddress(0, D3DTADDRESS_WRAP); SetSamplerAddress(1, D3DTADDRESS_WRAP); } - SML_LigthsShadowRenderEnd(i); + SLight_ShadowRenderEnd(i); } - else if (SML_LigthsGetType(i) == LTYPE_LIGHT_DIR) + else if (SLight_GetType(i) == LTYPE_LIGHT_DIR) { - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - if (SML_LigthsCountUpdateUpdate(i, &GData::ConstCurrCamPos)) + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + if (SLight_CountUpdateUpdate(i, &gdata::vConstCurrCamPos)) { - SML_LigthsShadowRenderBegin(i); + SLight_ShadowRenderBegin(i); - if (SML_LigthsGetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) + if (SLight_GetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) { - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, 0) > -1) - SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, 0)); - - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, 0) > -1) - SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, 0)); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, 0) > -1) + SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, 0)); + + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, 0) > -1) + SGeom_GreenRender(timeDelta, &gdata::vConstCurrCamPos, GREEN_TYPE_TREE, SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, 0)); SXAnim_Render(); } else { - SGeom_ModelsComVisible(SML_LigthsGetFrustum(i, 0), &GData::ConstCurrCamPos, GData::DefaultGeomIDArr); - SGeom_ModelsRender(timeDelta, -1, GData::DefaultGeomIDArr); - SGeom_GreenComVisible(SML_LigthsGetFrustum(i, 0), &GData::ConstCurrCamPos, GData::DefaultGreenIDArr); - SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, GData::DefaultGreenIDArr); + SGeom_ModelsComVisible(SLight_GetFrustum(i, 0), &gdata::vConstCurrCamPos, gdata::idDefaultGeomArr); + SGeom_ModelsRender(timeDelta, -1, gdata::idDefaultGeomArr); + SGeom_GreenComVisible(SLight_GetFrustum(i, 0), &gdata::vConstCurrCamPos, gdata::idDefaultGreenArr); + SGeom_GreenRender(timeDelta, &gdata::vConstCurrCamPos, GREEN_TYPE_TREE, gdata::idDefaultGreenArr); } - SML_LigthsShadowRenderEnd(i); + SLight_ShadowRenderEnd(i); } } - else if (SML_LigthsGetType(i) == LTYPE_LIGHT_POINT) + else if (SLight_GetType(i) == LTYPE_LIGHT_POINT) { - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - if (SML_LigthsGetTypeShadowed(i) != LTYPE_SHADOW_NONE && SML_LigthsCountUpdateUpdate(i, &GData::ConstCurrCamPos)) + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + if (SLight_GetTypeShadowed(i) != LTYPE_SHADOW_NONE && SLight_CountUpdateUpdate(i, &gdata::vConstCurrCamPos)) { - SML_LigthsShadowRenderBegin(i); + SLight_ShadowRenderBegin(i); for (int k = 0; k < 6; k++) { - if (SML_LigthsGetCubeEdgeEnable(i, k)) + if (SLight_GetCubeEdgeEnable(i, k)) { - SML_LigthsShadowRenderPre(i, k); + SLight_ShadowRenderPre(i, k); - if (SML_LigthsGetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) + if (SLight_GetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC) { - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k) > -1) - SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k)); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k) > -1) + SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SLight_GetIDArr(i, RENDER_IDARRCOM_GEOM, k)); - if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k) > -1) - SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k)); + if (SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k) > -1) + SGeom_GreenRender(timeDelta, &gdata::vConstCurrCamPos, GREEN_TYPE_TREE, SLight_GetIDArr(i, RENDER_IDARRCOM_GREEN, k)); SXAnim_Render(); } else { - SGeom_ModelsComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, GData::DefaultGeomIDArr); - SGeom_ModelsRender(timeDelta, -1, GData::DefaultGeomIDArr); - SGeom_GreenComVisible(SML_LigthsGetFrustum(i, k), &GData::ConstCurrCamPos, GData::DefaultGreenIDArr); - SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, GData::DefaultGreenIDArr); + SGeom_ModelsComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, gdata::idDefaultGeomArr); + SGeom_ModelsRender(timeDelta, -1, gdata::idDefaultGeomArr); + SGeom_GreenComVisible(SLight_GetFrustum(i, k), &gdata::vConstCurrCamPos, gdata::idDefaultGreenArr); + SGeom_GreenRender(timeDelta, &gdata::vConstCurrCamPos, GREEN_TYPE_TREE, gdata::idDefaultGreenArr); } - - SML_LigthsShadowRenderPost(i, k); + + SLight_ShadowRenderPost(i, k); } } - SML_LigthsShadowRenderEnd(i); + SLight_ShadowRenderEnd(i); } } } } Core_RIntSet(G_RI_INT_RENDERSTATE, RENDER_STATE_FREE); - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); } -void SXRenderFunc::RenderSky(DWORD timeDelta) +void rfunc::RenderSky(DWORD timeDelta) { LPDIRECT3DSURFACE9 ColorSurf, BackBuf; - SML_DSGetRT(DS_RT_SCENELIGHT)->GetSurfaceLevel(0, &ColorSurf); - GData::DXDevice->GetRenderTarget(0, &BackBuf); - GData::DXDevice->SetRenderTarget(0, ColorSurf); + SGCore_GbufferGetRT(DS_RT_SCENELIGHT)->GetSurfaceLevel(0, &ColorSurf); + gdata::pDXDevice->GetRenderTarget(0, &BackBuf); + gdata::pDXDevice->SetRenderTarget(0, ColorSurf); - GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, RENDER_DEFAUL_BACKGROUND_COLOR, 1.0f, 0); + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_TARGET, RENDER_DEFAUL_BACKGROUND_COLOR, 1.0f, 0); SetSamplerFilter(0, 2, D3DTEXF_ANISOTROPIC); if (SGCore_SkyBoxIsCr() && SGCore_SkyBoxIsLoadTex()) { - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); SetSamplerAddress(0, 2, D3DTADDRESS_CLAMP); - SGCore_SkyBoxRender(timeDelta, &float3(GData::ConstCurrCamPos.x, GData::ConstCurrCamPos.y + 40, GData::ConstCurrCamPos.z)); + SGCore_SkyBoxRender(timeDelta, &float3(gdata::vConstCurrCamPos.x, gdata::vConstCurrCamPos.y + 40, gdata::vConstCurrCamPos.z)); } - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - GData::DXDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + gdata::pDXDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + gdata::pDXDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - GData::DXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - GData::DXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); if (SGCore_SkyCloudsIsCr() && SGCore_SkyCloudsIsLoadTex()) { SetSamplerAddress(0, 2, D3DTADDRESS_MIRROR); - SGCore_SkyCloudsRender(timeDelta, &float3(GData::ConstCurrCamPos.x, GData::ConstCurrCamPos.y + 150, GData::ConstCurrCamPos.z), false); + SGCore_SkyCloudsRender(timeDelta, &float3(gdata::vConstCurrCamPos.x, gdata::vConstCurrCamPos.y + 150, gdata::vConstCurrCamPos.z), false); } - GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_SCENELIGHT2)); + gdata::pDXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_SCENELIGHT2)); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::ScreenOut); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idScreenOut); SGCore_ScreenQuadDraw(); @@ -1036,203 +1029,203 @@ void SXRenderFunc::RenderSky(DWORD timeDelta) mem_release(ColorSurf); - GData::DXDevice->SetRenderTarget(0, BackBuf); + gdata::pDXDevice->SetRenderTarget(0, BackBuf); mem_release(BackBuf); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } -void SXRenderFunc::ComLighting(DWORD timeDelta) +void rfunc::ComLighting(DWORD timeDelta) { static int *r_win_width = (int*)GET_PCVAR_INT("r_win_width"); static int *r_win_height = (int*)GET_PCVAR_INT("r_win_height"); SGCore_ShaderUnBind(); - LPDIRECT3DSURFACE9 AmbientSurf, SpecDiffSurf, BackBuf; - SML_DSGetRT(DS_RT_AMBIENTDIFF)->GetSurfaceLevel(0, &AmbientSurf); - SML_DSGetRT(DS_RT_SPECULAR)->GetSurfaceLevel(0, &SpecDiffSurf); + LPDIRECT3DSURFACE9 pAmbientSurf, pSpecDiffSurf, pBackBuf; + SGCore_GbufferGetRT(DS_RT_AMBIENTDIFF)->GetSurfaceLevel(0, &pAmbientSurf); + SGCore_GbufferGetRT(DS_RT_SPECULAR)->GetSurfaceLevel(0, &pSpecDiffSurf); - GData::DXDevice->GetRenderTarget(0, &BackBuf); + gdata::pDXDevice->GetRenderTarget(0, &pBackBuf); - GData::DXDevice->SetRenderTarget(0, AmbientSurf); - GData::DXDevice->SetRenderTarget(1, SpecDiffSurf); + gdata::pDXDevice->SetRenderTarget(0, pAmbientSurf); + gdata::pDXDevice->SetRenderTarget(1, pSpecDiffSurf); //очищаем рт и стенсил - GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_STENCIL, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_STENCIL, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); //устанавка аддитивного смешивания //когда к уже записанному будет прибавляться то что хотим записать - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - GData::DXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); - GData::DXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); - GData::DXDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + gdata::pDXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + gdata::pDXDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); - GData::DXDevice->SetTransform(D3DTS_WORLD, &((D3DXMATRIX)SMMatrixIdentity())); - GData::DXDevice->SetTransform(D3DTS_VIEW, &((D3DXMATRIX)GData::MCamView)); - GData::DXDevice->SetTransform(D3DTS_PROJECTION, &((D3DXMATRIX)GData::MLightProj)); + gdata::pDXDevice->SetTransform(D3DTS_WORLD, &((D3DXMATRIX)SMMatrixIdentity())); + gdata::pDXDevice->SetTransform(D3DTS_VIEW, &((D3DXMATRIX)gdata::mCamView)); + gdata::pDXDevice->SetTransform(D3DTS_PROJECTION, &((D3DXMATRIX)gdata::mLightProj)); //проходимся циклом по всем источникам света - for (int i = 0; i<SML_LigthsGetCount(); i++) + for (int i = 0; i<SLight_GetCount(); i++) { - if (!SML_LigthsGetExists(i)) + if (!SLight_GetExists(i)) continue; //если свет виден фрустуму камеры (это надо было заранее просчитать) и если свет включен - if (SML_LigthsGetVisibleForFrustum(i) && SML_LigthsGetEnable(i)) + if (SLight_GetVisibleForFrustum(i) && SLight_GetEnable(i)) { //пока что назначаем шейдер без теней - ID idshader = GData::IDsShaders::PS::ComLightingNonShadow; + ID idshader = gdata::shaders_id::ps::idComLightingNonShadow; //если не глобальный источник - if (SML_LigthsGetType(i) != LTYPE_LIGHT_GLOBAL) + if (SLight_GetType(i) != LTYPE_LIGHT_GLOBAL) { //помечаем в стенсил буфере пиксели которые входят в ограничивающий объем света, чтобы их осветить //отключаем вывод цвета - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, FALSE); //установка стенсил теста, причем и двухстороннего тоже - GData::DXDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); - GData::DXDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, TRUE); //вклчить тест глубины, но запись выключить, установить стандартную функцию проверки глубины - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); //стенсил тест проходит всегда удачно, при провале теста глубины инкрементируем значение в стенсиле - GData::DXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); - GData::DXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_INCR); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_INCR); //при удачно проходе, игнорируем - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); //стенсил тест для обратной глубины проходит всегда удачно, при провале теста глубины декрементируем значение в стенсиле - GData::DXDevice->SetRenderState(D3DRS_CCW_STENCILFUNC, D3DCMP_ALWAYS); - GData::DXDevice->SetRenderState(D3DRS_CCW_STENCILZFAIL, D3DSTENCILOP_DECR); + gdata::pDXDevice->SetRenderState(D3DRS_CCW_STENCILFUNC, D3DCMP_ALWAYS); + gdata::pDXDevice->SetRenderState(D3DRS_CCW_STENCILZFAIL, D3DSTENCILOP_DECR); //при удачно проходе, игнорируем - GData::DXDevice->SetRenderState(D3DRS_CCW_STENCILPASS, D3DSTENCILOP_KEEP); + gdata::pDXDevice->SetRenderState(D3DRS_CCW_STENCILPASS, D3DSTENCILOP_KEEP); //установка значений для записи - GData::DXDevice->SetRenderState(D3DRS_STENCILREF, 0x0); - GData::DXDevice->SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF); - GData::DXDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); //включение двухсторонней отрисовки + gdata::pDXDevice->SetRenderState(D3DRS_STENCILREF, 0x0); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); //включение двухсторонней отрисовки - GData::DXDevice->SetTransform(D3DTS_WORLD, &((D3DXMATRIX)SMMatrixIdentity())); - GData::DXDevice->SetTransform(D3DTS_VIEW, &((D3DXMATRIX)GData::MCamView)); - GData::DXDevice->SetTransform(D3DTS_PROJECTION, &((D3DXMATRIX)GData::MLightProj)); + gdata::pDXDevice->SetTransform(D3DTS_WORLD, &((D3DXMATRIX)SMMatrixIdentity())); + gdata::pDXDevice->SetTransform(D3DTS_VIEW, &((D3DXMATRIX)gdata::mCamView)); + gdata::pDXDevice->SetTransform(D3DTS_PROJECTION, &((D3DXMATRIX)gdata::mLightProj)); //отрисовка ограничивающего объема - SML_LigthsRender(i, 0); + SLight_Render(i, 0); // - GData::DXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); - GData::DXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_ZERO); - GData::DXDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_ZERO); - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_ZERO); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_ZERO); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); - GData::DXDevice->SetRenderState(D3DRS_STENCILREF, 255); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILREF, 255); //включаем вывод цвета - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); } else { //иначе это глобальный источник, отключаем стенсил тест - GData::DXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, FALSE); } //отключаем тест глубины ибо будем теперь пост процессом обрабатывать полученные данные - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); //если свет отбрасывает тени - if (SML_LigthsGetShadowed(i)) + if (SLight_GetShadowed(i)) { //генерация теней для текущего света //{{ //так как нам нужно провести очистку рт то убираем оба рт - GData::DXDevice->SetRenderTarget(0, 0); - GData::DXDevice->SetRenderTarget(1, 0); + gdata::pDXDevice->SetRenderTarget(0, 0); + gdata::pDXDevice->SetRenderTarget(1, 0); //отключаем смешивание, нам не нужен хлам в рт - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED); - SML_LigthsShadowNull(); //очищаем рт генерации теней - SML_LigthsShadowGen(i); //генерируем тень для света + SLight_ShadowNull(); //очищаем рт генерации теней + SLight_ShadowGen(i); //генерируем тень для света static const int * r_shadow_soft = GET_PCVAR_INT("r_shadow_soft"); if (r_shadow_soft) { if ((*r_shadow_soft) == 1) - SML_LigthsShadowSoft(false, 2); + SLight_ShadowSoft(false, 2); else if ((*r_shadow_soft) == 2) { - SML_LigthsShadowSoft(false, 2); - SML_LigthsShadowSoft(false, 2); + SLight_ShadowSoft(false, 2); + SLight_ShadowSoft(false, 2); } } - GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA); //}} - + //включаем смешивание для освещения - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); //опять назначаем второй рт - GData::DXDevice->SetRenderTarget(0, AmbientSurf); - GData::DXDevice->SetRenderTarget(1, SpecDiffSurf); + gdata::pDXDevice->SetRenderTarget(0, pAmbientSurf); + gdata::pDXDevice->SetRenderTarget(1, pSpecDiffSurf); //устанавливаем текстуру с тенями и переназначаем шейдер, теперь уже с тенями - GData::DXDevice->SetTexture(4, SML_LigthsGetShadow()); - idshader = GData::IDsShaders::PS::ComLightingShadow; + gdata::pDXDevice->SetTexture(4, SLight_GetShadow()); + idshader = gdata::shaders_id::ps::idComLightingShadow; - if (GetAsyncKeyState('Q')) - D3DXSaveTextureToFile((String("C:/1/SML_LigthsGetShadow") + String(i) + ".jpg").c_str(), D3DXIFF_JPG, SML_LigthsGetShadow(), NULL); + //if (GetAsyncKeyState('Q')) + //D3DXSaveTextureToFile((String("C:/1/SLight_GetShadow") + String(i) + ".jpg").c_str(), D3DXIFF_JPG, SLight_GetShadow(), NULL); - /*if (i == SML_LigthsGetGlobal()) - GData::DXDevice->SetTexture(4, SGCore_LoadTexGetTex(SGCore_LoadTexGetID("g_shadow")));*/ + /*if (i == SLight_GetGlobal()) + gdata::pDXDevice->SetTexture(4, SGCore_LoadTexGetTex(SGCore_LoadTexGetID("g_shadow")));*/ } SGCore_ShaderUnBind(); //теперь когда будем считать освещение надо сбросить значения в стенсил буфере, чтобы каждый кадр не чистить //если стенсил тест прошел успешно, устанавливаем значнеие в нуль - if (SML_LigthsGetType(i) != LTYPE_LIGHT_GLOBAL) - GData::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_ZERO); + if (SLight_GetType(i) != LTYPE_LIGHT_GLOBAL) + gdata::pDXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_ZERO); float determ = 0; - float4x4 ViewInv = SMMatrixInverse(&determ, GData::MCamView); + float4x4 ViewInv = SMMatrixInverse(&determ, gdata::mCamView); ViewInv = SMMatrixTranspose(ViewInv); - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "g_mViewInv", &ViewInv); - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "g_vNearFar", &GData::NearFar); - SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "g_vParamProj", &float3_t(*r_win_width, *r_win_height, GData::ProjFov)); + SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idResPos, "g_mViewInv", &ViewInv); + SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idResPos, "g_vNearFar", &gdata::vNearFar); + SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idResPos, "g_vParamProj", &float3_t(*r_win_width, *r_win_height, gdata::fProjFov)); float3 tmpPosition; float2 tmpPowerDist; float3 tmpColor; - SML_LigthsGetColor(i, &tmpColor); - SML_LigthsGetPos(i, &tmpPosition, true); - tmpPowerDist.x = SML_LigthsGetPower(i); - tmpPowerDist.y = SML_LigthsGetDist(i); - - if (SML_LigthsGetType(i) != LTYPE_LIGHT_GLOBAL) + SLight_GetColor(i, &tmpColor); + SLight_GetPos(i, &tmpPosition, true); + tmpPowerDist.x = SLight_GetPower(i); + tmpPowerDist.y = SLight_GetDist(i); + + if (SLight_GetType(i) != LTYPE_LIGHT_GLOBAL) { tmpColor.w = 0.f; ID gl_id = -1; - if ((gl_id = SML_LigthsGetGlobal()) >= 0) + if ((gl_id = SLight_GetGlobal()) >= 0) { float gl_power = 0.f; - if (SML_LigthsGetEnable(gl_id)) - gl_power = SML_LigthsGetPower(gl_id); + if (SLight_GetEnable(gl_id)) + gl_power = SLight_GetPower(gl_id); float f_dep_coef = clampf(1.f - gl_power, 0.25f, 1.f); tmpPowerDist.x *= f_dep_coef; @@ -1242,23 +1235,23 @@ void SXRenderFunc::ComLighting(DWORD timeDelta) else tmpColor.w = 1.f; - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vViewPos", &GData::ConstCurrCamPos); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vViewPos", &gdata::vConstCurrCamPos); SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vLightPos", &(tmpPosition)); SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vLightPowerDist", &(tmpPowerDist)); SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vLightColor", &tmpColor); - //SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "NearFar", &GData::NearFar); + //SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "vNearFar", &gdata::vNearFar); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idResPos); SGCore_ShaderBind(SHADER_TYPE_PIXEL, idshader); SetSamplerFilter(0, 5, D3DTEXF_NONE); SetSamplerAddress(0, 5, D3DTADDRESS_CLAMP); - - GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_COLOR)); - GData::DXDevice->SetTexture(1, SML_DSGetRT(DS_RT_NORMAL)); - GData::DXDevice->SetTexture(2, SML_DSGetRT(DS_RT_PARAM)); - GData::DXDevice->SetTexture(3, SML_DSGetRT(DS_RT_DEPTH)); - GData::DXDevice->SetTexture(5, SML_DSGetRT(DS_RT_ADAPTEDLUM)); + + gdata::pDXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_COLOR)); + gdata::pDXDevice->SetTexture(1, SGCore_GbufferGetRT(DS_RT_NORMAL)); + gdata::pDXDevice->SetTexture(2, SGCore_GbufferGetRT(DS_RT_PARAM)); + gdata::pDXDevice->SetTexture(3, SGCore_GbufferGetRT(DS_RT_DEPTH)); + gdata::pDXDevice->SetTexture(5, SGCore_GbufferGetRT(DS_RT_ADAPTEDLUM)); SGCore_ScreenQuadDraw(); @@ -1266,176 +1259,167 @@ void SXRenderFunc::ComLighting(DWORD timeDelta) } } - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - GData::DXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, FALSE); - GData::DXDevice->SetRenderTarget(0, BackBuf); - GData::DXDevice->SetRenderTarget(1, 0); + gdata::pDXDevice->SetRenderTarget(0, pBackBuf); + gdata::pDXDevice->SetRenderTarget(1, 0); - mem_release(BackBuf); + mem_release(pBackBuf); - mem_release(AmbientSurf); - mem_release(SpecDiffSurf); + mem_release(pAmbientSurf); + mem_release(pSpecDiffSurf); //------------------------------- - - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - + + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + //теперь необходимо все смешать чтобы получить итоговую освещенную картинку //{{ SetSamplerFilter(0, 5, D3DTEXF_NONE); SetSamplerAddress(0, 5, D3DTADDRESS_CLAMP); - LPDIRECT3DSURFACE9 ComLightSurf; + LPDIRECT3DSURFACE9 pComLightSurf; - SML_DSGetRT(DS_RT_SCENELIGHT)->GetSurfaceLevel(0, &ComLightSurf); + SGCore_GbufferGetRT(DS_RT_SCENELIGHT)->GetSurfaceLevel(0, &pComLightSurf); - GData::DXDevice->GetRenderTarget(0, &BackBuf); - GData::DXDevice->SetRenderTarget(0, ComLightSurf); + gdata::pDXDevice->GetRenderTarget(0, &pBackBuf); + gdata::pDXDevice->SetRenderTarget(0, pComLightSurf); //очищаем рт (в старой версии было многопроходное смешивание) - GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 1.0f, 0); - - GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_COLOR)); - GData::DXDevice->SetTexture(1, SML_DSGetRT(DS_RT_AMBIENTDIFF)); - GData::DXDevice->SetTexture(2, SML_DSGetRT(DS_RT_SPECULAR)); - GData::DXDevice->SetTexture(3, SML_DSGetRT(DS_RT_NORMAL)); - GData::DXDevice->SetTexture(4, SML_DSGetRT(DS_RT_ADAPTEDLUM)); - GData::DXDevice->SetTexture(5, SML_DSGetRT(DS_RT_PARAM)); - - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::BlendAmbientSpecDiffColor); - + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); + + gdata::pDXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_COLOR)); + gdata::pDXDevice->SetTexture(1, SGCore_GbufferGetRT(DS_RT_AMBIENTDIFF)); + gdata::pDXDevice->SetTexture(2, SGCore_GbufferGetRT(DS_RT_SPECULAR)); + gdata::pDXDevice->SetTexture(3, SGCore_GbufferGetRT(DS_RT_NORMAL)); + gdata::pDXDevice->SetTexture(4, SGCore_GbufferGetRT(DS_RT_ADAPTEDLUM)); + gdata::pDXDevice->SetTexture(5, SGCore_GbufferGetRT(DS_RT_PARAM)); + + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idBlendAmbientSpecDiffColor); + SGCore_ScreenQuadDraw(); - mem_release(ComLightSurf); + mem_release(pComLightSurf); //}} SGCore_ShaderUnBind(); - GData::DXDevice->SetRenderTarget(0, BackBuf); - mem_release(BackBuf); + gdata::pDXDevice->SetRenderTarget(0, pBackBuf); + mem_release(pBackBuf); } -void SXRenderFunc::UnionLayers() +void rfunc::UnionLayers() { static const int *r_win_width = GET_PCVAR_INT("r_win_width"); static const int *r_win_height = GET_PCVAR_INT("r_win_height"); - LPDIRECT3DSURFACE9 BackBuf, ComLightSurf; - GData::DXDevice->GetRenderTarget(0, &BackBuf); + LPDIRECT3DSURFACE9 pBackBuf, pComLightSurf; + gdata::pDXDevice->GetRenderTarget(0, &pBackBuf); - static int CurrCountTransparencySurf; + static int iCurrCountTransparencySurf; #if defined(SXMATERIAL_EDITOR) - CurrCountTransparencySurf = 3; + iCurrCountTransparencySurf = 3; #else - CurrCountTransparencySurf = SML_MtlGetCurrCountSurf(); + iCurrCountTransparencySurf = SMtrl_MtlGetCurrCountSurf(); #endif - if (CurrCountTransparencySurf >= RENDER_LAYER_TRANSPARENT) + if (iCurrCountTransparencySurf >= RENDER_LAYER_TRANSPARENT) { - LPDIRECT3DSURFACE9 ColorSurf, Color2Surf, DepthSurf; - SML_DSGetRT(DS_RT_SCENELIGHT2)->GetSurfaceLevel(0, &ColorSurf); - GData::DXDevice->SetRenderTarget(0, ColorSurf); - SML_DSGetRT(DS_RT_DEPTH0)->GetSurfaceLevel(0, &DepthSurf); - GData::DXDevice->SetRenderTarget(1, DepthSurf); - SML_DSGetRT(DS_RT_DEPTH1)->GetSurfaceLevel(0, &Color2Surf); - GData::DXDevice->SetRenderTarget(2, Color2Surf); - GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); - GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_COLOR)); - GData::DXDevice->SetTexture(1, SML_DSGetRT(DS_RT_SCENELIGHT)); - GData::DXDevice->SetTexture(2, SML_DSGetRT(DS_RT_DEPTH)); - GData::DXDevice->SetTexture(3, SML_DSGetRT(DS_RT_NORMAL)); - GData::DXDevice->SetTexture(4, SML_DSGetRT(DS_RT_PARAM)); - - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha); - SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha, "g_vWinSize", &float4_t(*r_win_width, *r_win_height, 1.f / float(*r_win_width), 1.f / float(*r_win_height))); + LPDIRECT3DSURFACE9 pColorSurf, pColor2Surf, pDepthSurf; + SGCore_GbufferGetRT(DS_RT_SCENELIGHT2)->GetSurfaceLevel(0, &pColorSurf); + gdata::pDXDevice->SetRenderTarget(0, pColorSurf); + SGCore_GbufferGetRT(DS_RT_DEPTH0)->GetSurfaceLevel(0, &pDepthSurf); + gdata::pDXDevice->SetRenderTarget(1, pDepthSurf); + SGCore_GbufferGetRT(DS_RT_DEPTH1)->GetSurfaceLevel(0, &pColor2Surf); + gdata::pDXDevice->SetRenderTarget(2, pColor2Surf); + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); + gdata::pDXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_COLOR)); + gdata::pDXDevice->SetTexture(1, SGCore_GbufferGetRT(DS_RT_SCENELIGHT)); + gdata::pDXDevice->SetTexture(2, SGCore_GbufferGetRT(DS_RT_DEPTH)); + gdata::pDXDevice->SetTexture(3, SGCore_GbufferGetRT(DS_RT_NORMAL)); + gdata::pDXDevice->SetTexture(4, SGCore_GbufferGetRT(DS_RT_PARAM)); + + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idUnionAlpha); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idUnionAlpha, "g_vWinSize", &float4_t(*r_win_width, *r_win_height, 1.f / float(*r_win_width), 1.f / float(*r_win_height))); SGCore_ScreenQuadDraw(); - GData::DXDevice->SetRenderTarget(1, 0); - GData::DXDevice->SetRenderTarget(2, 0); - mem_release(ColorSurf); - mem_release(DepthSurf); - mem_release(Color2Surf); + gdata::pDXDevice->SetRenderTarget(1, 0); + gdata::pDXDevice->SetRenderTarget(2, 0); + mem_release(pColorSurf); + mem_release(pDepthSurf); + mem_release(pColor2Surf); } else { //копируем значения только для ds_rt_depth1, а ds_rt_depth0 уже заполнен - LPDIRECT3DSURFACE9 DepthSurf1; + LPDIRECT3DSURFACE9 pDepthSurf1; - SML_DSGetRT(DS_RT_DEPTH1)->GetSurfaceLevel(0, &DepthSurf1); - GData::DXDevice->SetRenderTarget(0, DepthSurf1); + SGCore_GbufferGetRT(DS_RT_DEPTH1)->GetSurfaceLevel(0, &pDepthSurf1); + gdata::pDXDevice->SetRenderTarget(0, pDepthSurf1); - GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); - GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_DEPTH)); + gdata::pDXDevice->SetTexture(0, SGCore_GbufferGetRT(DS_RT_DEPTH)); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::ScreenOut); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idScreenOut); SGCore_ScreenQuadDraw(); - GData::DXDevice->SetRenderTarget(0, 0); - mem_release(DepthSurf1); + gdata::pDXDevice->SetRenderTarget(0, 0); + mem_release(pDepthSurf1); } //копируем итоговую сцену - SML_DSGetRT((CurrCountTransparencySurf >= RENDER_LAYER_TRANSPARENT ? DS_RT_SCENELIGHT : DS_RT_SCENELIGHT2))->GetSurfaceLevel(0, &ComLightSurf); - GData::DXDevice->SetRenderTarget(0, ComLightSurf); - GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); - GData::DXDevice->SetTexture(0, SML_DSGetRT((CurrCountTransparencySurf >= RENDER_LAYER_TRANSPARENT ? DS_RT_SCENELIGHT2 : DS_RT_SCENELIGHT))); + SGCore_GbufferGetRT((iCurrCountTransparencySurf >= RENDER_LAYER_TRANSPARENT ? DS_RT_SCENELIGHT : DS_RT_SCENELIGHT2))->GetSurfaceLevel(0, &pComLightSurf); + gdata::pDXDevice->SetRenderTarget(0, pComLightSurf); + gdata::pDXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0, 0); + gdata::pDXDevice->SetTexture(0, SGCore_GbufferGetRT((iCurrCountTransparencySurf >= RENDER_LAYER_TRANSPARENT ? DS_RT_SCENELIGHT2 : DS_RT_SCENELIGHT))); - SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut); - SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::ScreenOut); + SGCore_ShaderBind(SHADER_TYPE_VERTEX, gdata::shaders_id::vs::idScreenOut); + SGCore_ShaderBind(SHADER_TYPE_PIXEL, gdata::shaders_id::ps::idScreenOut); SGCore_ScreenQuadDraw(); - mem_release(ComLightSurf); + mem_release(pComLightSurf); SGCore_ShaderUnBind(); - GData::DXDevice->SetRenderTarget(0, BackBuf); - mem_release(BackBuf); -} - -void SXRenderFunc::ComToneMapping(DWORD timeDelta) -{ - //обработка tone mapping - static const float * r_hdr_adapted_coef = GET_PCVAR_FLOAT("r_hdr_adapted_coef"); - SML_LigthsToneMappingCom(timeDelta, (r_hdr_adapted_coef ? (*r_hdr_adapted_coef) : 0.03f)); + gdata::pDXDevice->SetRenderTarget(0, pBackBuf); + mem_release(pBackBuf); } - - -void SXRenderFunc::RenderParticles(DWORD timeDelta) +void rfunc::RenderParticles(DWORD timeDelta) { - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); - GData::DXDevice->SetRenderState(D3DRS_ALPHAREF, RENDER_PARTICLES_ALPHATEST_VALUE); - GData::DXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHAREF, RENDER_PARTICLES_ALPHATEST_VALUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); SetSamplerFilter(0, 3, D3DTEXF_LINEAR); SetSamplerAddress(0, 3, D3DTADDRESS_WRAP); SPE_EffectRenderAll(timeDelta); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); } -void SXRenderFunc::RenderPostProcess(DWORD timeDelta) +void rfunc::RenderMainPostProcess(DWORD timeDelta) { static const int *r_win_width = GET_PCVAR_INT("r_win_width"); static const int *r_win_height = GET_PCVAR_INT("r_win_height"); @@ -1445,79 +1429,98 @@ void SXRenderFunc::RenderPostProcess(DWORD timeDelta) SPP_Update(); SPP_RTNull(); + //********************************************************************** + static const int * pp_ssao = GET_PCVAR_INT("pp_ssao"); if (pp_ssao && (*pp_ssao) > 0) - SPP_RenderSSAO(&float4_t(0.3f, 0.1f, 0.8f, 0.3f / GData::NearFar.y), (*pp_ssao)); + SPP_RenderSSAO(&float4_t(0.3f, 0.1f, 0.8f, 0.3f / gdata::vNearFar.y), (*pp_ssao)); + + //********************************************************************** //создаем статический вектор цвета тумана, затем получаем квар который int типа который будет содеражть указатель на этот вектор, и в него записываем указатель на вектор цвета тумана //static float3_t fog_color(0.5, 0.5, 0.5); static UINT_PTR *pp_fog_color = GET_PCVAR_POINTER("pp_fog_color"); - static float3_t *fog_color; + static float3_t *fog_color; fog_color = (float3_t*)(*pp_fog_color); + //********************************************************************** + static const float * pp_fog_density = GET_PCVAR_FLOAT("pp_fog_density"); - if (pp_fog_density && *pp_fog_density > 0.f ) + if (pp_fog_density && *pp_fog_density > 0.f) SPP_RenderFogLinear(fog_color, *pp_fog_density); - + + //********************************************************************** static const bool * pp_bloom = GET_PCVAR_BOOL("pp_bloom"); if (pp_bloom && (*pp_bloom)) SPP_RenderBloom(&float3_t(1, 0.7, 1.0)); + //********************************************************************** + float3 vGLpos; + float3 vGLcolor; - float3 tmpPosition; - float3 tmpColor; - - ID GlobalLight = SML_LigthsGetGlobal(); - if (GlobalLight > -1) + ID idGlobalLight = SLight_GetGlobal(); + if (idGlobalLight > -1) { - SML_LigthsGetColor(GlobalLight, &tmpColor); - SML_LigthsGetPos(GlobalLight, &tmpPosition, true); + SLight_GetColor(idGlobalLight, &vGLcolor); + SLight_GetPos(idGlobalLight, &vGLpos, true); - SPP_UpdateSun((SML_LigthsGetEnable(GlobalLight) ? &tmpPosition : 0)); + SPP_UpdateSun((SLight_GetEnable(idGlobalLight) ? &vGLpos : 0)); - if (!SML_LigthsGetCastGlobalShadow()) - SPP_RenderSun(&float4_t(tmpColor.x, tmpColor.y, tmpColor.z, SML_LigthsGetPower(GlobalLight))); + if (!SLight_GetCastGlobalShadow()) + SPP_RenderSun(&float4_t(vGLcolor.x, vGLcolor.y, vGLcolor.z, SLight_GetPower(idGlobalLight))); } else SPP_UpdateSun(0); + //********************************************************************** + static const bool * pp_lensflare = GET_PCVAR_BOOL("pp_lensflare"); static const bool * pp_lensflare_usebloom = GET_PCVAR_BOOL("pp_lensflare_usebloom"); - if (pp_lensflare && (*pp_lensflare) && GlobalLight >= 0) - SPP_RenderLensFlare(&float3_t(0.25f, 0.3f, 0.2f), &float4_t(tmpColor.x, tmpColor.y, tmpColor.z, (SML_LigthsGetCastGlobalShadow() ? 0 : SML_LigthsGetPower(GlobalLight))), (pp_lensflare_usebloom ? (*pp_lensflare_usebloom) : false)); + if (pp_lensflare && (*pp_lensflare) && idGlobalLight >= 0) + SPP_RenderLensFlare(&float3_t(0.25f, 0.3f, 0.2f), &float4_t(vGLcolor.x, vGLcolor.y, vGLcolor.z, (SLight_GetCastGlobalShadow() ? 0 : SLight_GetPower(idGlobalLight))), (pp_lensflare_usebloom ? (*pp_lensflare_usebloom) : false)); + //********************************************************************** SPP_RenderDOF(&float4_t(0, 100, 0, 20), 0); - + //********************************************************************** static const bool * pp_nfaa = GET_PCVAR_BOOL("pp_nfaa"); if (pp_nfaa && (*pp_nfaa)) SPP_RenderNFAA(&float3_t(1, 1, 0)); + //********************************************************************** + static const bool * pp_dlaa = GET_PCVAR_BOOL("pp_dlaa"); if (pp_dlaa && (*pp_dlaa)) SPP_RenderDLAA(); + //********************************************************************** + static const bool * pp_motionblur = GET_PCVAR_BOOL("pp_motionblur"); static const float * pp_motionblur_coef = GET_PCVAR_FLOAT("pp_motionblur_coef"); if (pp_motionblur && (*pp_motionblur)) SPP_RenderMotionBlur((pp_motionblur_coef ? (*pp_motionblur_coef) : 0.1), timeDelta); +} - +void rfunc::RenderFinalPostProcess(DWORD timeDelta) +{ static const float * pp_whiteblack_coef = GET_PCVAR_FLOAT("pp_whiteblack_coef"); if (pp_whiteblack_coef && (*pp_whiteblack_coef) > 0.f) SPP_RenderWhiteBlack(*pp_whiteblack_coef); + //********************************************************************** static const float * pp_sepia_coef = GET_PCVAR_FLOAT("pp_sepia_coef"); if (pp_sepia_coef && (*pp_sepia_coef) > 0.f) SPP_RenderSepia((*pp_sepia_coef)); + //********************************************************************** + static const float * pp_contrast = GET_PCVAR_FLOAT("pp_contrast"); static const float * pp_gamma = GET_PCVAR_FLOAT("pp_gamma"); static const float * pp_bright = GET_PCVAR_FLOAT("pp_bright"); @@ -1526,16 +1529,16 @@ void SXRenderFunc::RenderPostProcess(DWORD timeDelta) SPP_RenderCBG(&float3_t((*pp_contrast), (*pp_gamma), (*pp_bright))); } -void SXRenderFunc::ShaderRegisterData() +void rfunc::ShaderRegisterData() { - static float4_t tmpnull[256]; - memset(tmpnull, 0, sizeof(float4_t)* 256); - GData::DXDevice->SetVertexShaderConstantF(0, (float*)&tmpnull, 256); - GData::DXDevice->SetPixelShaderConstantF(0, (float*)&tmpnull, 256); + static float4_t aNull[256]; + memset(aNull, 0, sizeof(float4_t)* 256); + gdata::pDXDevice->SetVertexShaderConstantF(0, (float*)&aNull, 256); + gdata::pDXDevice->SetPixelShaderConstantF(0, (float*)&aNull, 256); } -void SXRenderFunc::UpdateReflectionScene(DWORD timeDelta) +void rfunc::UpdateReflectionScene(DWORD timeDelta) { static const int *r_reflection_render = GET_PCVAR_INT("r_reflection_render"); @@ -1546,256 +1549,256 @@ void SXRenderFunc::UpdateReflectionScene(DWORD timeDelta) { for (int k = 0; k < SGeom_ModelsMGetCountGroups(i); ++k) { - ID idmat = SGeom_ModelsMGetGroupIDMat(i, k); - MTLTYPE_REFLECT typeref = SML_MtlGetTypeReflection(SGeom_ModelsMGetGroupIDMat(i, k)); - D3DXPLANE plane; - float3_t center; - if (typeref == MTLTYPE_REFLECT_PLANE) + ID idMat = SGeom_ModelsMGetGroupIDMat(i, k); + MTLTYPE_REFLECT typeReflection = SMtrl_MtlGetTypeReflection(SGeom_ModelsMGetGroupIDMat(i, k)); + D3DXPLANE oPlane; + float3_t vCenter; + + if (typeReflection == MTLTYPE_REFLECT_PLANE) { - - if (!SML_MtlRefIsAllowedRender(idmat)) + if (!SMtrl_RefIsAllowedRender(idMat)) { - SML_MtlRefUpdateCountUpdate(idmat, &((float3_t)GData::ConstCurrCamPos)); + SMtrl_RefUpdateCountUpdate(idMat, &((float3_t)gdata::vConstCurrCamPos)); continue; } - SGeom_ModelsMGetGroupPlane(i, k, &plane); - SGeom_ModelsMGetGroupCenter(i, k, ¢er); - SML_MtlRefPreRenderPlane(idmat, &plane); + SGeom_ModelsMGetGroupPlane(i, k, &oPlane); + SGeom_ModelsMGetGroupCenter(i, k, &vCenter); + SMtrl_RefPreRenderPlane(idMat, &oPlane); SetSamplerFilter(0, 16, D3DTEXF_LINEAR); SetSamplerAddress(0, 16, D3DTADDRESS_WRAP); Core_RBoolSet(G_RI_BOOL_CLIPPLANE0, true); - Core_RFloat3Set(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &float3(plane.a, plane.b, plane.c)); - Core_RFloat3Set(G_RI_FLOAT3_CLIPPLANE0_POINT, &float3(center)); + Core_RFloat3Set(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &float3(oPlane.a, oPlane.b, oPlane.c)); + Core_RFloat3Set(G_RI_FLOAT3_CLIPPLANE0_POINT, &float3(vCenter)); if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0) >= 0) - SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0), false, i, k); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, 0) >= 0) + SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, 0), false, i, k); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GREEN, 0) >= 0) - SGeom_GreenRender(timeDelta, &float3(center), GREEN_TYPE_ALL, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GREEN, 0)); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GREEN, 0) >= 0) + SGeom_GreenRender(timeDelta, &float3(vCenter), GREEN_TYPE_ALL, SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GREEN, 0)); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_ANIM) { - SXAnim_Render(); + SXAnim_Render(); } SGCore_ShaderUnBind(); if (SGCore_SkyBoxIsCr()) { - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - GData::DXDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - GData::DXDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + gdata::pDXDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + gdata::pDXDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - GData::DXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTALPHA); - GData::DXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); SetSamplerAddress(0, 2, D3DTADDRESS_CLAMP); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &GData::MRefPlaneSkyProj); - SGCore_SkyBoxRender(timeDelta, &float3(center)); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &gdata::mRefPlaneSkyProj); + SGCore_SkyBoxRender(timeDelta, &float3(vCenter)); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } - SML_MtlRefPostRenderPlane(idmat); + SMtrl_RefPostRenderPlane(idMat); } - else if (typeref == MTLTYPE_REFLECT_CUBE_STATIC || typeref == MTLTYPE_REFLECT_CUBE_DYNAMIC) + else if (typeReflection == MTLTYPE_REFLECT_CUBE_STATIC || typeReflection == MTLTYPE_REFLECT_CUBE_DYNAMIC) { - SGeom_ModelsMGetGroupCenter(i, k, ¢er); + SGeom_ModelsMGetGroupCenter(i, k, &vCenter); float3_t min, max; SGeom_ModelsMGetGroupMin(i, k, &min); SGeom_ModelsMGetGroupMax(i, k, &max); - SML_MtlRefSetMinMax(idmat, &min, &max); + SMtrl_RefSetMinMax(idMat, &min, &max); - if (!SML_MtlRefIsAllowedRender(idmat)) + if (!SMtrl_RefIsAllowedRender(idMat)) { - SML_MtlRefUpdateCountUpdate(idmat, &((float3_t)GData::ConstCurrCamPos)); + SMtrl_RefUpdateCountUpdate(idMat, &((float3_t)gdata::vConstCurrCamPos)); continue; } - SML_MtlRefCubeBeginRender(idmat, ¢er); + SMtrl_RefCubeBeginRender(idMat, &vCenter); for (int j = 0; j < 6; j++) { Core_RMatrixSet(G_RI_MATRIX_WORLD, &SMMatrixIdentity()); - SML_MtlRefCubePreRender(idmat, j, &(SMMatrixIdentity())); + SMtrl_RefCubePreRender(idMat, j, &(SMMatrixIdentity())); SetSamplerFilter(0, 16, D3DTEXF_LINEAR); SetSamplerAddress(0, 16, D3DTADDRESS_WRAP); if (r_reflection_render && (*r_reflection_render) != 0) { - //если статические кубические отражения - if (SML_MtlGetTypeReflection(idmat) == MTLTYPE_REFLECT_CUBE_STATIC) - { - //тогда считаем в массив камеры + //если статические кубические отражения + if (SMtrl_MtlGetTypeReflection(idMat) == MTLTYPE_REFLECT_CUBE_STATIC) + { + //тогда считаем в массив камеры if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM) { - SGeom_ModelsComVisible(SML_MtlRefGetfrustum(idmat, j), &float3(center), GData::DefaultGeomIDArr); - SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, GData::DefaultGeomIDArr, false, i, k); + SGeom_ModelsComVisible(SMtrl_RefGetfrustum(idMat, j), &float3(vCenter), gdata::idDefaultGeomArr); + SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, gdata::idDefaultGeomArr, false, i, k); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN) { - SGeom_GreenComVisible(SML_MtlRefGetfrustum(idmat, j), &float3(center), GData::DefaultGreenIDArr); - SGeom_GreenRender(timeDelta, &float3(center), GREEN_TYPE_ALL, GData::DefaultGreenIDArr); - } + SGeom_GreenComVisible(SMtrl_RefGetfrustum(idMat, j), &float3(vCenter), gdata::idDefaultGreenArr); + SGeom_GreenRender(timeDelta, &float3(vCenter), GREEN_TYPE_ALL, gdata::idDefaultGreenArr); + } } - else - { + else + { if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k) >= 0) - SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k), false, i, k); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, k) >= 0) + SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GEOM, k), false, i, k); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN) { - if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GREEN, k) >= 0) - SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_ALL, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GREEN, k)); + if (SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GREEN, k) >= 0) + SGeom_GreenRender(timeDelta, &gdata::vConstCurrCamPos, GREEN_TYPE_ALL, SMtrl_RefGetIDArr(idMat, RENDER_IDARRCOM_GREEN, k)); } if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_ANIM) { - SXAnim_Render(); - } + SXAnim_Render(); + } } } if (SGCore_SkyBoxIsCr()) { - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - GData::DXDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - GData::DXDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + gdata::pDXDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + gdata::pDXDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - GData::DXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTALPHA); - GData::DXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTALPHA); + gdata::pDXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - SetSamplerAddress(0, 2, D3DTADDRESS_CLAMP); + gdata::pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + SetSamplerAddress(0, 2, D3DTADDRESS_CLAMP); - Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &GData::MRefCubeSkyProj); + Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &gdata::mRefCubeSkyProj); - SGCore_SkyBoxRender(timeDelta, &float3(center)); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + SGCore_SkyBoxRender(timeDelta, &float3(vCenter)); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - SML_MtlRefCubePostRender(idmat, j); + SMtrl_RefCubePostRender(idMat, j); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - } + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + } } - SML_MtlRefCubeEndRender(idmat, &((float3_t)GData::ConstCurrCamPos)); + SMtrl_RefCubeEndRender(idMat, &((float3_t)gdata::vConstCurrCamPos)); } } } } -void SXRenderFunc::UpdateReflectionSimModel(DWORD timeDelta) +void rfunc::UpdateReflectionSimModel(DWORD timeDelta) { - ID idmat = GData::Editors::SimModel->getIdMtl(); - MTLTYPE_REFLECT typeref = SML_MtlGetTypeReflection(idmat); - D3DXPLANE plane; - float3_t center; - GData::Editors::SimModel->getCenter(¢er); + ID idMat = gdata::Editors::pSimModel->getIdMtl(); + MTLTYPE_REFLECT typeReflection = SMtrl_MtlGetTypeReflection(idMat); + D3DXPLANE oPlane; + float3_t vCenter; + gdata::Editors::pSimModel->getCenter(&vCenter); SGCore_ShaderUnBind(); - if (typeref == MTLTYPE_REFLECT_PLANE) + if (typeReflection == MTLTYPE_REFLECT_PLANE) { - GData::Editors::SimModel->getPlane(&plane); - SML_MtlRefPreRenderPlane(idmat, &plane); + gdata::Editors::pSimModel->getPlane(&oPlane); + SMtrl_RefPreRenderPlane(idMat, &oPlane); SetSamplerFilter(0, 16, D3DTEXF_LINEAR); SetSamplerAddress(0, 16, D3DTADDRESS_WRAP); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &GData::MRefPlaneSkyProj); - SGCore_SkyBoxRender(timeDelta, &float3(center)); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &gdata::mRefPlaneSkyProj); + SGCore_SkyBoxRender(timeDelta, &float3(vCenter)); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - SML_MtlRefPostRenderPlane(idmat); + SMtrl_RefPostRenderPlane(idMat); } - else if (typeref == MTLTYPE_REFLECT_CUBE_STATIC || typeref == MTLTYPE_REFLECT_CUBE_DYNAMIC) + else if (typeReflection == MTLTYPE_REFLECT_CUBE_STATIC || typeReflection == MTLTYPE_REFLECT_CUBE_DYNAMIC) { - SML_MtlRefCubeBeginRender(idmat, ¢er); + SMtrl_RefCubeBeginRender(idMat, &vCenter); - for (int j = 0; j<6; j++) + for (int j = 0; j<6; ++j) { Core_RMatrixGet(G_RI_MATRIX_WORLD, &SMMatrixIdentity()); - SML_MtlRefCubePreRender(idmat, j, &(SMMatrixIdentity())); + SMtrl_RefCubePreRender(idMat, j, &(SMMatrixIdentity())); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &GData::MRefCubeSkyProj); - SGCore_SkyBoxRender(timeDelta, &float3(center)); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &gdata::mRefCubeSkyProj); + SGCore_SkyBoxRender(timeDelta, &float3(vCenter)); - GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); - SML_MtlRefCubePostRender(idmat, j); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + SMtrl_RefCubePostRender(idMat, j); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); } - SML_MtlRefCubeEndRender(idmat, &((float3_t)GData::ConstCurrCamPos)); + SMtrl_RefCubeEndRender(idMat, &((float3_t)gdata::vConstCurrCamPos)); } } -void SXRenderFunc::UpdateReflection(DWORD timeDelta, bool isRenderSimulation) +void rfunc::UpdateReflection(DWORD timeDelta, bool isRenderSimulation) { Core_RIntSet(G_RI_INT_RENDERSTATE, RENDER_STATE_FREE); Core_RMatrixSet(G_RI_MATRIX_WORLD, &SMMatrixIdentity()); - Core_RMatrixSet(G_RI_MATRIX_VIEW, &GData::MCamView); + Core_RMatrixSet(G_RI_MATRIX_VIEW, &gdata::mCamView); - GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); if (!isRenderSimulation) - SXRenderFunc::UpdateReflectionScene(timeDelta); + rfunc::UpdateReflectionScene(timeDelta); else - SXRenderFunc::UpdateReflectionSimModel(timeDelta); + rfunc::UpdateReflectionSimModel(timeDelta); } //########################################################################## -void SXRenderFunc::RenderEditorMain() +void rfunc::RenderEditorMain() { - if (GData::Editors::ObjGrid && GData::Editors::RenderGrid) + if (gdata::Editors::pGrid && gdata::Editors::canRenderGrid) { - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - GData::Editors::ObjGrid->render(); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::Editors::pGrid->render(); } - if (GData::Editors::ObjAxesStatic && GData::Editors::RenderAxesStatic) + if (gdata::Editors::pAxesStatic && gdata::Editors::canRenderAxesStatic) { - GData::DXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); - GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); - GData::Editors::ObjAxesStatic->render(); + gdata::pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); + gdata::pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE); + gdata::Editors::pAxesStatic->render(); } } diff --git a/source/render/render_func.h b/source/render/render_func.h index 04bb2bea632e168cd1d4aaaa0523d39d4897969a..9a2b9ed34748cb58394899eed944941536eeb49f 100644 --- a/source/render/render_func.h +++ b/source/render/render_func.h @@ -27,7 +27,7 @@ See the license in LICENSE #include <render/gdata.h> #include <geom/sxgeom.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include <aigrid/sxaigrid.h> #include <physics/sxphysics.h> #include <game/sxgame.h> @@ -44,17 +44,17 @@ enum REFLECTION_RENDER }; //! пространство имен с орагнизацией рендера -namespace SXRenderFunc +namespace rfunc { //быстрая реализация фильтрации и адресации //{ //индифидуально для регистра - inline void SetSamplerFilter(DWORD id, DWORD value); - inline void SetSamplerAddress(DWORD id, DWORD value); + inline void SetSamplerFilter(DWORD dwId, DWORD dwValue); + inline void SetSamplerAddress(DWORD dwId, DWORD dwValue); //для указанного промежутка групп регистров - inline void SetSamplerFilter(DWORD begin_id, DWORD end_id, DWORD value); - inline void SetSamplerAddress(DWORD begin_id, DWORD end_id, DWORD value); + inline void SetSamplerFilter(DWORD dwIdStart, DWORD dwIdFisnish, DWORD dwValue); + inline void SetSamplerAddress(DWORD dwIdStart, DWORD dwIdFisnish, DWORD dwValue); void SetRenderSceneFilter(); void SetRenderSceneFilterUn(); @@ -103,19 +103,15 @@ namespace SXRenderFunc //! объединение слоев прозрачности void UnionLayers(); - - //! применение тонмаппинга к рт - //void ApplyToneMapping(); - - //! просчет тонмаппинга - void ComToneMapping(DWORD timeDelta); //! отрисовка партиклов (эффектов) void RenderParticles(DWORD timeDelta); - //! отрисовка постпроцесса - void RenderPostProcess(DWORD timeDelta); + //! отрисовка основного постпроцесса + void RenderMainPostProcess(DWORD timeDelta); + + void RenderFinalPostProcess(DWORD timeDelta); void ShaderRegisterData(); @@ -139,29 +135,6 @@ namespace SXRenderFunc void ChangeModeWindow(); void FullScreenChangeSizeAbs(); - - //! время задержек/ожидания выполнения некоторых функций рендера - /*namespace Delay - { - extern int64_t UpdateVisibleForCamera; - extern int64_t UpdateVisibleForLight; - extern int64_t UpdateVisibleForReflection; - - extern int64_t UpdateShadow; - extern int64_t UpdateParticles; - extern int64_t RenderMRT; - extern int64_t ComLighting; - extern int64_t PostProcess; - extern int64_t ComReflection; - extern int64_t GeomSortGroup; - - extern int64_t Present; - - extern int64_t FreeVal; - extern float FreeValF1; - extern float FreeValF2; - extern float FreeValF3; - };*/ }; #endif diff --git a/source/render/simulation_model.cpp b/source/render/simulation_model.cpp index 118dc660067d5702afa0cd73e3b59dc4a6af4794..801d57c82a0f14b8af351c149fbd451acdb6ad51 100644 --- a/source/render/simulation_model.cpp +++ b/source/render/simulation_model.cpp @@ -19,7 +19,7 @@ CSimulationModel::CSimulationModel() D3DDECL_END() }; - GData::DXDevice->CreateVertexDeclaration(layoutstatic, &m_pVertexDeclarationStatic); + gdata::pDXDevice->CreateVertexDeclaration(layoutstatic, &m_pVertexDeclarationStatic); D3DVERTEXELEMENT9 InstanceGreen[] = @@ -33,7 +33,7 @@ CSimulationModel::CSimulationModel() D3DDECL_END() }; - GData::DXDevice->CreateVertexDeclaration(InstanceGreen, &m_pVertexDeclarationGreen); + gdata::pDXDevice->CreateVertexDeclaration(InstanceGreen, &m_pVertexDeclarationGreen); D3DVERTEXELEMENT9 layoutDynamic[] = { @@ -44,9 +44,9 @@ CSimulationModel::CSimulationModel() { 0, 36, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 }, D3DDECL_END() }; - GData::DXDevice->CreateVertexDeclaration(layoutDynamic, &m_pVertexDeclarationSkin); + gdata::pDXDevice->CreateVertexDeclaration(layoutDynamic, &m_pVertexDeclarationSkin); - GData::DXDevice->CreateVertexBuffer( + gdata::pDXDevice->CreateVertexBuffer( 1 * sizeof(CGreenDataVertex), /*D3DUSAGE_DYNAMIC | */D3DUSAGE_WRITEONLY, 0, @@ -147,7 +147,7 @@ void CSimulationModel::add(const char *szPath) m_aModels.push_back(new CModel(pStaticModel, &Center, &Max, &Min, &Plane)); IDirect3DVertexBuffer9* Anim; - GData::DXDevice->CreateVertexBuffer( + gdata::pDXDevice->CreateVertexBuffer( pStaticModel->m_uiAllVertexCount * sizeof(vertex_animated), D3DUSAGE_WRITEONLY, 0, @@ -223,9 +223,9 @@ void CSimulationModel::render(DWORD timeDelta) void CSimulationModel::renderStatic(DWORD timeDelta) { - GData::DXDevice->SetStreamSource(0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pVertexBuffer, 0, sizeof(vertex_static)); - GData::DXDevice->SetIndices(m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexBuffer); - GData::DXDevice->SetVertexDeclaration(m_pVertexDeclarationStatic); + gdata::pDXDevice->SetStreamSource(0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pVertexBuffer, 0, sizeof(vertex_static)); + gdata::pDXDevice->SetIndices(m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexBuffer); + gdata::pDXDevice->SetVertexDeclaration(m_pVertexDeclarationStatic); SGCore_MtlSet(m_idMtrl, &m_mWorld); SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pVertexCount[0], 0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexCount[0] / 3); @@ -234,14 +234,14 @@ void CSimulationModel::renderStatic(DWORD timeDelta) void CSimulationModel::renderGreen(DWORD timeDelta) { - GData::DXDevice->SetStreamSourceFreq(0, (D3DSTREAMSOURCE_INDEXEDDATA | 1)); + gdata::pDXDevice->SetStreamSourceFreq(0, (D3DSTREAMSOURCE_INDEXEDDATA | 1)); - GData::DXDevice->SetStreamSourceFreq(1, (D3DSTREAMSOURCE_INSTANCEDATA | 1)); - GData::DXDevice->SetStreamSource(1, m_pTransVertBufGreen, 0, sizeof(CGreenDataVertex)); + gdata::pDXDevice->SetStreamSourceFreq(1, (D3DSTREAMSOURCE_INSTANCEDATA | 1)); + gdata::pDXDevice->SetStreamSource(1, m_pTransVertBufGreen, 0, sizeof(CGreenDataVertex)); - GData::DXDevice->SetStreamSource(0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pVertexBuffer, 0, sizeof(vertex_static)); - GData::DXDevice->SetIndices(m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexBuffer); - GData::DXDevice->SetVertexDeclaration(m_pVertexDeclarationGreen); + gdata::pDXDevice->SetStreamSource(0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pVertexBuffer, 0, sizeof(vertex_static)); + gdata::pDXDevice->SetIndices(m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexBuffer); + gdata::pDXDevice->SetVertexDeclaration(m_pVertexDeclarationGreen); long jCountIndex = 0; @@ -251,8 +251,8 @@ void CSimulationModel::renderGreen(DWORD timeDelta) Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + ((m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexCount[0] / 3) * 1)); jCountIndex += m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexCount[0]; - GData::DXDevice->SetStreamSourceFreq(0, 1); - GData::DXDevice->SetStreamSourceFreq(1, 1); + gdata::pDXDevice->SetStreamSourceFreq(0, 1); + gdata::pDXDevice->SetStreamSourceFreq(1, 1); } void CSimulationModel::renderSkin(DWORD timeDelta) @@ -261,12 +261,12 @@ void CSimulationModel::renderSkin(DWORD timeDelta) mbs.position = float4(0, 0, 0, 1); mbs.orient = SMQuaternion(); - GData::DXDevice->SetStreamSource(0, m_aModels[m_iCurrRenderModel]->m_pAnim, 0, sizeof(vertex_animated)); - GData::DXDevice->SetIndices(m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexBuffer); - GData::DXDevice->SetVertexDeclaration(m_pVertexDeclarationSkin); + gdata::pDXDevice->SetStreamSource(0, m_aModels[m_iCurrRenderModel]->m_pAnim, 0, sizeof(vertex_animated)); + gdata::pDXDevice->SetIndices(m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexBuffer); + gdata::pDXDevice->SetVertexDeclaration(m_pVertexDeclarationSkin); SGCore_MtlSet(m_idMtrl, &m_mWorld); - GData::DXDevice->SetVertexShaderConstantF(16, (float*)&mbs, 2); + gdata::pDXDevice->SetVertexShaderConstantF(16, (float*)&mbs, 2); SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pVertexCount[0], 0, m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexCount[0] / 3); Core_RIntSet(G_RI_INT_COUNT_POLY, Core_RIntGet(G_RI_INT_COUNT_POLY) + m_aModels[m_iCurrRenderModel]->m_pModel->m_pIndexCount[0] / 3); } \ No newline at end of file diff --git a/source/render/simulation_model.h b/source/render/simulation_model.h index b7b8d5094993dd78b582b564bb5952e5f51f8213..7c228037a51eba7080ab7a28a9ac30bb27bedd24 100644 --- a/source/render/simulation_model.h +++ b/source/render/simulation_model.h @@ -21,7 +21,7 @@ See the license in LICENSE #define SM_D3D_CONVERSIONS #include <common/SXMath.h> #include <geom/sxgeom.h> -#include <mtllight/sxmtllight.h> +#include <mtrl/sxmtrl.h> #include <anim/sxanim.h> #include <render/gdata.h> diff --git a/source/render/sxrender.cpp b/source/render/sxrender.cpp index 9e4fe66fcc4ba462ad5d6214f539a12b1118f1fc..abfa16fbe3835d4a9dfe0b8bc60ba7857e621f64 100644 --- a/source/render/sxrender.cpp +++ b/source/render/sxrender.cpp @@ -18,7 +18,7 @@ See the license in LICENSE report_func g_fnReportf = DefReport; #endif -#define SR_PRECOND(retval) if(!GData::DXDevice){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxrender is not init", GEN_MSG_LOCATION); return retval;} +#define SR_PRECOND(retval) if(!gdata::pDXDevice){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - sxrender is not init", GEN_MSG_LOCATION); return retval;} //########################################################################## @@ -47,40 +47,40 @@ SX_LIB_API void SRender_0Create(const char *szName, HWND hWnd3D, HWND hWndParent } } - GData::Handle3D = hWnd3D; - GData::HandleParent3D = hWndParent3D; + gdata::hHandle3D = hWnd3D; + gdata::hHandleParent3D = hWndParent3D; - GData::DXDevice = SGCore_GetDXDevice(); + gdata::pDXDevice = SGCore_GetDXDevice(); - GData::ObjCamera = SGCore_CrCamera(); - GData::ObjCamera->setFOV(GData::ProjFov); + gdata::pCamera = SGCore_CrCamera(); + gdata::pCamera->setFOV(gdata::fProjFov); - GData::InitAllMatrix(); + gdata::InitAllMatrix(); - GData::IDsShaders::InitAllShaders(); + gdata::shaders_id::InitAllShaders(); //********************** - GData::Editors::SimModel = new CSimulationModel(); + gdata::Editors::pSimModel = new CSimulationModel(); - GData::Editors::ObjGrid = new CGrid(); - GData::Editors::ObjGrid->create(100, 100, D3DCOLOR_ARGB(255, 200, 200, 200)); + gdata::Editors::pGrid = new CGrid(); + gdata::Editors::pGrid->create(100, 100, D3DCOLOR_ARGB(255, 200, 200, 200)); - GData::Editors::ObjAxesStatic = new CAxesStatic(); - GData::Editors::ObjAxesStatic->create(1); + gdata::Editors::pAxesStatic = new CAxesStatic(); + gdata::Editors::pAxesStatic->create(1); - GData::Editors::RenderGrid = GData::Editors::RenderAxesStatic = false; + gdata::Editors::canRenderGrid = gdata::Editors::canRenderAxesStatic = false; - /*GData::Editors::RenderBoundBox = GData::Editors::RenderBoundSphere = GData::Editors::RenderBoundCone = false; + /*gdata::Editors::RenderBoundBox = gdata::Editors::RenderBoundSphere = gdata::Editors::RenderBoundCone = false; - D3DXCreateBox(GData::DXDevice, 1, 1, 1, &GData::Editors::FigureBox, 0); - D3DXCreateSphere(GData::DXDevice, 1, 20, 20, &GData::Editors::FigureSphere, 0); + D3DXCreateBox(gdata::pDXDevice, 1, 1, 1, &gdata::Editors::FigureBox, 0); + D3DXCreateSphere(gdata::pDXDevice, 1, 20, 20, &gdata::Editors::FigureSphere, 0); - GData::Editors::vFigureConeParam.x = 1; - GData::Editors::vFigureConeParam.y = 0.1; - GData::Editors::vFigureConeParam.z = 1; + gdata::Editors::vFigureConeParam.x = 1; + gdata::Editors::vFigureConeParam.y = 0.1; + gdata::Editors::vFigureConeParam.z = 1; - SGCore_FCreateCone(GData::Editors::vFigureConeParam.x, GData::Editors::vFigureConeParam.y, GData::Editors::vFigureConeParam.z, &GData::Editors::FigureCone, 20); + SGCore_FCreateCone(gdata::Editors::vFigureConeParam.x, gdata::Editors::vFigureConeParam.y, gdata::Editors::vFigureConeParam.z, &gdata::Editors::FigureCone, 20); */ //*********************** @@ -97,7 +97,7 @@ SX_LIB_API void SRender_0Create(const char *szName, HWND hWnd3D, HWND hWndParent SelectMaterial->UnlockRect(0); //SGCore_LoadTexLoadTextures(); - GData::IDSelectTex = SGCore_LoadTexCreate("select_material__", SelectMaterial); + gdata::idSelectTex = SGCore_LoadTexCreate("select_material__", SelectMaterial); //SGCore_LoadTexLoadTextures(); } @@ -109,106 +109,101 @@ SX_LIB_API void SRender_AKill() { SR_PRECOND(_VOID); - /*mem_delete(GData::Editors::SimModel); + /*mem_delete(gdata::Editors::SimModel); - mem_delete(GData::Editors::ObjGrid); - mem_delete(GData::Editors::ObjAxesStatic); - mem_release(GData::Editors::FigureBox); - mem_release(GData::Editors::FigureSphere); - mem_release(GData::Editors::FigureCone); - mem_delete(GData::Editors::ObjAxesHelper);*/ + mem_delete(gdata::Editors::ObjGrid); + mem_delete(gdata::Editors::ObjAxesStatic); + mem_release(gdata::Editors::FigureBox); + mem_release(gdata::Editors::FigureSphere); + mem_release(gdata::Editors::FigureCone); + mem_delete(gdata::Editors::ObjAxesHelper);*/ - mem_release(GData::ObjCamera); + mem_release(gdata::pCamera); } //########################################################################## SX_LIB_API HWND SRender_GetHandleWin3D() { - return GData::Handle3D; + return gdata::hHandle3D; } SX_LIB_API HWND SRender_GetParentHandleWin3D() { - return GData::HandleParent3D; + return gdata::hHandleParent3D; } SX_LIB_API void SRender_SetHandleWin3D(HWND hWnd) { - GData::Handle3D = hWnd; + gdata::hHandle3D = hWnd; } SX_LIB_API void SRender_SetParentHandleWin3D(HWND hWnd) { - GData::HandleParent3D = hWnd; + gdata::hHandleParent3D = hWnd; } SX_LIB_API void SRender_SetCamera(ICamera *pCamera) { - GData::ObjCamera = pCamera; + gdata::pCamera = pCamera; } SX_LIB_API ICamera* SRender_GetCamera() { - return GData::ObjCamera; + return gdata::pCamera; } SX_LIB_API void SRender_EditorCameraSetMove(bool canMove) { - GData::Editors::MoveCamera = canMove; + gdata::Editors::canMoveCamera = canMove; } SX_LIB_API bool SRender_EditorCameraGetMove() { - return GData::Editors::MoveCamera; + return gdata::Editors::canMoveCamera; } //************************************************************************** -/*SX_LIB_API void SRender_SimModelSetPosition(const float3 *pPos) -{ - -}*/ - SX_LIB_API void SRender_SimModelAdd(const char *szName) { - GData::Editors::SimModel->add(szName); + gdata::Editors::pSimModel->add(szName); } SX_LIB_API ID SRender_SimModelGetIDMtl() { - return GData::Editors::SimModel->getIdMtl(); + return gdata::Editors::pSimModel->getIdMtl(); } SX_LIB_API MTLTYPE_MODEL SRender_SimModelGetType() { - return GData::Editors::SimModel->m_type_model; + return gdata::Editors::pSimModel->m_type_model; } SX_LIB_API void SRender_SimModelSetType(MTLTYPE_MODEL type) { - GData::Editors::SimModel->m_type_model = type; + gdata::Editors::pSimModel->m_type_model = type; } SX_LIB_API void SRender_SimModelSetNumCurrModel(int iCurrNumModel) { - GData::Editors::SimModel->m_iCurrRenderModel = iCurrNumModel; + gdata::Editors::pSimModel->m_iCurrRenderModel = iCurrNumModel; } SX_LIB_API int SRender_SimModelGetNumCurrModel() { - return GData::Editors::SimModel->m_iCurrRenderModel; + return gdata::Editors::pSimModel->m_iCurrRenderModel; } SX_LIB_API void SRender_SimModelSetRotationY(float Rotation) { - GData::Editors::SimModel->m_vRotation.y = Rotation; + gdata::Editors::pSimModel->m_vRotation.y = Rotation; } SX_LIB_API float SRender_SimModelGetRotationY() { - return GData::Editors::SimModel->m_vRotation.y; + return gdata::Editors::pSimModel->m_vRotation.y; } //########################################################################## @@ -227,28 +222,28 @@ SX_LIB_API void SRender_UpdateEditorial(DWORD timeDelta) SX_LIB_API void SRender_EditorSetRenderGrid(bool canRender) { - GData::Editors::RenderGrid = canRender; + gdata::Editors::canRenderGrid = canRender; } SX_LIB_API bool SRender_EditorGetRenderGrid() { - return GData::Editors::RenderGrid; + return gdata::Editors::canRenderGrid; } SX_LIB_API void SRender_EditorSetRenderAxesStatic(bool canRender) { - GData::Editors::RenderAxesStatic = canRender; + gdata::Editors::canRenderAxesStatic = canRender; } SX_LIB_API bool SRender_EditorGetRenderAxesStatic() { - return GData::Editors::RenderAxesStatic; + return gdata::Editors::canRenderAxesStatic; } SX_LIB_API ID SRender_EditorGetSelectTex() { - return GData::IDSelectTex; + return gdata::idSelectTex; } //########################################################################## @@ -256,100 +251,100 @@ SX_LIB_API ID SRender_EditorGetSelectTex() SX_LIB_API void SRender_ComDeviceLost(bool isSetWindowSize) { - SXRenderFunc::ComDeviceLost(isSetWindowSize); + rfunc::ComDeviceLost(isSetWindowSize); } SX_LIB_API void SRender_ComVisibleForLight() { - SXRenderFunc::ComVisibleForLight(); + rfunc::ComVisibleForLight(); } SX_LIB_API void SRender_ComVisibleForCamera() { - SXRenderFunc::ComVisibleForCamera(); + rfunc::ComVisibleForCamera(); } SX_LIB_API void SRender_ComVisibleReflection() { - SXRenderFunc::ComVisibleReflection(); + rfunc::ComVisibleReflection(); } SX_LIB_API void SRender_UpdateView() { - SXRenderFunc::UpdateView(); + rfunc::UpdateView(); } SX_LIB_API int SRender_OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char *szStr) { - return SXRenderFunc::OutputDebugInfo(timeDelta, needGameTime, szStr); + return rfunc::OutputDebugInfo(timeDelta, needGameTime, szStr); } SX_LIB_API void SRender_BuildMRT(DWORD timeDelta, bool isRenderSimulation) { - SXRenderFunc::BuildMRT(timeDelta, isRenderSimulation); + rfunc::BuildMRT(timeDelta, isRenderSimulation); } SX_LIB_API void SRender_UpdateShadow(DWORD timeDelta) { - SXRenderFunc::UpdateShadow(timeDelta); + rfunc::UpdateShadow(timeDelta); } SX_LIB_API void SRender_UpdateReflection(DWORD timeDelta, bool isRenderSimulation) { - SXRenderFunc::UpdateReflection(timeDelta, isRenderSimulation); + rfunc::UpdateReflection(timeDelta, isRenderSimulation); } SX_LIB_API void SRender_UpdateReflectionScene(DWORD timeDelta) { - SXRenderFunc::UpdateReflectionScene(timeDelta); + rfunc::UpdateReflectionScene(timeDelta); } SX_LIB_API void SRender_UpdateReflectionSimModel(DWORD timeDelta) { - SXRenderFunc::UpdateReflectionSimModel(timeDelta); + rfunc::UpdateReflectionSimModel(timeDelta); } SX_LIB_API void SRender_RenderSky(DWORD timeDelta) { - SXRenderFunc::RenderSky(timeDelta); + rfunc::RenderSky(timeDelta); } SX_LIB_API void SRender_ComLighting(DWORD timeDelta) { - SXRenderFunc::ComLighting(timeDelta); + rfunc::ComLighting(timeDelta); } SX_LIB_API void SRender_UnionLayers() { - SXRenderFunc::UnionLayers(); + rfunc::UnionLayers(); } -SX_LIB_API void SRender_ComToneMapping(DWORD timeDelta) + +SX_LIB_API void SRender_RenderParticles(DWORD timeDelta) { - SXRenderFunc::ComToneMapping(timeDelta); + rfunc::RenderParticles(timeDelta); } - -SX_LIB_API void SRender_RenderParticles(DWORD timeDelta) +SX_LIB_API void SRender_RenderMainPostProcess(DWORD timeDelta) { - SXRenderFunc::RenderParticles(timeDelta); + rfunc::RenderMainPostProcess(timeDelta); } -SX_LIB_API void SRender_RenderPostProcess(DWORD timeDelta) +SX_LIB_API void SRender_RenderFinalPostProcess(DWORD timeDelta) { - SXRenderFunc::RenderPostProcess(timeDelta); + rfunc::RenderFinalPostProcess(timeDelta); } SX_LIB_API void SRender_ShaderRegisterData() { - SXRenderFunc::ShaderRegisterData(); + rfunc::ShaderRegisterData(); } SX_LIB_API void SRender_RenderEditorMain() { - SXRenderFunc::RenderEditorMain(); + rfunc::RenderEditorMain(); } //########################################################################## @@ -357,22 +352,22 @@ SX_LIB_API void SRender_RenderEditorMain() SX_LIB_API void SRender_SaveScreenShot() { - SXRenderFunc::SaveScreenShot(); + rfunc::SaveScreenShot(); } SX_LIB_API void SRender_SaveWorkTex() { - SXRenderFunc::SaveWorkTex(); + rfunc::SaveWorkTex(); } SX_LIB_API void SRender_ChangeModeWindow() { //LibReport(REPORT_MSG_LEVEL_NOTICE, "SRender_ChangeModeWindow\n"); - SXRenderFunc::ChangeModeWindow(); + rfunc::ChangeModeWindow(); //LibReport(REPORT_MSG_LEVEL_NOTICE, "SRender_ChangeModeWindow --\n"); } SX_LIB_API void SRender_FullScreenChangeSizeAbs() { - SXRenderFunc::FullScreenChangeSizeAbs(); + rfunc::FullScreenChangeSizeAbs(); } \ No newline at end of file diff --git a/source/render/sxrender.h b/source/render/sxrender.h index 775d3f9e6b4a3a523f2f8190beef89fa1a6af8e4..e84d20c2078312d9e76cc62ff162d4b4262eeac3 100644 --- a/source/render/sxrender.h +++ b/source/render/sxrender.h @@ -33,9 +33,15 @@ See the license in LICENSE #endif #if defined(_DEBUG) -#pragma comment(lib, "sxmtllight_d.lib") +#pragma comment(lib, "sxlight_d.lib") #else -#pragma comment(lib, "sxmtllight.lib") +#pragma comment(lib, "sxlight.lib") +#endif + +#if defined(_DEBUG) +#pragma comment(lib, "sxmtrl_d.lib") +#else +#pragma comment(lib, "sxmtrl.lib") #endif #if defined(_DEBUG) @@ -72,7 +78,8 @@ See the license in LICENSE #define SX_LIB_API extern "C" __declspec (dllimport) #include <gcore/sxgcore.h> #include <geom/sxgeom.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> +#include <mtrl/sxmtrl.h> #include <anim/sxanim.h> #include <pp/sxpp.h> #include <particles/sxparticles.h> @@ -360,15 +367,15 @@ SX_LIB_API void SRender_ComLighting(DWORD timeDelta); //! объединение слоев прозрачности SX_LIB_API void SRender_UnionLayers(); -//! просчет тонмаппинга -SX_LIB_API void SRender_ComToneMapping(DWORD timeDelta); - //! отрисовка партиклов (эффектов) SX_LIB_API void SRender_RenderParticles(DWORD timeDelta); -//! отрисовка постпроцесса -SX_LIB_API void SRender_RenderPostProcess(DWORD timeDelta); +//! отрисовка основного постпроцесса +SX_LIB_API void SRender_RenderMainPostProcess(DWORD timeDelta); + +//! отрисовка финального (после gui) постпроцесса +SX_LIB_API void SRender_RenderFinalPostProcess(DWORD timeDelta); //! очистка регистров шейдеров (были случаи когда не инициаилизировав определенный регист в шейдере, шейдер брал то что было установлено до него) SX_LIB_API void SRender_ShaderRegisterData(); diff --git a/source/skyxengine.cpp b/source/skyxengine.cpp index 12f578b3bd3c16cfa11b9fc0702c9140de02e992..852d347168b99ad0fa1feb12b6462119277ba352 100644 --- a/source/skyxengine.cpp +++ b/source/skyxengine.cpp @@ -226,9 +226,9 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D, const char * szCmdLine) SGCore_SetFunc_MtlSet(SkyXEngine_RFuncMtlSet); SGCore_SetFunc_MtlLoad(SkyXEngine_RFuncMtlLoad); - SGCore_SetFunc_MtlGetSort((g_func_mtl_get_sort)SML_MtlGetSort); - SGCore_SetFunc_MtlGroupRenderIsSingly((g_func_mtl_group_render_is_singly)SML_MtlGetTypeReflection); - SGCore_SetFunc_MtlGetPhysicType((g_func_mtl_get_physic_type)SML_MtlGetPhysicMaterial); + SGCore_SetFunc_MtlGetSort((g_func_mtl_get_sort)SMtrl_MtlGetSort); + SGCore_SetFunc_MtlGroupRenderIsSingly((g_func_mtl_group_render_is_singly)SMtrl_MtlGetTypeReflection); + SGCore_SetFunc_MtlGetPhysicType((g_func_mtl_get_physic_type)SMtrl_MtlGetPhysicMaterial); SGCore_SkyBoxCr(); #if !defined(SX_MATERIAL_EDITOR) @@ -249,20 +249,26 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D, const char * szCmdLine) SGeom_0Create("sxgeom", false); SGeom_Dbg_Set(SkyXEngine_PrintfLog); + SGeom_GreenSetFncIntersect(SkyXEngine_RFuncGreenIntersect); LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB geom initialized\n"); - SML_0Create("sxml", false); - SML_Dbg_Set(SkyXEngine_PrintfLog); + SLight_0Create("sxml", false); + SLight_Dbg_Set(SkyXEngine_PrintfLog); - //SML_LigthsCreatePoint(&float3(100, 10, 100), 100, &float3(10, 0, 10), false, false); + LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB light initialized\n"); + + + SMtrl_0Create("sxml", false); + SMtrl_Dbg_Set(SkyXEngine_PrintfLog); + + LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB mtrl initialized\n"); - LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB mtllight initialized\n"); SPE_0Create("sxparticles", false); SPE_Dbg_Set(SkyXEngine_PrintfLog); SPE_SetFunc_ParticlesPhyCollision(SkyXEngine_RFuncParticlesPhyCollision); - SPE_RTDepthSet(SML_DSGetRT_ID(DS_RT_DEPTH)); + SPE_RTDepthSet(SGCore_GbufferGetRT_ID(DS_RT_DEPTH)); LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB particles initialized\n"); @@ -272,11 +278,11 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D, const char * szCmdLine) #if defined(SX_GAME) SPP_ChangeTexSun("fx_sun.dds"); #endif - SPP_RTSetInput(SML_DSGetRT_ID(DS_RT_SCENELIGHT)); - SPP_RTSetOutput(SML_DSGetRT_ID(DS_RT_SCENELIGHT2)); - SPP_RTSetDepth0(SML_DSGetRT_ID(DS_RT_DEPTH0)); - SPP_RTSetDepth1(SML_DSGetRT_ID(DS_RT_DEPTH1)); - SPP_RTSetNormal(SML_DSGetRT_ID(DS_RT_NORMAL)); + SPP_RTSetInput(SGCore_GbufferGetRT_ID(DS_RT_SCENELIGHT)); + SPP_RTSetOutput(SGCore_GbufferGetRT_ID(DS_RT_SCENELIGHT2)); + SPP_RTSetDepth0(SGCore_GbufferGetRT_ID(DS_RT_DEPTH0)); + SPP_RTSetDepth1(SGCore_GbufferGetRT_ID(DS_RT_DEPTH1)); + SPP_RTSetNormal(SGCore_GbufferGetRT_ID(DS_RT_NORMAL)); LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB pp initialized\n"); @@ -769,7 +775,7 @@ void SkyXEngine_Frame(DWORD timeDelta) Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mView); Core_RMatrixGet(G_RI_MATRIX_LIGHT_PROJ, &mProjLight); - SML_Update(timeDelta); + SMtrl_Update(timeDelta); pDXDevice->BeginScene(); pDXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); @@ -802,15 +808,14 @@ void SkyXEngine_Frame(DWORD timeDelta) if (SGCore_SkyBoxIsCr()) SRender_RenderSky(timeDelta); - SRender_ComToneMapping(timeDelta); + static const float * r_hdr_adapted_coef = GET_PCVAR_FLOAT("r_hdr_adapted_coef"); + SGCore_ToneMappingCom(timeDelta, (r_hdr_adapted_coef ? (*r_hdr_adapted_coef) : 0.03f)); DelayComLighting += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime; } SGCore_ShaderUnBind(); - SRender_RenderParticles(timeDelta); - pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); @@ -820,17 +825,52 @@ void SkyXEngine_Frame(DWORD timeDelta) #if defined(SX_GAME) ttime = TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)); if (!SSInput_GetKeyState(SIK_P)) - SRender_RenderPostProcess(timeDelta); + SRender_RenderMainPostProcess(timeDelta); DelayPostProcess += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime; #endif + + LPDIRECT3DSURFACE9 pRenderSurf, pBackBuf; + SGCore_RTGetTexture(SPP_RTGetCurrSend())->GetSurfaceLevel(0, &pRenderSurf); + + pDXDevice->GetRenderTarget(0, &pBackBuf); + pDXDevice->SetRenderTarget(0, pRenderSurf); + + SRender_RenderParticles(timeDelta); + +#if defined(SX_GAME) + SXGame_RenderHUD(); +#endif + +#if defined(SX_GAME) || defined(SX_LEVEL_EDITOR) + SXGame_Render(); +#endif + + SGCore_ShaderUnBind(); + + pDXDevice->SetRenderTarget(0, pBackBuf); + mem_release(pRenderSurf); + mem_release(pBackBuf); + + + pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE); + pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + pDXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); + +#if defined(SX_GAME) + SRender_RenderFinalPostProcess(timeDelta); +#endif + + SGCore_ShaderBindN(SHADER_TYPE_VERTEX, "pp_quad_render.vs"); SGCore_ShaderBindN(SHADER_TYPE_PIXEL, "pp_quad_render.ps"); pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); #if !defined(SX_GAME) - pDXDevice->SetTexture(0, SML_DSGetRT((DS_RT)*r_final_image)); + pDXDevice->SetTexture(0, SGCore_GbufferGetRT((DS_RT)*r_final_image)); #else pDXDevice->SetTexture(0, SGCore_RTGetTexture(SPP_RTGetCurrSend())); #endif @@ -838,30 +878,23 @@ void SkyXEngine_Frame(DWORD timeDelta) SGCore_ScreenQuadDraw(); SGCore_ShaderUnBind(); - - SRender_RenderParticles(timeDelta); + pDXDevice->SetTransform(D3DTS_WORLD, &((D3DXMATRIX)SMMatrixIdentity())); pDXDevice->SetTransform(D3DTS_VIEW, &((D3DXMATRIX)mView)); pDXDevice->SetTransform(D3DTS_PROJECTION, &((D3DXMATRIX)mProjLight)); SRender_RenderEditorMain(); - #if defined(SX_GAME) && defined(SX_AIGRID_RENDER) //static const float * r_far = GET_PCVAR_FLOAT("r_far"); SAIG_RenderQuads(SRender_GetCamera()->getFrustum(), &vCamPos, *r_far); #endif -#if defined(SX_GAME) - SXGame_RenderHUD(); +#ifdef _DEBUG + SXPhysics_DebugRender(); #endif - - - - - #if defined(SX_GAME) || defined(SX_LEVEL_EDITOR) static bool needGameTime = true; #else @@ -922,13 +955,7 @@ void SkyXEngine_Frame(DWORD timeDelta) DelayPresent = 0; } -#ifdef _DEBUG - SXPhysics_DebugRender(); -#endif -#if defined(SX_GAME) || defined(SX_LEVEL_EDITOR) - SXGame_Render(); -#endif #if defined(SX_LEVEL_EDITOR) SXLevelEditor::LevelEditorUpdate(timeDelta); @@ -967,7 +994,7 @@ void SkyXEngine_Frame(DWORD timeDelta) ttime = TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)); - SGCore_OC_Update(SML_DSGetRT_ID(DS_RT_DEPTH0), SRender_GetCamera()->getFrustum()); + SGCore_OC_Update(SGCore_GbufferGetRT_ID(DS_RT_DEPTH0), SRender_GetCamera()->getFrustum()); DelayUpdateOC += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime; @@ -1001,7 +1028,7 @@ void SkyXEngine_Frame(DWORD timeDelta) void SkyXEngind_UpdateDataCVar() { - ID idGlobalLight = SML_LigthsGetGlobal(); + ID idGlobalLight = SLight_GetGlobal(); static const bool * r_pssm_4or3 = GET_PCVAR_BOOL("r_pssm_4or3"); static bool r_pssm_4or3_old = true; @@ -1009,14 +1036,14 @@ void SkyXEngind_UpdateDataCVar() if (r_pssm_4or3 && r_pssm_4or3_old != (*r_pssm_4or3) && idGlobalLight >= 0) { r_pssm_4or3_old = (*r_pssm_4or3); - SML_LigthsSet4Or3SplitsG(idGlobalLight, r_pssm_4or3_old); + SLight_Set4Or3SplitsG(idGlobalLight, r_pssm_4or3_old); } static const bool * r_pssm_shadowed = GET_PCVAR_BOOL("r_pssm_shadowed"); if (r_pssm_shadowed && idGlobalLight >= 0) { - SML_LigthsSetTypeShadowed(idGlobalLight, ((*r_pssm_shadowed) ? LTYPE_SHADOW_DYNAMIC : LTYPE_SHADOW_NONE)); + SLight_SetTypeShadowed(idGlobalLight, ((*r_pssm_shadowed) ? LTYPE_SHADOW_DYNAMIC : LTYPE_SHADOW_NONE)); } static const float * r_pssm_quality = GET_PCVAR_FLOAT("r_pssm_quality"); @@ -1035,7 +1062,7 @@ void SkyXEngind_UpdateDataCVar() r_pssm_quality_old = 4.f; Core_0SetCVarFloat("r_pssm_quality", r_pssm_quality_old); } - SML_LigthsSettGCoefSizeDepth(r_pssm_quality_old); + SLight_SettGCoefSizeDepth(r_pssm_quality_old); } static const float * r_lsm_quality = GET_PCVAR_FLOAT("r_lsm_quality"); @@ -1054,7 +1081,7 @@ void SkyXEngind_UpdateDataCVar() r_lsm_quality_old = 4.f; Core_0SetCVarFloat("r_lsm_quality", r_lsm_quality_old); } - SML_LigthsSettLCoefSizeDepth(r_lsm_quality_old); + SLight_SettLCoefSizeDepth(r_lsm_quality_old); } static const int * r_grass_freq = GET_PCVAR_INT("r_grass_freq"); @@ -1336,7 +1363,7 @@ void SkyXEngine_Kill() SXAnim_AKill(); SGeom_AKill(); - SML_AKill(); + SLight_AKill(); SSCore_AKill(); SGCore_AKill(); Core_AKill(); @@ -1437,6 +1464,7 @@ void SkyXEngine_PreviewKill() g_hWinPreview = 0; } #endif + //########################################################################## void SkyXEngine_RFuncDIP(UINT type_primitive, long base_vertexIndex, UINT min_vertex_index, UINT num_vertices, UINT start_index, UINT prim_count) @@ -1449,26 +1477,26 @@ void SkyXEngine_RFuncMtlSet(ID id, float4x4* world) switch (Core_RIntGet(G_RI_INT_RENDERSTATE)) { case RENDER_STATE_SHADOW: - SML_MtlSetMainTexture(0, id); - SML_LigthsShadowSetShaderOfTypeMat(Core_RIntGet(G_RI_INT_CURRIDLIGHT), SML_MtlGetTypeModel(id), world); + SMtrl_MtlSetMainTexture(0, id); + SLight_ShadowSetShaderOfTypeMat(Core_RIntGet(G_RI_INT_CURRIDLIGHT), SMtrl_MtlGetTypeModel(id), world); break; case RENDER_STATE_FREE: - SML_MtlSetMainTexture(0, id); + SMtrl_MtlSetMainTexture(0, id); Core_RMatrixSet(G_RI_MATRIX_WORLD, &(world ? (*world) : SMMatrixIdentity())); //SGCore_ShaderUnBind(); - SML_MtlRenderStd(SML_MtlGetTypeModel(id), world, 0, id); + SMtrl_MtlRenderStd(SMtrl_MtlGetTypeModel(id), world, 0, id); break; case RENDER_STATE_MATERIAL: - SML_MtlRender(id, world); + SMtrl_MtlRender(id, world); break; } } ID SkyXEngine_RFuncMtlLoad(const char* name, int mtl_type) { - return SML_MtlLoad(name, (MTLTYPE_MODEL)mtl_type); + return SMtrl_MtlLoad(name, (MTLTYPE_MODEL)mtl_type); } bool SkyXEngine_RFuncAIQuadPhyNavigate(float3_t *pPos) @@ -1553,6 +1581,28 @@ bool SkyXEngine_RFuncParticlesPhyCollision(const float3 * lastpos, const float3* return false; } +bool SkyXEngine_RFuncGreenIntersect(const float3 *pStart, const float3 *pFinish, float3 *pResult) +{ + if (!pStart || !pFinish) + return false; + + float3 vDir = float3(0, -1, 0); + + btCollisionWorld::ClosestRayResultCallback cb(F3_BTVEC(*pStart), F3_BTVEC(*pFinish)); + SXPhysics_GetDynWorld()->rayTest(F3_BTVEC(*pStart), F3_BTVEC(*pFinish), cb); + + if (cb.hasHit()) + { + if (pResult) + *pResult = BTVEC_F3(cb.m_hitPointWorld); + + return true; + } + + return false; +} + +//########################################################################## IDirect3DTexture9* SkyXEngine_LoadAsPreviewData(const char *szPath) { diff --git a/source/sxleveleditor/green_callback.cpp b/source/sxleveleditor/green_callback.cpp index 4db307b0d2221f22a7802f3b4f95856161f93c2a..6c3862620e4137d7d0692139fb76af5620d2bd74 100644 --- a/source/sxleveleditor/green_callback.cpp +++ b/source/sxleveleditor/green_callback.cpp @@ -194,7 +194,6 @@ LRESULT SXLevelEditor_ButtonGreenMask_Click(HWND hwnd, UINT msg, WPARAM wParam, if (gui_func::dialogs::SelectFileOwn(tmpname, tmppath, Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), "dds", "Select texture mask", true, Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), SXLevelEditor::JobWindow->getHWND(), SkyXEngine_EditorHandlerGetPreviewData, SkyXEngine_EditorHandlerGetTextureInfo)) { - StrCutName(tmppath, tmpname); SXLevelEditor::EditGreenMask->setText(tmpname); } return 0; @@ -343,6 +342,8 @@ LRESULT SXLevelEditor_ButtonGreenGenerate_Click(HWND hwnd, UINT msg, WPARAM wPar float pos = SXLevelEditor::TrackBarGreenDensity->getPos(); + SXPhysics_LoadGeom(NULL); + SGeom_GreenAddGreen(tmp_name, tmp_tex, pos, diff --git a/source/sxmaterialeditor/buttons_callback.cpp b/source/sxmaterialeditor/buttons_callback.cpp index fe9d3955ebfcedbbab70ee0da3cbbe874e1f5590..1ea94e411216d39b9f6bcde0eeac0c5a283ffa12 100644 --- a/source/sxmaterialeditor/buttons_callback.cpp +++ b/source/sxmaterialeditor/buttons_callback.cpp @@ -31,9 +31,9 @@ LRESULT SXMaterialEditor_ButtonLigthColor_Click(HWND hwnd, UINT msg, WPARAM wPar oChooseColor.lpCustColors = aCustClr; oChooseColor.Flags = CC_FULLOPEN | CC_RGBINIT; - ID idGlobalLight = SML_LigthsGetGlobal(); + ID idGlobalLight = SLight_GetGlobal(); float3 vColor; - SML_LigthsGetColor(idGlobalLight, &vColor); + SLight_GetColor(idGlobalLight, &vColor); oChooseColor.rgbResult = RGB(DWORD(vColor.x * 255.0), DWORD(vColor.y * 255.0), DWORD(vColor.z * 255.0)); @@ -42,7 +42,7 @@ LRESULT SXMaterialEditor_ButtonLigthColor_Click(HWND hwnd, UINT msg, WPARAM wPar vColor.x = float(GetRValue(oChooseColor.rgbResult)) / 255.0; vColor.y = float(GetGValue(oChooseColor.rgbResult)) / 255.0; vColor.z = float(GetBValue(oChooseColor.rgbResult)) / 255.0; - SML_LigthsSetColor(idGlobalLight, &vColor); + SLight_SetColor(idGlobalLight, &vColor); SXMaterialEditor::pStaticLigthColor->setColorBrush(oChooseColor.rgbResult); SXMaterialEditor::pEditLigthColorR->setText(String(vColor.x).c_str()); @@ -65,7 +65,7 @@ LRESULT SXMaterialEditor_ButtonTex_Click(HWND hwnd, UINT msg, WPARAM wParam, LPA //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditTex->setText(tmpname); - SML_MtlSetTexture(SXMaterialEditor::idMat, tmpname); + SMtrl_MtlSetTexture(SXMaterialEditor::idMat, tmpname); } return 0; } @@ -82,7 +82,7 @@ LRESULT SXMaterialEditor_ButtonVS_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditVS->setText(tmpname); - SML_MtlSetVS(SXMaterialEditor::idMat, tmpname); + SMtrl_MtlSetVS(SXMaterialEditor::idMat, tmpname); } return 0; } @@ -99,7 +99,7 @@ LRESULT SXMaterialEditor_ButtonPS_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditPS->setText(tmpname); - SML_MtlSetPS(SXMaterialEditor::idMat, tmpname); + SMtrl_MtlSetPS(SXMaterialEditor::idMat, tmpname); } return 0; } @@ -115,7 +115,7 @@ LRESULT SXMaterialEditor_ButtonTexLighting_Click(HWND hwnd, UINT msg, WPARAM wPa //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditTexLighting->setText(tmpname); - SML_MtlSetTextureLighting(SXMaterialEditor::idMat, tmpname); + SMtrl_MtlSetTextureLighting(SXMaterialEditor::idMat, tmpname); } return 0; } @@ -131,7 +131,7 @@ LRESULT SXMaterialEditor_ButtonMask_Click(HWND hwnd, UINT msg, WPARAM wParam, LP //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditMask->setText(tmpname); - SML_MtlSetMaskTex(SXMaterialEditor::idMat, tmpname); + SMtrl_MtlSetMaskTex(SXMaterialEditor::idMat, tmpname); } return 0; } @@ -147,7 +147,7 @@ LRESULT SXMaterialEditor_ButtonMR_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditMR->setText(tmpname); - SML_MtlSetMRTex(SXMaterialEditor::idMat, 0, tmpname); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 0, tmpname); } return 0; } @@ -163,7 +163,7 @@ LRESULT SXMaterialEditor_ButtonMG_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditMG->setText(tmpname); - SML_MtlSetMRTex(SXMaterialEditor::idMat, 1, tmpname); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 1, tmpname); } return 0; } @@ -179,7 +179,7 @@ LRESULT SXMaterialEditor_ButtonMB_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditMB->setText(tmpname); - SML_MtlSetMRTex(SXMaterialEditor::idMat, 2, tmpname); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 2, tmpname); } return 0; } @@ -195,7 +195,7 @@ LRESULT SXMaterialEditor_ButtonMA_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditMA->setText(tmpname); - SML_MtlSetMRTex(SXMaterialEditor::idMat, 3, tmpname); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 3, tmpname); } return 0; } @@ -212,7 +212,7 @@ LRESULT SXMaterialEditor_ButtonDR_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditDR->setText(tmpname); - SML_MtlSetDTex(SXMaterialEditor::idMat, 0, tmpname); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 0, tmpname); } return 0; } @@ -228,7 +228,7 @@ LRESULT SXMaterialEditor_ButtonDG_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditDG->setText(tmpname); - SML_MtlSetDTex(SXMaterialEditor::idMat, 1, tmpname); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 1, tmpname); } return 0; } @@ -244,7 +244,7 @@ LRESULT SXMaterialEditor_ButtonDB_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditDB->setText(tmpname); - SML_MtlSetDTex(SXMaterialEditor::idMat, 2, tmpname); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 2, tmpname); } return 0; } @@ -260,7 +260,7 @@ LRESULT SXMaterialEditor_ButtonDA_Click(HWND hwnd, UINT msg, WPARAM wParam, LPAR //StrCutName(tmppath, tmpname); SXMaterialEditor::pEditDA->setText(tmpname); - SML_MtlSetDTex(SXMaterialEditor::idMat, 3, tmpname); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 3, tmpname); } return 0; } \ No newline at end of file diff --git a/source/sxmaterialeditor/buttons_callback.h b/source/sxmaterialeditor/buttons_callback.h index 5ca127dc9d210edcfa2b05304a57562214349c84..c06d69af832a35bffc87bff6703ed19db4d2cb19 100644 --- a/source/sxmaterialeditor/buttons_callback.h +++ b/source/sxmaterialeditor/buttons_callback.h @@ -5,7 +5,7 @@ #include <common/string.h> #include <windows.h> #include <sxguiwinapi/sxgui.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include <render/sxrender.h> #include <sxmaterialeditor/resource.h> diff --git a/source/sxmaterialeditor/common_callback.cpp b/source/sxmaterialeditor/common_callback.cpp index 98d3d22dd0c6c4f29462e00d32936ce265758825..25b852a37196c8deeacae696ecdac4e5aa7ee004 100644 --- a/source/sxmaterialeditor/common_callback.cpp +++ b/source/sxmaterialeditor/common_callback.cpp @@ -17,8 +17,8 @@ void SXMaterialEditor::MtlOpen() //gui_func::dialogs::SelectFile(SXGUI_DIALOG_FILE_OPEN, tmppath, 0, Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), FILE_FILTER_TEXTURE); if (gui_func::dialogs::SelectFileOwn(tmpname, tmppath, Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), "dds", "Select textures", true, Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), SXMaterialEditor::pJobWindow->getHWND(), SkyXEngine_EditorHandlerGetPreviewData, SkyXEngine_EditorHandlerGetTextureInfo)) { - SML_MtlReloadMaterial(SRender_SimModelGetIDMtl(), tmpname); - SML_MtlSetIsTextureLighting(SRender_SimModelGetIDMtl(), false); + SMtrl_MtlReloadMaterial(SRender_SimModelGetIDMtl(), tmpname); + SMtrl_MtlSetIsTextureLighting(SRender_SimModelGetIDMtl(), false); SGCore_LoadTexAllLoad(); char headertest[1024]; @@ -30,7 +30,7 @@ void SXMaterialEditor::MtlOpen() void SXMaterialEditor::MtlSave() { - SML_MtlSave(SXMaterialEditor::idMat); + SMtrl_MtlSave(SXMaterialEditor::idMat); } LRESULT ComMenuId(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) @@ -192,107 +192,107 @@ LRESULT SXMaterialEditor_JobWindow_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPa HWND handle_elem = (HWND)(lParam); if (SXMaterialEditor::pCheckBoxLighting->getHWND() == handle_elem) { - SML_MtlSetLighting(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxLighting->getCheck()); + SMtrl_MtlSetLighting(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxLighting->getCheck()); } else if (SXMaterialEditor::pCheckBoxTransparent->getHWND() == handle_elem) { - SML_MtlSetTransparency(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxTransparent->getCheck()); + SMtrl_MtlSetTransparency(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxTransparent->getCheck()); } else if (SXMaterialEditor::pCheckBoxTexLighting->getHWND() == handle_elem) { - SML_MtlSetIsTextureLighting(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxTexLighting->getCheck()); + SMtrl_MtlSetIsTextureLighting(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxTexLighting->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSVVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::pCheckBoxDoSVVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::pCheckBoxDoSVVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::pCheckBoxDoSWVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::pCheckBoxDoSWVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::pCheckBoxDoSWPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::pCheckBoxDoSWPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSVPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::pCheckBoxDoSVPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::pCheckBoxDoSVPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSPVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::pCheckBoxDoSPVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::pCheckBoxDoSPVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSPPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::pCheckBoxDoSPPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::pCheckBoxDoSPPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWVVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::pCheckBoxDoSWVVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::pCheckBoxDoSWVVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWVPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::pCheckBoxDoSWVPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::pCheckBoxDoSWVPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSCamposVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::pCheckBoxDoSCamposVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::pCheckBoxDoSCamposVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWVPVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::pCheckBoxDoSWVPVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::pCheckBoxDoSWVPVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWVPPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::pCheckBoxDoSWVPPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::pCheckBoxDoSWVPPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSCamposPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::pCheckBoxDoSCamposPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::pCheckBoxDoSCamposPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxUDVSInPS->getHWND() == handle_elem) { - SML_MtlSetUserDataVS_InPS(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxUDVSInPS->getCheck()); + SMtrl_MtlSetUserDataVS_InPS(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxUDVSInPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSTimeDeltaVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::pCheckBoxDoSTimeDeltaVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::pCheckBoxDoSTimeDeltaVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSTimeDeltaPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::pCheckBoxDoSTimeDeltaPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::pCheckBoxDoSTimeDeltaPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWinSizeVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::pCheckBoxDoSWinSizeVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::pCheckBoxDoSWinSizeVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxDoSWinSizePS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::pCheckBoxDoSWinSizePS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::pCheckBoxDoSWinSizePS->getCheck()); } else if (SXMaterialEditor::pCheckBoxUDPSInVS->getHWND() == handle_elem) { - SML_MtlSetUserDataPS_InVS(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxUDPSInVS->getCheck()); + SMtrl_MtlSetUserDataPS_InVS(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxUDPSInVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxUDVS->getHWND() == handle_elem) { - SML_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::pCheckBoxUDVS->getCheck()); + SMtrl_MtlSetStdVS(SXMaterialEditor::idMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::pCheckBoxUDVS->getCheck()); } else if (SXMaterialEditor::pCheckBoxUDPS->getHWND() == handle_elem) { - SML_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::pCheckBoxUDPS->getCheck()); + SMtrl_MtlSetStdPS(SXMaterialEditor::idMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::pCheckBoxUDPS->getCheck()); } else if (SXMaterialEditor::pCheckBoxAlphaTest->getHWND() == handle_elem) { - SML_MtlSetUsingAlphaTest(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxAlphaTest->getCheck()); + SMtrl_MtlSetUsingAlphaTest(SXMaterialEditor::idMat, SXMaterialEditor::pCheckBoxAlphaTest->getCheck()); } } else if (Notification == CBN_SELCHANGE) @@ -301,7 +301,7 @@ LRESULT SXMaterialEditor_JobWindow_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPa if (SXMaterialEditor::pComboBoxTypeModel->getHWND() == handle_elem) { SRender_SimModelSetType((MTLTYPE_MODEL)SXMaterialEditor::pComboBoxTypeModel->getSel()); - SML_MtlSetTypeModel(SRender_SimModelGetIDMtl(), (MTLTYPE_MODEL)SXMaterialEditor::pComboBoxTypeModel->getSel()); + SMtrl_MtlSetTypeModel(SRender_SimModelGetIDMtl(), (MTLTYPE_MODEL)SXMaterialEditor::pComboBoxTypeModel->getSel()); } else if (SXMaterialEditor::pComboBoxTestModel->getHWND() == handle_elem) { @@ -309,15 +309,15 @@ LRESULT SXMaterialEditor_JobWindow_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPa } /*else if (SXMaterialEditor::pComboBoxTypeRefract->getHWND() == handle_elem) { - SML_MtlSetTypeTransparency(SXMaterialEditor::idMat, (MTLTYPE_TRANSPARENCY)SXMaterialEditor::pComboBoxTypeRefract->getSel()); + SMtrl_MtlSetTypeTransparency(SXMaterialEditor::idMat, (MTLTYPE_TRANSPARENCY)SXMaterialEditor::pComboBoxTypeRefract->getSel()); }*/ else if (SXMaterialEditor::pComboBoxTypeReflect->getHWND() == handle_elem) { - SML_MtlSetTypeReflection(SXMaterialEditor::idMat, (MTLTYPE_REFLECT)SXMaterialEditor::pComboBoxTypeReflect->getSel()); + SMtrl_MtlSetTypeReflection(SXMaterialEditor::idMat, (MTLTYPE_REFLECT)SXMaterialEditor::pComboBoxTypeReflect->getSel()); } else if (SXMaterialEditor::pComboBoxPhysic->getHWND() == handle_elem) { - SML_MtlSetPhysicMaterial(SXMaterialEditor::idMat, (MTLTYPE_PHYSIC)SXMaterialEditor::pComboBoxPhysic->getSel()); + SMtrl_MtlSetPhysicMaterial(SXMaterialEditor::idMat, (MTLTYPE_PHYSIC)SXMaterialEditor::pComboBoxPhysic->getSel()); } else if (SXMaterialEditor::pComboBoxShaders->getHWND() == handle_elem) { @@ -325,10 +325,10 @@ LRESULT SXMaterialEditor_JobWindow_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPa if (sel > 0) { sel -= 1; - SML_MtlSetVS(SXMaterialEditor::idMat, SXMaterialEditor::pShaders->getVS(sel)); + SMtrl_MtlSetVS(SXMaterialEditor::idMat, SXMaterialEditor::pShaders->getVS(sel)); SXMaterialEditor::pEditVS->setText(SXMaterialEditor::pShaders->getVS(sel)); - SML_MtlSetPS(SXMaterialEditor::idMat, SXMaterialEditor::pShaders->getPS(sel)); + SMtrl_MtlSetPS(SXMaterialEditor::idMat, SXMaterialEditor::pShaders->getPS(sel)); SXMaterialEditor::pEditPS->setText(SXMaterialEditor::pShaders->getPS(sel)); } } @@ -338,15 +338,15 @@ LRESULT SXMaterialEditor_JobWindow_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPa if (sel > 0) { sel -= 1; - SML_MtlSetThickness(SXMaterialEditor::idMat, SXMaterialEditor::pParamL->getThickness(sel)); + SMtrl_MtlSetThickness(SXMaterialEditor::idMat, SXMaterialEditor::pParamL->getThickness(sel)); SXMaterialEditor::pEditThickness->setText(String(SXMaterialEditor::pParamL->getThickness(sel)).c_str()); SXMaterialEditor::pTrackBarThickness->setPos(SXMaterialEditor::pParamL->getThickness(sel)*100); - SML_MtlSetRoughness(SXMaterialEditor::idMat, SXMaterialEditor::pParamL->getRoughness(sel)); + SMtrl_MtlSetRoughness(SXMaterialEditor::idMat, SXMaterialEditor::pParamL->getRoughness(sel)); SXMaterialEditor::pEditRoughness->setText(String(SXMaterialEditor::pParamL->getRoughness(sel)).c_str()); SXMaterialEditor::pTrackBarRoughness->setPos(SXMaterialEditor::pParamL->getRoughness(sel) * 100); - SML_MtlSetF0(SXMaterialEditor::idMat, SXMaterialEditor::pParamL->getF0(sel)); + SMtrl_MtlSetF0(SXMaterialEditor::idMat, SXMaterialEditor::pParamL->getF0(sel)); SXMaterialEditor::pEditF0->setText(String(SXMaterialEditor::pParamL->getF0(sel)).c_str()); SXMaterialEditor::pTrackBarF0->setPos(SXMaterialEditor::pParamL->getF0(sel) * 100); } @@ -448,127 +448,127 @@ void SXMaterialEditor::Nulling() void SXMaterialEditor::InitMtl(ID id) { - SRender_SimModelSetType(SML_MtlGetTypeModel(id)); - SXMaterialEditor::pComboBoxTypeModel->setSel(SML_MtlGetTypeModel(id)); + SRender_SimModelSetType(SMtrl_MtlGetTypeModel(id)); + SXMaterialEditor::pComboBoxTypeModel->setSel(SMtrl_MtlGetTypeModel(id)); SXMaterialEditor::pComboBoxTestModel; - SXMaterialEditor::pComboBoxPhysic->setSel(SML_MtlGetPhysicMaterial(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pComboBoxPhysic->setSel(SMtrl_MtlGetPhysicMaterial(SRender_SimModelGetIDMtl())); char tmppath[1024]; - SML_MtlGetTexture(SRender_SimModelGetIDMtl(), tmppath); + SMtrl_MtlGetTexture(SRender_SimModelGetIDMtl(), tmppath); SXMaterialEditor::pEditTex->setText(tmppath); - SML_MtlGetVS(SRender_SimModelGetIDMtl(), tmppath); + SMtrl_MtlGetVS(SRender_SimModelGetIDMtl(), tmppath); SXMaterialEditor::pEditVS->setText(tmppath); - SML_MtlGetPS(SRender_SimModelGetIDMtl(), tmppath); + SMtrl_MtlGetPS(SRender_SimModelGetIDMtl(), tmppath); SXMaterialEditor::pEditPS->setText(tmppath); - SXMaterialEditor::pCheckBoxAlphaTest->setCheck(SML_MtlGetUsingAlphaTest(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pCheckBoxAlphaTest->setCheck(SMtrl_MtlGetUsingAlphaTest(SRender_SimModelGetIDMtl())); - SXMaterialEditor::pEditRoughness->setText(String(SML_MtlGetRoughness(SRender_SimModelGetIDMtl())).c_str()); - SXMaterialEditor::pEditThickness->setText(String(SML_MtlGetThickness(SRender_SimModelGetIDMtl())).c_str()); - SXMaterialEditor::pEditF0->setText(String(SML_MtlGetF0(SRender_SimModelGetIDMtl())).c_str()); - SXMaterialEditor::pEditHitChance->setText(String(SML_MtlGetHitChance(SRender_SimModelGetIDMtl())).c_str()); - SXMaterialEditor::pEditDurability->setText(String(SML_MtlGetDurability(SRender_SimModelGetIDMtl())).c_str()); - SXMaterialEditor::pEditDensity->setText(String(SML_MtlGetDensity(SRender_SimModelGetIDMtl())).c_str()); + SXMaterialEditor::pEditRoughness->setText(String(SMtrl_MtlGetRoughness(SRender_SimModelGetIDMtl())).c_str()); + SXMaterialEditor::pEditThickness->setText(String(SMtrl_MtlGetThickness(SRender_SimModelGetIDMtl())).c_str()); + SXMaterialEditor::pEditF0->setText(String(SMtrl_MtlGetF0(SRender_SimModelGetIDMtl())).c_str()); + SXMaterialEditor::pEditHitChance->setText(String(SMtrl_MtlGetHitChance(SRender_SimModelGetIDMtl())).c_str()); + SXMaterialEditor::pEditDurability->setText(String(SMtrl_MtlGetDurability(SRender_SimModelGetIDMtl())).c_str()); + SXMaterialEditor::pEditDensity->setText(String(SMtrl_MtlGetDensity(SRender_SimModelGetIDMtl())).c_str()); - SXMaterialEditor::pCheckBoxLighting->setCheck(SML_MtlGetLighting(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pCheckBoxLighting->setCheck(SMtrl_MtlGetLighting(SRender_SimModelGetIDMtl())); - SXMaterialEditor::pCheckBoxTransparent->setCheck(SML_MtlGetTransparency(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pCheckBoxTransparent->setCheck(SMtrl_MtlGetTransparency(SRender_SimModelGetIDMtl())); - SXMaterialEditor::pTrackBarRoughness->setPos(SML_MtlGetRoughness(SRender_SimModelGetIDMtl())*100.f); - SXMaterialEditor::pTrackBarThickness->setPos(SML_MtlGetThickness(SRender_SimModelGetIDMtl())*100.f); - SXMaterialEditor::pTrackBarF0->setPos(SML_MtlGetF0(SRender_SimModelGetIDMtl()) * 100.f); - SXMaterialEditor::pTrackBarHitChance->setPos(SML_MtlGetHitChance(SRender_SimModelGetIDMtl()) * 100.f); + SXMaterialEditor::pTrackBarRoughness->setPos(SMtrl_MtlGetRoughness(SRender_SimModelGetIDMtl())*100.f); + SXMaterialEditor::pTrackBarThickness->setPos(SMtrl_MtlGetThickness(SRender_SimModelGetIDMtl())*100.f); + SXMaterialEditor::pTrackBarF0->setPos(SMtrl_MtlGetF0(SRender_SimModelGetIDMtl()) * 100.f); + SXMaterialEditor::pTrackBarHitChance->setPos(SMtrl_MtlGetHitChance(SRender_SimModelGetIDMtl()) * 100.f); - SML_MtlGetTextureLighting(SRender_SimModelGetIDMtl(), tmppath); + SMtrl_MtlGetTextureLighting(SRender_SimModelGetIDMtl(), tmppath); SXMaterialEditor::pEditTexLighting->setText(tmppath); - SXMaterialEditor::pCheckBoxTexLighting->setCheck(SML_MtlGetIsTextureLighting(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pCheckBoxTexLighting->setCheck(SMtrl_MtlGetIsTextureLighting(SRender_SimModelGetIDMtl())); - SXMaterialEditor::pComboBoxTypeReflect->setSel(SML_MtlGetTypeReflection(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pComboBoxTypeReflect->setSel(SMtrl_MtlGetTypeReflection(SRender_SimModelGetIDMtl())); SXMaterialEditor::pComboBoxPhysic->setSel(0); - SML_MtlGetMaskTex(SRender_SimModelGetIDMtl(), tmppath); + SMtrl_MtlGetMaskTex(SRender_SimModelGetIDMtl(), tmppath); SXMaterialEditor::pEditMask->setText(tmppath); - SML_MtlGetMRTex(SRender_SimModelGetIDMtl(), 0, tmppath); + SMtrl_MtlGetMRTex(SRender_SimModelGetIDMtl(), 0, tmppath); SXMaterialEditor::pEditMR->setText(tmppath); - SML_MtlGetMRTex(SRender_SimModelGetIDMtl(), 1, tmppath); + SMtrl_MtlGetMRTex(SRender_SimModelGetIDMtl(), 1, tmppath); SXMaterialEditor::pEditMG->setText(tmppath); - SML_MtlGetMRTex(SRender_SimModelGetIDMtl(), 2, tmppath); + SMtrl_MtlGetMRTex(SRender_SimModelGetIDMtl(), 2, tmppath); SXMaterialEditor::pEditMB->setText(tmppath); - SML_MtlGetMRTex(SRender_SimModelGetIDMtl(), 3, tmppath); + SMtrl_MtlGetMRTex(SRender_SimModelGetIDMtl(), 3, tmppath); SXMaterialEditor::pEditMA->setText(tmppath); - SML_MtlGetDTex(SRender_SimModelGetIDMtl(), 0, tmppath); + SMtrl_MtlGetDTex(SRender_SimModelGetIDMtl(), 0, tmppath); SXMaterialEditor::pEditDR->setText(tmppath); - SML_MtlGetDTex(SRender_SimModelGetIDMtl(), 1, tmppath); + SMtrl_MtlGetDTex(SRender_SimModelGetIDMtl(), 1, tmppath); SXMaterialEditor::pEditDG->setText(tmppath); - SML_MtlGetDTex(SRender_SimModelGetIDMtl(), 2, tmppath); + SMtrl_MtlGetDTex(SRender_SimModelGetIDMtl(), 2, tmppath); SXMaterialEditor::pEditDB->setText(tmppath); - SML_MtlGetDTex(SRender_SimModelGetIDMtl(), 3, tmppath); + SMtrl_MtlGetDTex(SRender_SimModelGetIDMtl(), 3, tmppath); SXMaterialEditor::pEditDA->setText(tmppath); - SXMaterialEditor::pCheckBoxDoSWVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD)); - SXMaterialEditor::pCheckBoxDoSWPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD)); + SXMaterialEditor::pCheckBoxDoSWVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD)); + SXMaterialEditor::pCheckBoxDoSWPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD)); - SXMaterialEditor::pCheckBoxDoSVVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW)); - SXMaterialEditor::pCheckBoxDoSVPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW)); + SXMaterialEditor::pCheckBoxDoSVVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW)); + SXMaterialEditor::pCheckBoxDoSVPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW)); - SXMaterialEditor::pCheckBoxDoSPVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION)); - SXMaterialEditor::pCheckBoxDoSPPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION)); + SXMaterialEditor::pCheckBoxDoSPVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION)); + SXMaterialEditor::pCheckBoxDoSPPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION)); - SXMaterialEditor::pCheckBoxDoSWVVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW)); - SXMaterialEditor::pCheckBoxDoSWVPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW)); + SXMaterialEditor::pCheckBoxDoSWVVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW)); + SXMaterialEditor::pCheckBoxDoSWVPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW)); - SXMaterialEditor::pCheckBoxDoSCamposVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS)); - SXMaterialEditor::pCheckBoxDoSCamposPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS)); + SXMaterialEditor::pCheckBoxDoSCamposVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS)); + SXMaterialEditor::pCheckBoxDoSCamposPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS)); - SXMaterialEditor::pCheckBoxDoSTimeDeltaVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA)); - SXMaterialEditor::pCheckBoxDoSTimeDeltaPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA)); + SXMaterialEditor::pCheckBoxDoSTimeDeltaVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA)); + SXMaterialEditor::pCheckBoxDoSTimeDeltaPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA)); - SXMaterialEditor::pCheckBoxDoSWVPVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)); - SXMaterialEditor::pCheckBoxDoSWVPPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)); + SXMaterialEditor::pCheckBoxDoSWVPVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)); + SXMaterialEditor::pCheckBoxDoSWVPPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)); - SXMaterialEditor::pCheckBoxDoSWinSizeVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE)); - SXMaterialEditor::pCheckBoxDoSWinSizePS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE)); + SXMaterialEditor::pCheckBoxDoSWinSizeVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE)); + SXMaterialEditor::pCheckBoxDoSWinSizePS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE)); - SXMaterialEditor::pCheckBoxUDVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA)); - SXMaterialEditor::pCheckBoxUDPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA)); + SXMaterialEditor::pCheckBoxUDVS->setCheck(SMtrl_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA)); + SXMaterialEditor::pCheckBoxUDPS->setCheck(SMtrl_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA)); // // SXMaterialEditor::pCheckBoxUDVSInPS->setCheck(false); - SXMaterialEditor::pTrackBarUDVSX->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 0) * 100.f); - SXMaterialEditor::pEditUDVSX->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 0)).c_str()); + SXMaterialEditor::pTrackBarUDVSX->setPos(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 0) * 100.f); + SXMaterialEditor::pEditUDVSX->setText(String(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 0)).c_str()); - SXMaterialEditor::pTrackBarUDVSY->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 1) * 100.f); - SXMaterialEditor::pEditUDVSY->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 1)).c_str()); + SXMaterialEditor::pTrackBarUDVSY->setPos(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 1) * 100.f); + SXMaterialEditor::pEditUDVSY->setText(String(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 1)).c_str()); - SXMaterialEditor::pTrackBarUDVSZ->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 2) * 100.f); - SXMaterialEditor::pEditUDVSZ->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 2)).c_str()); + SXMaterialEditor::pTrackBarUDVSZ->setPos(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 2) * 100.f); + SXMaterialEditor::pEditUDVSZ->setText(String(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 2)).c_str()); - SXMaterialEditor::pTrackBarUDVSW->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 3) * 100.f); - SXMaterialEditor::pEditUDVSW->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 3)).c_str()); + SXMaterialEditor::pTrackBarUDVSW->setPos(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 3) * 100.f); + SXMaterialEditor::pEditUDVSW->setText(String(SMtrl_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 3)).c_str()); SXMaterialEditor::pCheckBoxUDPSInVS->setCheck(false); - SXMaterialEditor::pTrackBarUDPSX->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 0) * 100.f); - SXMaterialEditor::pEditUDPSX->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 0)).c_str()); + SXMaterialEditor::pTrackBarUDPSX->setPos(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 0) * 100.f); + SXMaterialEditor::pEditUDPSX->setText(String(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 0)).c_str()); - SXMaterialEditor::pTrackBarUDPSY->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 1) * 100.f); - SXMaterialEditor::pEditUDPSY->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 1)).c_str()); + SXMaterialEditor::pTrackBarUDPSY->setPos(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 1) * 100.f); + SXMaterialEditor::pEditUDPSY->setText(String(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 1)).c_str()); - SXMaterialEditor::pTrackBarUDPSZ->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 2) * 100.f); - SXMaterialEditor::pEditUDPSZ->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 2)).c_str()); + SXMaterialEditor::pTrackBarUDPSZ->setPos(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 2) * 100.f); + SXMaterialEditor::pEditUDPSZ->setText(String(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 2)).c_str()); - SXMaterialEditor::pTrackBarUDPSW->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 3) * 100.f); - SXMaterialEditor::pEditUDPSW->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 3)).c_str()); + SXMaterialEditor::pTrackBarUDPSW->setPos(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 3) * 100.f); + SXMaterialEditor::pEditUDPSW->setText(String(SMtrl_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 3)).c_str()); - SXMaterialEditor::pCheckBoxUDPSInVS->setCheck(SML_MtlGetUserDataPS_InVS(SRender_SimModelGetIDMtl())); - SXMaterialEditor::pCheckBoxUDVSInPS->setCheck(SML_MtlGetUserDataVS_InPS(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pCheckBoxUDPSInVS->setCheck(SMtrl_MtlGetUserDataPS_InVS(SRender_SimModelGetIDMtl())); + SXMaterialEditor::pCheckBoxUDVSInPS->setCheck(SMtrl_MtlGetUserDataVS_InPS(SRender_SimModelGetIDMtl())); } void SXMaterialEditor::FinalImageUncheckedMenu() diff --git a/source/sxmaterialeditor/common_callback.h b/source/sxmaterialeditor/common_callback.h index 4e4e976500c90fef6b276732ee4d806d3d09921b..d717cecdd797eb90f68d97c2f77a6ebcaf609ef3 100644 --- a/source/sxmaterialeditor/common_callback.h +++ b/source/sxmaterialeditor/common_callback.h @@ -5,7 +5,7 @@ #include <common/string.h> #include <sxguiwinapi/sxgui.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include <render/sxrender.h> #include <sxmaterialeditor/resource.h> diff --git a/source/sxmaterialeditor/edits_callback.cpp b/source/sxmaterialeditor/edits_callback.cpp index 22ad84b839569496fd90ab63fda36882867dc79f..4bc0a845d8f890bb45ea4e3cd1f60183faa6d447 100644 --- a/source/sxmaterialeditor/edits_callback.cpp +++ b/source/sxmaterialeditor/edits_callback.cpp @@ -41,14 +41,14 @@ LRESULT SXMaterialEditor_EditLigthColorR_Enter(HWND hwnd, UINT msg, WPARAM wPara SXMaterialEditor::pEditLigthColorR->getText(szStr, 32); - ID idGlobalLight = SML_LigthsGetGlobal(); + ID idGlobalLight = SLight_GetGlobal(); if (idGlobalLight > -1) { float3 vColor; - SML_LigthsGetColor(idGlobalLight, &vColor); + SLight_GetColor(idGlobalLight, &vColor); sscanf(szStr, "%f", &vColor.x); - SML_LigthsSetColor(idGlobalLight, &vColor); + SLight_SetColor(idGlobalLight, &vColor); SXMaterialEditor::pStaticLigthColor->setColorBrush(RGB(DWORD(vColor.x * 255.0), DWORD(vColor.y * 255.0), DWORD(vColor.z * 255.0))); } @@ -62,14 +62,14 @@ LRESULT SXMaterialEditor_EditLigthColorG_Enter(HWND hwnd, UINT msg, WPARAM wPara SXMaterialEditor::pEditLigthColorG->getText(szStr, 32); - ID idGlobalLight = SML_LigthsGetGlobal(); + ID idGlobalLight = SLight_GetGlobal(); if (idGlobalLight > -1) { float3 vColor; - SML_LigthsGetColor(idGlobalLight, &vColor); + SLight_GetColor(idGlobalLight, &vColor); sscanf(szStr, "%f", &vColor.y); - SML_LigthsSetColor(idGlobalLight, &vColor); + SLight_SetColor(idGlobalLight, &vColor); SXMaterialEditor::pStaticLigthColor->setColorBrush(RGB(DWORD(vColor.x * 255.0), DWORD(vColor.y * 255.0), DWORD(vColor.z * 255.0))); } @@ -83,14 +83,14 @@ LRESULT SXMaterialEditor_EditLigthColorB_Enter(HWND hwnd, UINT msg, WPARAM wPara SXMaterialEditor::pEditLigthColorB->getText(szStr, 32); - ID idGlobalLight = SML_LigthsGetGlobal(); + ID idGlobalLight = SLight_GetGlobal(); if (idGlobalLight > -1) { float3 vColor; - SML_LigthsGetColor(idGlobalLight, &vColor); + SLight_GetColor(idGlobalLight, &vColor); sscanf(szStr, "%f", &vColor.z); - SML_LigthsSetColor(idGlobalLight, &vColor); + SLight_SetColor(idGlobalLight, &vColor); SXMaterialEditor::pStaticLigthColor->setColorBrush(RGB(DWORD(vColor.x * 255.0), DWORD(vColor.y * 255.0), DWORD(vColor.z * 255.0))); } @@ -105,12 +105,12 @@ LRESULT SXMaterialEditor_EditTex_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARA SXMaterialEditor::pEditTex->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetTexture(SXMaterialEditor::idMat, szStr); + SMtrl_MtlSetTexture(SXMaterialEditor::idMat, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetTexture(SXMaterialEditor::idMat, szStr2); + SMtrl_MtlGetTexture(SXMaterialEditor::idMat, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditTex->setText(szStr); @@ -127,12 +127,12 @@ LRESULT SXMaterialEditor_EditVS_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditVS->getText(szStr, SXGC_SHADER_MAX_SIZE_DIRNAME); if (SGCore_ShaderFileExists(szStr)) - SML_MtlSetVS(SXMaterialEditor::idMat, szStr); + SMtrl_MtlSetVS(SXMaterialEditor::idMat, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetVS(SXMaterialEditor::idMat, szStr2); + SMtrl_MtlGetVS(SXMaterialEditor::idMat, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditVS->setText(szStr); @@ -149,12 +149,12 @@ LRESULT SXMaterialEditor_EditPS_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditPS->getText(szStr, SXGC_SHADER_MAX_SIZE_DIRNAME); if (SGCore_ShaderFileExists(szStr)) - SML_MtlSetPS(SXMaterialEditor::idMat, szStr); + SMtrl_MtlSetPS(SXMaterialEditor::idMat, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetPS(SXMaterialEditor::idMat, szStr2); + SMtrl_MtlGetPS(SXMaterialEditor::idMat, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditPS->setText(szStr); @@ -174,7 +174,7 @@ LRESULT SXMaterialEditor_EditHitChance_Enter(HWND hwnd, UINT msg, WPARAM wParam, sscanf(szStr, "%f", &fValue); SXMaterialEditor::pTrackBarHitChance->setPos(fValue * 100); - SML_MtlSetHitChance(SXMaterialEditor::idMat, fValue*0.01f); + SMtrl_MtlSetHitChance(SXMaterialEditor::idMat, fValue*0.01f); SXMaterialEditor::pEditHitChance->setText(String(fValue).c_str()); return 0; @@ -190,7 +190,7 @@ LRESULT SXMaterialEditor_EditDurability_Enter(HWND hwnd, UINT msg, WPARAM wParam sscanf(szStr, "%f", &fValue); - SML_MtlSetDurability(SXMaterialEditor::idMat, fValue); + SMtrl_MtlSetDurability(SXMaterialEditor::idMat, fValue); SXMaterialEditor::pEditDurability->setText(String(fValue).c_str()); return 0; @@ -206,7 +206,7 @@ LRESULT SXMaterialEditor_EditDensity_Enter(HWND hwnd, UINT msg, WPARAM wParam, L sscanf(szStr, "%f", &fValue); - SML_MtlSetDensity(SXMaterialEditor::idMat, fValue); + SMtrl_MtlSetDensity(SXMaterialEditor::idMat, fValue); SXMaterialEditor::pEditDensity->setText(String(fValue).c_str()); return 0; @@ -221,12 +221,12 @@ LRESULT SXMaterialEditor_EditTexLighting_Enter(HWND hwnd, UINT msg, WPARAM wPara SXMaterialEditor::pEditTexLighting->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetTextureLighting(SXMaterialEditor::idMat, szStr); + SMtrl_MtlSetTextureLighting(SXMaterialEditor::idMat, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetTextureLighting(SXMaterialEditor::idMat, szStr2); + SMtrl_MtlGetTextureLighting(SXMaterialEditor::idMat, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditTexLighting->setText(szStr); @@ -244,12 +244,12 @@ LRESULT SXMaterialEditor_EditMask_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPAR SXMaterialEditor::pEditMask->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetMaskTex(SXMaterialEditor::idMat, szStr); + SMtrl_MtlSetMaskTex(SXMaterialEditor::idMat, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetMaskTex(SXMaterialEditor::idMat, szStr2); + SMtrl_MtlGetMaskTex(SXMaterialEditor::idMat, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditMask->setText(szStr); @@ -266,12 +266,12 @@ LRESULT SXMaterialEditor_EditMR_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditMR->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetMRTex(SXMaterialEditor::idMat, 0, szStr); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 0, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetMRTex(SXMaterialEditor::idMat, 0, szStr2); + SMtrl_MtlGetMRTex(SXMaterialEditor::idMat, 0, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditMR->setText(szStr); @@ -288,12 +288,12 @@ LRESULT SXMaterialEditor_EditMG_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditMG->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetMRTex(SXMaterialEditor::idMat, 1, szStr); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 1, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetMRTex(SXMaterialEditor::idMat, 1, szStr2); + SMtrl_MtlGetMRTex(SXMaterialEditor::idMat, 1, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditMG->setText(szStr); @@ -310,12 +310,12 @@ LRESULT SXMaterialEditor_EditMB_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditMB->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetMRTex(SXMaterialEditor::idMat, 2, szStr); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 2, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetMRTex(SXMaterialEditor::idMat, 2, szStr2); + SMtrl_MtlGetMRTex(SXMaterialEditor::idMat, 2, szStr2); TexProcInputString(szStr); SXMaterialEditor::pEditMB->setText(szStr); @@ -332,12 +332,12 @@ LRESULT SXMaterialEditor_EditMA_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditMA->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetMRTex(SXMaterialEditor::idMat, 3, szStr); + SMtrl_MtlSetMRTex(SXMaterialEditor::idMat, 3, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetMRTex(SXMaterialEditor::idMat, 3, szStr); + SMtrl_MtlGetMRTex(SXMaterialEditor::idMat, 3, szStr); TexProcInputString(szStr); SXMaterialEditor::pEditMA->setText(szStr); @@ -355,12 +355,12 @@ LRESULT SXMaterialEditor_EditDR_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditDR->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetDTex(SXMaterialEditor::idMat, 0, szStr); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 0, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetDTex(SXMaterialEditor::idMat, 0, szStr); + SMtrl_MtlGetDTex(SXMaterialEditor::idMat, 0, szStr); TexProcInputString(szStr); SXMaterialEditor::pEditDR->setText(szStr); @@ -377,12 +377,12 @@ LRESULT SXMaterialEditor_EditDG_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditDG->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetDTex(SXMaterialEditor::idMat, 1, szStr); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 1, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetDTex(SXMaterialEditor::idMat, 1, szStr); + SMtrl_MtlGetDTex(SXMaterialEditor::idMat, 1, szStr); TexProcInputString(szStr); SXMaterialEditor::pEditDR->setText(szStr); @@ -399,12 +399,12 @@ LRESULT SXMaterialEditor_EditDB_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditDB->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetDTex(SXMaterialEditor::idMat, 2, szStr); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 2, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetDTex(SXMaterialEditor::idMat, 2, szStr); + SMtrl_MtlGetDTex(SXMaterialEditor::idMat, 2, szStr); TexProcInputString(szStr); SXMaterialEditor::pEditDR->setText(szStr); @@ -421,12 +421,12 @@ LRESULT SXMaterialEditor_EditDA_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM SXMaterialEditor::pEditDA->getText(szStr, SXGC_LOADTEX_MAX_SIZE_DIRNAME); if (SGCore_LoadTexFileExists(szStr)) - SML_MtlSetDTex(SXMaterialEditor::idMat, 3, szStr); + SMtrl_MtlSetDTex(SXMaterialEditor::idMat, 3, szStr); else { char szStr2[SXGC_LOADTEX_MAX_SIZE_DIRNAME]; szStr2[0] = 0; - SML_MtlGetDTex(SXMaterialEditor::idMat, 3, szStr); + SMtrl_MtlGetDTex(SXMaterialEditor::idMat, 3, szStr); TexProcInputString(szStr); SXMaterialEditor::pEditDR->setText(szStr); @@ -448,7 +448,7 @@ LRESULT SXMaterialEditor_EditRoughness_Enter(HWND hwnd, UINT msg, WPARAM wParam, sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarRoughness->setPos(tmpval*100); - SML_MtlSetRoughness(SXMaterialEditor::idMat, tmpval); + SMtrl_MtlSetRoughness(SXMaterialEditor::idMat, tmpval); return 0; } @@ -464,7 +464,7 @@ LRESULT SXMaterialEditor_EditF0_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarF0->setPos(tmpval * 100); - SML_MtlSetF0(SXMaterialEditor::idMat, tmpval); + SMtrl_MtlSetF0(SXMaterialEditor::idMat, tmpval); return 0; } @@ -479,7 +479,7 @@ LRESULT SXMaterialEditor_EditThickness_Enter(HWND hwnd, UINT msg, WPARAM wParam, sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarThickness->setPos(tmpval * 100); - SML_MtlSetThickness(SXMaterialEditor::idMat, tmpval); + SMtrl_MtlSetThickness(SXMaterialEditor::idMat, tmpval); return 0; } @@ -496,7 +496,7 @@ LRESULT SXMaterialEditor_EditUDVSX_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDVSX->setPos(tmpval * 100); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 0, tmpval); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 0, tmpval); return 0; } @@ -511,7 +511,7 @@ LRESULT SXMaterialEditor_EditUDVSY_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDVSY->setPos(tmpval * 100); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 1, tmpval); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 1, tmpval); return 0; } @@ -526,7 +526,7 @@ LRESULT SXMaterialEditor_EditUDVSZ_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDVSZ->setPos(tmpval * 100); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 2, tmpval); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 2, tmpval); return 0; } @@ -541,7 +541,7 @@ LRESULT SXMaterialEditor_EditUDVSW_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDVSW->setPos(tmpval * 100); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 3, tmpval); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 3, tmpval); return 0; } @@ -557,7 +557,7 @@ LRESULT SXMaterialEditor_EditUDPSX_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDPSX->setPos(tmpval * 100); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 0, tmpval); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 0, tmpval); return 0; } @@ -572,7 +572,7 @@ LRESULT SXMaterialEditor_EditUDPSY_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDPSY->setPos(tmpval * 100); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 1, tmpval); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 1, tmpval); return 0; } @@ -587,7 +587,7 @@ LRESULT SXMaterialEditor_EditUDPSZ_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDPSZ->setPos(tmpval * 100); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 2, tmpval); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 2, tmpval); return 0; } @@ -602,6 +602,6 @@ LRESULT SXMaterialEditor_EditUDPSW_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA sscanf(szStr, "%f", &tmpval); SXMaterialEditor::pTrackBarUDPSW->setPos(tmpval * 100); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 3, tmpval); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 3, tmpval); return 0; } \ No newline at end of file diff --git a/source/sxmaterialeditor/edits_callback.h b/source/sxmaterialeditor/edits_callback.h index 684989ad488b1bbf5f298aecea94fe8666770de1..3c3b6384ca8eaba45c01bccb549d97ea7fb93129 100644 --- a/source/sxmaterialeditor/edits_callback.h +++ b/source/sxmaterialeditor/edits_callback.h @@ -5,7 +5,7 @@ #include <common/string.h> #include <sxguiwinapi/sxgui.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include <render/sxrender.h> #include <sxmaterialeditor/resource.h> diff --git a/source/sxmaterialeditor/material_editor.cpp b/source/sxmaterialeditor/material_editor.cpp index 768061724c78f4133c650ec586caef111d6c8341..744c3c5f24f6e89b44bfd01bab8a203031a8eeb8 100644 --- a/source/sxmaterialeditor/material_editor.cpp +++ b/source/sxmaterialeditor/material_editor.cpp @@ -1430,8 +1430,8 @@ void SXMaterialEditor::MaterialEditorUpdate(DWORD timeDelta) char vs[1024]; char ps[1024]; - SML_MtlGetVS(SXMaterialEditor::idMat, vs); - SML_MtlGetPS(SXMaterialEditor::idMat, ps); + SMtrl_MtlGetVS(SXMaterialEditor::idMat, vs); + SMtrl_MtlGetPS(SXMaterialEditor::idMat, ps); if ((skit = SXMaterialEditor::pShaders->find(vs, ps)) >= 0) SXMaterialEditor::pComboBoxShaders->setSel(skit + 1); @@ -1441,9 +1441,9 @@ void SXMaterialEditor::MaterialEditorUpdate(DWORD timeDelta) if (!SXMaterialEditor::pComboBoxParamL->getFocus()) { - float thikcness = SML_MtlGetThickness(SXMaterialEditor::idMat); - float roughness = SML_MtlGetRoughness(SXMaterialEditor::idMat); - float f0 = SML_MtlGetF0(SXMaterialEditor::idMat); + float thikcness = SMtrl_MtlGetThickness(SXMaterialEditor::idMat); + float roughness = SMtrl_MtlGetRoughness(SXMaterialEditor::idMat); + float f0 = SMtrl_MtlGetF0(SXMaterialEditor::idMat); skit = -1; if ((skit = SXMaterialEditor::pParamL->find(thikcness, roughness, f0)) >= 0) diff --git a/source/sxmaterialeditor/material_editor.h b/source/sxmaterialeditor/material_editor.h index 5667deaa17bfb30ad36935efc165e035baacdf7e..21574e8183dcd00b5204d90ec6a1a2827f58bf45 100644 --- a/source/sxmaterialeditor/material_editor.h +++ b/source/sxmaterialeditor/material_editor.h @@ -8,7 +8,7 @@ #include <common/string.h> #include <sxguiwinapi/sxgui.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include <render/sxrender.h> #include <sxmaterialeditor/resource.h> diff --git a/source/sxmaterialeditor/sxmaterialeditor.cpp b/source/sxmaterialeditor/sxmaterialeditor.cpp index 9dbcd70f6b5ff45ad1da8836babb416749eb65c4..3d14901a3470b391ceb7096627855abdab89d180 100644 --- a/source/sxmaterialeditor/sxmaterialeditor.cpp +++ b/source/sxmaterialeditor/sxmaterialeditor.cpp @@ -477,14 +477,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLin SRender_SimModelAdd("cube.dse"); SRender_SimModelAdd("plane.dse"); - SML_LigthsCreatePoint( + SLight_CreatePoint( &float3(110,110,-110), LIGHTS_GLOBAL_STD_RADIUS, &float3(1,1,1), true, true); - SML_LigthsSetEnable(SML_LigthsGetCount() - 1, true); - SML_LigthsSetName(SML_LigthsGetCount() - 1, "sun"); + SLight_SetEnable(SLight_GetCount() - 1, true); + SLight_SetName(SLight_GetCount() - 1, "sun"); SXMaterialEditor::pEditLigthColorR->setText("1"); SXMaterialEditor::pEditLigthColorG->setText("1"); diff --git a/source/sxmaterialeditor/trackbars_callback.cpp b/source/sxmaterialeditor/trackbars_callback.cpp index 4a1ff70b91a371612862533619b4ac1079ea1cae..2c53d79c8d65a517af06877f6d685407dc9b875f 100644 --- a/source/sxmaterialeditor/trackbars_callback.cpp +++ b/source/sxmaterialeditor/trackbars_callback.cpp @@ -10,7 +10,7 @@ LRESULT SXMaterialEditor_TrackBarHitChance_MouseMove(HWND hwnd, UINT msg, WPARAM sprintf(thickness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditHitChance->setText(thickness); - SML_MtlSetHitChance(SXMaterialEditor::idMat, float(pos)*0.01f); + SMtrl_MtlSetHitChance(SXMaterialEditor::idMat, float(pos)*0.01f); return 0; } @@ -24,7 +24,7 @@ LRESULT SXMaterialEditor_TrackBarRoughness_MouseMove(HWND hwnd, UINT msg, WPARAM sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditRoughness->setText(roughness); - SML_MtlSetRoughness(SXMaterialEditor::idMat, float(pos)*0.01f); + SMtrl_MtlSetRoughness(SXMaterialEditor::idMat, float(pos)*0.01f); return 0; } @@ -38,7 +38,7 @@ LRESULT SXMaterialEditor_TrackBarThickness_MouseMove(HWND hwnd, UINT msg, WPARAM sprintf(thickness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditThickness->setText(thickness); - SML_MtlSetThickness(SXMaterialEditor::idMat, float(pos)*0.01f); + SMtrl_MtlSetThickness(SXMaterialEditor::idMat, float(pos)*0.01f); return 0; } @@ -52,7 +52,7 @@ LRESULT SXMaterialEditor_TrackBarF0_MouseMove(HWND hwnd, UINT msg, WPARAM wParam sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditF0->setText(roughness); - SML_MtlSetF0(SXMaterialEditor::idMat, float(pos)*0.01f); + SMtrl_MtlSetF0(SXMaterialEditor::idMat, float(pos)*0.01f); return 0; } @@ -68,7 +68,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSX_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDVSX->setText(roughness); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 0, float(pos)*0.01f); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 0, float(pos)*0.01f); return 0; } @@ -82,7 +82,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSY_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDVSY->setText(roughness); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 1, float(pos)*0.01f); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 1, float(pos)*0.01f); return 0; } @@ -96,7 +96,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSZ_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDVSZ->setText(roughness); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 2, float(pos)*0.01f); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 2, float(pos)*0.01f); return 0; } @@ -110,7 +110,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSW_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDVSW->setText(roughness); - SML_MtlSetUserDataVS(SXMaterialEditor::idMat, 3, float(pos)*0.01f); + SMtrl_MtlSetUserDataVS(SXMaterialEditor::idMat, 3, float(pos)*0.01f); return 0; } @@ -126,7 +126,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSX_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDPSX->setText(roughness); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 0, float(pos)*0.01f); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 0, float(pos)*0.01f); return 0; } @@ -140,7 +140,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSY_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDPSY->setText(roughness); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 1, float(pos)*0.01f); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 1, float(pos)*0.01f); return 0; } @@ -154,7 +154,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSZ_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDPSZ->setText(roughness); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 2, float(pos)*0.01f); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 2, float(pos)*0.01f); return 0; } @@ -168,7 +168,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSW_MouseMove(HWND hwnd, UINT msg, WPARAM wPa sprintf(roughness, "%.2f", float(pos)*0.01f); SXMaterialEditor::pEditUDPSW->setText(roughness); - SML_MtlSetUserDataPS(SXMaterialEditor::idMat, 3, float(pos)*0.01f); + SMtrl_MtlSetUserDataPS(SXMaterialEditor::idMat, 3, float(pos)*0.01f); return 0; } \ No newline at end of file diff --git a/source/sxmaterialeditor/trackbars_callback.h b/source/sxmaterialeditor/trackbars_callback.h index 79ee150fa8a9be24ae69819fc187b106e14239c6..07393a1a83b0ba444754380e7a6613e9b10c59b6 100644 --- a/source/sxmaterialeditor/trackbars_callback.h +++ b/source/sxmaterialeditor/trackbars_callback.h @@ -5,7 +5,7 @@ #include <common/string.h> #include <sxguiwinapi/sxgui.h> -#include <mtllight/sxmtllight.h> +#include <light/sxlight.h> #include <render/sxrender.h> #include <sxmaterialeditor/resource.h>