ruby_rpg 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 007b1e3b07b58938d2ef46f760a57bcff8ea430db434db6be96804453e864839
4
- data.tar.gz: 54ba403b3ba8bfa5b5c0a1a9e537b6acce9dcaa20460354592ab1cb738fa617c
3
+ metadata.gz: 2af1c7ed1b41fa5eaabfdf70e7b3ba0edb82c2af7bf03f5c376e23d8ed16efd1
4
+ data.tar.gz: fb36bef8b832479b05401c0eb90522bd255ee40d8ad6357caf75bf40e685322a
5
5
  SHA512:
6
- metadata.gz: ce867115127c2b89fde8c2cc9de02c8d4cb76b73358e5104d75889d886cf5780db38c2a7ce925480e364d3ca3c2d08adc2cfc822daf38b7e462e0d32b2795b6e
7
- data.tar.gz: 46dfa2e1f02498f220f825efcdbaa9ebf97a1133f58e019fd2ee1c92efd38ae4731e454cb35606f5aaf588a707fbc08b997a01e61e8d9dee31201f8a729e7889
6
+ metadata.gz: b7976e4dae17174f3483a0ecd4da0fb9ad49a40943d2ad54a31381be28ced45d39c58f5683468f115c37a40d5762603a78121342a44dd16e6b56f87508b6ec94
7
+ data.tar.gz: aec55a9871b095a867397b9fe6d78ea0ecf21064c2bc41ec36841818ead2890334ee7faf327942370331f2213c7fb96862898b965e1abfe13cb04045e9a2338e
@@ -224,6 +224,12 @@ static VALUE rb_gl_depth_func(VALUE self, VALUE func) {
224
224
  return Qnil;
225
225
  }
226
226
 
227
+ /* LineWidth(width) */
228
+ static VALUE rb_gl_line_width(VALUE self, VALUE width) {
229
+ glLineWidth((GLfloat)NUM2DBL(width));
230
+ return Qnil;
231
+ }
232
+
227
233
  /* DrawBuffer(mode) */
228
234
  static VALUE rb_gl_draw_buffer(VALUE self, VALUE mode) {
229
235
  glDrawBuffer((GLenum)NUM2INT(mode));
@@ -521,6 +527,7 @@ void Init_gl_native(void) {
521
527
  rb_define_module_function(mGLNative, "create_shader", rb_gl_create_shader, 1);
522
528
  rb_define_module_function(mGLNative, "cull_face", rb_gl_cull_face, 1);
523
529
  rb_define_module_function(mGLNative, "depth_func", rb_gl_depth_func, 1);
530
+ rb_define_module_function(mGLNative, "line_width", rb_gl_line_width, 1);
524
531
  rb_define_module_function(mGLNative, "draw_buffer", rb_gl_draw_buffer, 1);
525
532
  rb_define_module_function(mGLNative, "draw_buffers", rb_gl_draw_buffers, 2);
526
533
  rb_define_module_function(mGLNative, "enable_vertex_attrib_array", rb_gl_enable_vertex_attrib_array, 1);
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Engine
4
+ module Debug
5
+ @lines = []
6
+
7
+ class << self
8
+ def line(from, to, color: [1, 1, 1])
9
+ @lines << { from: from, to: to, color: color }
10
+ end
11
+
12
+ def lines
13
+ @lines
14
+ end
15
+
16
+ def clear
17
+ @lines.clear
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/engine/gl.rb CHANGED
@@ -232,6 +232,10 @@ module Engine
232
232
  GLNative.get_uniform_location(program, name)
233
233
  end
234
234
 
235
+ def self.LineWidth(width)
236
+ GLNative.line_width(width)
237
+ end
238
+
235
239
  def self.LinkProgram(program)
236
240
  GLNative.link_program(program)
237
241
  end
@@ -360,6 +364,7 @@ module Engine
360
364
  KEEP = 0x1E00
361
365
  LESS = 0x0201
362
366
  LINEAR = 0x2601
367
+ LINES = 0x0001
363
368
  LINK_STATUS = 0x8B82
364
369
  NEAREST = 0x2600
365
370
  NONE = 0
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rendering
4
+ module DebugDraw
5
+ SCALE_FACTOR = 3 # Render at 1/3 resolution for thicker lines
6
+
7
+ class << self
8
+ def draw(target_framebuffer)
9
+ lines = Engine::Debug.lines
10
+ return if lines.empty?
11
+
12
+ update_render_texture_size
13
+
14
+ # Draw lines to low-res texture
15
+ render_texture.bind
16
+ Engine::GL.ClearColor(0.0, 0.0, 0.0, 0.0)
17
+ Engine::GL.Clear(Engine::GL::COLOR_BUFFER_BIT)
18
+ Engine::GL.Disable(Engine::GL::DEPTH_TEST)
19
+
20
+ line_shader.use
21
+ line_shader.set_mat4('camera', camera_matrix)
22
+
23
+ update_vertex_data(lines)
24
+ draw_lines(lines.size * 2)
25
+
26
+ # Composite onto main framebuffer
27
+ Engine::GL.BindFramebuffer(Engine::GL::FRAMEBUFFER, target_framebuffer)
28
+ Engine::GL.Viewport(0, 0, Engine::Window.framebuffer_width, Engine::Window.framebuffer_height)
29
+ Engine::GL.Enable(Engine::GL::BLEND)
30
+
31
+ composite_material.set_runtime_texture('debugTexture', render_texture.color_texture)
32
+ composite_material.set_vec2('texelSize', [1.0 / render_texture.width, 1.0 / render_texture.height])
33
+ screen_quad.draw_with_material(composite_material)
34
+
35
+ Engine::Debug.clear
36
+ end
37
+
38
+ private
39
+
40
+ def update_render_texture_size
41
+ width = Engine::Window.framebuffer_width / SCALE_FACTOR
42
+ height = Engine::Window.framebuffer_height / SCALE_FACTOR
43
+ width = [width, 1].max
44
+ height = [height, 1].max
45
+
46
+ if @render_texture.nil?
47
+ @render_texture = RenderTexture.new(width, height)
48
+ else
49
+ @render_texture.resize(width, height)
50
+ end
51
+ end
52
+
53
+ def render_texture
54
+ @render_texture
55
+ end
56
+
57
+ def update_vertex_data(lines)
58
+ vertex_data = []
59
+
60
+ lines.each do |line|
61
+ vertex_data << line[:from][0] << line[:from][1] << line[:from][2]
62
+ vertex_data << line[:color][0] << line[:color][1] << line[:color][2]
63
+
64
+ vertex_data << line[:to][0] << line[:to][1] << line[:to][2]
65
+ vertex_data << line[:color][0] << line[:color][1] << line[:color][2]
66
+ end
67
+
68
+ Engine::GL.BindVertexArray(vao)
69
+ Engine::GL.BindBuffer(Engine::GL::ARRAY_BUFFER, vbo)
70
+
71
+ data = vertex_data.pack('f*')
72
+ Engine::GL.BufferData(Engine::GL::ARRAY_BUFFER, data.bytesize, data, Engine::GL::DYNAMIC_DRAW)
73
+ end
74
+
75
+ def draw_lines(vertex_count)
76
+ Engine::GL.BindVertexArray(vao)
77
+ Engine::GL.DrawArrays(Engine::GL::LINES, 0, vertex_count)
78
+ Engine::GL.BindVertexArray(0)
79
+ end
80
+
81
+ def camera_matrix
82
+ Engine::Camera.instance&.matrix || Matrix.identity(4)
83
+ end
84
+
85
+ def line_shader
86
+ @line_shader ||= Engine::Shader.for('debug_line_vertex.glsl', 'debug_line_frag.glsl', source: :engine)
87
+ end
88
+
89
+ def composite_shader
90
+ @composite_shader ||= Engine::Shader.for('fullscreen_vertex.glsl', 'debug_composite_frag.glsl', source: :engine)
91
+ end
92
+
93
+ def composite_material
94
+ @composite_material ||= Engine::Material.create(shader: composite_shader)
95
+ end
96
+
97
+ def screen_quad
98
+ @screen_quad ||= ScreenQuad.new
99
+ end
100
+
101
+ def vao
102
+ setup_buffers unless @vao
103
+ @vao
104
+ end
105
+
106
+ def vbo
107
+ setup_buffers unless @vbo
108
+ @vbo
109
+ end
110
+
111
+ def setup_buffers
112
+ vao_buf = ' ' * 4
113
+ Engine::GL.GenVertexArrays(1, vao_buf)
114
+ @vao = vao_buf.unpack1('L')
115
+
116
+ vbo_buf = ' ' * 4
117
+ Engine::GL.GenBuffers(1, vbo_buf)
118
+ @vbo = vbo_buf.unpack1('L')
119
+
120
+ Engine::GL.BindVertexArray(@vao)
121
+ Engine::GL.BindBuffer(Engine::GL::ARRAY_BUFFER, @vbo)
122
+
123
+ stride = 6 * 4
124
+
125
+ Engine::GL.VertexAttribPointer(0, 3, Engine::GL::FLOAT, Engine::GL::FALSE, stride, 0)
126
+ Engine::GL.EnableVertexAttribArray(0)
127
+
128
+ Engine::GL.VertexAttribPointer(1, 3, Engine::GL::FLOAT, Engine::GL::FALSE, stride, 3 * 4)
129
+ Engine::GL.EnableVertexAttribArray(1)
130
+
131
+ Engine::GL.BindVertexArray(0)
132
+ end
133
+ end
134
+ end
135
+ end
@@ -30,6 +30,10 @@ module Rendering
30
30
 
31
31
  current_texture = PostProcessingEffect.apply_all(render_texture_a, render_texture_b, screen_quad, normal_buffer, start_index: 1)
32
32
 
33
+ GpuTimer.measure(:debug) do
34
+ DebugDraw.draw(current_texture.framebuffer)
35
+ end
36
+
33
37
  GpuTimer.measure(:ui) do
34
38
  disable_depth_test
35
39
  current_texture.bind
@@ -0,0 +1,38 @@
1
+ #version 330 core
2
+
3
+ in vec2 TexCoords;
4
+ out vec4 FragColor;
5
+
6
+ uniform sampler2D debugTexture;
7
+ uniform vec2 texelSize; // 1.0 / textureSize
8
+
9
+ void main()
10
+ {
11
+ // Sample center and 8 neighbors for dilation
12
+ vec4 center = texture(debugTexture, TexCoords);
13
+
14
+ vec4 n = texture(debugTexture, TexCoords + vec2( 0.0, 1.0) * texelSize);
15
+ vec4 s = texture(debugTexture, TexCoords + vec2( 0.0, -1.0) * texelSize);
16
+ vec4 e = texture(debugTexture, TexCoords + vec2( 1.0, 0.0) * texelSize);
17
+ vec4 w = texture(debugTexture, TexCoords + vec2(-1.0, 0.0) * texelSize);
18
+ vec4 ne = texture(debugTexture, TexCoords + vec2( 1.0, 1.0) * texelSize);
19
+ vec4 nw = texture(debugTexture, TexCoords + vec2(-1.0, 1.0) * texelSize);
20
+ vec4 se = texture(debugTexture, TexCoords + vec2( 1.0, -1.0) * texelSize);
21
+ vec4 sw = texture(debugTexture, TexCoords + vec2(-1.0, -1.0) * texelSize);
22
+
23
+ // Weighted dilation - center has full weight, neighbors contribute
24
+ float cardinalWeight = 0.7;
25
+ float diagonalWeight = 0.5;
26
+
27
+ vec4 dilated = center;
28
+ dilated = max(dilated, n * cardinalWeight);
29
+ dilated = max(dilated, s * cardinalWeight);
30
+ dilated = max(dilated, e * cardinalWeight);
31
+ dilated = max(dilated, w * cardinalWeight);
32
+ dilated = max(dilated, ne * diagonalWeight);
33
+ dilated = max(dilated, nw * diagonalWeight);
34
+ dilated = max(dilated, se * diagonalWeight);
35
+ dilated = max(dilated, sw * diagonalWeight);
36
+
37
+ FragColor = dilated;
38
+ }
@@ -0,0 +1,10 @@
1
+ #version 330 core
2
+
3
+ in vec3 lineColor;
4
+
5
+ out vec4 FragColor;
6
+
7
+ void main()
8
+ {
9
+ FragColor = vec4(lineColor, 1.0);
10
+ }
@@ -0,0 +1,14 @@
1
+ #version 330 core
2
+
3
+ layout (location = 0) in vec3 position;
4
+ layout (location = 1) in vec3 color;
5
+
6
+ uniform mat4 camera;
7
+
8
+ out vec3 lineColor;
9
+
10
+ void main()
11
+ {
12
+ gl_Position = camera * vec4(position, 1.0);
13
+ lineColor = color;
14
+ }
data/lib/ruby_rpg.rb CHANGED
@@ -20,6 +20,7 @@ require_relative 'engine/serialization/graph_serializer'
20
20
  require_relative 'engine/serialization/yaml_persistence'
21
21
  require_relative 'engine/matrix_helpers'
22
22
  require_relative "engine/debugging"
23
+ require_relative "engine/debug"
23
24
  require_relative 'engine/rendering/render_texture'
24
25
  require_relative 'engine/rendering/shadow_map_array'
25
26
  require_relative 'engine/rendering/cubemap_shadow_map_array'
@@ -36,6 +37,7 @@ require_relative 'engine/rendering/post_processing/ssao_effect'
36
37
  require_relative 'engine/rendering/skybox_cubemap'
37
38
  require_relative 'engine/rendering/skybox_renderer'
38
39
  require_relative 'engine/rendering/gpu_timer'
40
+ require_relative 'engine/rendering/debug_draw'
39
41
  require_relative 'engine/rendering/render_pipeline'
40
42
  require_relative 'engine/rendering/ui/stencil_manager'
41
43
  require_relative 'engine/rendering/instance_renderer'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_rpg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Hatfull
@@ -179,6 +179,7 @@ files:
179
179
  - lib/engine/compute_shader.rb
180
180
  - lib/engine/compute_texture.rb
181
181
  - lib/engine/cursor.rb
182
+ - lib/engine/debug.rb
182
183
  - lib/engine/debugging.rb
183
184
  - lib/engine/engine.rb
184
185
  - lib/engine/font.rb
@@ -207,6 +208,7 @@ files:
207
208
  - lib/engine/polygon_mesh.rb
208
209
  - lib/engine/quaternion.rb
209
210
  - lib/engine/rendering/cubemap_shadow_map_array.rb
211
+ - lib/engine/rendering/debug_draw.rb
210
212
  - lib/engine/rendering/gpu_timer.rb
211
213
  - lib/engine/rendering/instance_renderer.rb
212
214
  - lib/engine/rendering/post_processing/bloom_effect.rb
@@ -233,6 +235,9 @@ files:
233
235
  - lib/engine/shader.rb
234
236
  - lib/engine/shaders/colour_frag.glsl
235
237
  - lib/engine/shaders/colour_vertex.glsl
238
+ - lib/engine/shaders/debug_composite_frag.glsl
239
+ - lib/engine/shaders/debug_line_frag.glsl
240
+ - lib/engine/shaders/debug_line_vertex.glsl
236
241
  - lib/engine/shaders/fullscreen_frag.glsl
237
242
  - lib/engine/shaders/fullscreen_vertex.glsl
238
243
  - lib/engine/shaders/instanced_sprite_frag.glsl