opengl3 0.0.1.pre3 → 0.0.1.pre4
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/lib/glut.rb +5 -1
- data/lib/glut/i386/freeglut.dll.gitkeep +0 -0
- data/lib/glut/x86_64/freeglut.dll.gitkeep +0 -0
- data/lib/opengl/platform/windows.rb +28 -0
- data/lib/opengl/type.rb +14 -1
- data/lib/opengl/type/default.yml +1 -0
- data/lib/opengl/version.rb +1 -1
- metadata +13 -32
- data/.gitignore +0 -21
- data/.yardopts +0 -6
- data/Gemfile +0 -8
- data/LICENSE.txt +0 -22
- data/README.md +0 -92
- data/Rakefile +0 -26
- data/examples/math3d.rb +0 -65
- data/examples/ogl-2_1-basic.rb +0 -115
- data/examples/ogl-3_2-attribute_less.rb +0 -119
- data/examples/ogl-3_2-basic.rb +0 -136
- data/examples/ogl-3_2-cube.rb +0 -204
- data/examples/ogl-3_2-texture.rb +0 -163
- data/examples/ogl-4_0-quad_tessellation.rb +0 -284
- data/examples/ogl-4_0-triangle_tessellation.rb +0 -263
- data/opengl.gemspec +0 -24
- data/spec/spec_helper.rb +0 -8
- data/test/test_helper.rb +0 -8
- data/yard/database.rb +0 -51
- data/yard/dsl_handler.rb +0 -76
- data/yard/wrapper_handler.rb +0 -24
data/examples/ogl-2_1-basic.rb
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler/setup'
|
3
|
-
require 'opengl'
|
4
|
-
require 'glut'
|
5
|
-
|
6
|
-
class TestApp
|
7
|
-
include GLUT
|
8
|
-
include OpenGL::Constants
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
glutInit()
|
12
|
-
caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
|
13
|
-
glutInitDisplayMode(caps)
|
14
|
-
glutInitWindowPosition(300, 200)
|
15
|
-
glutInitWindowSize(512, 512)
|
16
|
-
glutCreateWindow('test')
|
17
|
-
|
18
|
-
# prevent callback proc from being garbage-collected
|
19
|
-
glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
|
20
|
-
end
|
21
|
-
|
22
|
-
def start
|
23
|
-
self.extend OpenGL::GL.entrypoints
|
24
|
-
puts glGetString(GL_VERSION)
|
25
|
-
puts glGetVersion().inspect
|
26
|
-
puts glGetShadingLanguageVersion().inspect
|
27
|
-
puts glGetAvailableExtensions().inspect
|
28
|
-
|
29
|
-
@quad = begin
|
30
|
-
buffer = glGenBuffers(1)[0]
|
31
|
-
glBindBuffer(GL_ARRAY_BUFFER, buffer)
|
32
|
-
glBufferData(GL_ARRAY_BUFFER, 3 * 4 * 4, nil, GL_STATIC_DRAW)
|
33
|
-
glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
|
34
|
-
ptr.put_array_of_GLfloat( 0, [-0.5, 0.5, 0.0])
|
35
|
-
ptr.put_array_of_GLfloat(12, [-0.5,-0.5, 0.0])
|
36
|
-
ptr.put_array_of_GLfloat(24, [ 0.5, 0.5, 0.0])
|
37
|
-
ptr.put_array_of_GLfloat(36, [ 0.5,-0.5, 0.0])
|
38
|
-
end
|
39
|
-
|
40
|
-
buffer
|
41
|
-
end
|
42
|
-
|
43
|
-
@program = begin
|
44
|
-
vertex_shader = glCreateShader(:vertex)
|
45
|
-
glShaderSource(vertex_shader, VS_CODE)
|
46
|
-
glCompileShader(vertex_shader)
|
47
|
-
err_msg = glGetShaderInfoLog(vertex_shader)
|
48
|
-
unless glIsShaderCompiled?(vertex_shader)
|
49
|
-
raise RuntimeError, "vertex_shader:\n#{err_msg}"
|
50
|
-
else
|
51
|
-
$stderr.puts "vertex_shader:\n#{err_msg}"
|
52
|
-
end
|
53
|
-
|
54
|
-
fragment_shader = glCreateShader(:fragment)
|
55
|
-
glShaderSource(fragment_shader, FS_CODE)
|
56
|
-
glCompileShader(fragment_shader)
|
57
|
-
err_msg = glGetShaderInfoLog(fragment_shader)
|
58
|
-
unless glIsShaderCompiled?(fragment_shader)
|
59
|
-
raise RuntimeError, "fragment_shader:\n#{err_msg}"
|
60
|
-
else
|
61
|
-
$stderr.puts "fragment_shader:\n#{err_msg}"
|
62
|
-
end
|
63
|
-
|
64
|
-
program = glCreateProgram()
|
65
|
-
glAttachShader(program, vertex_shader)
|
66
|
-
glAttachShader(program, fragment_shader)
|
67
|
-
glBindAttribLocation(program, 0, "in_Position")
|
68
|
-
glLinkProgram(program)
|
69
|
-
err_msg = glGetProgramInfoLog(program)
|
70
|
-
unless glIsProgramLinked?(program)
|
71
|
-
raise RuntimeError, "program:\n#{err_msg}"
|
72
|
-
else
|
73
|
-
$stderr.puts "program:\n#{err_msg}"
|
74
|
-
end
|
75
|
-
glDeleteShader(vertex_shader)
|
76
|
-
glDeleteShader(fragment_shader)
|
77
|
-
program
|
78
|
-
end
|
79
|
-
|
80
|
-
glutMainLoop()
|
81
|
-
end
|
82
|
-
|
83
|
-
def draw
|
84
|
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
85
|
-
|
86
|
-
glUseProgram(@program)
|
87
|
-
glBindBuffer(GL_ARRAY_BUFFER, @quad)
|
88
|
-
glEnableVertexAttribArray(0)
|
89
|
-
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil)
|
90
|
-
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
|
91
|
-
|
92
|
-
glutSwapBuffers()
|
93
|
-
end
|
94
|
-
|
95
|
-
VS_CODE =<<-GLSL
|
96
|
-
attribute vec4 in_Position;
|
97
|
-
varying vec2 vs_TexCoord;
|
98
|
-
void main()
|
99
|
-
{
|
100
|
-
gl_Position = in_Position;
|
101
|
-
vs_TexCoord = in_Position.xy + 0.5;
|
102
|
-
}
|
103
|
-
GLSL
|
104
|
-
|
105
|
-
FS_CODE =<<-GLSL
|
106
|
-
varying vec2 vs_TexCoord;
|
107
|
-
void main()
|
108
|
-
{
|
109
|
-
gl_FragColor = vec4(vs_TexCoord, 0.0, 1.0);
|
110
|
-
}
|
111
|
-
GLSL
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
TestApp.new.start
|
@@ -1,119 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler/setup'
|
3
|
-
require 'opengl'
|
4
|
-
require 'glut'
|
5
|
-
|
6
|
-
class TestApp
|
7
|
-
include GLUT
|
8
|
-
include OpenGL::Constants
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
glutInit()
|
12
|
-
caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
|
13
|
-
if FFI::Platform.mac?
|
14
|
-
caps |= GLUT_3_2_CORE_PROFILE
|
15
|
-
else
|
16
|
-
glutInitContextVersion(3, 2)
|
17
|
-
glutInitContextProfile(:core)
|
18
|
-
end
|
19
|
-
glutInitDisplayMode(caps)
|
20
|
-
glutInitWindowPosition(300, 200)
|
21
|
-
glutInitWindowSize(512, 512)
|
22
|
-
glutCreateWindow('test')
|
23
|
-
|
24
|
-
# prevent callback proc from being garbage-collected
|
25
|
-
glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
|
26
|
-
end
|
27
|
-
|
28
|
-
def start
|
29
|
-
self.extend OpenGL::GL.entrypoints
|
30
|
-
puts glGetString(GL_VERSION)
|
31
|
-
puts glGetBooleanv(GL_DEPTH_TEST, 1).inspect
|
32
|
-
puts glGetDoublev(GL_COLOR_CLEAR_VALUE, 4).inspect
|
33
|
-
puts glGetFloatv(GL_LINE_WIDTH, 1).inspect
|
34
|
-
puts glGetIntegerv(GL_VIEWPORT, 4).inspect
|
35
|
-
puts glGetVersion().inspect
|
36
|
-
puts glGetShadingLanguageVersion().inspect
|
37
|
-
puts glGetAvailableExtensions().inspect
|
38
|
-
|
39
|
-
@dummy = glGenVertexArrays(1)[0]
|
40
|
-
|
41
|
-
@program = begin
|
42
|
-
vertex_shader = glCreateShader(:vertex)
|
43
|
-
glShaderSource(vertex_shader, VS_CODE)
|
44
|
-
glCompileShader(vertex_shader)
|
45
|
-
err_msg = glGetShaderInfoLog(vertex_shader)
|
46
|
-
unless glIsShaderCompiled?(vertex_shader)
|
47
|
-
raise RuntimeError, "vertex_shader:\n#{err_msg}"
|
48
|
-
else
|
49
|
-
$stderr.puts "vertex_shader:\n#{err_msg}"
|
50
|
-
end
|
51
|
-
|
52
|
-
fragment_shader = glCreateShader(:fragment)
|
53
|
-
glShaderSource(fragment_shader, FS_CODE)
|
54
|
-
glCompileShader(fragment_shader)
|
55
|
-
err_msg = glGetShaderInfoLog(fragment_shader)
|
56
|
-
unless glIsShaderCompiled?(fragment_shader)
|
57
|
-
raise RuntimeError, "fragment_shader:\n#{err_msg}"
|
58
|
-
else
|
59
|
-
$stderr.puts "fragment_shader:\n#{err_msg}"
|
60
|
-
end
|
61
|
-
|
62
|
-
program = glCreateProgram()
|
63
|
-
glAttachShader(program, vertex_shader)
|
64
|
-
glAttachShader(program, fragment_shader)
|
65
|
-
glBindFragDataLocation(program, 0, "fs_FragColor")
|
66
|
-
glLinkProgram(program)
|
67
|
-
err_msg = glGetProgramInfoLog(program)
|
68
|
-
unless glIsProgramLinked?(program)
|
69
|
-
raise RuntimeError, "program:\n#{err_msg}"
|
70
|
-
else
|
71
|
-
$stderr.puts "program:\n#{err_msg}"
|
72
|
-
end
|
73
|
-
glDeleteShader(vertex_shader)
|
74
|
-
glDeleteShader(fragment_shader)
|
75
|
-
program
|
76
|
-
end
|
77
|
-
|
78
|
-
glutMainLoop()
|
79
|
-
end
|
80
|
-
|
81
|
-
def draw
|
82
|
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
83
|
-
|
84
|
-
glUseProgram(@program)
|
85
|
-
glBindVertexArray(@dummy)
|
86
|
-
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
|
87
|
-
|
88
|
-
glutSwapBuffers()
|
89
|
-
end
|
90
|
-
|
91
|
-
VS_CODE =<<-GLSL
|
92
|
-
#version 150 core
|
93
|
-
out vec2 vs_TexCoord;
|
94
|
-
|
95
|
-
const vec2 data[4] = vec2[](
|
96
|
-
vec2(-1.0, 1.0), vec2(-1.0,-1.0), vec2( 1.0, 1.0), vec2( 1.0,-1.0)
|
97
|
-
);
|
98
|
-
|
99
|
-
void main()
|
100
|
-
{
|
101
|
-
vec3 pos = vec3(data[gl_VertexID], 0.0);
|
102
|
-
gl_Position = vec4(pos * 0.5, 1.0);
|
103
|
-
vs_TexCoord = pos.xy * 0.5 + 0.5;
|
104
|
-
}
|
105
|
-
GLSL
|
106
|
-
|
107
|
-
FS_CODE =<<-GLSL
|
108
|
-
#version 150 core
|
109
|
-
in vec2 vs_TexCoord;
|
110
|
-
out vec4 fs_FragColor;
|
111
|
-
void main()
|
112
|
-
{
|
113
|
-
fs_FragColor = vec4(vs_TexCoord, 0.0, 1.0);
|
114
|
-
}
|
115
|
-
GLSL
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
TestApp.new.start
|
data/examples/ogl-3_2-basic.rb
DELETED
@@ -1,136 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler/setup'
|
3
|
-
require 'opengl'
|
4
|
-
require 'glut'
|
5
|
-
|
6
|
-
class TestApp
|
7
|
-
include GLUT
|
8
|
-
include OpenGL::Constants
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
glutInit()
|
12
|
-
caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
|
13
|
-
if FFI::Platform.mac?
|
14
|
-
caps |= GLUT_3_2_CORE_PROFILE
|
15
|
-
else
|
16
|
-
glutInitContextVersion(3, 2)
|
17
|
-
glutInitContextProfile(:core)
|
18
|
-
end
|
19
|
-
glutInitDisplayMode(caps)
|
20
|
-
glutInitWindowPosition(300, 200)
|
21
|
-
glutInitWindowSize(512, 512)
|
22
|
-
glutCreateWindow('test')
|
23
|
-
|
24
|
-
# prevent callback proc from being garbage-collected
|
25
|
-
glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
|
26
|
-
end
|
27
|
-
|
28
|
-
def start
|
29
|
-
self.extend OpenGL::GL.entrypoints
|
30
|
-
puts glGetString(GL_VERSION)
|
31
|
-
puts glGetBooleanv(GL_DEPTH_TEST, 1).inspect
|
32
|
-
puts glGetDoublev(GL_COLOR_CLEAR_VALUE, 4).inspect
|
33
|
-
puts glGetFloatv(GL_LINE_WIDTH, 1).inspect
|
34
|
-
puts glGetIntegerv(GL_VIEWPORT, 4).inspect
|
35
|
-
puts glGetVersion().inspect
|
36
|
-
puts glGetShadingLanguageVersion().inspect
|
37
|
-
puts glGetAvailableExtensions().inspect
|
38
|
-
|
39
|
-
@quad = begin
|
40
|
-
buffer = glGenBuffers(1)[0]
|
41
|
-
glBindBuffer(GL_ARRAY_BUFFER, buffer)
|
42
|
-
glBufferData(GL_ARRAY_BUFFER, 3 * 4 * 4, nil, GL_STATIC_DRAW)
|
43
|
-
glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
|
44
|
-
ptr.put_array_of_GLfloat( 0, [-0.5, 0.5, 0.0])
|
45
|
-
ptr.put_array_of_GLfloat(12, [-0.5,-0.5, 0.0])
|
46
|
-
ptr.put_array_of_GLfloat(24, [ 0.5, 0.5, 0.0])
|
47
|
-
ptr.put_array_of_GLfloat(36, [ 0.5,-0.5, 0.0])
|
48
|
-
end
|
49
|
-
|
50
|
-
array = glGenVertexArrays(1)[0]
|
51
|
-
glBindVertexArray(array)
|
52
|
-
glBindBuffer(GL_ARRAY_BUFFER, buffer)
|
53
|
-
glEnableVertexAttribArray(0)
|
54
|
-
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil)
|
55
|
-
|
56
|
-
glBindVertexArray(0)
|
57
|
-
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
58
|
-
|
59
|
-
array
|
60
|
-
end
|
61
|
-
|
62
|
-
@program = begin
|
63
|
-
vertex_shader = glCreateShader(:vertex)
|
64
|
-
glShaderSource(vertex_shader, VS_CODE)
|
65
|
-
glCompileShader(vertex_shader)
|
66
|
-
err_msg = glGetShaderInfoLog(vertex_shader)
|
67
|
-
unless glIsShaderCompiled?(vertex_shader)
|
68
|
-
raise RuntimeError, "vertex_shader:\n#{err_msg}"
|
69
|
-
else
|
70
|
-
$stderr.puts "vertex_shader:\n#{err_msg}"
|
71
|
-
end
|
72
|
-
|
73
|
-
fragment_shader = glCreateShader(:fragment)
|
74
|
-
glShaderSource(fragment_shader, FS_CODE)
|
75
|
-
glCompileShader(fragment_shader)
|
76
|
-
err_msg = glGetShaderInfoLog(fragment_shader)
|
77
|
-
unless glIsShaderCompiled?(fragment_shader)
|
78
|
-
raise RuntimeError, "fragment_shader:\n#{err_msg}"
|
79
|
-
else
|
80
|
-
$stderr.puts "fragment_shader:\n#{err_msg}"
|
81
|
-
end
|
82
|
-
|
83
|
-
program = glCreateProgram()
|
84
|
-
glAttachShader(program, vertex_shader)
|
85
|
-
glAttachShader(program, fragment_shader)
|
86
|
-
glBindAttribLocation(program, 0, "in_Position")
|
87
|
-
glBindFragDataLocation(program, 0, "fs_FragColor")
|
88
|
-
glLinkProgram(program)
|
89
|
-
err_msg = glGetProgramInfoLog(program)
|
90
|
-
unless glIsProgramLinked?(program)
|
91
|
-
raise RuntimeError, "program:\n#{err_msg}"
|
92
|
-
else
|
93
|
-
$stderr.puts "program:\n#{err_msg}"
|
94
|
-
end
|
95
|
-
glDeleteShader(vertex_shader)
|
96
|
-
glDeleteShader(fragment_shader)
|
97
|
-
program
|
98
|
-
end
|
99
|
-
|
100
|
-
glutMainLoop()
|
101
|
-
end
|
102
|
-
|
103
|
-
def draw
|
104
|
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
105
|
-
|
106
|
-
glUseProgram(@program)
|
107
|
-
glBindVertexArray(@quad)
|
108
|
-
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
|
109
|
-
|
110
|
-
glutSwapBuffers()
|
111
|
-
end
|
112
|
-
|
113
|
-
VS_CODE =<<-GLSL
|
114
|
-
#version 150 core
|
115
|
-
in vec4 in_Position;
|
116
|
-
out vec2 vs_TexCoord;
|
117
|
-
void main()
|
118
|
-
{
|
119
|
-
gl_Position = in_Position;
|
120
|
-
vs_TexCoord = in_Position.xy + 0.5;
|
121
|
-
}
|
122
|
-
GLSL
|
123
|
-
|
124
|
-
FS_CODE =<<-GLSL
|
125
|
-
#version 150 core
|
126
|
-
in vec2 vs_TexCoord;
|
127
|
-
out vec4 fs_FragColor;
|
128
|
-
void main()
|
129
|
-
{
|
130
|
-
fs_FragColor = vec4(vs_TexCoord, 0.0, 1.0);
|
131
|
-
}
|
132
|
-
GLSL
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
TestApp.new.start
|
data/examples/ogl-3_2-cube.rb
DELETED
@@ -1,204 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler/setup'
|
3
|
-
require 'opengl'
|
4
|
-
require 'glut'
|
5
|
-
require_relative 'math3d'
|
6
|
-
|
7
|
-
class TestApp
|
8
|
-
include GLUT
|
9
|
-
include OpenGL::Constants
|
10
|
-
|
11
|
-
def initialize
|
12
|
-
glutInit()
|
13
|
-
caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
|
14
|
-
if FFI::Platform.mac?
|
15
|
-
caps |= GLUT_3_2_CORE_PROFILE
|
16
|
-
else
|
17
|
-
glutInitContextVersion(3, 2)
|
18
|
-
glutInitContextProfile(:core)
|
19
|
-
end
|
20
|
-
glutInitDisplayMode(caps)
|
21
|
-
glutInitWindowPosition(300, 200)
|
22
|
-
glutInitWindowSize(512, 512)
|
23
|
-
glutCreateWindow('cube')
|
24
|
-
|
25
|
-
glutDisplayFunc(@draw_method ||= method(:draw))
|
26
|
-
glutReshapeFunc(@resize_method ||= method(:resize))
|
27
|
-
glutMouseFunc(@mouse_press_method ||= method(:mouse_press))
|
28
|
-
glutMotionFunc(@mouse_track_method ||= method(:mouse_track))
|
29
|
-
end
|
30
|
-
|
31
|
-
def start
|
32
|
-
self.extend OpenGL::GL.entrypoints
|
33
|
-
puts glGetString(GL_VERSION)
|
34
|
-
|
35
|
-
@cube = begin
|
36
|
-
vertex_buffer, index_buffer = glGenBuffers(2)
|
37
|
-
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
|
38
|
-
glBufferData(GL_ARRAY_BUFFER, 3 * 4 * 8, nil, GL_STATIC_DRAW)
|
39
|
-
glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
|
40
|
-
ptr.put_array_of_GLfloat( 0, [-1.0, 1.0, 1.0]) # 0
|
41
|
-
ptr.put_array_of_GLfloat(12, [-1.0,-1.0, 1.0]) # 1
|
42
|
-
ptr.put_array_of_GLfloat(24, [ 1.0, 1.0, 1.0]) # 2
|
43
|
-
ptr.put_array_of_GLfloat(36, [ 1.0,-1.0, 1.0]) # 3
|
44
|
-
ptr.put_array_of_GLfloat(48, [ 1.0, 1.0,-1.0]) # 4
|
45
|
-
ptr.put_array_of_GLfloat(60, [ 1.0,-1.0,-1.0]) # 5
|
46
|
-
ptr.put_array_of_GLfloat(72, [-1.0, 1.0,-1.0]) # 6
|
47
|
-
ptr.put_array_of_GLfloat(84, [-1.0,-1.0,-1.0]) # 7
|
48
|
-
end
|
49
|
-
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer)
|
50
|
-
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 2 * 4 * 6, nil, GL_STATIC_DRAW)
|
51
|
-
glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
|
52
|
-
ptr.write_array_of_GLushort [0,1,2,3,4,5,6,7,0,1,0xffff]
|
53
|
-
ptr.put_array_of_GLushort(22, [6,0,4,2,0xffff,1,7,3,5])
|
54
|
-
#ptr.put_array_of_GLushort( 0, [0, 1, 2, 3]) # front
|
55
|
-
#ptr.put_array_of_GLushort( 8, [2, 3, 4, 5]) # right
|
56
|
-
#ptr.put_array_of_GLushort(16, [4, 5, 6, 7]) # back
|
57
|
-
#ptr.put_array_of_GLushort(24, [6, 7, 0, 1]) # left
|
58
|
-
#ptr.put_array_of_GLushort(32, [6, 0, 4, 2]) # top
|
59
|
-
#ptr.put_array_of_GLushort(40, [1, 7, 3, 5]) # bottom
|
60
|
-
end
|
61
|
-
|
62
|
-
array = glGenVertexArrays(1)[0]
|
63
|
-
glBindVertexArray(array)
|
64
|
-
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
|
65
|
-
glEnableVertexAttribArray(0)
|
66
|
-
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil)
|
67
|
-
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer)
|
68
|
-
|
69
|
-
glBindVertexArray(0)
|
70
|
-
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
71
|
-
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
|
72
|
-
|
73
|
-
array
|
74
|
-
end
|
75
|
-
|
76
|
-
@program = begin
|
77
|
-
vertex_shader = glCreateShader(:vertex)
|
78
|
-
glShaderSource(vertex_shader, VS_CODE)
|
79
|
-
glCompileShader(vertex_shader)
|
80
|
-
unless glIsShaderCompiled?(vertex_shader)
|
81
|
-
msg = glGetShaderInfoLog(vertex_shader)
|
82
|
-
raise RuntimeError, "vertex_shader:\n#{msg}"
|
83
|
-
end
|
84
|
-
|
85
|
-
fragment_shader = glCreateShader(:fragment)
|
86
|
-
glShaderSource(fragment_shader, FS_CODE)
|
87
|
-
glCompileShader(fragment_shader)
|
88
|
-
unless glIsShaderCompiled?(fragment_shader)
|
89
|
-
msg = glGetShaderInfoLog(fragment_shader)
|
90
|
-
raise RuntimeError, "fragment_shader:\n#{msg}"
|
91
|
-
end
|
92
|
-
|
93
|
-
program = glCreateProgram()
|
94
|
-
glAttachShader(program, vertex_shader)
|
95
|
-
glAttachShader(program, fragment_shader)
|
96
|
-
glBindAttribLocation(program, 0, "in_Position")
|
97
|
-
glBindFragDataLocation(program, 0, "fs_FragColor")
|
98
|
-
glLinkProgram(program)
|
99
|
-
unless glIsProgramLinked?(program)
|
100
|
-
msg = glGetProgramInfoLog(program)
|
101
|
-
raise RuntimeError, "program:\n#{msg}"
|
102
|
-
end
|
103
|
-
glDeleteShader(vertex_shader)
|
104
|
-
glDeleteShader(fragment_shader)
|
105
|
-
program
|
106
|
-
end
|
107
|
-
|
108
|
-
@view = Matrix.translate(0, 0, -5)
|
109
|
-
@world = Matrix.identity(4)
|
110
|
-
|
111
|
-
glutMainLoop()
|
112
|
-
end
|
113
|
-
|
114
|
-
def draw
|
115
|
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
116
|
-
|
117
|
-
glEnable(GL_CULL_FACE)
|
118
|
-
#glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
|
119
|
-
glEnable(GL_DEPTH_TEST)
|
120
|
-
|
121
|
-
glUseProgram(@program)
|
122
|
-
|
123
|
-
if (loc = glGetUniformLocation(@program, "u_Projection")) != -1
|
124
|
-
#glUniformMatrix4fv(loc, [ @projection ], true)
|
125
|
-
OpenGL::Type.GLfloat(16) do |ptr|
|
126
|
-
ptr.write_array_of_GLfloat(@projection.to_a.flatten)
|
127
|
-
glUniformMatrix4fv(loc, 1, GL_TRUE, ptr)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
if (loc = glGetUniformLocation(@program, "u_ModelView")) != -1
|
132
|
-
OpenGL::Type.GLfloat(16) do |ptr|
|
133
|
-
modelview = @view * @world
|
134
|
-
ptr.write_array_of_GLfloat(modelview.to_a.flatten)
|
135
|
-
glUniformMatrix4fv(loc, 1, GL_TRUE, ptr)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
glBindVertexArray(@cube)
|
140
|
-
glEnable(GL_PRIMITIVE_RESTART)
|
141
|
-
glPrimitiveRestartIndex(0xffff)
|
142
|
-
glDrawElements(GL_TRIANGLE_STRIP, 20, GL_UNSIGNED_SHORT, nil)
|
143
|
-
|
144
|
-
glutSwapBuffers()
|
145
|
-
end
|
146
|
-
|
147
|
-
def resize(width, height)
|
148
|
-
glViewport(0, 0, width, height)
|
149
|
-
|
150
|
-
fovy = 45.0 / 180.0 * Math::PI
|
151
|
-
aspect = Float(width) / Float(height)
|
152
|
-
z_near, z_far = 1.0, 100.0
|
153
|
-
@projection = Matrix.perspective(fovy, aspect, z_near, z_far)
|
154
|
-
end
|
155
|
-
|
156
|
-
def mouse_press(button, button_state, x, y)
|
157
|
-
if button == :LEFT
|
158
|
-
case button_state
|
159
|
-
when :DOWN
|
160
|
-
@mouse_tracking_pos = [x, y]
|
161
|
-
when :UP
|
162
|
-
remove_instance_variable(:@mouse_tracking_pos)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def mouse_track(x, y)
|
168
|
-
if defined? @mouse_tracking_pos
|
169
|
-
delta_x = (x - @mouse_tracking_pos[0]) * 0.01
|
170
|
-
delta_y = (y - @mouse_tracking_pos[1]) * 0.01
|
171
|
-
|
172
|
-
@world = Matrix.rotate_x(delta_y) * Matrix.rotate_y(delta_x) * @world
|
173
|
-
|
174
|
-
@mouse_tracking_pos = [x, y]
|
175
|
-
glutPostRedisplay()
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
VS_CODE =<<-GLSL
|
180
|
-
#version 150 core
|
181
|
-
uniform mat4 u_Projection;
|
182
|
-
uniform mat4 u_ModelView;
|
183
|
-
in vec4 in_Position;
|
184
|
-
out vec3 vs_Vertex;
|
185
|
-
void main()
|
186
|
-
{
|
187
|
-
gl_Position = u_Projection * u_ModelView * in_Position;
|
188
|
-
vs_Vertex = in_Position.xyz;
|
189
|
-
}
|
190
|
-
GLSL
|
191
|
-
|
192
|
-
FS_CODE =<<-GLSL
|
193
|
-
#version 150 core
|
194
|
-
in vec3 vs_Vertex;
|
195
|
-
out vec4 fs_FragColor;
|
196
|
-
void main()
|
197
|
-
{
|
198
|
-
fs_FragColor = vec4(vs_Vertex * 0.5 + 0.5, 1.0);
|
199
|
-
}
|
200
|
-
GLSL
|
201
|
-
|
202
|
-
end
|
203
|
-
|
204
|
-
TestApp.new.start
|