summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTom Black <[email protected]>2021-04-13 09:43:09 -0500
committerTom Black <[email protected]>2021-04-13 09:43:09 -0500
commit426f677cb4c1543c62f0a1eafba34777c6525646 (patch)
tree2595df9227be9ffbccb753b080c43ede27cc4afc
parent983e3cd0941b5a9c458bb5801b05447fd26bafbe (diff)
downloadruby2d-426f677cb4c1543c62f0a1eafba34777c6525646.tar.gz
ruby2d-426f677cb4c1543c62f0a1eafba34777c6525646.zip
Add direct draw for shapes
Also add `Pixel` class
-rw-r--r--ext/ruby2d/ruby2d.c306
-rw-r--r--lib/ruby2d.rb1
-rw-r--r--lib/ruby2d/circle.rb20
-rw-r--r--lib/ruby2d/line.rb20
-rw-r--r--lib/ruby2d/pixel.rb17
-rw-r--r--lib/ruby2d/quad.rb21
-rw-r--r--lib/ruby2d/rectangle.rb13
-rw-r--r--lib/ruby2d/square.rb22
-rw-r--r--lib/ruby2d/triangle.rb16
-rw-r--r--test/render-perf.rb39
-rw-r--r--test/render.rb92
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