-
Notifications
You must be signed in to change notification settings - Fork 138
/
triangle.p6
111 lines (82 loc) · 2.65 KB
/
triangle.p6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
use v6;
=begin pod
=head1 TITLE
triangle.p6 - Initialize GLUT and render a simple OpenGL animation
=head1 SYNOPSIS
$ cd rakudo-home
$ export PERL6LIB=rakudo-home:parrot-home/runtime/parrot/library
$ ./perl6 parrot-home/examples/opengl/triangle.p6
=head1 DESCRIPTION
This simple example shows how to load the OpenGL/GLU/GLUT wrapper, create
a small GLUT window and register the appropriate callbacks, and finally
display a simple OpenGL animation until the user closes the window. It is
a simple translation of F<triangle.pir> to Perl 6.
To quit the example, press C<Q> or the C<ESCAPE> key, or close the window
using your window manager (using the X in the corner of the window title
bar, for example). To pause or restart the animation, press any other
ASCII key.
For a more complex and well-behaved example, try F<shapes.p6>.
=end pod
# None of these currently work; they all create an inescapable new lexical pad
# require 'glutconst.p6';
# 'glutconst.p6'.evalfile;
# eval open('glutconst.p6').slurp;
constant GLUT_RGBA = 0x0000;
constant GLUT_DOUBLE = 0x0002;
constant GL_TRIANGLES = 0x0004;
constant GL_DEPTH_BUFFER_BIT = 0x0100;
constant GL_COLOR_BUFFER_BIT = 0x4000;
use OpenGL:from<parrot>;
use NCI::Utils:from<parrot>;
our $rotating = 1;
our $prev_time = time();
our $window;
sub MAIN(*@ARGS is rw) {
# Initialize GLUT
@ARGS = call_toolkit_init(&glutInit, @ARGS, $*PROGRAM_NAME);
# Set display mode
glutInitDisplayMode(GLUT_DOUBLE +| GLUT_RGBA);
# Create GLUT window
$window = glutCreateWindow('Rotating Triangle NCI Test');
# Set up GLUT callbacks
glutDisplayFunc( &draw );
glutIdleFunc( &idle );
glutKeyboardFunc( &keyboard );
# Enter the GLUT main loop
glutMainLoop();
# Rakudo bug -- glutMainLoop() never returns, but Rakudo dies without this
return;
}
sub draw {
glClear(GL_COLOR_BUFFER_BIT +| GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); glVertex3f(-.5, -.5, 0);
glColor3f(0, 1, 0); glVertex3f( .5, -.5, 0);
glColor3f(0, 0, 1); glVertex3f(0 , .5, 0);
glEnd();
glutSwapBuffers();
}
sub idle {
my $now = time();
my $dt = 360 * ($now - $prev_time);
$prev_time = $now;
if ($rotating) {
glRotatef($dt, 0, 1, 0);
glutPostRedisplay();
}
}
sub keyboard($key, $x, $y) {
# For ESCAPE, 'Q', and 'q', exit program
if ($key == 27 | 81 | 113) {
glutDestroyWindow($window);
}
# For all other keys, just toggle rotation
else {
$rotating = !$rotating;
}
}
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=perl6: