ruby_rpg 0.1.2 → 0.1.4

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: c328c05de08632fbcec77f982d1bd6e150c200526efa127372f074af4b1637b9
4
+ data.tar.gz: bd7677b6daae32a963efd6147afee0862a06c86dd462914fff7d91f4942e5112
5
5
  SHA512:
6
- metadata.gz: ce867115127c2b89fde8c2cc9de02c8d4cb76b73358e5104d75889d886cf5780db38c2a7ce925480e364d3ca3c2d08adc2cfc822daf38b7e462e0d32b2795b6e
7
- data.tar.gz: 46dfa2e1f02498f220f825efcdbaa9ebf97a1133f58e019fd2ee1c92efd38ae4731e454cb35606f5aaf588a707fbc08b997a01e61e8d9dee31201f8a729e7889
6
+ metadata.gz: 8faa38680401e6e5b50cee67bf99c40eef7b01dcfa4d9b2e69469e3845b894e247a2d61af58a2c1ea26904821ea0370372ad4a80ff2ce4f40163c6c2f27d1d82
7
+ data.tar.gz: 7eb6191a3068720aa8a47b9b1f44b521a2100e4eff571a7f7456fc289c3c469a64ed474745d152426a4b7df7a672d6740803bbddad8ff2df9468c8c46b9c03a0
@@ -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,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Engine
4
+ module Debug
5
+ @lines = []
6
+ @spheres = []
7
+
8
+ class << self
9
+ def line(from, to, color: [1, 1, 1])
10
+ @lines << { from: from, to: to, color: color }
11
+ end
12
+
13
+ def sphere(center, radius, color: [1, 1, 1], segments: 16)
14
+ @spheres << { center: center, radius: radius, color: color, segments: segments }
15
+ end
16
+
17
+ def lines
18
+ @lines
19
+ end
20
+
21
+ def spheres
22
+ @spheres
23
+ end
24
+
25
+ def clear
26
+ @lines.clear
27
+ @spheres.clear
28
+ end
29
+ end
30
+ end
31
+ 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,175 @@
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
+ spheres = Engine::Debug.spheres
11
+ return if lines.empty? && spheres.empty?
12
+
13
+ update_render_texture_size
14
+
15
+ # Draw lines to low-res texture
16
+ render_texture.bind
17
+ Engine::GL.ClearColor(0.0, 0.0, 0.0, 0.0)
18
+ Engine::GL.Clear(Engine::GL::COLOR_BUFFER_BIT)
19
+ Engine::GL.Disable(Engine::GL::DEPTH_TEST)
20
+
21
+ line_shader.use
22
+ line_shader.set_mat4('camera', camera_matrix)
23
+
24
+ update_vertex_data(lines, spheres)
25
+ vertex_count = lines.size * 2 + spheres.sum { |s| s[:segments] * 3 * 2 }
26
+ draw_lines(vertex_count)
27
+
28
+ # Composite onto main framebuffer
29
+ Engine::GL.BindFramebuffer(Engine::GL::FRAMEBUFFER, target_framebuffer)
30
+ Engine::GL.Viewport(0, 0, Engine::Window.framebuffer_width, Engine::Window.framebuffer_height)
31
+ Engine::GL.Enable(Engine::GL::BLEND)
32
+
33
+ composite_material.set_runtime_texture('debugTexture', render_texture.color_texture)
34
+ composite_material.set_vec2('texelSize', [1.0 / render_texture.width, 1.0 / render_texture.height])
35
+ screen_quad.draw_with_material(composite_material)
36
+
37
+ Engine::Debug.clear
38
+ end
39
+
40
+ private
41
+
42
+ def update_render_texture_size
43
+ width = Engine::Window.framebuffer_width / SCALE_FACTOR
44
+ height = Engine::Window.framebuffer_height / SCALE_FACTOR
45
+ width = [width, 1].max
46
+ height = [height, 1].max
47
+
48
+ if @render_texture.nil?
49
+ @render_texture = RenderTexture.new(width, height)
50
+ else
51
+ @render_texture.resize(width, height)
52
+ end
53
+ end
54
+
55
+ def render_texture
56
+ @render_texture
57
+ end
58
+
59
+ def update_vertex_data(lines, spheres)
60
+ vertex_data = []
61
+
62
+ lines.each do |line|
63
+ vertex_data << line[:from][0] << line[:from][1] << line[:from][2]
64
+ vertex_data << line[:color][0] << line[:color][1] << line[:color][2]
65
+
66
+ vertex_data << line[:to][0] << line[:to][1] << line[:to][2]
67
+ vertex_data << line[:color][0] << line[:color][1] << line[:color][2]
68
+ end
69
+
70
+ spheres.each do |sphere|
71
+ add_sphere_vertices(vertex_data, sphere)
72
+ end
73
+
74
+ Engine::GL.BindVertexArray(vao)
75
+ Engine::GL.BindBuffer(Engine::GL::ARRAY_BUFFER, vbo)
76
+
77
+ data = vertex_data.pack('f*')
78
+ Engine::GL.BufferData(Engine::GL::ARRAY_BUFFER, data.bytesize, data, Engine::GL::DYNAMIC_DRAW)
79
+ end
80
+
81
+ def add_sphere_vertices(vertex_data, sphere)
82
+ center = sphere[:center]
83
+ radius = sphere[:radius]
84
+ color = sphere[:color]
85
+ segments = sphere[:segments]
86
+
87
+ # Generate 3 circles (XY, XZ, YZ planes)
88
+ [
89
+ ->(angle) { [Math.cos(angle), Math.sin(angle), 0] }, # XY plane
90
+ ->(angle) { [Math.cos(angle), 0, Math.sin(angle)] }, # XZ plane
91
+ ->(angle) { [0, Math.cos(angle), Math.sin(angle)] } # YZ plane
92
+ ].each do |plane_fn|
93
+ segments.times do |i|
94
+ angle1 = (i.to_f / segments) * 2 * Math::PI
95
+ angle2 = ((i + 1).to_f / segments) * 2 * Math::PI
96
+
97
+ offset1 = plane_fn.call(angle1)
98
+ offset2 = plane_fn.call(angle2)
99
+
100
+ # Line start vertex
101
+ vertex_data << (center[0] + offset1[0] * radius)
102
+ vertex_data << (center[1] + offset1[1] * radius)
103
+ vertex_data << (center[2] + offset1[2] * radius)
104
+ vertex_data << color[0] << color[1] << color[2]
105
+
106
+ # Line end vertex
107
+ vertex_data << (center[0] + offset2[0] * radius)
108
+ vertex_data << (center[1] + offset2[1] * radius)
109
+ vertex_data << (center[2] + offset2[2] * radius)
110
+ vertex_data << color[0] << color[1] << color[2]
111
+ end
112
+ end
113
+ end
114
+
115
+ def draw_lines(vertex_count)
116
+ Engine::GL.BindVertexArray(vao)
117
+ Engine::GL.DrawArrays(Engine::GL::LINES, 0, vertex_count)
118
+ Engine::GL.BindVertexArray(0)
119
+ end
120
+
121
+ def camera_matrix
122
+ Engine::Camera.instance&.matrix || Matrix.identity(4)
123
+ end
124
+
125
+ def line_shader
126
+ @line_shader ||= Engine::Shader.for('debug_line_vertex.glsl', 'debug_line_frag.glsl', source: :engine)
127
+ end
128
+
129
+ def composite_shader
130
+ @composite_shader ||= Engine::Shader.for('fullscreen_vertex.glsl', 'debug_composite_frag.glsl', source: :engine)
131
+ end
132
+
133
+ def composite_material
134
+ @composite_material ||= Engine::Material.create(shader: composite_shader)
135
+ end
136
+
137
+ def screen_quad
138
+ @screen_quad ||= ScreenQuad.new
139
+ end
140
+
141
+ def vao
142
+ setup_buffers unless @vao
143
+ @vao
144
+ end
145
+
146
+ def vbo
147
+ setup_buffers unless @vbo
148
+ @vbo
149
+ end
150
+
151
+ def setup_buffers
152
+ vao_buf = ' ' * 4
153
+ Engine::GL.GenVertexArrays(1, vao_buf)
154
+ @vao = vao_buf.unpack1('L')
155
+
156
+ vbo_buf = ' ' * 4
157
+ Engine::GL.GenBuffers(1, vbo_buf)
158
+ @vbo = vbo_buf.unpack1('L')
159
+
160
+ Engine::GL.BindVertexArray(@vao)
161
+ Engine::GL.BindBuffer(Engine::GL::ARRAY_BUFFER, @vbo)
162
+
163
+ stride = 6 * 4
164
+
165
+ Engine::GL.VertexAttribPointer(0, 3, Engine::GL::FLOAT, Engine::GL::FALSE, stride, 0)
166
+ Engine::GL.EnableVertexAttribArray(0)
167
+
168
+ Engine::GL.VertexAttribPointer(1, 3, Engine::GL::FLOAT, Engine::GL::FALSE, stride, 3 * 4)
169
+ Engine::GL.EnableVertexAttribArray(1)
170
+
171
+ Engine::GL.BindVertexArray(0)
172
+ end
173
+ end
174
+ end
175
+ 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.4
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