From e00847f64b49fb58a822e682d7ed130ef93cb531 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 23 Jun 2013 11:13:01 +0200 Subject: [PATCH] - GZDoom solution file - missing GL resources for gzdoom.pk3. --- gzdoom.sln | 177 ++++++++++++ wadsrc/static/glstuff/gllight.png | Bin 0 -> 13073 bytes wadsrc/static/glstuff/glpart.png | Bin 0 -> 13343 bytes wadsrc/static/glstuff/glpart2.png | Bin 0 -> 358 bytes wadsrc/static/glstuff/mirror.png | Bin 0 -> 26089 bytes wadsrc/static/shaders/glsl/fogboundary.fp | 36 +++ wadsrc/static/shaders/glsl/func_brightmap.fp | 9 + wadsrc/static/shaders/glsl/func_normal.fp | 7 + wadsrc/static/shaders/glsl/func_notexture.fp | 6 + wadsrc/static/shaders/glsl/func_warp1.fp | 17 ++ wadsrc/static/shaders/glsl/func_warp2.fp | 18 ++ wadsrc/static/shaders/glsl/func_wavex.fp | 13 + wadsrc/static/shaders/glsl/fuzz_jagged.fp | 25 ++ wadsrc/static/shaders/glsl/fuzz_noise.fp | 21 ++ wadsrc/static/shaders/glsl/fuzz_smooth.fp | 19 ++ .../static/shaders/glsl/fuzz_smoothnoise.fp | 20 ++ .../shaders/glsl/fuzz_smoothtranslucent.fp | 19 ++ wadsrc/static/shaders/glsl/fuzz_standard.fp | 22 ++ wadsrc/static/shaders/glsl/fuzz_swirly.fp | 19 ++ wadsrc/static/shaders/glsl/main.fp | 262 ++++++++++++++++++ wadsrc/static/shaders/glsl/main.vp | 75 +++++ wadsrc/static/shaders/glsl/main_colormap.fp | 46 +++ 22 files changed, 811 insertions(+) create mode 100644 gzdoom.sln create mode 100644 wadsrc/static/glstuff/gllight.png create mode 100644 wadsrc/static/glstuff/glpart.png create mode 100644 wadsrc/static/glstuff/glpart2.png create mode 100644 wadsrc/static/glstuff/mirror.png create mode 100644 wadsrc/static/shaders/glsl/fogboundary.fp create mode 100644 wadsrc/static/shaders/glsl/func_brightmap.fp create mode 100644 wadsrc/static/shaders/glsl/func_normal.fp create mode 100644 wadsrc/static/shaders/glsl/func_notexture.fp create mode 100644 wadsrc/static/shaders/glsl/func_warp1.fp create mode 100644 wadsrc/static/shaders/glsl/func_warp2.fp create mode 100644 wadsrc/static/shaders/glsl/func_wavex.fp create mode 100644 wadsrc/static/shaders/glsl/fuzz_jagged.fp create mode 100644 wadsrc/static/shaders/glsl/fuzz_noise.fp create mode 100644 wadsrc/static/shaders/glsl/fuzz_smooth.fp create mode 100644 wadsrc/static/shaders/glsl/fuzz_smoothnoise.fp create mode 100644 wadsrc/static/shaders/glsl/fuzz_smoothtranslucent.fp create mode 100644 wadsrc/static/shaders/glsl/fuzz_standard.fp create mode 100644 wadsrc/static/shaders/glsl/fuzz_swirly.fp create mode 100644 wadsrc/static/shaders/glsl/main.fp create mode 100644 wadsrc/static/shaders/glsl/main.vp create mode 100644 wadsrc/static/shaders/glsl/main_colormap.fp diff --git a/gzdoom.sln b/gzdoom.sln new file mode 100644 index 000000000..16d1acc3d --- /dev/null +++ b/gzdoom.sln @@ -0,0 +1,177 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gzdoom", "gzdoom.vcproj", "{8049475B-5C87-46F9-9358-635218A4EF18}" + ProjectSection(ProjectDependencies) = postProject + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96} = {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96} + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63} = {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63} + {6077B7D6-349F-4077-B552-3BC302EF5859} = {6077B7D6-349F-4077-B552-3BC302EF5859} + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E} = {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E} + {0F80ACBF-460E-44F0-B28E-B3272D1774A7} = {0F80ACBF-460E-44F0-B28E-B3272D1774A7} + {DA47396F-60C1-4BDE-A977-7F7DE461CF77} = {DA47396F-60C1-4BDE-A977-7F7DE461CF77} + {1D179D4B-F008-431B-8C72-111F8372584F} = {1D179D4B-F008-431B-8C72-111F8372584F} + {B68E0ABF-B627-48A3-A92F-D8F827A75054} = {B68E0ABF-B627-48A3-A92F-D8F827A75054} + {8997289F-10BF-4678-8BAA-3BB509C84953} = {8997289F-10BF-4678-8BAA-3BB509C84953} + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466} = {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466} + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4} = {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4} + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F} = {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib\zlib.vcproj", "{F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lemon", "tools\lemon\lemon.vcproj", "{0F80ACBF-460E-44F0-B28E-B3272D1774A7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "re2c", "tools\re2c\re2c.vcproj", "{667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wadsrc", "wadsrc\wadsrc.vcproj", "{1D179D4B-F008-431B-8C72-111F8372584F}" + ProjectSection(ProjectDependencies) = postProject + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3} = {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "updaterevision", "tools\updaterevision\updaterevision.vcproj", "{6077B7D6-349F-4077-B552-3BC302EF5859}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg-6b", "jpeg-6b\jpeg-6b.vcproj", "{AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fixrtext", "tools\fixrtext\fixrtext.vcproj", "{DA47396F-60C1-4BDE-A977-7F7DE461CF77}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dumb_static", "dumb\vc6\dumb_static\dumb_static.vcproj", "{8997289F-10BF-4678-8BAA-3BB509C84953}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gdtoa", "gdtoa\gdtoa.vcproj", "{B68E0ABF-B627-48A3-A92F-D8F827A75054}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zipdir", "tools\zipdir\zipdir.vcproj", "{24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}" + ProjectSection(ProjectDependencies) = postProject + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4} = {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4} + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63} = {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63} + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F} = {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lzmalib", "lzma\lzmalib.vcproj", "{6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzip2", "bzip2\bzip2.vcproj", "{A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "game-music-emu", "game-music-emu\game-music-emu.vcproj", "{9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8049475B-5C87-46F9-9358-635218A4EF18}.Debug|Win32.ActiveCfg = Debug|Win32 + {8049475B-5C87-46F9-9358-635218A4EF18}.Debug|Win32.Build.0 = Debug|Win32 + {8049475B-5C87-46F9-9358-635218A4EF18}.Debug|x64.ActiveCfg = Debug|x64 + {8049475B-5C87-46F9-9358-635218A4EF18}.Debug|x64.Build.0 = Debug|x64 + {8049475B-5C87-46F9-9358-635218A4EF18}.Release|Win32.ActiveCfg = Release|Win32 + {8049475B-5C87-46F9-9358-635218A4EF18}.Release|Win32.Build.0 = Release|Win32 + {8049475B-5C87-46F9-9358-635218A4EF18}.Release|x64.ActiveCfg = Release|x64 + {8049475B-5C87-46F9-9358-635218A4EF18}.Release|x64.Build.0 = Release|x64 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Debug|Win32.ActiveCfg = Debug|Win32 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Debug|Win32.Build.0 = Debug|Win32 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Debug|x64.ActiveCfg = Debug|x64 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Debug|x64.Build.0 = Debug|x64 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Release|Win32.ActiveCfg = Release|Win32 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Release|Win32.Build.0 = Release|Win32 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Release|x64.ActiveCfg = Release|x64 + {F9D9E7D4-E1A2-4866-9E85-B1B14137EE63}.Release|x64.Build.0 = Release|x64 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Debug|Win32.ActiveCfg = Debug|Win32 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Debug|Win32.Build.0 = Debug|Win32 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Debug|x64.ActiveCfg = Release|Win32 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Debug|x64.Build.0 = Release|Win32 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Release|Win32.ActiveCfg = Release|Win32 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Release|Win32.Build.0 = Release|Win32 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Release|x64.ActiveCfg = Release|Win32 + {0F80ACBF-460E-44F0-B28E-B3272D1774A7}.Release|x64.Build.0 = Release|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Debug|Win32.ActiveCfg = Debug|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Debug|Win32.Build.0 = Debug|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Debug|x64.ActiveCfg = Release|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Debug|x64.Build.0 = Release|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Release|Win32.ActiveCfg = Release|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Release|Win32.Build.0 = Release|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Release|x64.ActiveCfg = Release|Win32 + {667D2EE7-C357-49E2-9BAB-0A4A45F0F76E}.Release|x64.Build.0 = Release|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Debug|Win32.Build.0 = Debug|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Debug|x64.ActiveCfg = Release|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Debug|x64.Build.0 = Release|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Release|Win32.ActiveCfg = Release|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Release|Win32.Build.0 = Release|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Release|x64.ActiveCfg = Release|Win32 + {1D179D4B-F008-431B-8C72-111F8372584F}.Release|x64.Build.0 = Release|Win32 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Debug|Win32.ActiveCfg = Debug|Win32 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Debug|Win32.Build.0 = Debug|Win32 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Debug|x64.ActiveCfg = Debug|x64 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Debug|x64.Build.0 = Debug|x64 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Release|Win32.ActiveCfg = Release|Win32 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Release|Win32.Build.0 = Release|Win32 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Release|x64.ActiveCfg = Release|x64 + {6077B7D6-349F-4077-B552-3BC302EF5859}.Release|x64.Build.0 = Release|x64 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Debug|Win32.ActiveCfg = Debug|Win32 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Debug|Win32.Build.0 = Debug|Win32 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Debug|x64.ActiveCfg = Debug|x64 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Debug|x64.Build.0 = Debug|x64 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Release|Win32.ActiveCfg = Release|Win32 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Release|Win32.Build.0 = Release|Win32 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Release|x64.ActiveCfg = Release|x64 + {AC3F5340-40CB-4C3A-8AA7-CB7158DB4466}.Release|x64.Build.0 = Release|x64 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Debug|Win32.Build.0 = Debug|Win32 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Debug|x64.ActiveCfg = Debug|Win32 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Debug|x64.Build.0 = Debug|Win32 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Release|Win32.ActiveCfg = Release|Win32 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Release|Win32.Build.0 = Release|Win32 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Release|x64.ActiveCfg = Release|Win32 + {DA47396F-60C1-4BDE-A977-7F7DE461CF77}.Release|x64.Build.0 = Release|Win32 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Debug|Win32.ActiveCfg = Debug|Win32 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Debug|Win32.Build.0 = Debug|Win32 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Debug|x64.ActiveCfg = Debug|x64 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Debug|x64.Build.0 = Debug|x64 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Release|Win32.ActiveCfg = Release|Win32 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Release|Win32.Build.0 = Release|Win32 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Release|x64.ActiveCfg = Release|x64 + {8997289F-10BF-4678-8BAA-3BB509C84953}.Release|x64.Build.0 = Release|x64 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Debug|Win32.ActiveCfg = Debug|Win32 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Debug|Win32.Build.0 = Debug|Win32 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Debug|x64.ActiveCfg = Debug|x64 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Debug|x64.Build.0 = Debug|x64 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Release|Win32.ActiveCfg = Release|Win32 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Release|Win32.Build.0 = Release|Win32 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Release|x64.ActiveCfg = Release|x64 + {B68E0ABF-B627-48A3-A92F-D8F827A75054}.Release|x64.Build.0 = Release|x64 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Debug|Win32.ActiveCfg = Debug|Win32 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Debug|Win32.Build.0 = Debug|Win32 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Debug|x64.ActiveCfg = Debug|x64 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Debug|x64.Build.0 = Debug|x64 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Release|Win32.ActiveCfg = Release|Win32 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Release|Win32.Build.0 = Release|Win32 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Release|x64.ActiveCfg = Release|x64 + {24A19C02-F041-4AB0-A1A1-02E1E88EDBD3}.Release|x64.Build.0 = Release|x64 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Debug|Win32.ActiveCfg = Debug|Win32 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Debug|Win32.Build.0 = Debug|Win32 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Debug|x64.ActiveCfg = Debug|x64 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Debug|x64.Build.0 = Debug|x64 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Release|Win32.ActiveCfg = Release|Win32 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Release|Win32.Build.0 = Release|Win32 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Release|x64.ActiveCfg = Release|x64 + {6EB27E78-7C7A-4F08-8E19-957E8EB3A20F}.Release|x64.Build.0 = Release|x64 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Debug|Win32.ActiveCfg = Debug|Win32 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Debug|Win32.Build.0 = Debug|Win32 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Debug|x64.ActiveCfg = Debug|x64 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Debug|x64.Build.0 = Debug|x64 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Release|Win32.ActiveCfg = Release|Win32 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Release|Win32.Build.0 = Release|Win32 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Release|x64.ActiveCfg = Release|x64 + {A7DE5C73-D623-4118-A48A-BDFD1FAE97D4}.Release|x64.Build.0 = Release|x64 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Debug|Win32.ActiveCfg = Release|Win32 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Debug|Win32.Build.0 = Release|Win32 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Debug|x64.ActiveCfg = Release|x64 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Debug|x64.Build.0 = Release|x64 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Release|Win32.ActiveCfg = Release|Win32 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Release|Win32.Build.0 = Release|Win32 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Release|x64.ActiveCfg = Release|x64 + {9B465A9E-E5C7-4577-B559-3CA2F7AE7D96}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/wadsrc/static/glstuff/gllight.png b/wadsrc/static/glstuff/gllight.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a296b9f856f4654aae244e3400a4f33fd95902 GIT binary patch literal 13073 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 literal 0 HcmV?d00001 diff --git a/wadsrc/static/glstuff/glpart.png b/wadsrc/static/glstuff/glpart.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb0aea8ea8a74843fa0709b41264552043bede0 GIT binary patch literal 13343 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 S&mKA91FU!7%qn-~B>f+ts&qU6 literal 0 HcmV?d00001 diff --git a/wadsrc/static/glstuff/glpart2.png b/wadsrc/static/glstuff/glpart2.png new file mode 100644 index 0000000000000000000000000000000000000000..f95255ebfb620942841caf6cecba5ac2610ba0f3 GIT binary patch literal 358 zcmV-s0h#`ZP)6)<54EtoMxn!Ev93lEZU;Y7j0UGrgtV@F+>;M1&07*qoM6N<$ Ef<=>*$N&HU literal 0 HcmV?d00001 diff --git a/wadsrc/static/glstuff/mirror.png b/wadsrc/static/glstuff/mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..08a6abcbe6705e5c76aeb85608df8784f69904f6 GIT binary patch literal 26089 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∓$-JURCuRFPNhoE$>gO9$$NPPYv~_Owb_v;N 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 literal 0 HcmV?d00001 diff --git a/wadsrc/static/shaders/glsl/fogboundary.fp b/wadsrc/static/shaders/glsl/fogboundary.fp new file mode 100644 index 000000000..5b43dfd95 --- /dev/null +++ b/wadsrc/static/shaders/glsl/fogboundary.fp @@ -0,0 +1,36 @@ +uniform int fogenabled; +uniform vec4 fogcolor; +uniform vec3 camerapos; +varying vec4 pixelpos; +varying vec4 fogparm; + +//=========================================================================== +// +// Main shader routine +// +//=========================================================================== + +void main() +{ + float fogdist; + float fogfactor; + + // + // calculate fog factor + // + #ifndef NO_SM4 + if (fogenabled == -1) + { + fogdist = pixelpos.w; + } + else + { + fogdist = max(16.0, distance(pixelpos.xyz, camerapos)); + } + #else + fogdist = pixelpos.w; + #endif + fogfactor = exp2 (fogparm.z * fogdist); + gl_FragColor = vec4(fogcolor.rgb, 1.0 - fogfactor); +} + diff --git a/wadsrc/static/shaders/glsl/func_brightmap.fp b/wadsrc/static/shaders/glsl/func_brightmap.fp new file mode 100644 index 000000000..e8ad0bb3d --- /dev/null +++ b/wadsrc/static/shaders/glsl/func_brightmap.fp @@ -0,0 +1,9 @@ +uniform sampler2D texture2; + +vec4 Process(vec4 color) +{ + vec4 brightpix = desaturate(texture2D(texture2, gl_TexCoord[0].st)); + vec4 texel = getTexel(gl_TexCoord[0].st); + return vec4(texel.rgb * min (color.rgb + brightpix.rgb, 1.0), texel.a*color.a); +} + diff --git a/wadsrc/static/shaders/glsl/func_normal.fp b/wadsrc/static/shaders/glsl/func_normal.fp new file mode 100644 index 000000000..f9297ca6f --- /dev/null +++ b/wadsrc/static/shaders/glsl/func_normal.fp @@ -0,0 +1,7 @@ + +vec4 Process(vec4 color) +{ + vec4 pix = getTexel(gl_TexCoord[0].st); + return pix * color; +} + diff --git a/wadsrc/static/shaders/glsl/func_notexture.fp b/wadsrc/static/shaders/glsl/func_notexture.fp new file mode 100644 index 000000000..99ef44f68 --- /dev/null +++ b/wadsrc/static/shaders/glsl/func_notexture.fp @@ -0,0 +1,6 @@ + +vec4 Process(vec4 color) +{ + return color; +} + diff --git a/wadsrc/static/shaders/glsl/func_warp1.fp b/wadsrc/static/shaders/glsl/func_warp1.fp new file mode 100644 index 000000000..c4acb8854 --- /dev/null +++ b/wadsrc/static/shaders/glsl/func_warp1.fp @@ -0,0 +1,17 @@ +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + + const float pi = 3.14159265358979323846; + vec2 offset = vec2(0,0); + + offset.y = sin(pi * 2.0 * (texCoord.x + timer * 0.125)) * 0.1; + offset.x = sin(pi * 2.0 * (texCoord.y + timer * 0.125)) * 0.1; + + texCoord += offset; + + return getTexel(texCoord) * color; +} + diff --git a/wadsrc/static/shaders/glsl/func_warp2.fp b/wadsrc/static/shaders/glsl/func_warp2.fp new file mode 100644 index 000000000..9d5b8f9db --- /dev/null +++ b/wadsrc/static/shaders/glsl/func_warp2.fp @@ -0,0 +1,18 @@ +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + + const float pi = 3.14159265358979323846; + vec2 offset = vec2(0.0,0.0); + + float siny = sin(pi * 2.0 * (texCoord.y * 2.2 + timer * 0.75)) * 0.03; + offset.y = siny + sin(pi * 2.0 * (texCoord.x * 0.75 + timer * 0.75)) * 0.03; + offset.x = siny + sin(pi * 2.0 * (texCoord.x * 1.1 + timer * 0.45)) * 0.02; + + texCoord += offset; + + return getTexel(texCoord) * color; +} + diff --git a/wadsrc/static/shaders/glsl/func_wavex.fp b/wadsrc/static/shaders/glsl/func_wavex.fp new file mode 100644 index 000000000..d90486358 --- /dev/null +++ b/wadsrc/static/shaders/glsl/func_wavex.fp @@ -0,0 +1,13 @@ +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + + const float pi = 3.14159265358979323846; + + texCoord.x += sin(pi * 2.0 * (texCoord.y + timer * 0.125)) * 0.1; + + return getTexel(texCoord) * color; +} + diff --git a/wadsrc/static/shaders/glsl/fuzz_jagged.fp b/wadsrc/static/shaders/glsl/fuzz_jagged.fp new file mode 100644 index 000000000..d1d1c9727 --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_jagged.fp @@ -0,0 +1,25 @@ +//created by Evil Space Tomato +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + + vec2 texSplat; + const float pi = 3.14159265358979323846; + texSplat.x = texCoord.x + mod(sin(pi * 2.0 * (texCoord.y + timer * 2.0)),0.1) * 0.1; + texSplat.y = texCoord.y + mod(cos(pi * 2.0 * (texCoord.x + timer * 2.0)),0.1) * 0.1; + + vec4 basicColor = getTexel(texSplat) * color; + + float texX = sin(texCoord.x * 100.0 + timer*5.0); + float texY = cos(texCoord.x * 100.0 + timer*5.0); + float vX = (texX/texY)*21.0; + float vY = (texY/texX)*13.0; + + float test = mod(timer*2.0+(vX + vY), 0.5); + + basicColor.a = basicColor.a * test; + + return basicColor; +} diff --git a/wadsrc/static/shaders/glsl/fuzz_noise.fp b/wadsrc/static/shaders/glsl/fuzz_noise.fp new file mode 100644 index 000000000..7e08646cb --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_noise.fp @@ -0,0 +1,21 @@ +//created by Evil Space Tomato +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + vec4 basicColor = getTexel(texCoord) * color; + + texCoord.x = float( int(texCoord.x * 128.0) ) / 128.0; + texCoord.y = float( int(texCoord.y * 128.0) ) / 128.0; + + float texX = sin(mod(texCoord.x * 100.0 + timer*5.0, 3.489)) + texCoord.x / 4.0; + float texY = cos(mod(texCoord.y * 100.0 + timer*5.0, 3.489)) + texCoord.y / 4.0; + float vX = (texX/texY)*21.0; + float vY = (texY/texX)*13.0; + + float test = mod(timer*2.0+(vX + vY), 0.5); + basicColor.a = basicColor.a * test; + basicColor.rgb = vec3(0.0,0.0,0.0); + return basicColor; +} diff --git a/wadsrc/static/shaders/glsl/fuzz_smooth.fp b/wadsrc/static/shaders/glsl/fuzz_smooth.fp new file mode 100644 index 000000000..9cb840e78 --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_smooth.fp @@ -0,0 +1,19 @@ +//created by Evil Space Tomato +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + vec4 basicColor = getTexel(texCoord) * color; + + float texX = texCoord.x / 3.0 + 0.66; + float texY = 0.34 - texCoord.y / 3.0; + float vX = (texX/texY)*21.0; + float vY = (texY/texX)*13.0; + float test = mod(timer*2.0+(vX + vY), 0.5); + + basicColor.a = basicColor.a * test; + basicColor.r = basicColor.g = basicColor.b = 0.0; + + return basicColor; +} diff --git a/wadsrc/static/shaders/glsl/fuzz_smoothnoise.fp b/wadsrc/static/shaders/glsl/fuzz_smoothnoise.fp new file mode 100644 index 000000000..4c796de60 --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_smoothnoise.fp @@ -0,0 +1,20 @@ +//created by Evil Space Tomato +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + vec4 basicColor = getTexel(texCoord) * color; + + float texX = sin(mod(texCoord.x * 100.0 + timer*5.0, 3.489)) + texCoord.x / 4.0; + float texY = cos(mod(texCoord.y * 100.0 + timer*5.0, 3.489)) + texCoord.y / 4.0; + float vX = (texX/texY)*21.0; + float vY = (texY/texX)*13.0; + + + float test = mod(timer*2.0+(vX + vY), 0.5); + basicColor.a = basicColor.a * test; + + basicColor.rgb = vec3(0.0,0.0,0.0); + return basicColor; +} diff --git a/wadsrc/static/shaders/glsl/fuzz_smoothtranslucent.fp b/wadsrc/static/shaders/glsl/fuzz_smoothtranslucent.fp new file mode 100644 index 000000000..074e5f10d --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_smoothtranslucent.fp @@ -0,0 +1,19 @@ +//created by Evil Space Tomato +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + vec4 basicColor = getTexel(texCoord) * color; + + float texX = sin(texCoord.x * 100.0 + timer*5.0); + float texY = cos(texCoord.x * 100.0 + timer*5.0); + float vX = (texX/texY)*21.0; + float vY = (texY/texX)*13.0; + + float test = mod(timer*2.0+(vX + vY), 0.5); + + basicColor.a = basicColor.a * test; + + return basicColor; +} diff --git a/wadsrc/static/shaders/glsl/fuzz_standard.fp b/wadsrc/static/shaders/glsl/fuzz_standard.fp new file mode 100644 index 000000000..a93bef849 --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_standard.fp @@ -0,0 +1,22 @@ +//created by Evil Space Tomato +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + vec4 basicColor = getTexel(texCoord) * color; + + texCoord.x = float( int(texCoord.x * 128.0) ) / 128.0; + texCoord.y = float( int(texCoord.y * 128.0) ) / 128.0; + + float texX = texCoord.x / 3.0 + 0.66; + float texY = 0.34 - texCoord.y / 3.0; + float vX = (texX/texY)*21.0; + float vY = (texY/texX)*13.0; + float test = mod(timer*2.0+(vX + vY), 0.5); + + basicColor.a = basicColor.a * test; + basicColor.r = basicColor.g = basicColor.b = 0.0; + + return basicColor; +} diff --git a/wadsrc/static/shaders/glsl/fuzz_swirly.fp b/wadsrc/static/shaders/glsl/fuzz_swirly.fp new file mode 100644 index 000000000..19816f8f4 --- /dev/null +++ b/wadsrc/static/shaders/glsl/fuzz_swirly.fp @@ -0,0 +1,19 @@ +//created by Evil Space Tomato +uniform float timer; + +vec4 Process(vec4 color) +{ + vec2 texCoord = gl_TexCoord[0].st; + vec4 basicColor = getTexel(texCoord) * color; + + float texX = sin(texCoord.x * 100.0 + timer*5.0); + float texY = cos(texCoord.x * 100.0 + timer*5.0); + float vX = (texX/texY)*21.0; + float vY = (texY/texX)*13.0; + float test = mod(timer*2.0+(vX + vY), 0.5); + + basicColor.a = basicColor.a * test; + basicColor.r = basicColor.g = basicColor.b = 0.0; + + return basicColor; +} diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp new file mode 100644 index 000000000..aa2c33238 --- /dev/null +++ b/wadsrc/static/shaders/glsl/main.fp @@ -0,0 +1,262 @@ + +// Changing this constant gives results very similar to changing r_visibility. +// Default is 232, it seems to give exactly the same light bands as software renderer. +#define DOOMLIGHTFACTOR 232.0 + + +#ifdef DYNLIGHT + +// ATI does not like this inside an #ifdef so it will be prepended by the compiling code inside the .EXE now. +//#version 120 +//#extension GL_EXT_gpu_shader4 : enable + +uniform ivec3 lightrange; +#ifndef MAXLIGHTS128 +uniform vec4 lights[256]; +#else +uniform vec4 lights[128]; +#endif + +#endif + + + +uniform int fogenabled; +uniform vec4 fogcolor; +uniform vec3 dlightcolor; +uniform vec3 camerapos; +varying vec4 pixelpos; +varying vec4 fogparm; +//uniform vec2 lightparms; +uniform float desaturation_factor; + +uniform vec4 topglowcolor; +uniform vec4 bottomglowcolor; +varying vec2 glowdist; + +uniform int texturemode; +uniform sampler2D tex; + +vec4 Process(vec4 color); + + +varying float lightlevel; + +#ifdef SOFTLIGHT +// Doom lighting equation ripped from EDGE. +// Big thanks to EDGE developers for making the only port +// that actually replicates software renderer's lighting in OpenGL. +// Float version. +// Basically replace int with float and divide all constants by 31. +float R_DoomLightingEquation(float light, float dist) +{ + /* L in the range 0 to 63 */ + float L = light * 63.0/31.0; + + float min_L = clamp(36.0/31.0 - L, 0.0, 1.0); + + // Fix objects getting totally black when close. + if (dist < 0.0001) + dist = 0.0001; + + float scale = 1.0 / dist; + float index = (59.0/31.0 - L) - (scale * DOOMLIGHTFACTOR/31.0 - DOOMLIGHTFACTOR/31.0); + + /* result is colormap index (0 bright .. 31 dark) */ + return clamp(index, min_L, 1.0); +} +#endif + +//=========================================================================== +// +// Desaturate a color +// +//=========================================================================== + +vec4 desaturate(vec4 texel) +{ + #ifndef NO_DESATURATE + float gray = (texel.r * 0.3 + texel.g * 0.56 + texel.b * 0.14); + return mix (vec4(gray,gray,gray,texel.a), texel, desaturation_factor); + #else + return texel; + #endif +} + +//=========================================================================== +// +// Calculate light +// +//=========================================================================== + +vec4 getLightColor(float fogdist, float fogfactor) +{ + vec4 color = gl_Color; + #ifdef SOFTLIGHT + float newlightlevel = 1.0 - R_DoomLightingEquation(lightlevel, gl_FragCoord.z); + color.rgb *= clamp(vec3(newlightlevel) + dlightcolor, 0.0, 1.0); + #endif + #ifndef NO_FOG + // + // apply light diminishing + // + if (fogenabled > 0) + { + #if (!defined(NO_SM4) || defined(DOOMLIGHT)) && !defined SOFTLIGHT + // special lighting mode 'Doom' not available on older cards for performance reasons. + if (fogdist < fogparm.y) + { + color.rgb *= fogparm.x - (fogdist / fogparm.y) * (fogparm.x - 1.0); + } + #endif + + //color = vec4(color.rgb * (1.0 - fogfactor), color.a); + color.rgb = mix(vec3(0.0, 0.0, 0.0), color.rgb, fogfactor); + } + #endif + + #ifndef NO_GLOW + // + // handle glowing walls + // + if (topglowcolor.a > 0.0 && glowdist.x < topglowcolor.a) + { + color.rgb += desaturate(topglowcolor * (1.0 - glowdist.x / topglowcolor.a)).rgb; + } + if (bottomglowcolor.a > 0.0 && glowdist.y < bottomglowcolor.a) + { + color.rgb += desaturate(bottomglowcolor * (1.0 - glowdist.y / bottomglowcolor.a)).rgb; + } + color = min(color, 1.0); + #endif + + // calculation of actual light color is complete. + return color; +} + +//=========================================================================== +// +// Gets a texel and performs common manipulations +// +//=========================================================================== + +vec4 getTexel(vec2 st) +{ + vec4 texel = texture2D(tex, st); + + #ifndef NO_TEXTUREMODE + // + // Apply texture modes + // + if (texturemode == 2) + { + texel.a = 1.0; + } + else if (texturemode == 1) + { + texel.rgb = vec3(1.0,1.0,1.0); + } + #endif + + return desaturate(texel); +} + +//=========================================================================== +// +// Applies colored fog +// +//=========================================================================== + +#ifndef NO_FOG +vec4 applyFog(vec4 frag, float fogfactor) +{ + return vec4(mix(fogcolor.rgb, frag.rgb, fogfactor), frag.a); +} +#endif + + +//=========================================================================== +// +// Main shader routine +// +//=========================================================================== + +void main() +{ + float fogdist = 0.0; + float fogfactor = 0.0; + + #ifdef DYNLIGHT + vec4 dynlight = vec4(0.0,0.0,0.0,0.0); + vec4 addlight = vec4(0.0,0.0,0.0,0.0); + #endif + + #ifndef NO_FOG + // + // calculate fog factor + // + if (fogenabled != 0) + { + #ifndef NO_SM4 + if (fogenabled == 1 || fogenabled == -1) + { + fogdist = pixelpos.w; + } + else + { + fogdist = max(16.0, distance(pixelpos.xyz, camerapos)); + } + #elif !defined(FOG_RADIAL) + fogdist = pixelpos.w; + #else + fogdist = max(16.0, distance(pixelpos.xyz, camerapos)); + #endif + fogfactor = exp2 (fogparm.z * fogdist); + } + #endif + + vec4 frag = getLightColor(fogdist, fogfactor); + + + #ifdef DYNLIGHT + for(int i=0; i