ray 0.1.1 → 0.2.0
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.
- data/README.md +9 -6
- data/Rakefile +1 -5
- data/ext/audio.c +25 -19
- data/ext/audio_source.c +67 -39
- data/ext/color.c +19 -19
- data/ext/drawable.c +190 -31
- data/ext/extconf.rb +16 -14
- data/ext/gl.c +310 -30
- data/ext/gl_buffer.c +223 -2
- data/ext/gl_index_buffer.c +11 -0
- data/ext/gl_int_array.c +24 -22
- data/ext/gl_vertex.c +84 -49
- data/ext/image.c +115 -51
- data/ext/image_target.c +58 -10
- data/ext/input.c +73 -6
- data/ext/mo.c +583 -0
- data/ext/mo.h +189 -0
- data/ext/music.c +9 -8
- data/ext/pixel_bus.c +349 -0
- data/ext/polygon.c +68 -45
- data/ext/ray.c +1 -0
- data/ext/ray.h +19 -1
- data/ext/rect.c +9 -47
- data/ext/say.h +1 -2
- data/ext/say_all.h +6 -0
- data/ext/say_audio.h +3 -0
- data/ext/say_audio_context.c +1 -4
- data/ext/say_basic_type.c +24 -0
- data/ext/say_basic_type.h +4 -0
- data/ext/say_buffer.c +217 -88
- data/ext/say_buffer.h +20 -5
- data/ext/say_buffer_renderer.c +10 -7
- data/ext/say_buffer_renderer.h +1 -1
- data/ext/say_buffer_slice.c +70 -76
- data/ext/say_context.c +109 -22
- data/ext/say_context.h +14 -0
- data/ext/say_drawable.c +113 -25
- data/ext/say_drawable.h +23 -2
- data/ext/say_error.c +7 -2
- data/ext/say_font.c +30 -27
- data/ext/say_font.h +3 -6
- data/ext/say_get_proc.c +35 -0
- data/ext/say_image.c +102 -27
- data/ext/say_image.h +11 -4
- data/ext/say_image_target.c +88 -34
- data/ext/say_image_target.h +3 -2
- data/ext/say_index_buffer.c +31 -19
- data/ext/say_index_buffer.h +4 -2
- data/ext/say_index_buffer_slice.c +78 -70
- data/ext/say_music.c +4 -2
- data/ext/say_osx.h +3 -2
- data/ext/say_osx_context.h +37 -4
- data/ext/say_osx_window.h +32 -37
- data/ext/say_pixel_bus.c +163 -0
- data/ext/say_pixel_bus.h +44 -0
- data/ext/say_polygon.c +2 -2
- data/ext/say_shader.c +66 -62
- data/ext/say_shader.h +2 -0
- data/ext/say_sprite.c +1 -2
- data/ext/say_target.c +14 -23
- data/ext/say_target.h +3 -1
- data/ext/say_text.c +45 -7
- data/ext/say_text.h +12 -3
- data/ext/say_thread.c +13 -6
- data/ext/say_thread.h +1 -1
- data/ext/say_thread_variable.c +5 -5
- data/ext/say_vertex_type.c +79 -41
- data/ext/say_vertex_type.h +6 -2
- data/ext/say_view.c +10 -31
- data/ext/say_view.h +1 -5
- data/ext/say_win.h +2 -2
- data/ext/say_win_context.h +49 -11
- data/ext/say_win_window.h +30 -27
- data/ext/say_window.c +3 -3
- data/ext/say_x11.h +3 -1
- data/ext/say_x11_context.h +64 -10
- data/ext/say_x11_window.h +22 -17
- data/ext/shader.c +9 -0
- data/ext/sprite.c +7 -1
- data/ext/target.c +80 -28
- data/ext/text.c +43 -1
- data/ext/view.c +53 -1
- data/ext/window.c +4 -0
- data/lib/ray/animation_list.rb +17 -2
- data/lib/ray/audio_source.rb +11 -0
- data/lib/ray/color.rb +14 -0
- data/lib/ray/drawable.rb +23 -0
- data/lib/ray/dsl/event.rb +1 -9
- data/lib/ray/dsl/event_runner.rb +3 -4
- data/lib/ray/dsl/matcher.rb +20 -1
- data/lib/ray/effect.rb +116 -0
- data/lib/ray/effect/black_and_white.rb +38 -0
- data/lib/ray/effect/color_inversion.rb +16 -0
- data/lib/ray/effect/generator.rb +145 -0
- data/lib/ray/effect/grayscale.rb +32 -0
- data/lib/ray/game.rb +25 -5
- data/lib/ray/gl/vertex.rb +105 -26
- data/lib/ray/helper.rb +5 -0
- data/lib/ray/image.rb +54 -13
- data/lib/ray/image_target.rb +7 -0
- data/lib/ray/matrix.rb +26 -0
- data/lib/ray/music.rb +4 -0
- data/lib/ray/pixel_bus.rb +22 -0
- data/lib/ray/polygon.rb +17 -0
- data/lib/ray/pp.rb +28 -0
- data/lib/ray/ray.rb +7 -1
- data/lib/ray/rect.rb +7 -13
- data/lib/ray/scene.rb +24 -5
- data/lib/ray/scene_list.rb +9 -0
- data/lib/ray/shader.rb +11 -2
- data/lib/ray/sound.rb +4 -0
- data/lib/ray/sprite.rb +23 -62
- data/lib/ray/target.rb +25 -0
- data/lib/ray/text.rb +10 -0
- data/lib/ray/turtle.rb +9 -3
- data/lib/ray/vector.rb +18 -0
- data/lib/ray/vertex.rb +6 -0
- data/lib/ray/view.rb +22 -0
- data/samples/animation/sprite_motion.rb +0 -60
- data/samples/audio/{spacial.rb → spatial.rb} +1 -1
- data/samples/buffer/buffer.rb +1 -0
- data/samples/buffer/index_buffer.rb +2 -0
- data/samples/cptn_ruby/cptn_ruby.rb +6 -7
- data/samples/effects/effect.rb +39 -0
- data/samples/effects/grayscale.rb +27 -0
- data/samples/opengl/image.rb +7 -5
- data/samples/opengl/instancing.rb +159 -0
- data/samples/opengl/instancing.rbc +3231 -0
- data/samples/opengl/obj_loader.rb +9 -8
- data/samples/opengl/shader.rb +1 -3
- data/samples/shaders/geometry.rb +108 -38
- data/samples/shaders/geometry.rbc +2074 -0
- data/samples/shaders/shape.rb +2 -2
- data/samples/starfighter/starfighter.rb +5 -5
- data/samples/window/get_pixel.rb +1 -1
- data/test/animation_list_test.rb +18 -4
- data/test/drawable_test.rb +70 -1
- data/test/effect_generator_test.rb +63 -0
- data/test/effect_test.rb +61 -0
- data/test/game_test.rb +18 -0
- data/test/gl_buffer_test.rb +43 -1
- data/test/gl_index_buffer_test.rb +5 -0
- data/test/gl_vertex_test.rb +28 -1
- data/test/image_test.rb +5 -5
- data/test/input_test.rb +49 -0
- data/test/pixel_bus_test.rb +28 -0
- data/test/rect_test.rb +4 -0
- data/{samples/_media → test/res}/Beep.wav +0 -0
- data/samples/_media/CptnRuby Gem.png b/data/test/res/CptnRuby → Gem.png +0 -0
- data/samples/_media/CptnRuby Map.txt b/data/test/res/CptnRuby → Map.txt +0 -0
- data/samples/_media/CptnRuby Tileset.png b/data/test/res/CptnRuby → Tileset.png +0 -0
- data/{samples/_media → test/res}/CptnRuby.png +0 -0
- data/{samples/_media → test/res}/Space.png +0 -0
- data/{samples/_media → test/res}/Star.png +0 -0
- data/{samples/_media → test/res}/Starfighter.png +0 -0
- data/test/res/cube.obj +28 -0
- data/test/res/light3d.c +2 -2
- data/test/res/stone.png +0 -0
- data/test/scene_test.rb +3 -0
- data/test/sprite_test.rb +10 -0
- data/test/text_test.rb +31 -2
- data/test/view_test.rb +13 -1
- metadata +38 -17
- data/ext/say_array.c +0 -124
- data/ext/say_array.h +0 -34
- data/ext/say_table.c +0 -86
- data/ext/say_table.h +0 -24
data/ext/say_osx_window.h
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
void say_osx_flip_pool() {
|
4
4
|
static say_thread_variable *var = NULL;
|
5
5
|
if (!var) {
|
6
|
-
var = say_thread_variable_create(
|
6
|
+
var = say_thread_variable_create();
|
7
7
|
}
|
8
8
|
|
9
9
|
NSAutoreleasePool *pool = say_thread_variable_get(var);
|
@@ -59,7 +59,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev);
|
|
59
59
|
if (!(self = [super init]))
|
60
60
|
return nil;
|
61
61
|
|
62
|
-
events
|
62
|
+
mo_array_init(&events, sizeof(say_event));
|
63
63
|
return self;
|
64
64
|
}
|
65
65
|
|
@@ -67,11 +67,6 @@ static uint8_t say_osx_convert_mod(NSEvent *ev);
|
|
67
67
|
width:(size_t)w
|
68
68
|
height:(size_t)h
|
69
69
|
style:(uint8_t)style {
|
70
|
-
if ([NSThread currentThread] != [NSThread mainThread]) {
|
71
|
-
say_error_set("can't create window outside main thread");
|
72
|
-
return NO;
|
73
|
-
}
|
74
|
-
|
75
70
|
say_osx_setup_process();
|
76
71
|
|
77
72
|
NSRect rect = NSMakeRect(0, 0, w, h);
|
@@ -174,11 +169,9 @@ static uint8_t say_osx_convert_mod(NSEvent *ev);
|
|
174
169
|
|
175
170
|
bitsPerPixel:0];
|
176
171
|
|
177
|
-
|
178
|
-
say_color *buf = say_image_get_buffer(img);
|
179
172
|
for (size_t y = 0; y < h; y++) {
|
180
173
|
for (size_t x = 0; x < w; x++) {
|
181
|
-
say_color col =
|
174
|
+
say_color col = say_image_get(img, x, y);
|
182
175
|
NSUInteger pixel[] = {col.r, col.g, col.b, col.a};
|
183
176
|
|
184
177
|
[rep setPixel:pixel atX:x y:y];
|
@@ -226,7 +219,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev);
|
|
226
219
|
say_event ev;
|
227
220
|
ev.type = SAY_EVENT_RESIZE;
|
228
221
|
ev.ev.resize.size = say_make_vector2(w, h);
|
229
|
-
|
222
|
+
mo_array_push(&events, &ev);
|
230
223
|
}
|
231
224
|
else {
|
232
225
|
NSRect frame = view.frame;
|
@@ -243,10 +236,12 @@ static uint8_t say_osx_convert_mod(NSEvent *ev);
|
|
243
236
|
|
244
237
|
- (void)close {
|
245
238
|
if (window) {
|
246
|
-
|
239
|
+
allow_close = YES;
|
247
240
|
[window close];
|
248
241
|
[window release];
|
249
242
|
window = nil;
|
243
|
+
|
244
|
+
mo_array_resize(&events, 0);
|
250
245
|
}
|
251
246
|
}
|
252
247
|
|
@@ -255,7 +250,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev);
|
|
255
250
|
|
256
251
|
[self close];
|
257
252
|
[view release];
|
258
|
-
|
253
|
+
mo_array_release(&events);
|
259
254
|
[super dealloc];
|
260
255
|
|
261
256
|
say_osx_flip_pool();
|
@@ -319,9 +314,9 @@ static NSEvent *say_osx_get_event(bool patient) {
|
|
319
314
|
}
|
320
315
|
[pool drain];
|
321
316
|
|
322
|
-
if (
|
323
|
-
*ev =
|
324
|
-
|
317
|
+
if (events.size != 0) {
|
318
|
+
*ev = mo_array_get_as(&events, 0, say_event);
|
319
|
+
mo_array_delete(&events, 0);
|
325
320
|
|
326
321
|
return YES;
|
327
322
|
}
|
@@ -336,14 +331,14 @@ static NSEvent *say_osx_get_event(bool patient) {
|
|
336
331
|
|
337
332
|
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
338
333
|
|
339
|
-
while (
|
334
|
+
while (events.size == 0 && (nsev = say_osx_get_event(true))) {
|
340
335
|
[NSApp sendEvent:nsev];
|
341
336
|
}
|
342
337
|
|
343
338
|
[pool drain];
|
344
339
|
|
345
|
-
*ev =
|
346
|
-
|
340
|
+
*ev = mo_array_get_as(&events, 0, say_event);
|
341
|
+
mo_array_delete(&events, 0);
|
347
342
|
}
|
348
343
|
|
349
344
|
static say_key say_osx_convert_key(NSEvent *ev) {
|
@@ -480,7 +475,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
480
475
|
ev.ev.key.mod = say_osx_convert_mod(nsev);
|
481
476
|
ev.ev.key.native_code = nsev.keyCode;
|
482
477
|
|
483
|
-
|
478
|
+
mo_array_push(&events, &ev);
|
484
479
|
}
|
485
480
|
|
486
481
|
NSText *text = [window fieldEditor:YES forObject:self];
|
@@ -491,7 +486,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
491
486
|
ev.type = SAY_EVENT_TEXT_ENTERED;
|
492
487
|
ev.ev.text.text = [text.string characterAtIndex:0];
|
493
488
|
|
494
|
-
|
489
|
+
mo_array_push(&events, &ev);
|
495
490
|
|
496
491
|
text.string = @"";
|
497
492
|
}
|
@@ -505,7 +500,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
505
500
|
ev.ev.key.mod = say_osx_convert_mod(nsev);
|
506
501
|
ev.ev.key.native_code = nsev.keyCode;
|
507
502
|
|
508
|
-
|
503
|
+
mo_array_push(&events, &ev);
|
509
504
|
}
|
510
505
|
|
511
506
|
- (void)submitFlagChange:(uint8_t)mod forKey:(say_key)key
|
@@ -517,7 +512,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
517
512
|
ev.ev.key.mod = mod;
|
518
513
|
ev.ev.key.native_code = 0;
|
519
514
|
|
520
|
-
|
515
|
+
mo_array_push(&events, &ev);
|
521
516
|
}
|
522
517
|
|
523
518
|
- (void)flagsChanged:(NSEvent*)nsev {
|
@@ -578,7 +573,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
578
573
|
ev.type = SAY_EVENT_BUTTON_PRESS;
|
579
574
|
ev.ev.button.pos = [self convertPoint:nsev.locationInWindow];
|
580
575
|
ev.ev.button.button = SAY_BUTTON_LEFT;
|
581
|
-
|
576
|
+
mo_array_push(&events, &ev);
|
582
577
|
}
|
583
578
|
|
584
579
|
- (void)ownMouseUp:(NSEvent*)nsev {
|
@@ -586,7 +581,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
586
581
|
ev.type = SAY_EVENT_BUTTON_RELEASE;
|
587
582
|
ev.ev.button.pos = [self convertPoint:nsev.locationInWindow];
|
588
583
|
ev.ev.button.button = SAY_BUTTON_LEFT;
|
589
|
-
|
584
|
+
mo_array_push(&events, &ev);
|
590
585
|
}
|
591
586
|
|
592
587
|
- (void)ownRightMouseDown:(NSEvent*)nsev {
|
@@ -594,7 +589,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
594
589
|
ev.type = SAY_EVENT_BUTTON_PRESS;
|
595
590
|
ev.ev.button.pos = [self convertPoint:nsev.locationInWindow];
|
596
591
|
ev.ev.button.button = SAY_BUTTON_RIGHT;
|
597
|
-
|
592
|
+
mo_array_push(&events, &ev);
|
598
593
|
}
|
599
594
|
|
600
595
|
- (void)ownRightMouseUp:(NSEvent*)nsev {
|
@@ -602,7 +597,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
602
597
|
ev.type = SAY_EVENT_BUTTON_RELEASE;
|
603
598
|
ev.ev.button.pos = [self convertPoint:nsev.locationInWindow];
|
604
599
|
ev.ev.button.button = SAY_BUTTON_RIGHT;
|
605
|
-
|
600
|
+
mo_array_push(&events, &ev);
|
606
601
|
}
|
607
602
|
|
608
603
|
/* Assume other mouse button will be middle. */
|
@@ -611,7 +606,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
611
606
|
ev.type = SAY_EVENT_BUTTON_PRESS;
|
612
607
|
ev.ev.button.pos = [self convertPoint:nsev.locationInWindow];
|
613
608
|
ev.ev.button.button = SAY_BUTTON_MIDDLE;
|
614
|
-
|
609
|
+
mo_array_push(&events, &ev);
|
615
610
|
}
|
616
611
|
|
617
612
|
- (void)ownOtherMouseUp:(NSEvent*)nsev {
|
@@ -619,26 +614,26 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
619
614
|
ev.type = SAY_EVENT_BUTTON_RELEASE;
|
620
615
|
ev.ev.button.pos = [self convertPoint:nsev.locationInWindow];
|
621
616
|
ev.ev.button.button = SAY_BUTTON_MIDDLE;
|
622
|
-
|
617
|
+
mo_array_push(&events, &ev);
|
623
618
|
}
|
624
619
|
|
625
620
|
- (void)mouseMoved:(NSEvent*)nsev {
|
626
621
|
say_event ev;
|
627
622
|
ev.type = SAY_EVENT_MOUSE_MOTION;
|
628
623
|
ev.ev.motion.pos = [self convertPoint:nsev.locationInWindow];
|
629
|
-
|
624
|
+
mo_array_push(&events, &ev);
|
630
625
|
}
|
631
626
|
|
632
627
|
- (void)mouseEntered:(NSEvent*)nsev {
|
633
628
|
say_event ev;
|
634
629
|
ev.type = SAY_EVENT_MOUSE_ENTERED;
|
635
|
-
|
630
|
+
mo_array_push(&events, &ev);
|
636
631
|
}
|
637
632
|
|
638
633
|
- (void)mouseExited:(NSEvent*)nsev {
|
639
634
|
say_event ev;
|
640
635
|
ev.type = SAY_EVENT_MOUSE_LEFT;
|
641
|
-
|
636
|
+
mo_array_push(&events, &ev);
|
642
637
|
}
|
643
638
|
|
644
639
|
- (void)ownScrollWheel:(NSEvent*)nsev {
|
@@ -649,7 +644,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
649
644
|
ev.type = SAY_EVENT_WHEEL_MOTION;
|
650
645
|
ev.ev.wheel.pos = [self convertPoint:nsev.locationInWindow];
|
651
646
|
ev.ev.wheel.delta = nsev.deltaY;
|
652
|
-
|
647
|
+
mo_array_push(&events, &ev);
|
653
648
|
}
|
654
649
|
|
655
650
|
/*
|
@@ -659,7 +654,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
659
654
|
- (BOOL)windowShouldClose:(id)sender {
|
660
655
|
say_event ev;
|
661
656
|
ev.type = SAY_EVENT_QUIT;
|
662
|
-
|
657
|
+
mo_array_push(&events, &ev);
|
663
658
|
|
664
659
|
if (allow_close) {
|
665
660
|
allow_close = NO;
|
@@ -672,13 +667,13 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
672
667
|
- (void)windowDidBecomeKey:(NSNotification*)not {
|
673
668
|
say_event ev;
|
674
669
|
ev.type = SAY_EVENT_FOCUS_GAIN;
|
675
|
-
|
670
|
+
mo_array_push(&events, &ev);
|
676
671
|
}
|
677
672
|
|
678
673
|
- (void)windowDidResignKey:(NSNotification*)not {
|
679
674
|
say_event ev;
|
680
675
|
ev.type = SAY_EVENT_FOCUS_LOSS;
|
681
|
-
|
676
|
+
mo_array_push(&events, &ev);
|
682
677
|
}
|
683
678
|
|
684
679
|
- (void)windowDidResize:(NSNotification*)not {
|
@@ -689,7 +684,7 @@ static uint8_t say_osx_convert_mod(NSEvent *ev) {
|
|
689
684
|
say_event ev;
|
690
685
|
ev.type = SAY_EVENT_RESIZE;
|
691
686
|
ev.ev.resize.size = say_make_vector2(size.width, size.height);
|
692
|
-
|
687
|
+
mo_array_push(&events, &ev);
|
693
688
|
}
|
694
689
|
|
695
690
|
[view removeTrackingRect:track];
|
data/ext/say_pixel_bus.c
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
#include "say.h"
|
2
|
+
|
3
|
+
static say_context *say_pack_pbo_last_context = NULL;
|
4
|
+
static GLuint say_pack_pbo = 0;
|
5
|
+
|
6
|
+
static void say_pack_pbo_make_current(GLuint pbo) {
|
7
|
+
say_context *context = say_context_current();
|
8
|
+
if (say_pack_pbo_last_context != context ||
|
9
|
+
pbo != say_pack_pbo) {
|
10
|
+
say_pack_pbo = pbo;
|
11
|
+
say_pack_pbo_last_context = context;
|
12
|
+
|
13
|
+
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
static say_context *say_unpack_pbo_last_context = NULL;
|
18
|
+
static GLuint say_unpack_pbo = 0;
|
19
|
+
|
20
|
+
static void say_unpack_pbo_make_current(GLuint pbo) {
|
21
|
+
say_context *context = say_context_current();
|
22
|
+
if (say_unpack_pbo_last_context != context ||
|
23
|
+
pbo != say_unpack_pbo) {
|
24
|
+
say_unpack_pbo = pbo;
|
25
|
+
say_unpack_pbo_last_context = context;
|
26
|
+
|
27
|
+
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
static void say_pbo_will_delete(GLuint pbo) {
|
32
|
+
if (say_pack_pbo == pbo) say_pack_pbo = 0;
|
33
|
+
if (say_unpack_pbo == pbo) say_unpack_pbo = 0;
|
34
|
+
}
|
35
|
+
|
36
|
+
bool say_pixel_bus_is_available() {
|
37
|
+
say_context_ensure();
|
38
|
+
return GLEW_ARB_pixel_buffer_object ||
|
39
|
+
GLEW_VERSION_2_1;
|
40
|
+
}
|
41
|
+
|
42
|
+
say_pixel_bus *say_pixel_bus_create(GLenum mode) {
|
43
|
+
say_context_ensure();
|
44
|
+
|
45
|
+
say_pixel_bus *bus = malloc(sizeof(say_pixel_bus));
|
46
|
+
|
47
|
+
glGenBuffers(1, &bus->pbo);
|
48
|
+
|
49
|
+
bus->size = 1024;
|
50
|
+
bus->mode = mode;
|
51
|
+
|
52
|
+
say_pixel_bus_bind_pack(bus);
|
53
|
+
glBufferData(GL_PIXEL_PACK_BUFFER, 1024 * sizeof(say_color), NULL,
|
54
|
+
mode);
|
55
|
+
|
56
|
+
return bus;
|
57
|
+
}
|
58
|
+
|
59
|
+
void say_pixel_bus_free(say_pixel_bus *bus) {
|
60
|
+
say_context_ensure();
|
61
|
+
say_pbo_will_delete(bus->pbo);
|
62
|
+
glDeleteBuffers(1, &bus->pbo);
|
63
|
+
free(bus);
|
64
|
+
}
|
65
|
+
|
66
|
+
size_t say_pixel_bus_pull_image(say_pixel_bus *bus,
|
67
|
+
say_image *img, size_t offset) {
|
68
|
+
say_image_bind(img);
|
69
|
+
say_pixel_bus_bind_pack(bus);
|
70
|
+
|
71
|
+
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
72
|
+
(void*)(offset * sizeof(say_color)));
|
73
|
+
return offset + say_image_get_width(img) * say_image_get_height(img);
|
74
|
+
}
|
75
|
+
|
76
|
+
size_t say_pixel_bus_pull_target(say_pixel_bus *bus,
|
77
|
+
say_target *target, size_t offset,
|
78
|
+
size_t x, size_t y, size_t w, size_t h) {
|
79
|
+
if (!say_target_make_current(target))
|
80
|
+
return offset + w * h;
|
81
|
+
|
82
|
+
say_pixel_bus_bind_pack(bus);
|
83
|
+
|
84
|
+
glReadPixels(x, target->size.y - y - h, w, h, GL_RGBA,
|
85
|
+
GL_UNSIGNED_BYTE, (void*)(offset * sizeof(say_color)));
|
86
|
+
return offset + w * h;
|
87
|
+
}
|
88
|
+
|
89
|
+
void say_pixel_bus_push_image(say_pixel_bus *bus,
|
90
|
+
say_image *img, size_t offset,
|
91
|
+
size_t x, size_t y, size_t w, size_t h) {
|
92
|
+
say_image_bind(img);
|
93
|
+
say_pixel_bus_bind_unpack(bus);
|
94
|
+
|
95
|
+
glTexSubImage2D(GL_TEXTURE_2D, 0,
|
96
|
+
x, y, w, h,
|
97
|
+
GL_RGBA, GL_UNSIGNED_BYTE,
|
98
|
+
(void*)(offset * sizeof(say_color)));
|
99
|
+
say_image_mark_out_of_date(img);
|
100
|
+
}
|
101
|
+
|
102
|
+
void say_pixel_bus_bind_pack(say_pixel_bus *bus) {
|
103
|
+
say_context_ensure();
|
104
|
+
say_pack_pbo_make_current(bus->pbo);
|
105
|
+
}
|
106
|
+
|
107
|
+
void say_pixel_bus_bind_unpack(say_pixel_bus *bus) {
|
108
|
+
say_context_ensure();
|
109
|
+
say_unpack_pbo_make_current(bus->pbo);
|
110
|
+
}
|
111
|
+
|
112
|
+
void say_pixel_bus_unbind_pack() {
|
113
|
+
if (say_pixel_bus_is_available()) say_pack_pbo_make_current(0);
|
114
|
+
}
|
115
|
+
|
116
|
+
void say_pixel_bus_unbind_unpack() {
|
117
|
+
if (say_pixel_bus_is_available()) say_unpack_pbo_make_current(0);
|
118
|
+
}
|
119
|
+
|
120
|
+
void say_pixel_bus_bind(say_pixel_bus *bus) {
|
121
|
+
say_pixel_bus_bind_pack(bus);
|
122
|
+
say_pixel_bus_bind_unpack(bus);
|
123
|
+
}
|
124
|
+
|
125
|
+
void say_pixel_bus_unbind() {
|
126
|
+
say_pixel_bus_unbind_pack();
|
127
|
+
say_pixel_bus_unbind_unpack();
|
128
|
+
}
|
129
|
+
|
130
|
+
void say_pixel_bus_resize(say_pixel_bus *bus, size_t new_size) {
|
131
|
+
/* This is slow, so better not go through this for no reason. */
|
132
|
+
if (bus->size == new_size) return;
|
133
|
+
|
134
|
+
say_pixel_bus_bind_pack(bus);
|
135
|
+
|
136
|
+
void *buffer = malloc(sizeof(say_color) * new_size);
|
137
|
+
glGetBufferSubData(GL_PIXEL_PACK_BUFFER, 0, new_size, buffer);
|
138
|
+
|
139
|
+
glBufferData(GL_PIXEL_PACK_BUFFER, new_size * sizeof(say_color),
|
140
|
+
buffer, bus->mode);
|
141
|
+
|
142
|
+
free(buffer);
|
143
|
+
|
144
|
+
bus->size = new_size;
|
145
|
+
}
|
146
|
+
|
147
|
+
void say_pixel_bus_resize_fast(say_pixel_bus *bus, size_t new_size) {
|
148
|
+
if (bus->size == new_size) return;
|
149
|
+
|
150
|
+
say_pixel_bus_bind_pack(bus);
|
151
|
+
glBufferData(GL_PIXEL_PACK_BUFFER, new_size * sizeof(say_color), NULL,
|
152
|
+
bus->mode);
|
153
|
+
|
154
|
+
bus->size = new_size;
|
155
|
+
}
|
156
|
+
|
157
|
+
size_t say_pixel_bus_get_size(say_pixel_bus *bus) {
|
158
|
+
return bus->size;
|
159
|
+
}
|
160
|
+
|
161
|
+
GLuint say_pixel_bus_get_pbo(say_pixel_bus *bus) {
|
162
|
+
return bus->pbo;
|
163
|
+
}
|
data/ext/say_pixel_bus.h
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#ifndef SAY_PIXEL_BUS_H_
|
2
|
+
#define SAY_PIXEL_BUS_H_
|
3
|
+
|
4
|
+
#include "say_target.h"
|
5
|
+
#include "say_image.h"
|
6
|
+
|
7
|
+
typedef struct say_pixel_bus {
|
8
|
+
GLuint pbo;
|
9
|
+
size_t size;
|
10
|
+
GLenum mode;
|
11
|
+
} say_pixel_bus;
|
12
|
+
|
13
|
+
bool say_pixel_bus_is_available();
|
14
|
+
|
15
|
+
say_pixel_bus *say_pixel_bus_create(GLenum mode);
|
16
|
+
void say_pixel_bus_free(say_pixel_bus *bus);
|
17
|
+
|
18
|
+
size_t say_pixel_bus_pull_image(say_pixel_bus *bus,
|
19
|
+
say_image *img, size_t offset);
|
20
|
+
size_t say_pixel_bus_pull_target(say_pixel_bus *bus,
|
21
|
+
say_target *target, size_t offset,
|
22
|
+
size_t x, size_t y, size_t w, size_t h);
|
23
|
+
|
24
|
+
void say_pixel_bus_push_image(say_pixel_bus *bus,
|
25
|
+
say_image *img, size_t offset,
|
26
|
+
size_t x, size_t y, size_t w, size_t h);
|
27
|
+
|
28
|
+
void say_pixel_bus_bind_pack(say_pixel_bus *bus);
|
29
|
+
void say_pixel_bus_bind_unpack(say_pixel_bus *bus);
|
30
|
+
|
31
|
+
void say_pixel_bus_unbind_pack();
|
32
|
+
void say_pixel_bus_unbind_unpack();
|
33
|
+
|
34
|
+
void say_pixel_bus_bind(say_pixel_bus *bus);
|
35
|
+
void say_pixel_bus_unbind();
|
36
|
+
|
37
|
+
void say_pixel_bus_resize(say_pixel_bus *bus, size_t new_size);
|
38
|
+
void say_pixel_bus_resize_fast(say_pixel_bus *bus, size_t new_size);
|
39
|
+
|
40
|
+
size_t say_pixel_bus_get_size(say_pixel_bus *bus);
|
41
|
+
|
42
|
+
GLuint say_pixel_bus_get_pbo(say_pixel_bus *bus);
|
43
|
+
|
44
|
+
#endif
|