Class: Mittsu::OpenGLRenderTarget
- Inherits:
-
OpenGLTexture
- Object
- OpenGLTexture
- Mittsu::OpenGLRenderTarget
- Includes:
- EventDispatcher
- Defined in:
- lib/mittsu/renderers/opengl_render_target.rb
Instance Attribute Summary collapse
-
#anisotropy ⇒ Object
Returns the value of attribute anisotropy.
-
#depth_buffer ⇒ Object
Returns the value of attribute depth_buffer.
-
#format ⇒ Object
Returns the value of attribute format.
-
#framebuffer ⇒ Object
readonly
Returns the value of attribute framebuffer.
-
#generate_mipmaps ⇒ Object
Returns the value of attribute generate_mipmaps.
-
#height ⇒ Object
Returns the value of attribute height.
-
#mag_filter ⇒ Object
Returns the value of attribute mag_filter.
-
#min_filter ⇒ Object
Returns the value of attribute min_filter.
-
#offset ⇒ Object
Returns the value of attribute offset.
-
#repeat ⇒ Object
Returns the value of attribute repeat.
-
#share_depth_from ⇒ Object
Returns the value of attribute share_depth_from.
-
#stencil_buffer ⇒ Object
Returns the value of attribute stencil_buffer.
-
#type ⇒ Object
Returns the value of attribute type.
-
#width ⇒ Object
Returns the value of attribute width.
-
#wrap_s ⇒ Object
Returns the value of attribute wrap_s.
-
#wrap_t ⇒ Object
Returns the value of attribute wrap_t.
Attributes inherited from OpenGLTexture
Instance Method Summary collapse
- #clone ⇒ Object
- #dispose ⇒ Object
- #implementation(renderer) ⇒ Object
-
#initialize(width, height, options = {}) ⇒ OpenGLRenderTarget
constructor
A new instance of OpenGLRenderTarget.
- #needs_update? ⇒ Boolean
- #set_size(width, height) ⇒ Object
- #setup_buffers ⇒ Object
- #update_mipmap ⇒ Object
- #use ⇒ Object
Methods included from EventDispatcher
#add_event_listener, #dispatch_event, #has_event_listener, #remove_event_listener
Methods inherited from OpenGLTexture
Constructor Details
#initialize(width, height, options = {}) ⇒ OpenGLRenderTarget
Returns a new instance of OpenGLRenderTarget.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 23 def initialize(width, height, = {}) super(self, nil) @width = width @height = height @wrap_s = .fetch(:wrap_s, ClampToEdgeWrapping) @wrap_t = .fetch(:wrap_t, ClampToEdgeWrapping) @mag_filter = .fetch(:mag_filter, LinearFilter) @min_filter = .fetch(:min_filter, LinearMipMapLinearFilter) @anisotropy = .fetch(:anisotropy, 1.0); @offset = Vector2.new(0.0, 0.0) @repeat = Vector2.new(1.0, 1.0) @format = .fetch(:format, RGBAFormat) @type = .fetch(:type, UnsignedByteType) @depth_buffer = .fetch(:depth_buffer, true) @stencil_buffer = .fetch(:stencil_buffer, true) @generate_mipmaps = true @share_depth_from = .fetch(:share_depth_from, nil) end |
Instance Attribute Details
#anisotropy ⇒ Object
Returns the value of attribute anisotropy.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def anisotropy @anisotropy end |
#depth_buffer ⇒ Object
Returns the value of attribute depth_buffer.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def depth_buffer @depth_buffer end |
#format ⇒ Object
Returns the value of attribute format.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def format @format end |
#framebuffer ⇒ Object (readonly)
Returns the value of attribute framebuffer.
21 22 23 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 21 def framebuffer @framebuffer end |
#generate_mipmaps ⇒ Object
Returns the value of attribute generate_mipmaps.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def generate_mipmaps @generate_mipmaps end |
#height ⇒ Object
Returns the value of attribute height.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def height @height end |
#mag_filter ⇒ Object
Returns the value of attribute mag_filter.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def mag_filter @mag_filter end |
#min_filter ⇒ Object
Returns the value of attribute min_filter.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def min_filter @min_filter end |
#offset ⇒ Object
Returns the value of attribute offset.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def offset @offset end |
#repeat ⇒ Object
Returns the value of attribute repeat.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def repeat @repeat end |
#share_depth_from ⇒ Object
Returns the value of attribute share_depth_from.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def share_depth_from @share_depth_from end |
#stencil_buffer ⇒ Object
Returns the value of attribute stencil_buffer.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def stencil_buffer @stencil_buffer end |
#type ⇒ Object
Returns the value of attribute type.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def type @type end |
#width ⇒ Object
Returns the value of attribute width.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def width @width end |
#wrap_s ⇒ Object
Returns the value of attribute wrap_s.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def wrap_s @wrap_s end |
#wrap_t ⇒ Object
Returns the value of attribute wrap_t.
5 6 7 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 5 def wrap_t @wrap_t end |
Instance Method Details
#clone ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 60 def clone OpenGLRenderTarget.new(@width, @height).tap do |tmp| tmp.wrap_s = @wrap_s tmp.wrap_t = @wrap_t tmp.mag_filter = @mag_filter tmp.min_filter = @min_filter tmp.anisotropy = @anisotropy tmp.offset.copy(@offset) tmp.repeat.copy(@repeat) tmp.format = @format tmp.type = @type tmp.depth_buffer = @depth_buffer tmp.stencil_buffer = @stencil_buffer tmp.generate_mipmaps = @generate_mipmaps tmp.share_depth_from = @share_depth_from end end |
#dispose ⇒ Object
154 155 156 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 154 def dispose dispatch_event(type: :dispose) end |
#implementation(renderer) ⇒ Object
158 159 160 161 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 158 def implementation(renderer) @renderer = renderer self end |
#needs_update? ⇒ Boolean
56 57 58 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 56 def needs_update? false end |
#set_size(width, height) ⇒ Object
51 52 53 54 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 51 def set_size(width, height) @width = width @height = height end |
#setup_buffers ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 85 def setup_buffers return unless @framebuffer.nil? # TODO: when OpenGLRenderTargetCube exists is_cube = false # render_target.is_a? OpenGLRenderTargetCube @depth_buffer = true if @depth_buffer.nil? @stencil_buffer = true if @stencil_buffer.nil? add_event_listener(:dispose, @renderer.method(:on_render_target_dispose)) @opengl_texture = glCreateTexture @renderer.info[:memory][:textures] += 1 # Setup texture, create render and frame buffers is_target_power_of_two = Math.power_of_two?(@width) && Math.power_of_two?(@height) gl_format = GL_MITTSU_PARAMS[@format] gl_type = GL_MITTSU_PARAMS[@type] if is_cube # TODO else @framebuffer = glCreateFramebuffer if @share_depth_from @renderbuffer = share_depth_from.renderbuffer else @renderbuffer = glCreateRenderbuffer end glBindTexture(GL_TEXTURE_2D, @opengl_texture) set_parameters(GL_TEXTURE_2D, is_target_power_of_two) glTexImage2D(GL_TEXTURE_2D, 0, gl_format, @width, @height, 0, gl_format, gl_type, nil) setup_framebuffer(GL_TEXTURE_2D) if @share_depth_from if @depth_buffer && !@stencil_buffer glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, @renderbuffer) elsif @depth_buffer && @stencil_buffer glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, @renderbuffer) end else setup_renderbuffer end glGenerateMipmap(GL_TEXTURE_2D) if is_target_power_of_two end # Release everything if is_cube # TODO else glBindTexture(GL_TEXTURE_2D, 0) end glBindRenderbuffer(GL_RENDERBUFFER, 0) glBindFramebuffer(GL_FRAMEBUFFER, 0) end |
#update_mipmap ⇒ Object
163 164 165 166 167 168 169 170 171 172 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 163 def update_mipmap return if !@generate_mipmaps || @min_filter == NearestFilter || @min_filter == LinearFilter # TODO: when OpenGLRenderTargetCube exists # glBindTexture(GL_TEXTURE_CUBE_MAP, @opengl_texture) # glGenerateMipmap(GL_TEXTURE_CUBE_MAP) # glBindTexture(GL_TEXTURE_CUBE_MAP, nil) glBindTexture(GL_TEXTURE_2D, @opengl_texture) glGenerateMipmap(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, nil) end |
#use ⇒ Object
149 150 151 152 |
# File 'lib/mittsu/renderers/opengl_render_target.rb', line 149 def use glBindFramebuffer(GL_FRAMEBUFFER, @framebuffer) glViewport(0, 0, @width, @height) end |