aboutsummaryrefslogtreecommitdiff
path: root/libs/moonshine/dmg.lua
diff options
context:
space:
mode:
authorIndrajith K L2022-02-27 01:15:31 +0530
committerIndrajith K L2022-02-27 01:15:31 +0530
commit62ff5245c26c305e35a2903cc64a60cb20718e96 (patch)
tree9042f9917e77b584b0ceb421166221ef7777a5d1 /libs/moonshine/dmg.lua
downloadYEAD-62ff5245c26c305e35a2903cc64a60cb20718e96.tar.gz
YEAD-62ff5245c26c305e35a2903cc64a60cb20718e96.tar.bz2
YEAD-62ff5245c26c305e35a2903cc64a60cb20718e96.zip
Initial Commit
* ECS - In-Progress * GameStates - Skeleton Implemented * Library Integrations - Completed * Levels - In-Progress
Diffstat (limited to 'libs/moonshine/dmg.lua')
-rw-r--r--libs/moonshine/dmg.lua153
1 files changed, 153 insertions, 0 deletions
diff --git a/libs/moonshine/dmg.lua b/libs/moonshine/dmg.lua
new file mode 100644
index 0000000..b426852
--- /dev/null
+++ b/libs/moonshine/dmg.lua
@@ -0,0 +1,153 @@
+--[[
+The MIT License (MIT)
+
+Original code: Copyright (c) 2015 Josef Patoprsty
+Port to moonshine: Copyright (c) 2017 Matthias Richter <vrld@vrld.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+]]--
+
+local palettes = {
+ -- Default color palette. Source:
+ -- http://en.wikipedia.org/wiki/List_of_video_game_console_palettes#Original_Game_Boy
+ {
+ name = "default",
+ colors = {
+ { 15/255, 56/255, 15/255},
+ { 48/255, 98/255, 48/255},
+ {139/255,172/255, 15/255},
+ {155/255,188/255, 15/255}
+ }
+ },
+ -- Hardcore color profiles. Source:
+ -- http://www.hardcoregaming101.net/gbdebate/gbcolours.htm
+ {
+ name = "dark_yellow",
+ colors = {
+ {33/255,32/255,16/255},
+ {107/255,105/255,49/255},
+ {181/255,174/255,74/255},
+ {255/255,247/255,123/255}
+ }
+ },
+ {
+ name = "light_yellow",
+ colors = {
+ {102/255,102/255,37/255},
+ {148/255,148/255,64/255},
+ {208/255,208/255,102/255},
+ {255/255,255/255,148/255}
+ }
+ },
+ {
+ name = "green",
+ colors = {
+ {8/255,56/255,8/255},
+ {48/255,96/255,48/255},
+ {136/255,168/255,8/255},
+ {183/255,220/255,17/255}
+ }
+ },
+ {
+ name = "greyscale",
+ colors = {
+ {56/255,56/255,56/255},
+ {117/255,117/255,117/255},
+ {178/255,178/255,178/255},
+ {239/255,239/255,239/255}
+ }
+ },
+ {
+ name = "stark_bw",
+ colors = {
+ {0/255,0/255,0/255},
+ {117/255,117/255,117/255},
+ {178/255,178/255,178/255},
+ {255/255,255/255,255/255}
+ }
+ },
+ {
+ name = "pocket",
+ colors = {
+ {108/255,108/255,78/255},
+ {142/255,139/255,87/255},
+ {195/255,196/255,165/255},
+ {227/255,230/255,201/255}
+ }
+ }
+}
+
+local lookup_palette = function(name)
+ for _,palette in pairs(palettes) do
+ if palette.name == name then
+ return palette
+ end
+ end
+end
+
+local is_valid_palette = function(v)
+ -- Needs to match: {{R,G,B},{R,G,B},{R,G,B},{R,G,B}}
+ if #v ~= 4 then return false end
+
+ for i = 1,4 do
+ if type(v[i]) ~= "table" or #v[i] ~= 3 then return false end
+ for c = 1,3 do
+ if type(v[i][c]) ~= "number" then return false end
+ local x = v[i][c]
+ if x > 1 then x = x / 255 end
+ if x < 0 or x > 1 then return false end
+ v[i][c] = x
+ end
+ end
+ return true
+end
+
+return function(moonshine)
+ local shader = love.graphics.newShader[[
+ extern vec3 palette[ 4 ];
+
+ vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords) {
+ vec4 pixel = Texel(texture, texture_coords);
+ float avg = min(0.9999,max(0.0001,(pixel.r + pixel.g + pixel.b)/3));
+ int index = int(avg*4);
+ return vec4(palette[index], pixel.a);
+ }]]
+
+ local setters = {}
+ setters.palette = function(v)
+ if type(v) == "number" and palettes[math.floor(v)] then -- indexed palette
+ palette = palettes[math.floor(v)]
+ elseif type(v) == "string" then -- named palette
+ palette = lookup_palette(v)
+ elseif type(v) == "table" and is_valid_palette(v) then -- custom palette
+ palette = {colors=v}
+ else -- Fall back to default
+ palette = palettes[1]
+ end
+ shader:send("palette", palette.colors[1], palette.colors[2],
+ palette.colors[3], palette.colors[4], {})
+ end
+
+ return moonshine.Effect{
+ name = "dmg",
+ shader = shader,
+ setters = setters,
+ defaults = {palette = "default"}
+ }
+end