Sha256: 9740487336743cd1cf8e2d5d5eb213605e7030a228cd74902ee77106da149cf1

Contents?: true

Size: 1.97 KB

Versions: 10

Compression:

Stored size: 1.97 KB

Contents

module CyberarmEngine
  class Texture
    DEFAULT_TEXTURE = "#{CYBERARM_ENGINE_ROOT_PATH}/assets/textures/default.png".freeze

    CACHE = {}

    def self.release_textures
      CACHE.values.each do |id|
        glDeleteTextures(id)
      end
    end

    def self.from_cache(path, retro)
      CACHE.dig("#{path}?retro=#{retro}")
    end

    attr_reader :id

    def initialize(path: nil, image: nil, retro: false)
      raise "keyword :path or :image must be provided!" if path.nil? && image.nil?

      @retro = retro
      @path = path

      if @path
        unless File.exist?(@path)
          warn "Missing texture at: #{@path}"
          @retro = true # override retro setting
          @path = DEFAULT_TEXTURE
        end

        if texture = Texture.from_cache(@path, @retro)
          @id = texture.id
          return
        end

        image = load_image(@path)
        @id = create_from_image(image)
      else
        @id = create_from_image(image)
      end
    end

    def load_image(path)
      CACHE["#{path}?retro=#{@retro}"] = self
      Gosu::Image.new(path, retro: @retro)
    end

    def create_from_image(image)
      array_of_pixels = image.to_blob

      tex_names_buf = " " * 4
      glGenTextures(1, tex_names_buf)
      texture_id = tex_names_buf.unpack1("L2")

      glBindTexture(GL_TEXTURE_2D, texture_id)
      glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA, image.width, image.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, array_of_pixels)
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) if @retro
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) unless @retro
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
      glGenerateMipmap(GL_TEXTURE_2D)
      gl_error?

      texture_id
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
cyberarm_engine-0.24.4 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.24.3 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.24.2 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.24.1 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.24.0 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.23.0 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.22.0 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.21.0 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.20.0 lib/cyberarm_engine/opengl/texture.rb
cyberarm_engine-0.19.1 lib/cyberarm_engine/opengl/texture.rb