funfriend/src/buddy_renderer.cr

110 lines
3.3 KiB
Crystal
Raw Normal View History

class Funfriend::BuddyRenderer
getter buddy : Buddy
2023-05-30 15:47:50 +02:00
2023-06-02 13:57:26 +02:00
getter buddy_shader : Program
getter bg_shader : Program
2023-05-30 15:47:50 +02:00
getter vertex_array : VertexArray
getter vertex_buffer : Buffer
getter textures : TextureMan::TextureBasket
2023-06-02 13:57:26 +02:00
getter bg_texture : Texture?
2023-05-30 15:47:50 +02:00
def initialize(@buddy : Buddy)
2023-06-02 13:57:26 +02:00
@buddy_shader, @bg_shader = init_shaders
2023-05-30 15:47:50 +02:00
@vertex_array, @vertex_buffer = init_buffers
@textures = buddy.textures
2023-06-02 13:57:26 +02:00
@bg_texture = buddy.bg_texture
2023-05-30 15:47:50 +02:00
end
2023-06-01 12:41:01 +02:00
def funfriend_size
funfriend_size = ConfigMan.config["window"]["funfriend_size"].as(Int32)
{width: funfriend_size, height: funfriend_size}
end
2023-05-30 15:47:50 +02:00
def init_buffers
vertices = {
# ------ positions ------- texture coordinates
1.0f32, 1.0f32, 0.0f32, 1.0f32, 1.0f32, # top right
1.0f32, -1.0f32, 0.0f32, 1.0f32, 0.0f32, # bottom right
-1.0f32, -1.0f32, 0.0f32, 0.0f32, 0.0f32, # bottom left
-1.0f32, 1.0f32, 0.0f32, 0.0f32, 1.0f32 # top left
}
# Indices used for indexed draw calls. Each is used as an index into the four vertices.
indices = {
0, 1, 3, # first triangle
1, 2, 3 # second triangle
}
vertex_buffer = Buffer.new
element_buffer = Buffer.new
vertex_array = VertexArray.new
vertex_array.bind do
vertex_buffer.bind(Buffer::Target::Array) do |buffer, target|
target.buffer_data(vertices, Buffer::UsageHint::StaticDraw)
vertex_array.define_attributes do |va|
va.attribute(3, DataType::Float, false)
va.attribute(2, DataType::Float, false)
end
end
# bind the element buffer to GL_ELEMENT_ARRAY_BUFFER
element_buffer.bind(Buffer::Target::ElementArray)
# Send index data to the GPU.
Buffer::Target::ElementArray.buffer_data(indices, Buffer::UsageHint::StaticDraw)
end
# unbind the element buffer.
element_buffer.unbind
return {vertex_array, vertex_buffer}
end
def init_shaders
2023-06-02 13:57:26 +02:00
{GL.shader("funfriend.frag", "nop.vert"), GL.shader("nop.frag", "nop.vert")}
2023-05-30 15:47:50 +02:00
end
def render(dt : Float64, window_width : Int32, window_height : Int32)
LibGL.clear_color(0.0, 0.0, 0.0, 0.0)
LibGL.clear(Buffer::Bit::Color)
textures.update(dt)
frame = textures.texture
2023-05-30 15:47:50 +02:00
width, height = frame[:width], frame[:height]
2023-06-02 13:57:26 +02:00
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
2023-05-30 15:47:50 +02:00
frame[:tex].bind(Texture::Target::Texture2D) do
2023-06-02 13:57:26 +02:00
buddy_shader.use do |shader|
2023-05-30 15:47:50 +02:00
shader.set_uniform("texture1", 0)
2023-06-01 12:41:01 +02:00
shader.set_uniform("funfriendSize", funfriend_size[:width].to_f32, funfriend_size[:height].to_f32)
2023-05-30 15:47:50 +02:00
shader.set_uniform("resolution", window_width.to_f32, window_height.to_f32)
shader.set_uniform("time", CrystGLFW.time.to_f32)
vertex_array.bind do
LibGL.draw_elements(LibGL::TRIANGLES, 6, DataType::UnsignedInt, Pointer(Void).new(0))
end
end
end
end
def clean_up
{vertex_array, vertex_buffer}.each { |v| v.delete }
end
end