diff options
| author | Tom Black <[email protected]> | 2021-04-13 09:43:09 -0500 |
|---|---|---|
| committer | Tom Black <[email protected]> | 2021-04-13 09:43:09 -0500 |
| commit | 426f677cb4c1543c62f0a1eafba34777c6525646 (patch) | |
| tree | 2595df9227be9ffbccb753b080c43ede27cc4afc | |
| parent | 983e3cd0941b5a9c458bb5801b05447fd26bafbe (diff) | |
| download | ruby2d-426f677cb4c1543c62f0a1eafba34777c6525646.tar.gz ruby2d-426f677cb4c1543c62f0a1eafba34777c6525646.zip | |
Add direct draw for shapes
Also add `Pixel` class
| -rw-r--r-- | ext/ruby2d/ruby2d.c | 306 | ||||
| -rw-r--r-- | lib/ruby2d.rb | 1 | ||||
| -rw-r--r-- | lib/ruby2d/circle.rb | 20 | ||||
| -rw-r--r-- | lib/ruby2d/line.rb | 20 | ||||
| -rw-r--r-- | lib/ruby2d/pixel.rb | 17 | ||||
| -rw-r--r-- | lib/ruby2d/quad.rb | 21 | ||||
| -rw-r--r-- | lib/ruby2d/rectangle.rb | 13 | ||||
| -rw-r--r-- | lib/ruby2d/square.rb | 22 | ||||
| -rw-r--r-- | lib/ruby2d/triangle.rb | 16 | ||||
| -rw-r--r-- | test/render-perf.rb | 39 | ||||
| -rw-r--r-- | test/render.rb | 92 |
11 files changed, 362 insertions, 205 deletions
diff --git a/ext/ruby2d/ruby2d.c b/ext/ruby2d/ruby2d.c index e758e39..c7db19d 100644 --- a/ext/ruby2d/ruby2d.c +++ b/ext/ruby2d/ruby2d.c @@ -166,38 +166,45 @@ static R_VAL ruby2d_ext_base_path(R_VAL self) { /* - * Ruby2D::Triangle#ext_render + * Ruby2D::Pixel#self.ext_draw */ #if MRUBY -static R_VAL ruby2d_triangle_ext_render(mrb_state* mrb, R_VAL self) { +static R_VAL ruby2d_pixel_ext_draw(mrb_state* mrb, R_VAL self) { + mrb_value a; + mrb_get_args(mrb, "o", &a); #else -static R_VAL ruby2d_triangle_ext_render(R_VAL self) { +static R_VAL ruby2d_pixel_ext_draw(R_VAL self, R_VAL a) { #endif - R_VAL c1 = r_iv_get(self, "@c1"); - R_VAL c2 = r_iv_get(self, "@c2"); - R_VAL c3 = r_iv_get(self, "@c3"); + // `a` is the array representing the pixel - R2D_DrawTriangle( - NUM2DBL(r_iv_get(self, "@x1")), - NUM2DBL(r_iv_get(self, "@y1")), - NUM2DBL(r_iv_get(c1, "@r")), - NUM2DBL(r_iv_get(c1, "@g")), - NUM2DBL(r_iv_get(c1, "@b")), - NUM2DBL(r_iv_get(c1, "@a")), - - NUM2DBL(r_iv_get(self, "@x2")), - NUM2DBL(r_iv_get(self, "@y2")), - NUM2DBL(r_iv_get(c2, "@r")), - NUM2DBL(r_iv_get(c2, "@g")), - NUM2DBL(r_iv_get(c2, "@b")), - NUM2DBL(r_iv_get(c2, "@a")), - - NUM2DBL(r_iv_get(self, "@x3")), - NUM2DBL(r_iv_get(self, "@y3")), - NUM2DBL(r_iv_get(c3, "@r")), - NUM2DBL(r_iv_get(c3, "@g")), - NUM2DBL(r_iv_get(c3, "@b")), - NUM2DBL(r_iv_get(c3, "@a")) + R2D_DrawQuad( + NUM2DBL(r_ary_entry(a, 0)), // x1 + NUM2DBL(r_ary_entry(a, 1)), // y1 + NUM2DBL(r_ary_entry(a, 8)), // color + NUM2DBL(r_ary_entry(a, 9)), // color + NUM2DBL(r_ary_entry(a, 10)), // color + NUM2DBL(r_ary_entry(a, 11)), // color + + NUM2DBL(r_ary_entry(a, 2)), // x2 + NUM2DBL(r_ary_entry(a, 3)), // y2 + NUM2DBL(r_ary_entry(a, 8)), // color + NUM2DBL(r_ary_entry(a, 9)), // color + NUM2DBL(r_ary_entry(a, 10)), // color + NUM2DBL(r_ary_entry(a, 11)), // color + + NUM2DBL(r_ary_entry(a, 4)), // x3 + NUM2DBL(r_ary_entry(a, 5)), // y3 + NUM2DBL(r_ary_entry(a, 8)), // color + NUM2DBL(r_ary_entry(a, 9)), // color + NUM2DBL(r_ary_entry(a, 10)), // color + NUM2DBL(r_ary_entry(a, 11)), // color + + NUM2DBL(r_ary_entry(a, 6)), // x4 + NUM2DBL(r_ary_entry(a, 7)), // y4 + NUM2DBL(r_ary_entry(a, 8)), // color + NUM2DBL(r_ary_entry(a, 9)), // color + NUM2DBL(r_ary_entry(a, 10)), // color + NUM2DBL(r_ary_entry(a, 11)) // color ); return R_NIL; @@ -205,94 +212,84 @@ static R_VAL ruby2d_triangle_ext_render(R_VAL self) { /* - * Ruby2D::Quad#ext_render + * Ruby2D::Triangle#self.ext_draw */ #if MRUBY -static R_VAL ruby2d_quad_ext_render(mrb_state* mrb, R_VAL self) { +static R_VAL ruby2d_triangle_ext_draw(mrb_state* mrb, R_VAL self) { + mrb_value a; + mrb_get_args(mrb, "o", &a); #else -static R_VAL ruby2d_quad_ext_render(R_VAL self) { +static R_VAL ruby2d_triangle_ext_draw(R_VAL self, R_VAL a) { #endif - R_VAL c1 = r_iv_get(self, "@c1"); - R_VAL c2 = r_iv_get(self, "@c2"); - R_VAL c3 = r_iv_get(self, "@c3"); - R_VAL c4 = r_iv_get(self, "@c4"); + // `a` is the array representing the triangle - R2D_DrawQuad( - NUM2DBL(r_iv_get(self, "@x1")), - NUM2DBL(r_iv_get(self, "@y1")), - NUM2DBL(r_iv_get(c1, "@r")), - NUM2DBL(r_iv_get(c1, "@g")), - NUM2DBL(r_iv_get(c1, "@b")), - NUM2DBL(r_iv_get(c1, "@a")), - - NUM2DBL(r_iv_get(self, "@x2")), - NUM2DBL(r_iv_get(self, "@y2")), - NUM2DBL(r_iv_get(c2, "@r")), - NUM2DBL(r_iv_get(c2, "@g")), - NUM2DBL(r_iv_get(c2, "@b")), - NUM2DBL(r_iv_get(c2, "@a")), - - NUM2DBL(r_iv_get(self, "@x3")), - NUM2DBL(r_iv_get(self, "@y3")), - NUM2DBL(r_iv_get(c3, "@r")), - NUM2DBL(r_iv_get(c3, "@g")), - NUM2DBL(r_iv_get(c3, "@b")), - NUM2DBL(r_iv_get(c3, "@a")), - - NUM2DBL(r_iv_get(self, "@x4")), - NUM2DBL(r_iv_get(self, "@y4")), - NUM2DBL(r_iv_get(c4, "@r")), - NUM2DBL(r_iv_get(c4, "@g")), - NUM2DBL(r_iv_get(c4, "@b")), - NUM2DBL(r_iv_get(c4, "@a")) + R2D_DrawTriangle( + NUM2DBL(r_ary_entry(a, 0)), // x1 + NUM2DBL(r_ary_entry(a, 1)), // y1 + NUM2DBL(r_ary_entry(a, 2)), // c1 red + NUM2DBL(r_ary_entry(a, 3)), // c1 green + NUM2DBL(r_ary_entry(a, 4)), // c1 blue + NUM2DBL(r_ary_entry(a, 5)), // c1 alpha + + NUM2DBL(r_ary_entry(a, 6)), // x2 + NUM2DBL(r_ary_entry(a, 7)), // y2 + NUM2DBL(r_ary_entry(a, 8)), // c2 red + NUM2DBL(r_ary_entry(a, 9)), // c2 green + NUM2DBL(r_ary_entry(a, 10)), // c2 blue + NUM2DBL(r_ary_entry(a, 11)), // c2 alpha + + NUM2DBL(r_ary_entry(a, 12)), // x3 + NUM2DBL(r_ary_entry(a, 13)), // y3 + NUM2DBL(r_ary_entry(a, 14)), // c3 red + NUM2DBL(r_ary_entry(a, 15)), // c3 green + NUM2DBL(r_ary_entry(a, 16)), // c3 blue + NUM2DBL(r_ary_entry(a, 17)) // c3 alpha ); return R_NIL; } - /* - * Ruby2D::Quad#ext_draw + * Ruby2D::Quad#self.ext_draw */ #if MRUBY static R_VAL ruby2d_quad_ext_draw(mrb_state* mrb, R_VAL self) { - mrb_value x, y, c; - mrb_get_args(mrb, "o", &x); - mrb_get_args(mrb, "o", &y); - mrb_get_args(mrb, "o", &c); + mrb_value a; + mrb_get_args(mrb, "o", &a); #else -static R_VAL ruby2d_quad_ext_draw(R_VAL self, R_VAL x, R_VAL y, R_VAL c) { +static R_VAL ruby2d_quad_ext_draw(R_VAL self, R_VAL a) { #endif + // `a` is the array representing the quad R2D_DrawQuad( - NUM2DBL(x), - NUM2DBL(y), - NUM2DBL(c), - NUM2DBL(c), - NUM2DBL(c), - 1.0, - - NUM2DBL(x) + 10, - NUM2DBL(y), - NUM2DBL(c), - NUM2DBL(c), - NUM2DBL(c), - 1.0, - - NUM2DBL(x) + 10, - NUM2DBL(y) + 10, - NUM2DBL(c), - NUM2DBL(c), - NUM2DBL(c), - 1.0, - - NUM2DBL(x), - NUM2DBL(y) + 10, - NUM2DBL(c), - NUM2DBL(c), - NUM2DBL(c), - 1.0 + NUM2DBL(r_ary_entry(a, 0)), // x1 + NUM2DBL(r_ary_entry(a, 1)), // y1 + NUM2DBL(r_ary_entry(a, 2)), // c1 red + NUM2DBL(r_ary_entry(a, 3)), // c1 green + NUM2DBL(r_ary_entry(a, 4)), // c1 blue + NUM2DBL(r_ary_entry(a, 5)), // c1 alpha + + NUM2DBL(r_ary_entry(a, 6)), // x2 + NUM2DBL(r_ary_entry(a, 7)), // y2 + NUM2DBL(r_ary_entry(a, 8)), // c2 red + NUM2DBL(r_ary_entry(a, 9)), // c2 green + NUM2DBL(r_ary_entry(a, 10)), // c2 blue + NUM2DBL(r_ary_entry(a, 11)), // c2 alpha + + NUM2DBL(r_ary_entry(a, 12)), // x3 + NUM2DBL(r_ary_entry(a, 13)), // y3 + NUM2DBL(r_ary_entry(a, 14)), // c3 red + NUM2DBL(r_ary_entry(a, 15)), // c3 green + NUM2DBL(r_ary_entry(a, 16)), // c3 blue + NUM2DBL(r_ary_entry(a, 17)), // c3 alpha + + NUM2DBL(r_ary_entry(a, 18)), // x4 + NUM2DBL(r_ary_entry(a, 19)), // y4 + NUM2DBL(r_ary_entry(a, 20)), // c4 red + NUM2DBL(r_ary_entry(a, 21)), // c4 green + NUM2DBL(r_ary_entry(a, 22)), // c4 blue + NUM2DBL(r_ary_entry(a, 23)) // c4 alpha ); return R_NIL; @@ -300,44 +297,43 @@ static R_VAL ruby2d_quad_ext_draw(R_VAL self, R_VAL x, R_VAL y, R_VAL c) { /* - * Ruby2D::Line#ext_render + * Ruby2D::Line#self.ext_draw */ #if MRUBY -static R_VAL ruby2d_line_ext_render(mrb_state* mrb, R_VAL self) { +static R_VAL ruby2d_line_ext_draw(mrb_state* mrb, R_VAL self) { + mrb_value a; + mrb_get_args(mrb, "o", &a); #else -static R_VAL ruby2d_line_ext_render(R_VAL self) { +static R_VAL ruby2d_line_ext_draw(R_VAL self, R_VAL a) { #endif - R_VAL c1 = r_iv_get(self, "@c1"); - R_VAL c2 = r_iv_get(self, "@c2"); - R_VAL c3 = r_iv_get(self, "@c3"); - R_VAL c4 = r_iv_get(self, "@c4"); + // `a` is the array representing the line R2D_DrawLine( - NUM2DBL(r_iv_get(self, "@x1")), - NUM2DBL(r_iv_get(self, "@y1")), - NUM2DBL(r_iv_get(self, "@x2")), - NUM2DBL(r_iv_get(self, "@y2")), - NUM2DBL(r_iv_get(self, "@width")), - - NUM2DBL(r_iv_get(c1, "@r")), - NUM2DBL(r_iv_get(c1, "@g")), - NUM2DBL(r_iv_get(c1, "@b")), - NUM2DBL(r_iv_get(c1, "@a")), - - NUM2DBL(r_iv_get(c2, "@r")), - NUM2DBL(r_iv_get(c2, "@g")), - NUM2DBL(r_iv_get(c2, "@b")), - NUM2DBL(r_iv_get(c2, "@a")), - - NUM2DBL(r_iv_get(c3, "@r")), - NUM2DBL(r_iv_get(c3, "@g")), - NUM2DBL(r_iv_get(c3, "@b")), - NUM2DBL(r_iv_get(c3, "@a")), - - NUM2DBL(r_iv_get(c4, "@r")), - NUM2DBL(r_iv_get(c4, "@g")), - NUM2DBL(r_iv_get(c4, "@b")), - NUM2DBL(r_iv_get(c4, "@a")) + NUM2DBL(r_ary_entry(a, 0)), // x1 + NUM2DBL(r_ary_entry(a, 1)), // y1 + NUM2DBL(r_ary_entry(a, 2)), // x2 + NUM2DBL(r_ary_entry(a, 3)), // y2 + NUM2DBL(r_ary_entry(a, 4)), // width + + NUM2DBL(r_ary_entry(a, 5)), // c1 red + NUM2DBL(r_ary_entry(a, 6)), // c1 green + NUM2DBL(r_ary_entry(a, 7)), // c1 blue + NUM2DBL(r_ary_entry(a, 8)), // c1 alpha + + NUM2DBL(r_ary_entry(a, 9)), // c2 red + NUM2DBL(r_ary_entry(a, 10)), // c2 green + NUM2DBL(r_ary_entry(a, 11)), // c2 blue + NUM2DBL(r_ary_entry(a, 12)), // c2 alpha + + NUM2DBL(r_ary_entry(a, 13)), // c3 red + NUM2DBL(r_ary_entry(a, 14)), // c3 green + NUM2DBL(r_ary_entry(a, 15)), // c3 blue + NUM2DBL(r_ary_entry(a, 16)), // c3 alpha + + NUM2DBL(r_ary_entry(a, 17)), // c4 red + NUM2DBL(r_ary_entry(a, 18)), // c4 green + NUM2DBL(r_ary_entry(a, 19)), // c4 blue + NUM2DBL(r_ary_entry(a, 20)) // c4 alpha ); return R_NIL; @@ -345,24 +341,26 @@ static R_VAL ruby2d_line_ext_render(R_VAL self) { /* - * Ruby2D::Circle#ext_render + * Ruby2D::Circle#self.ext_draw */ #if MRUBY -static R_VAL ruby2d_circle_ext_render(mrb_state* mrb, R_VAL self) { +static R_VAL ruby2d_circle_ext_draw(mrb_state* mrb, R_VAL self) { + mrb_value a; + mrb_get_args(mrb, "o", &a); #else -static R_VAL ruby2d_circle_ext_render(R_VAL self) { +static R_VAL ruby2d_circle_ext_draw(R_VAL self, R_VAL a) { #endif - R_VAL c = r_iv_get(self, "@color"); + // `a` is the array representing the circle R2D_DrawCircle( - NUM2DBL(r_iv_get(self, "@x")), - NUM2DBL(r_iv_get(self, "@y")), - NUM2DBL(r_iv_get(self, "@radius")), - NUM2DBL(r_iv_get(self, "@sectors")), - NUM2DBL(r_iv_get(c, "@r")), - NUM2DBL(r_iv_get(c, "@g")), - NUM2DBL(r_iv_get(c, "@b")), - NUM2DBL(r_iv_get(c, "@a")) + NUM2DBL(r_ary_entry(a, 0)), // x + NUM2DBL(r_ary_entry(a, 1)), // y + NUM2DBL(r_ary_entry(a, 2)), // radius + NUM2DBL(r_ary_entry(a, 3)), // sectors + NUM2DBL(r_ary_entry(a, 4)), // red + NUM2DBL(r_ary_entry(a, 5)), // green + NUM2DBL(r_ary_entry(a, 6)), // blue + NUM2DBL(r_ary_entry(a, 7)) // alpha ); return R_NIL; @@ -999,7 +997,7 @@ static void render() { // Switch on each object type for (int i = 0; i < num_objects; ++i) { R_VAL el = r_ary_entry(objects, i); - r_funcall(el, "ext_render", 0); + r_funcall(el, "render", 0); } // Call render proc, `window.render` @@ -1176,35 +1174,35 @@ void Init_ruby2d() { // Ruby2D#self.ext_base_path r_define_class_method(ruby2d_module, "ext_base_path", ruby2d_ext_base_path, r_args_none); + // Ruby2D::Pixel + R_CLASS ruby2d_pixel_class = r_define_class(ruby2d_module, "Pixel"); + + // Ruby2D::Pixel#self.ext_draw + r_define_class_method(ruby2d_pixel_class, "ext_draw", ruby2d_pixel_ext_draw, r_args_req(1)); + // Ruby2D::Triangle R_CLASS ruby2d_triangle_class = r_define_class(ruby2d_module, "Triangle"); - // Ruby2D::Triangle#ext_render - r_define_method(ruby2d_triangle_class, "ext_render", ruby2d_triangle_ext_render, r_args_none); + // Ruby2D::Triangle#self.ext_draw + r_define_class_method(ruby2d_triangle_class, "ext_draw", ruby2d_triangle_ext_draw, r_args_req(1)); // Ruby2D::Quad R_CLASS ruby2d_quad_class = r_define_class(ruby2d_module, "Quad"); - // Ruby2D::Quad#ext_render - r_define_method(ruby2d_quad_class, "ext_render", ruby2d_quad_ext_render, r_args_none); - // Ruby2D::Quad#self.ext_draw - r_define_class_method(ruby2d_quad_class, "ext_draw", ruby2d_quad_ext_draw, r_args_req(3)); - - // // Ruby2D::Square - // R_CLASS ruby2d_square_class = r_define_class(ruby2d_module, "Square"); + r_define_class_method(ruby2d_quad_class, "ext_draw", ruby2d_quad_ext_draw, r_args_req(1)); // Ruby2D::Line R_CLASS ruby2d_line_class = r_define_class(ruby2d_module, "Line"); - // Ruby2D::Line#ext_render - r_define_method(ruby2d_line_class, "ext_render", ruby2d_line_ext_render, r_args_none); + // Ruby2D::Line#self.ext_draw + r_define_class_method(ruby2d_line_class, "ext_draw", ruby2d_line_ext_draw, r_args_req(1)); // Ruby2D::Circle R_CLASS ruby2d_circle_class = r_define_class(ruby2d_module, "Circle"); - // Ruby2D::Circle#ext_render - r_define_method(ruby2d_circle_class, "ext_render", ruby2d_circle_ext_render, r_args_none); + // Ruby2D::Circle#self.ext_draw + r_define_class_method(ruby2d_circle_class, "ext_draw", ruby2d_circle_ext_draw, r_args_req(1)); // Ruby2D::Image R_CLASS ruby2d_image_class = r_define_class(ruby2d_module, "Image"); diff --git a/lib/ruby2d.rb b/lib/ruby2d.rb index 0562ec5..4ac40a0 100644 --- a/lib/ruby2d.rb +++ b/lib/ruby2d.rb @@ -13,6 +13,7 @@ unless RUBY_ENGINE == 'mruby' require 'ruby2d/rectangle' require 'ruby2d/square' require 'ruby2d/triangle' + require 'ruby2d/pixel' require 'ruby2d/image' require 'ruby2d/sprite' require 'ruby2d/font' diff --git a/lib/ruby2d/circle.rb b/lib/ruby2d/circle.rb index 7951db7..bb4cab1 100644 --- a/lib/ruby2d/circle.rb +++ b/lib/ruby2d/circle.rb @@ -10,8 +10,8 @@ module Ruby2D @x = opts[:x] || 25 @y = opts[:y] || 25 @z = opts[:z] || 0 - @radius = opts[:radius] || 25 - @sectors = opts[:sectors] || 20 + @radius = opts[:radius] || 50 + @sectors = opts[:sectors] || 30 self.color = opts[:color] || 'white' self.opacity = opts[:opacity] if opts[:opacity] add @@ -21,5 +21,21 @@ module Ruby2D Math.sqrt((x - @x)**2 + (y - @y)**2) <= @radius end + def self.draw(opts = {}) + ext_draw([ + opts[:x], opts[:y], opts[:radius], opts[:sectors], + opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3] + ]) + end + + private + + def render + self.class.ext_draw([ + @x, @y, @radius, @sectors, + @color.r, @color.g, @color.b, @color.a + ]) + end + end end diff --git a/lib/ruby2d/line.rb b/lib/ruby2d/line.rb index ebbb0d9..f641341 100644 --- a/lib/ruby2d/line.rb +++ b/lib/ruby2d/line.rb @@ -38,8 +38,28 @@ module Ruby2D (((@y2 - @y1) * x - (@x2 - @x1) * y + @x2 * @y1 - @y2 * @x1).abs / length) <= 0.5 * @width end + def self.draw(opts = {}) + ext_draw([ + opts[:x1], opts[:y1], opts[:x2], opts[:y2], opts[:width], + opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3], + opts[:color][1][0], opts[:color][1][1], opts[:color][1][2], opts[:color][1][3], + opts[:color][2][0], opts[:color][2][1], opts[:color][2][2], opts[:color][2][3], + opts[:color][3][0], opts[:color][3][1], opts[:color][3][2], opts[:color][3][3] + ]) + end + private + def render + self.class.ext_draw([ + @x1, @y1, @x2, @y2, @width, + @c1.r, @c1.g, @c1.b, @c1.a, + @c2.r, @c2.g, @c2.b, @c2.a, + @c3.r, @c3.g, @c3.b, @c3.a, + @c4.r, @c4.g, @c4.b, @c4.a + ]) + end + # Calculate the distance between two points def points_distance(x1, y1, x2, y2) Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) diff --git a/lib/ruby2d/pixel.rb b/lib/ruby2d/pixel.rb new file mode 100644 index 0000000..3661923 --- /dev/null +++ b/lib/ruby2d/pixel.rb @@ -0,0 +1,17 @@ +# Ruby2D::Pixel + +module Ruby2D + class Pixel + + def self.draw(opts = {}) + ext_draw([ + opts[:x] , opts[:y], + opts[:x] + opts[:size], opts[:y], + opts[:x] + opts[:size], opts[:y] + opts[:size], + opts[:x] , opts[:y] + opts[:size], + opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3] + ]) + end + + end +end diff --git a/lib/ruby2d/quad.rb b/lib/ruby2d/quad.rb index a333850..86490dc 100644 --- a/lib/ruby2d/quad.rb +++ b/lib/ruby2d/quad.rb @@ -48,15 +48,26 @@ module Ruby2D questioned_area <= self_area end - - def self.draw(x, y, c) - ext_draw(x, y, c) + def self.draw(opts = {}) + ext_draw([ + opts[:x1], opts[:y1], opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3], + opts[:x2], opts[:y2], opts[:color][1][0], opts[:color][1][1], opts[:color][1][2], opts[:color][1][3], + opts[:x3], opts[:y3], opts[:color][2][0], opts[:color][2][1], opts[:color][2][2], opts[:color][2][3], + opts[:x4], opts[:y4], opts[:color][3][0], opts[:color][3][1], opts[:color][3][2], opts[:color][3][3] + ]) end - - private + def render + self.class.ext_draw([ + @x1, @y1, @c1.r, @c1.g, @c1.b, @c1.a, + @x2, @y2, @c2.r, @c2.g, @c2.b, @c2.a, + @x3, @y3, @c3.r, @c3.g, @c3.b, @c3.a, + @x4, @y4, @c4.r, @c4.g, @c4.b, @c4.a + ]) + end + def triangle_area(x1, y1, x2, y2, x3, y3) (x1*y2 + x2*y3 + x3*y1 - x3*y2 - x1*y3 - x2*y1).abs / 2 end diff --git a/lib/ruby2d/rectangle.rb b/lib/ruby2d/rectangle.rb index f4bbfe8..06aab4d 100644 --- a/lib/ruby2d/rectangle.rb +++ b/lib/ruby2d/rectangle.rb @@ -39,6 +39,15 @@ module Ruby2D update_coords(@x, @y, @width, h) end + def self.draw(opts = {}) + ext_draw([ + opts[:x] , opts[:y] , opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3], + opts[:x] + opts[:width], opts[:y] , opts[:color][1][0], opts[:color][1][1], opts[:color][1][2], opts[:color][1][3], + opts[:x] + opts[:width], opts[:y] + opts[:height], opts[:color][2][0], opts[:color][2][1], opts[:color][2][2], opts[:color][2][3], + opts[:x] , opts[:y] + opts[:height], opts[:color][3][0], opts[:color][3][1], opts[:color][3][2], opts[:color][3][3] + ]) + end + private def update_coords(x, y, w, h) @@ -46,10 +55,10 @@ module Ruby2D @y1 = y @x2 = x + w @y2 = y - @x4 = x - @y4 = y + h @x3 = x + w @y3 = y + h + @x4 = x + @y4 = y + h end end diff --git a/lib/ruby2d/square.rb b/lib/ruby2d/square.rb index d890bb1..e116f7f 100644 --- a/lib/ruby2d/square.rb +++ b/lib/ruby2d/square.rb @@ -21,23 +21,15 @@ module Ruby2D self.width = self.height = @size = s end - - def self.draw(x: 0, y: 0, z: 0, size: 100) - - @width = @height = @size = size || 100 - - @x = opts[:x] || 0 - @y = opts[:y] || 0 - @z = opts[:z] || 0 - - self.color = opts[:color] || 'white' - self.opacity = opts[:opacity] if opts[:opacity] - update_coords(@x, @y, @size, @size) - - ext_draw(x, y, c) + def self.draw(opts = {}) + ext_draw([ + opts[:x] , opts[:y] , opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3], + opts[:x] + opts[:size], opts[:y] , opts[:color][1][0], opts[:color][1][1], opts[:color][1][2], opts[:color][1][3], + opts[:x] + opts[:size], opts[:y] + opts[:size], opts[:color][2][0], opts[:color][2][1], opts[:color][2][2], opts[:color][2][3], + opts[:x] , opts[:y] + opts[:size], opts[:color][3][0], opts[:color][3][1], opts[:color][3][2], opts[:color][3][3] + ]) end - # Make the inherited width and height attribute accessors private private :width=, :height= diff --git a/lib/ruby2d/triangle.rb b/lib/ruby2d/triangle.rb index 63c570b..bf89e62 100644 --- a/lib/ruby2d/triangle.rb +++ b/lib/ruby2d/triangle.rb @@ -38,8 +38,24 @@ module Ruby2D questioned_area <= self_area end + def self.draw(opts = {}) + ext_draw([ + opts[:x1], opts[:y1], opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3], + opts[:x2], opts[:y2], opts[:color][1][0], opts[:color][1][1], opts[:color][1][2], opts[:color][1][3], + opts[:x3], opts[:y3], opts[:color][2][0], opts[:color][2][1], opts[:color][2][2], opts[:color][2][3] + ]) + end + private + def render + self.class.ext_draw([ + @x1, @y1, @c1.r, @c1.g, @c1.b, @c1.a, + @x2, @y2, @c2.r, @c2.g, @c2.b, @c2.a, + @x3, @y3, @c3.r, @c3.g, @c3.b, @c3.a + ]) + end + def triangle_area(x1, y1, x2, y2, x3, y3) (x1*y2 + x2*y3 + x3*y1 - x3*y2 - x1*y3 - x2*y1).abs / 2 end diff --git a/test/render-perf.rb b/test/render-perf.rb new file mode 100644 index 0000000..909227a --- /dev/null +++ b/test/render-perf.rb @@ -0,0 +1,39 @@ +require 'ruby2d' + +set width: 1280, height: 770 + +# # 9,600 objects, Runs at 11 fps (30 with VBO) +# 128.times do |i| +# 75.times do |j| +# Square.new(x: i*10, y: j*10 + 20, size: 10, color: 'random') +# end +# end + +# # Runs at 27 fps and takes about 6 seconds to start up +# 10000.times do +# Quad.new(x1: 50, y1: 50) +# end + +fps = Text.new 'fps' + +update do + fps.text = Window.fps +end + +render do + + # 9,600 objects, runs at 60 fps + 128.times do |i| + 75.times do |j| + Quad.draw(i*10, j*10 + 20, rand) + end + end + + # # Runs at 60 fps, max objects before dip + # 50000.times do + # Quad.draw(50, 50, 1) + # end + +end + +show diff --git a/test/render.rb b/test/render.rb index 909227a..47667f0 100644 --- a/test/render.rb +++ b/test/render.rb @@ -1,38 +1,76 @@ require 'ruby2d' -set width: 1280, height: 770 +# set width: 1280, height: 770 -# # 9,600 objects, Runs at 11 fps (30 with VBO) -# 128.times do |i| -# 75.times do |j| -# Square.new(x: i*10, y: j*10 + 20, size: 10, color: 'random') -# end -# end -# # Runs at 27 fps and takes about 6 seconds to start up -# 10000.times do -# Quad.new(x1: 50, y1: 50) -# end +Quad.new(x3: 125, x4: 25) +Rectangle.new(y: 125) +Square.new(y: 250) +Line.new(x1: 5, y1: 375, x2: 95, y2: 475, width: 5) +Triangle.new(x1: 325, y1: 0, x2: 375, y2: 100, x3: 275, y3: 100) +Circle.new(x: 400, y: 175) -fps = Text.new 'fps' - -update do - fps.text = Window.fps -end render do - # 9,600 objects, runs at 60 fps - 128.times do |i| - 75.times do |j| - Quad.draw(i*10, j*10 + 20, rand) - end - end - - # # Runs at 60 fps, max objects before dip - # 50000.times do - # Quad.draw(50, 50, 1) - # end + Quad.draw( + x1: 125, y1: 0, + x2: 225, y2: 0, + x3: 250, y3: 100, + x4: 150, y4: 100, + color: [ + [0.8, 0.3, 0.7, 0.8], + [0.1, 0.9, 0.1, 1.0], + [0.8, 0.5, 0.8, 1.0], + [0.6, 0.4, 0.1, 1.0] + ] + ) + + Rectangle.draw( + x: 225, y: 125, width: 100, height: 100, + color: [ + [0.8, 0.3, 0.7, 0.8], + [0.1, 0.9, 0.1, 1.0], + [0.8, 0.5, 0.8, 1.0], + [0.6, 0.4, 0.1, 1.0] + ] + ) + + Square.draw( + x: 125, y: 250, size: 100, + color: [ + [0.8, 0.3, 0.7, 0.8], + [0.1, 0.9, 0.1, 1.0], + [0.8, 0.5, 0.8, 1.0], + [0.6, 0.4, 0.1, 1.0] + ] + ) + + Line.draw( + x1: 130, y1: 375, x2: 220, y2: 475, width: 5, + color: [ + [0.8, 0.3, 0.7, 0.8], + [0.1, 0.9, 0.1, 1.0], + [0.8, 0.5, 0.8, 1.0], + [0.6, 0.4, 0.1, 1.0] + ] + ) + + Triangle.draw( + x1: 450, y1: 0, x2: 500, y2: 100, x3: 400, y3: 100, + color: [ + [0.8, 0.3, 0.7, 0.8], + [0.1, 0.9, 0.1, 1.0], + [0.8, 0.5, 0.8, 1.0] + ] + ) + + Pixel.draw(x: 550, y: 50, size: 10, color: [1.0, 0.0, 0.0, 1.0]) + + Circle.draw( + x: 525, y: 175, radius: 50, sectors: 30, + color: [0.8, 0.3, 0.7, 0.8] + ) end |
