rays 0.1.47 → 0.1.48
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 +4 -4
- data/.doc/ext/rays/bitmap.cpp +287 -46
- data/.doc/ext/rays/camera.cpp +2 -2
- data/.doc/ext/rays/defs.cpp +32 -8
- data/.doc/ext/rays/font.cpp +50 -2
- data/.doc/ext/rays/native.cpp +2 -4
- data/.doc/ext/rays/painter.cpp +73 -3
- data/.doc/ext/rays/polygon.cpp +131 -97
- data/.doc/ext/rays/polyline.cpp +89 -10
- data/.doc/ext/rays/rays.cpp +80 -0
- data/.doc/ext/rays/{noise.cpp → util.cpp} +2 -2
- data/ChangeLog.md +23 -0
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +288 -46
- data/ext/rays/camera.cpp +2 -2
- data/ext/rays/defs.cpp +32 -8
- data/ext/rays/defs.h +56 -3
- data/ext/rays/font.cpp +56 -4
- data/ext/rays/native.cpp +2 -4
- data/ext/rays/painter.cpp +80 -3
- data/ext/rays/polygon.cpp +134 -99
- data/ext/rays/polyline.cpp +95 -9
- data/ext/rays/rays.cpp +80 -0
- data/ext/rays/{noise.cpp → util.cpp} +2 -2
- data/include/rays/defs.h +24 -26
- data/include/rays/font.h +17 -3
- data/include/rays/painter.h +14 -0
- data/include/rays/polygon.h +56 -37
- data/include/rays/polyline.h +17 -2
- data/include/rays/ruby/polygon.h +0 -11
- data/include/rays/ruby/rays.h +4 -0
- data/include/rays/{noise.h → util.h} +2 -2
- data/lib/rays/color.rb +1 -1
- data/lib/rays/font.rb +1 -1
- data/lib/rays/image.rb +1 -1
- data/lib/rays/painter.rb +12 -1
- data/lib/rays/point.rb +1 -1
- data/lib/rays/polygon.rb +44 -35
- data/lib/rays/polyline.rb +54 -8
- data/lib/rays.rb +0 -1
- data/rays.gemspec +1 -1
- data/src/font.cpp +24 -2
- data/src/font.h +8 -1
- data/src/ios/font.mm +88 -27
- data/src/osx/font.mm +90 -28
- data/src/osx/helper.h +2 -2
- data/src/osx/helper.mm +2 -2
- data/src/painter.cpp +155 -85
- data/src/painter.h +11 -3
- data/src/polygon.cpp +404 -315
- data/src/polyline.cpp +138 -27
- data/src/polyline.h +3 -5
- data/src/shader.cpp +36 -4
- data/src/shader.h +1 -1
- data/src/texture.cpp +2 -2
- data/src/{noise.cpp → util.cpp} +1 -1
- data/src/win32/font.cpp +1 -1
- data/test/test_bitmap.rb +12 -5
- data/test/test_color.rb +4 -0
- data/test/test_font.rb +20 -2
- data/test/test_image.rb +18 -18
- data/test/test_point.rb +1 -1
- data/test/test_polygon.rb +52 -45
- data/test/test_polyline.rb +191 -72
- metadata +9 -15
- data/.doc/ext/rays/polygon_line.cpp +0 -97
- data/ext/rays/polygon_line.cpp +0 -100
- data/lib/rays/polygon_line.rb +0 -33
- data/test/test_polygon_line.rb +0 -164
data/src/painter.cpp
CHANGED
@@ -65,6 +65,12 @@ namespace Rays
|
|
65
65
|
|
66
66
|
Font font;
|
67
67
|
|
68
|
+
Image texture;
|
69
|
+
|
70
|
+
TexCoordMode texcoord_mode;
|
71
|
+
|
72
|
+
TexCoordWrap texcoord_wrap;
|
73
|
+
|
68
74
|
Shader shader;
|
69
75
|
|
70
76
|
void init ()
|
@@ -80,7 +86,10 @@ namespace Rays
|
|
80
86
|
nsegment = 0;
|
81
87
|
blend_mode = BLEND_NORMAL;
|
82
88
|
clip .reset(-1);
|
83
|
-
font =
|
89
|
+
font = get_default_font();
|
90
|
+
texture = Image();
|
91
|
+
texcoord_mode = TEXCOORD_IMAGE;
|
92
|
+
texcoord_wrap = TEXCOORD_CLAMP;
|
84
93
|
shader = Shader();
|
85
94
|
}
|
86
95
|
|
@@ -97,7 +106,7 @@ namespace Rays
|
|
97
106
|
|
98
107
|
const Texture& texture;
|
99
108
|
|
100
|
-
Point
|
109
|
+
Point min, max;
|
101
110
|
|
102
111
|
TextureInfo (
|
103
112
|
const Texture& texture,
|
@@ -105,16 +114,16 @@ namespace Rays
|
|
105
114
|
coord x_max, coord y_max)
|
106
115
|
: texture(texture)
|
107
116
|
{
|
108
|
-
|
109
|
-
|
117
|
+
min.reset(x_min, y_min);
|
118
|
+
max.reset(x_max, y_max);
|
110
119
|
}
|
111
120
|
|
112
121
|
operator bool () const
|
113
122
|
{
|
114
123
|
return
|
115
124
|
texture &&
|
116
|
-
|
117
|
-
|
125
|
+
min.x < max.x &&
|
126
|
+
min.y < max.y;
|
118
127
|
}
|
119
128
|
|
120
129
|
bool operator ! () const
|
@@ -310,13 +319,14 @@ namespace Rays
|
|
310
319
|
return true;
|
311
320
|
}
|
312
321
|
|
313
|
-
void
|
314
|
-
GLenum mode, const Color
|
322
|
+
void draw (
|
323
|
+
GLenum mode, const Color* color,
|
315
324
|
const Coord3* points, size_t npoints,
|
316
325
|
const uint* indices = NULL, size_t nindices = 0,
|
326
|
+
const Color* colors = NULL,
|
317
327
|
const Coord3* texcoords = NULL,
|
318
|
-
const
|
319
|
-
const
|
328
|
+
const TextureInfo* texinfo = NULL,
|
329
|
+
const Shader* shader = NULL)
|
320
330
|
{
|
321
331
|
if (!points || npoints <= 0)
|
322
332
|
argument_error(__FILE__, __LINE__);
|
@@ -324,15 +334,18 @@ namespace Rays
|
|
324
334
|
if (!painting)
|
325
335
|
invalid_state_error(__FILE__, __LINE__, "'painting' should be true.");
|
326
336
|
|
327
|
-
|
328
|
-
|
337
|
+
std::unique_ptr<TextureInfo> ptexinfo;
|
338
|
+
texinfo = setup_texinfo(texinfo, ptexinfo);
|
339
|
+
shader = setup_shader(shader, texinfo);
|
340
|
+
|
341
|
+
const ShaderProgram* program = Shader_get_program(*shader);
|
329
342
|
if (!program || !*program) return;
|
330
343
|
|
331
344
|
ShaderProgram_activate(*program);
|
332
345
|
|
333
|
-
const auto& names = Shader_get_builtin_variable_names(shader);
|
346
|
+
const auto& names = Shader_get_builtin_variable_names(*shader);
|
334
347
|
apply_builtin_uniforms(*program, names, texinfo);
|
335
|
-
apply_attributes(*program, names, points, npoints, texcoords, color);
|
348
|
+
apply_attributes(*program, names, points, npoints, texcoords, color, colors);
|
336
349
|
draw_indices(mode, indices, nindices, npoints);
|
337
350
|
cleanup();
|
338
351
|
|
@@ -345,6 +358,27 @@ namespace Rays
|
|
345
358
|
|
346
359
|
std::vector<GLuint> buffers;
|
347
360
|
|
361
|
+
const TextureInfo* setup_texinfo (const TextureInfo* texinfo, auto& ptr)
|
362
|
+
{
|
363
|
+
if (texinfo) return texinfo;
|
364
|
+
|
365
|
+
const Texture* tex =
|
366
|
+
state.texture ? &Image_get_texture(state.texture) : NULL;
|
367
|
+
if (!tex) return NULL;
|
368
|
+
|
369
|
+
ptr.reset(new TextureInfo(*tex, 0, 0, tex->width(), tex->height()));
|
370
|
+
return ptr.get();
|
371
|
+
}
|
372
|
+
|
373
|
+
const Shader* setup_shader (const Shader* shader, bool for_texture)
|
374
|
+
{
|
375
|
+
if (state.shader) return &state.shader;
|
376
|
+
if (shader) return shader;
|
377
|
+
return for_texture
|
378
|
+
? &Shader_get_default_shader_for_texture(state.texcoord_wrap)
|
379
|
+
: &Shader_get_default_shader_for_shape();
|
380
|
+
}
|
381
|
+
|
348
382
|
void apply_builtin_uniforms (
|
349
383
|
const ShaderProgram& program, const ShaderBuiltinVariableNames& names,
|
350
384
|
const TextureInfo* texinfo)
|
@@ -354,9 +388,10 @@ namespace Rays
|
|
354
388
|
Matrix texcoord_matrix(1);
|
355
389
|
if (texture && *texture)
|
356
390
|
{
|
391
|
+
bool normal = state.texcoord_mode == TEXCOORD_NORMAL;
|
357
392
|
texcoord_matrix.scale(
|
358
|
-
1.0 / texture->reserved_width(),
|
359
|
-
1.0 / texture->reserved_height());
|
393
|
+
(normal ? texture->width() : 1.0) / texture->reserved_width(),
|
394
|
+
(normal ? texture->height() : 1.0) / texture->reserved_height());
|
360
395
|
}
|
361
396
|
|
362
397
|
for (const auto& name : names.uniform_position_matrix_names)
|
@@ -374,24 +409,27 @@ namespace Rays
|
|
374
409
|
|
375
410
|
if (!texinfo || !texture || !*texture) return;
|
376
411
|
|
412
|
+
coord tw = texture->reserved_width();
|
413
|
+
coord th = texture->reserved_height();
|
414
|
+
Point min(texinfo->min.x / tw, texinfo->min.y / th);
|
415
|
+
Point max(texinfo->max.x / tw, texinfo->max.y / th);
|
416
|
+
Point offset( 1 / tw, 1 / th);
|
417
|
+
|
377
418
|
for (const auto& name : names.uniform_texcoord_min_names)
|
378
419
|
{
|
379
420
|
apply_uniform(program, name, [&](GLint loc) {
|
380
|
-
Point min = texcoord_matrix * texinfo->texcoord_min;
|
381
421
|
glUniform3fv(loc, 1, min.array);
|
382
422
|
});
|
383
423
|
}
|
384
424
|
for (const auto& name : names.uniform_texcoord_max_names)
|
385
425
|
{
|
386
426
|
apply_uniform(program, name, [&](GLint loc) {
|
387
|
-
Point max = texcoord_matrix * texinfo->texcoord_max;
|
388
427
|
glUniform3fv(loc, 1, max.array);
|
389
428
|
});
|
390
429
|
}
|
391
430
|
for (const auto& name : names.uniform_texcoord_offset_names)
|
392
431
|
{
|
393
432
|
apply_uniform(program, name, [&](GLint loc) {
|
394
|
-
Point offset(1.0 / texture->width(), 1.0 / texture->height());
|
395
433
|
glUniform3fv(loc, 1, offset.array);
|
396
434
|
});
|
397
435
|
}
|
@@ -412,9 +450,10 @@ namespace Rays
|
|
412
450
|
void apply_attributes (
|
413
451
|
const ShaderProgram& program, const ShaderBuiltinVariableNames& names,
|
414
452
|
const Coord3* points, size_t npoints, const Coord3* texcoords,
|
415
|
-
const Color
|
453
|
+
const Color* color, const Color* colors)
|
416
454
|
{
|
417
|
-
assert(
|
455
|
+
assert(npoints > 0);
|
456
|
+
assert(!!color != !!colors);
|
418
457
|
|
419
458
|
apply_attribute(
|
420
459
|
program, names.attribute_position_names,
|
@@ -424,21 +463,30 @@ namespace Rays
|
|
424
463
|
program, names.attribute_texcoord_names,
|
425
464
|
texcoords ? texcoords : points, npoints);
|
426
465
|
|
427
|
-
|
428
|
-
// to fix that GL 2.1 with glVertexAttrib4fv() draws nothing
|
429
|
-
// with specific glsl 'attribute' name.
|
430
|
-
std::vector<Color> colors(npoints, color);
|
431
|
-
apply_attribute(
|
432
|
-
program, names.attribute_color_names,
|
433
|
-
(const Coord4*) &colors[0], npoints);
|
434
|
-
#else
|
435
|
-
for (const auto& name : names.attribute_color_names)
|
466
|
+
if (colors)
|
436
467
|
{
|
437
|
-
apply_attribute(
|
438
|
-
|
439
|
-
|
468
|
+
apply_attribute(
|
469
|
+
program, names.attribute_color_names,
|
470
|
+
colors, npoints);
|
440
471
|
}
|
472
|
+
else if (color)
|
473
|
+
{
|
474
|
+
#if defined(GL_VERSION_2_1) && !defined(GL_VERSION_3_0)
|
475
|
+
// to fix that GL 2.1 with glVertexAttrib4fv() draws nothing
|
476
|
+
// with specific glsl 'attribute' name.
|
477
|
+
std::vector<Color> colors_(npoints, *color);
|
478
|
+
apply_attribute(
|
479
|
+
program, names.attribute_color_names,
|
480
|
+
(const Coord4*) &colors_[0], npoints);
|
481
|
+
#else
|
482
|
+
for (const auto& name : names.attribute_color_names)
|
483
|
+
{
|
484
|
+
apply_attribute(program, name, [&](GLint loc) {
|
485
|
+
glVertexAttrib4fv(loc, color->array);
|
486
|
+
});
|
487
|
+
}
|
441
488
|
#endif
|
489
|
+
}
|
442
490
|
}
|
443
491
|
|
444
492
|
template <typename CoordN>
|
@@ -557,52 +605,27 @@ namespace Rays
|
|
557
605
|
};// Painter::Data
|
558
606
|
|
559
607
|
|
560
|
-
|
561
|
-
|
562
|
-
Painter* painter,
|
563
|
-
const
|
564
|
-
|
565
|
-
|
566
|
-
const Coord3* points, size_t npoints,
|
567
|
-
const uint* indices = NULL, size_t nindices = 0,
|
568
|
-
const Coord3* texcoords = NULL,
|
569
|
-
const Shader& default_shader = Shader_get_default_shader_for_shape(),
|
570
|
-
const TextureInfo* texinfo = NULL)
|
608
|
+
void
|
609
|
+
Painter_draw (
|
610
|
+
Painter* painter, GLenum mode, const Color& color,
|
611
|
+
const Coord3* points, size_t npoints,
|
612
|
+
const uint* indices, size_t nindices,
|
613
|
+
const Coord3* texcoords)
|
571
614
|
{
|
572
|
-
|
573
|
-
|
574
|
-
bool offset = offset_x != 0 || offset_y != 0;
|
575
|
-
if (offset)
|
576
|
-
{
|
577
|
-
painter->push_matrix();
|
578
|
-
painter->translate(offset_x, offset_y);
|
579
|
-
}
|
580
|
-
|
581
|
-
Color color;
|
582
|
-
for (int type = COLOR_TYPE_BEGIN; type < COLOR_TYPE_END; ++type)
|
583
|
-
{
|
584
|
-
if ((nofill && type == FILL) || (nostroke && type == STROKE))
|
585
|
-
continue;
|
586
|
-
|
587
|
-
if (!painter->self->get_color(&color, (ColorType) type))
|
588
|
-
continue;
|
589
|
-
|
590
|
-
painter->self->draw_polygon(
|
591
|
-
modes[type], color, points, npoints, indices, nindices, texcoords,
|
592
|
-
default_shader, texinfo);
|
593
|
-
}
|
594
|
-
|
595
|
-
if (offset)
|
596
|
-
painter->pop_matrix();
|
615
|
+
painter->self->draw(
|
616
|
+
mode, &color, points, npoints, indices, nindices, NULL, texcoords);
|
597
617
|
}
|
598
618
|
|
599
619
|
void
|
600
|
-
|
601
|
-
Painter* painter, GLenum mode,
|
620
|
+
Painter_draw (
|
621
|
+
Painter* painter, GLenum mode,
|
602
622
|
const Coord3* points, size_t npoints,
|
603
|
-
const uint* indices, size_t nindices
|
623
|
+
const uint* indices, size_t nindices,
|
624
|
+
const Color* colors,
|
625
|
+
const Coord3* texcoords)
|
604
626
|
{
|
605
|
-
painter->self->
|
627
|
+
painter->self->draw(
|
628
|
+
mode, NULL, points, npoints, indices, nindices, colors, texcoords);
|
606
629
|
}
|
607
630
|
|
608
631
|
|
@@ -792,10 +815,7 @@ namespace Rays
|
|
792
815
|
if (Polygon_triangulate(&triangles, polygon))
|
793
816
|
{
|
794
817
|
for (size_t i = 0; i < triangles.size(); i += 3)
|
795
|
-
|
796
|
-
painter->self->draw_polygon(
|
797
|
-
GL_LINE_LOOP, invert_color, &triangles[i], 3);
|
798
|
-
}
|
818
|
+
painter->self->draw(GL_LINE_LOOP, &invert_color, &triangles[i], 3);
|
799
819
|
}
|
800
820
|
#endif
|
801
821
|
}
|
@@ -1015,7 +1035,8 @@ namespace Rays
|
|
1015
1035
|
Painter* painter, const Image& image,
|
1016
1036
|
coord src_x, coord src_y, coord src_w, coord src_h,
|
1017
1037
|
coord dst_x, coord dst_y, coord dst_w, coord dst_h,
|
1018
|
-
bool
|
1038
|
+
bool nofill = false, bool nostroke = false,
|
1039
|
+
const Shader* shader = NULL)
|
1019
1040
|
{
|
1020
1041
|
static const GLenum MODES[] = {GL_TRIANGLE_FAN, GL_LINE_LOOP};
|
1021
1042
|
|
@@ -1051,12 +1072,19 @@ namespace Rays
|
|
1051
1072
|
|
1052
1073
|
TextureInfo texinfo(texture, src_x, src_y, src_x + src_w, src_y + src_h);
|
1053
1074
|
|
1054
|
-
|
1055
|
-
|
1075
|
+
Color color;
|
1076
|
+
for (int type = COLOR_TYPE_BEGIN; type < COLOR_TYPE_END; ++type)
|
1077
|
+
{
|
1078
|
+
if ((nofill && type == FILL) || (nostroke && type == STROKE))
|
1079
|
+
continue;
|
1080
|
+
|
1081
|
+
if (!painter->self->get_color(&color, (ColorType) type))
|
1082
|
+
continue;
|
1056
1083
|
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1084
|
+
painter->self->draw(
|
1085
|
+
MODES[type], &color, points, 4, NULL, 0, NULL, texcoords,
|
1086
|
+
&texinfo, shader);
|
1087
|
+
}
|
1060
1088
|
}
|
1061
1089
|
|
1062
1090
|
void
|
@@ -1229,7 +1257,7 @@ namespace Rays
|
|
1229
1257
|
painter, self->text_image,
|
1230
1258
|
0, 0, str_w, str_h,
|
1231
1259
|
x, y, str_w, str_h,
|
1232
|
-
true, &Shader_get_shader_for_text());
|
1260
|
+
false, true, &Shader_get_shader_for_text());
|
1233
1261
|
|
1234
1262
|
debug_draw_text(painter, font, x, y, str_w / density, str_h / density);
|
1235
1263
|
}
|
@@ -1522,7 +1550,7 @@ namespace Rays
|
|
1522
1550
|
{
|
1523
1551
|
return
|
1524
1552
|
font.size() == size &&
|
1525
|
-
font.name() == (name ? name :
|
1553
|
+
font.name() == (name ? name : get_default_font().name().c_str());
|
1526
1554
|
}
|
1527
1555
|
|
1528
1556
|
void
|
@@ -1545,6 +1573,48 @@ namespace Rays
|
|
1545
1573
|
return self->state.font;
|
1546
1574
|
}
|
1547
1575
|
|
1576
|
+
void
|
1577
|
+
Painter::set_texture (const Image& image)
|
1578
|
+
{
|
1579
|
+
self->state.texture = image;
|
1580
|
+
}
|
1581
|
+
|
1582
|
+
void
|
1583
|
+
Painter::no_texture ()
|
1584
|
+
{
|
1585
|
+
self->state.texture = Image();
|
1586
|
+
}
|
1587
|
+
|
1588
|
+
const Image&
|
1589
|
+
Painter::texture () const
|
1590
|
+
{
|
1591
|
+
return self->state.texture;
|
1592
|
+
}
|
1593
|
+
|
1594
|
+
void
|
1595
|
+
Painter::set_texcoord_mode (TexCoordMode mode)
|
1596
|
+
{
|
1597
|
+
self->state.texcoord_mode = mode;
|
1598
|
+
}
|
1599
|
+
|
1600
|
+
TexCoordMode
|
1601
|
+
Painter::texcoord_mode () const
|
1602
|
+
{
|
1603
|
+
return self->state.texcoord_mode;
|
1604
|
+
}
|
1605
|
+
|
1606
|
+
void
|
1607
|
+
Painter::set_texcoord_wrap (TexCoordWrap wrap)
|
1608
|
+
{
|
1609
|
+
self->state.texcoord_wrap = wrap;
|
1610
|
+
}
|
1611
|
+
|
1612
|
+
TexCoordWrap
|
1613
|
+
Painter::texcoord_wrap () const
|
1614
|
+
{
|
1615
|
+
return self->state.texcoord_wrap;
|
1616
|
+
}
|
1617
|
+
|
1548
1618
|
void
|
1549
1619
|
Painter::set_shader (const Shader& shader)
|
1550
1620
|
{
|
data/src/painter.h
CHANGED
@@ -12,10 +12,18 @@ namespace Rays
|
|
12
12
|
{
|
13
13
|
|
14
14
|
|
15
|
-
void
|
15
|
+
void Painter_draw (
|
16
16
|
Painter* painter, GLenum mode, const Color& color,
|
17
|
-
const Coord3* points,
|
18
|
-
const uint* indices
|
17
|
+
const Coord3* points, size_t npoints,
|
18
|
+
const uint* indices = NULL, size_t nindices = 0,
|
19
|
+
const Coord3* texcoords = NULL);
|
20
|
+
|
21
|
+
void Painter_draw (
|
22
|
+
Painter* painter, GLenum mode,
|
23
|
+
const Coord3* points, size_t npoints,
|
24
|
+
const uint* indices = NULL, size_t nindices = 0,
|
25
|
+
const Color* colors = NULL,
|
26
|
+
const Coord3* texcoords = NULL);
|
19
27
|
|
20
28
|
|
21
29
|
}// Rays
|