diff --git a/assets/buddies/god_00.png b/assets/buddies/god_00.png index 2f6af48..d4a284d 100644 Binary files a/assets/buddies/god_00.png and b/assets/buddies/god_00.png differ diff --git a/assets/buddies/god_01.png b/assets/buddies/god_01.png index 3ba358a..9553ef9 100644 Binary files a/assets/buddies/god_01.png and b/assets/buddies/god_01.png differ diff --git a/assets/buddies/god_02.png b/assets/buddies/god_02.png index 1e1114b..6ce5f5c 100644 Binary files a/assets/buddies/god_02.png and b/assets/buddies/god_02.png differ diff --git a/assets/buddies/god_03.png b/assets/buddies/god_03.png index 77dc44d..fa5d806 100644 Binary files a/assets/buddies/god_03.png and b/assets/buddies/god_03.png differ diff --git a/assets/buddies/god_04.png b/assets/buddies/god_04.png index e92f59a..1ae0053 100644 Binary files a/assets/buddies/god_04.png and b/assets/buddies/god_04.png differ diff --git a/assets/buddies/god_05.png b/assets/buddies/god_05.png index 0d3219e..ee3290f 100644 Binary files a/assets/buddies/god_05.png and b/assets/buddies/god_05.png differ diff --git a/assets/buddies/god_06.png b/assets/buddies/god_06.png index 26806f5..3f15823 100644 Binary files a/assets/buddies/god_06.png and b/assets/buddies/god_06.png differ diff --git a/assets/buddies/god_07.png b/assets/buddies/god_07.png index 8222c7d..370e051 100644 Binary files a/assets/buddies/god_07.png and b/assets/buddies/god_07.png differ diff --git a/assets/buddies/god_08.png b/assets/buddies/god_08.png index 1184bcf..cc2ae69 100644 Binary files a/assets/buddies/god_08.png and b/assets/buddies/god_08.png differ diff --git a/assets/buddies/god_09.png b/assets/buddies/god_09.png index d5cd84f..b649987 100644 Binary files a/assets/buddies/god_09.png and b/assets/buddies/god_09.png differ diff --git a/assets/buddies/god_bg.png b/assets/buddies/god_bg.png new file mode 100644 index 0000000..16f9adf Binary files /dev/null and b/assets/buddies/god_bg.png differ diff --git a/src/buddies.cr b/src/buddies.cr index 468db40..a874c58 100644 --- a/src/buddies.cr +++ b/src/buddies.cr @@ -17,6 +17,8 @@ module Funfriend # Returns the textures this buddy uses abstract def textures : TextureMan::TextureBasket + # Texture to stretch over the whole canvas + abstract def bg_texture : Texture? # Implements the logic for the talk SFX, similar to corru.observer's `talk: () => ...` abstract def talk_sound @@ -58,6 +60,10 @@ module Funfriend ) end + def bg_texture : Texture? + nil + end + def talk_sound SoundMan.play_sound("assets/sfx/talk#{(1..8).sample}.ogg") end @@ -95,6 +101,10 @@ module Funfriend ) end + def bg_texture : Texture? + TextureMan.load_texture("assets/buddies/god_bg.png")[:tex] + end + def talk_sound SoundMan.play_sound("assets/sfx/talk_god#{(1..8).sample}.ogg") end diff --git a/src/buddy_renderer.cr b/src/buddy_renderer.cr index 9089248..f6e8b5f 100644 --- a/src/buddy_renderer.cr +++ b/src/buddy_renderer.cr @@ -1,15 +1,18 @@ class Funfriend::BuddyRenderer getter buddy : Buddy - getter shader_program : Program + getter buddy_shader : Program + getter bg_shader : Program getter vertex_array : VertexArray getter vertex_buffer : Buffer getter textures : TextureMan::TextureBasket + getter bg_texture : Texture? def initialize(@buddy : Buddy) - @shader_program = init_shaders + @buddy_shader, @bg_shader = init_shaders @vertex_array, @vertex_buffer = init_buffers @textures = buddy.textures + @bg_texture = buddy.bg_texture end def funfriend_size @@ -59,14 +62,7 @@ class Funfriend::BuddyRenderer end def init_shaders - vertex_shader_source = FileStorage.get("nop.vert").gets_to_end - fragment_shader_source = FileStorage.get("funfriend.frag").gets_to_end - - vertex_shader = VertexShader.create(vertex_shader_source) - fragment_shader = FragmentShader.create(fragment_shader_source) - - shaders = {vertex_shader, fragment_shader} - return Program.create(shaders) + {GL.shader("funfriend.frag", "nop.vert"), GL.shader("nop.frag", "nop.vert")} end def render(dt : Float64, window_width : Int32, window_height : Int32) @@ -78,9 +74,23 @@ class Funfriend::BuddyRenderer width, height = frame[:width], frame[:height] - Texture::Unit.activate(0) + LibGL.enable(LibGL::BLEND) + LibGL.blend_func(LibGL::SRC_ALPHA, LibGL::ONE_MINUS_SRC_ALPHA) + + if bg_texture + bg_texture.not_nil!.bind(Texture::Target::Texture2D) do + bg_shader.use do |shader| + shader.set_uniform("texture1", 0) + + vertex_array.bind do + LibGL.draw_elements(LibGL::TRIANGLES, 6, DataType::UnsignedInt, Pointer(Void).new(0)) + end + end + end + end + frame[:tex].bind(Texture::Target::Texture2D) do - shader_program.use do |shader| + buddy_shader.use do |shader| shader.set_uniform("texture1", 0) shader.set_uniform("funfriendSize", funfriend_size[:width].to_f32, funfriend_size[:height].to_f32) shader.set_uniform("resolution", window_width.to_f32, window_height.to_f32) diff --git a/src/gl.cr b/src/gl.cr index ea9c1b0..a4cf9d1 100644 --- a/src/gl.cr +++ b/src/gl.cr @@ -12,4 +12,15 @@ module Funfriend::GL offset += size end end + + def shader(fragment_filename : String, vertex_filename : String) : Program + vertex_shader_source = FileStorage.get(vertex_filename).gets_to_end + fragment_shader_source = FileStorage.get(fragment_filename).gets_to_end + + vertex_shader = VertexShader.create(vertex_shader_source) + fragment_shader = FragmentShader.create(fragment_shader_source) + + shaders = {vertex_shader, fragment_shader} + Program.create(shaders) + end end diff --git a/src/text_renderer.cr b/src/text_renderer.cr index d32a5db..318b66e 100644 --- a/src/text_renderer.cr +++ b/src/text_renderer.cr @@ -35,17 +35,13 @@ class Funfriend::TextRenderer end def init_shaders - vertex_shader_source = FileStorage.get("nop.vert").gets_to_end - fragment_shader_source = FileStorage.get("bake_alpha.frag").gets_to_end - - vertex_shader = VertexShader.create(vertex_shader_source) - fragment_shader = FragmentShader.create(fragment_shader_source) - - shaders = {vertex_shader, fragment_shader} - return Program.create(shaders) + GL.shader("nop.frag", "nop.vert") end def render(dt : Float64) + LibGL.enable(LibGL::BLEND) + LibGL.blend_func(LibGL::SRC_ALPHA, LibGL::ONE_MINUS_SRC_ALPHA) + font_texture.bind(Texture::Target::Texture2D) do shader_program.use do |p| p.set_uniform("texture1", 0)