ruby2d 0.9.0 → 0.9.5
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/assets/README.md +8 -8
- data/assets/Rakefile +85 -0
- data/assets/include/SDL2/SDL.h +1 -1
- data/assets/include/SDL2/SDL_assert.h +1 -1
- data/assets/include/SDL2/SDL_atomic.h +20 -2
- data/assets/include/SDL2/SDL_audio.h +47 -14
- data/assets/include/SDL2/SDL_bits.h +10 -1
- data/assets/include/SDL2/SDL_blendmode.h +7 -7
- data/assets/include/SDL2/SDL_clipboard.h +1 -1
- data/assets/include/SDL2/SDL_config.h +24 -390
- data/assets/include/SDL2/SDL_config_android.h +178 -0
- data/assets/include/SDL2/SDL_config_iphoneos.h +201 -0
- data/assets/include/SDL2/SDL_config_macosx.h +240 -0
- data/assets/include/SDL2/SDL_config_minimal.h +85 -0
- data/assets/include/SDL2/SDL_config_os2.h +170 -0
- data/assets/include/SDL2/SDL_config_pandora.h +133 -0
- data/assets/include/SDL2/SDL_config_psp.h +164 -0
- data/assets/include/SDL2/SDL_config_windows.h +257 -0
- data/assets/include/SDL2/SDL_config_winrt.h +240 -0
- data/assets/include/SDL2/SDL_config_wiz.h +146 -0
- data/assets/include/SDL2/SDL_copying.h +20 -0
- data/assets/include/SDL2/SDL_cpuinfo.h +90 -8
- data/assets/include/SDL2/SDL_egl.h +1 -1
- data/assets/include/SDL2/SDL_endian.h +1 -1
- data/assets/include/SDL2/SDL_error.h +1 -1
- data/assets/include/SDL2/SDL_events.h +4 -1
- data/assets/include/SDL2/SDL_filesystem.h +1 -1
- data/assets/include/SDL2/SDL_gamecontroller.h +1 -1
- data/assets/include/SDL2/SDL_gesture.h +1 -1
- data/assets/include/SDL2/SDL_haptic.h +1 -1
- data/assets/include/SDL2/SDL_hints.h +145 -14
- data/assets/include/SDL2/SDL_image.h +2 -2
- data/assets/include/SDL2/SDL_joystick.h +1 -1
- data/assets/include/SDL2/SDL_keyboard.h +1 -1
- data/assets/include/SDL2/SDL_keycode.h +1 -1
- data/assets/include/SDL2/SDL_loadso.h +1 -1
- data/assets/include/SDL2/SDL_log.h +1 -1
- data/assets/include/SDL2/SDL_main.h +28 -16
- data/assets/include/SDL2/SDL_messagebox.h +1 -1
- data/assets/include/SDL2/SDL_mouse.h +1 -1
- data/assets/include/SDL2/SDL_mutex.h +1 -1
- data/assets/include/SDL2/SDL_name.h +1 -1
- data/assets/include/SDL2/SDL_opengl.h +1 -1
- data/assets/include/SDL2/SDL_opengles.h +1 -1
- data/assets/include/SDL2/SDL_opengles2.h +1 -1
- data/assets/include/SDL2/SDL_pixels.h +3 -3
- data/assets/include/SDL2/SDL_platform.h +1 -1
- data/assets/include/SDL2/SDL_power.h +1 -1
- data/assets/include/SDL2/SDL_quit.h +1 -1
- data/assets/include/SDL2/SDL_rect.h +29 -3
- data/assets/include/SDL2/SDL_render.h +168 -1
- data/assets/include/SDL2/SDL_revision.h +2 -2
- data/assets/include/SDL2/SDL_rwops.h +50 -13
- data/assets/include/SDL2/SDL_scancode.h +2 -2
- data/assets/include/SDL2/SDL_sensor.h +4 -4
- data/assets/include/SDL2/SDL_shape.h +1 -1
- data/assets/include/SDL2/SDL_stdinc.h +1 -1
- data/assets/include/SDL2/SDL_surface.h +2 -1
- data/assets/include/SDL2/SDL_system.h +1 -1
- data/assets/include/SDL2/SDL_syswm.h +11 -8
- data/assets/include/SDL2/SDL_test.h +1 -1
- data/assets/include/SDL2/SDL_test_assert.h +1 -1
- data/assets/include/SDL2/SDL_test_common.h +22 -5
- data/assets/include/SDL2/SDL_test_compare.h +1 -1
- data/assets/include/SDL2/SDL_test_crc32.h +1 -1
- data/assets/include/SDL2/SDL_test_font.h +1 -1
- data/assets/include/SDL2/SDL_test_fuzzer.h +1 -1
- data/assets/include/SDL2/SDL_test_harness.h +1 -1
- data/assets/include/SDL2/SDL_test_images.h +1 -1
- data/assets/include/SDL2/SDL_test_log.h +1 -1
- data/assets/include/SDL2/SDL_test_md5.h +1 -1
- data/assets/include/SDL2/SDL_test_memory.h +3 -3
- data/assets/include/SDL2/SDL_test_random.h +1 -1
- data/assets/include/SDL2/SDL_thread.h +1 -1
- data/assets/include/SDL2/SDL_timer.h +1 -1
- data/assets/include/SDL2/SDL_touch.h +17 -1
- data/assets/include/SDL2/SDL_types.h +1 -1
- data/assets/include/SDL2/SDL_version.h +2 -2
- data/assets/include/SDL2/SDL_video.h +1 -1
- data/assets/include/SDL2/SDL_vulkan.h +3 -3
- data/assets/include/SDL2/begin_code.h +4 -1
- data/assets/include/SDL2/close_code.h +4 -1
- data/assets/macos/lib/libFLAC.a +0 -0
- data/assets/macos/lib/libSDL2.a +0 -0
- data/assets/macos/lib/libSDL2_image.a +0 -0
- data/assets/macos/lib/libSDL2_mixer.a +0 -0
- data/assets/macos/lib/libSDL2_ttf.a +0 -0
- data/assets/macos/lib/libfreetype.a +0 -0
- data/assets/macos/lib/libjpeg.a +0 -0
- data/assets/macos/lib/libmpg123.a +0 -0
- data/assets/macos/lib/libogg.a +0 -0
- data/assets/macos/lib/libpng16.a +0 -0
- data/assets/macos/lib/libtiff.a +0 -0
- data/assets/macos/lib/libwebp.a +0 -0
- data/assets/mingw/bin/SDL2.dll +0 -0
- data/assets/mingw/bin/SDL2_image.dll +0 -0
- data/assets/mingw/bin/libpng16-16.dll +0 -0
- data/assets/mingw/bin/libtiff-5.dll +0 -0
- data/assets/mingw/bin/libwebp-7.dll +0 -0
- data/assets/mingw/lib/libSDL2.a +0 -0
- data/assets/mingw/lib/libSDL2.dll.a +0 -0
- data/assets/mingw/lib/libSDL2_image.a +0 -0
- data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
- data/assets/mingw/lib/libSDL2_test.a +0 -0
- data/assets/mingw/lib/libSDL2main.a +0 -0
- data/bin/ruby2d +2 -1
- data/ext/ruby2d/common.c +185 -0
- data/ext/ruby2d/controllers.c +110 -0
- data/ext/ruby2d/extconf.rb +97 -46
- data/ext/ruby2d/gl.c +430 -0
- data/ext/ruby2d/gl2.c +146 -0
- data/ext/ruby2d/gl3.c +348 -0
- data/ext/ruby2d/gles.c +308 -0
- data/ext/ruby2d/image.c +138 -0
- data/ext/ruby2d/input.c +48 -0
- data/ext/ruby2d/music.c +114 -0
- data/ext/ruby2d/ruby2d.c +125 -126
- data/{assets/include/simple2d.h → ext/ruby2d/ruby2d.h} +223 -201
- data/ext/ruby2d/shapes.c +154 -0
- data/ext/ruby2d/sound.c +93 -0
- data/ext/ruby2d/sprite.c +147 -0
- data/ext/ruby2d/text.c +129 -0
- data/ext/ruby2d/window.c +414 -0
- data/lib/ruby2d.rb +1 -1
- data/lib/ruby2d/cli/build.rb +3 -8
- data/lib/ruby2d/cli/colorize.rb +10 -0
- data/lib/ruby2d/version.rb +1 -1
- metadata +34 -10
- data/assets/macos/lib/libsimple2d.a +0 -0
- data/assets/mingw/lib/libsimple2d.a +0 -0
- data/lib/ruby2d/colorize.rb +0 -10
data/ext/ruby2d/extconf.rb
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
require 'mkmf'
|
|
2
|
-
require_relative '../../lib/ruby2d/colorize'
|
|
2
|
+
require_relative '../../lib/ruby2d/cli/colorize'
|
|
3
|
+
|
|
4
|
+
$errors = [] # Holds errors
|
|
5
|
+
|
|
6
|
+
# Set the OS platform
|
|
7
|
+
case RUBY_PLATFORM
|
|
8
|
+
when /darwin/
|
|
9
|
+
$platform = :macos
|
|
10
|
+
when /linux/
|
|
11
|
+
$platform = :linux
|
|
12
|
+
if `cat /etc/os-release` =~ /raspbian/
|
|
13
|
+
$platform = :linux_rpi
|
|
14
|
+
end
|
|
15
|
+
when /mingw/
|
|
16
|
+
$platform = :windows
|
|
17
|
+
else
|
|
18
|
+
$platform = nil
|
|
19
|
+
end
|
|
20
|
+
|
|
3
21
|
|
|
4
|
-
|
|
5
|
-
$errors = [] # Array to capture errors
|
|
22
|
+
# Helper functions #############################################################
|
|
6
23
|
|
|
7
24
|
# Print installation errors
|
|
8
25
|
def print_errors
|
|
@@ -12,42 +29,71 @@ def print_errors
|
|
|
12
29
|
#{"======================================================================"}"
|
|
13
30
|
end
|
|
14
31
|
|
|
15
|
-
# Check that Simple 2D is installed and meets minimum version requirements
|
|
16
|
-
def check_s2d
|
|
17
32
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
33
|
+
# Add compiler and linker flags
|
|
34
|
+
def add_flags(type, flags)
|
|
35
|
+
case type
|
|
36
|
+
when :c
|
|
37
|
+
$CFLAGS << " #{flags} "
|
|
38
|
+
when :ld
|
|
39
|
+
$LDFLAGS << " #{flags} "
|
|
40
|
+
end
|
|
41
|
+
end
|
|
24
42
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
43
|
+
|
|
44
|
+
# Check SDL libraries on Linux
|
|
45
|
+
def check_sdl_linux
|
|
46
|
+
unless have_library('SDL2') && have_library('SDL2_image') && have_library('SDL2_mixer') && have_library('SDL2_ttf')
|
|
47
|
+
|
|
48
|
+
$errors << "Couldn't find packages needed by Ruby 2D."
|
|
49
|
+
|
|
50
|
+
# Fedora and CentOS
|
|
51
|
+
if system('which yum')
|
|
52
|
+
$errors << "Install the following packages using `yum` (or `dnf`) and try again:\n" <<
|
|
53
|
+
" SDL2-devel SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel".bold
|
|
54
|
+
|
|
55
|
+
# Arch
|
|
56
|
+
elsif system('which pacman')
|
|
57
|
+
$errors << "Install the following packages using `pacman` and try again:\n" <<
|
|
58
|
+
" sdl2 sdl2_image sdl2_mixer sdl2_ttf".bold
|
|
59
|
+
|
|
60
|
+
# openSUSE
|
|
61
|
+
elsif system('which zypper')
|
|
62
|
+
$errors << "Install the following packages using `zypper` and try again:\n" <<
|
|
63
|
+
" libSDL2-devel libSDL2_image-devel libSDL2_mixer-devel libSDL2_ttf-devel".bold
|
|
64
|
+
|
|
65
|
+
# Ubuntu, Debian, and Mint
|
|
66
|
+
# `apt` must be last because openSUSE has it aliased to `zypper`
|
|
67
|
+
elsif system('which apt')
|
|
68
|
+
$errors << "Install the following packages using `apt` and try again:\n" <<
|
|
69
|
+
" libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev".bold
|
|
33
70
|
end
|
|
71
|
+
|
|
72
|
+
$errors << "" << "See #{"ruby2d.com".bold} for additional help."
|
|
73
|
+
print_errors; exit
|
|
34
74
|
end
|
|
35
75
|
end
|
|
36
76
|
|
|
37
|
-
# Use the Simple 2D, SDL, and other libraries installed by the user (not those bundled with the gem)
|
|
38
|
-
def use_usr_libs
|
|
39
|
-
check_s2d
|
|
40
77
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if
|
|
44
|
-
|
|
78
|
+
# Set Raspberry Pi flags
|
|
79
|
+
def set_rpi_flags
|
|
80
|
+
if $platform == :linux_rpi
|
|
81
|
+
add_flags(:c, '-I/opt/vc/include')
|
|
82
|
+
add_flags(:ld, '-L/opt/vc/lib -lbrcmGLESv2')
|
|
45
83
|
end
|
|
46
|
-
$LDFLAGS << ' ' << `bash simple2d --libs`
|
|
47
|
-
$LDFLAGS.gsub!(/\n/, ' ') # remove newlines in flags, they cause problems
|
|
48
84
|
end
|
|
49
85
|
|
|
50
86
|
|
|
87
|
+
# Use SDL and other libraries installed by the user (not those bundled with the gem)
|
|
88
|
+
def use_usr_libs
|
|
89
|
+
# Add flags
|
|
90
|
+
set_rpi_flags
|
|
91
|
+
add_flags(:c, '-I/usr/local/include')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# Configure native extension ###################################################
|
|
96
|
+
|
|
51
97
|
# Build Ruby 2D native extention using libraries installed by user
|
|
52
98
|
# To use install flag: `gem install ruby2d -- libs`
|
|
53
99
|
if ARGV.include? 'libs'
|
|
@@ -55,27 +101,31 @@ if ARGV.include? 'libs'
|
|
|
55
101
|
|
|
56
102
|
# Use libraries provided by the gem (default)
|
|
57
103
|
else
|
|
58
|
-
|
|
59
|
-
case RUBY_PLATFORM
|
|
104
|
+
add_flags(:c, '-std=c11')
|
|
60
105
|
|
|
61
|
-
|
|
62
|
-
when /darwin/
|
|
63
|
-
# $LDFLAGS << " -L../../assets/macos/lib -lsimple2d -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -ljpeg -lpng16 -ltiff -lwebp -lmpg123 -logg -lflac -lvorbis -lvorbisfile -lfreetype -Wl,-framework,Cocoa -Wl,-framework,ForceFeedback"
|
|
106
|
+
case $platform
|
|
64
107
|
|
|
108
|
+
when :macos
|
|
109
|
+
add_flags(:c, '-I../../assets/include')
|
|
65
110
|
ldir = "#{Dir.pwd}/../../assets/macos/lib"
|
|
66
|
-
$LDFLAGS << " #{ldir}/libsimple2d.a #{ldir}/libSDL2.a #{ldir}/libSDL2_image.a #{ldir}/libSDL2_mixer.a #{ldir}/libSDL2_ttf.a \
|
|
67
|
-
#{ldir}/libjpeg.a #{ldir}/libpng16.a #{ldir}/libtiff.a #{ldir}/libwebp.a \
|
|
68
|
-
#{ldir}/libmpg123.a #{ldir}/libogg.a #{ldir}/libflac.a #{ldir}/libvorbis.a #{ldir}/libvorbisfile.a \
|
|
69
|
-
#{ldir}/libfreetype.a -Wl,-framework,Cocoa -Wl,-framework,ForceFeedback"
|
|
70
|
-
|
|
71
|
-
# Linux
|
|
72
|
-
when /linux/
|
|
73
|
-
# TODO: Implement static compilation for Linux
|
|
74
|
-
use_usr_libs
|
|
75
111
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
112
|
+
add_flags(:ld, "#{ldir}/libSDL2.a #{ldir}/libSDL2_image.a #{ldir}/libSDL2_mixer.a #{ldir}/libSDL2_ttf.a")
|
|
113
|
+
add_flags(:ld, "#{ldir}/libjpeg.a #{ldir}/libpng16.a #{ldir}/libtiff.a #{ldir}/libwebp.a")
|
|
114
|
+
add_flags(:ld, "#{ldir}/libmpg123.a #{ldir}/libogg.a #{ldir}/libFLAC.a #{ldir}/libvorbis.a #{ldir}/libvorbisfile.a")
|
|
115
|
+
add_flags(:ld, "#{ldir}/libfreetype.a")
|
|
116
|
+
add_flags(:ld, "-Wl,-framework,Cocoa -Wl,-framework,ForceFeedback")
|
|
117
|
+
|
|
118
|
+
when :linux, :linux_rpi
|
|
119
|
+
check_sdl_linux
|
|
120
|
+
|
|
121
|
+
set_rpi_flags
|
|
122
|
+
add_flags(:ld, "-lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -lm")
|
|
123
|
+
if $platform == :linux then add_flags(:ld, '-lGL') end
|
|
124
|
+
|
|
125
|
+
when :windows
|
|
126
|
+
add_flags(:c, '-I../../assets/include')
|
|
127
|
+
add_flags(:ld, '-L../../assets/mingw/lib -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf')
|
|
128
|
+
add_flags(:ld, '-lmingw32 -lopengl32 -lglew32')
|
|
79
129
|
|
|
80
130
|
# If can't detect the platform, use libraries installed by the user
|
|
81
131
|
else
|
|
@@ -83,6 +133,7 @@ else
|
|
|
83
133
|
end
|
|
84
134
|
end
|
|
85
135
|
|
|
136
|
+
$LDFLAGS.gsub!(/\n/, ' ') # remove newlines in flags, they can cause problems
|
|
86
137
|
|
|
87
|
-
# Create
|
|
138
|
+
# Create Makefile
|
|
88
139
|
create_makefile('ruby2d/ruby2d')
|
data/ext/ruby2d/gl.c
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
// Ruby 2D OpenGL Functions
|
|
2
|
+
|
|
3
|
+
#include "ruby2d.h"
|
|
4
|
+
|
|
5
|
+
// Set to `true` to force OpenGL 2.1 (for testing)
|
|
6
|
+
static bool FORCE_GL2 = false;
|
|
7
|
+
|
|
8
|
+
// Flag set if using OpenGL 2.1
|
|
9
|
+
static bool R2D_GL2 = false;
|
|
10
|
+
|
|
11
|
+
// The orthographic projection matrix for 2D rendering.
|
|
12
|
+
// Elements 0 and 5 are set in R2D_GL_SetViewport.
|
|
13
|
+
static GLfloat orthoMatrix[16] =
|
|
14
|
+
{ 0, 0, 0, 0,
|
|
15
|
+
0, 0, 0, 0,
|
|
16
|
+
0, 0, 0, 0,
|
|
17
|
+
-1.0f, 1.0f, -1.0f, 1.0f };
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* Prints current GL error
|
|
22
|
+
*/
|
|
23
|
+
void R2D_GL_PrintError(char *error) {
|
|
24
|
+
R2D_Log(R2D_ERROR, "%s (%d)", error, glGetError());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* Print info about the current OpenGL context
|
|
30
|
+
*/
|
|
31
|
+
void R2D_GL_PrintContextInfo(R2D_Window *window) {
|
|
32
|
+
R2D_Log(R2D_INFO,
|
|
33
|
+
"OpenGL Context\n"
|
|
34
|
+
" GL_VENDOR: %s\n"
|
|
35
|
+
" GL_RENDERER: %s\n"
|
|
36
|
+
" GL_VERSION: %s\n"
|
|
37
|
+
" GL_SHADING_LANGUAGE_VERSION: %s",
|
|
38
|
+
window->R2D_GL_VENDOR,
|
|
39
|
+
window->R2D_GL_RENDERER,
|
|
40
|
+
window->R2D_GL_VERSION,
|
|
41
|
+
window->R2D_GL_SHADING_LANGUAGE_VERSION
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* Store info about the current OpenGL context
|
|
48
|
+
*/
|
|
49
|
+
void R2D_GL_StoreContextInfo(R2D_Window *window) {
|
|
50
|
+
|
|
51
|
+
window->R2D_GL_VENDOR = glGetString(GL_VENDOR);
|
|
52
|
+
window->R2D_GL_RENDERER = glGetString(GL_RENDERER);
|
|
53
|
+
window->R2D_GL_VERSION = glGetString(GL_VERSION);
|
|
54
|
+
|
|
55
|
+
// These are not defined in GLES
|
|
56
|
+
#if GLES
|
|
57
|
+
window->R2D_GL_MAJOR_VERSION = 0;
|
|
58
|
+
window->R2D_GL_MINOR_VERSION = 0;
|
|
59
|
+
#else
|
|
60
|
+
glGetIntegerv(GL_MAJOR_VERSION, &window->R2D_GL_MAJOR_VERSION);
|
|
61
|
+
glGetIntegerv(GL_MINOR_VERSION, &window->R2D_GL_MINOR_VERSION);
|
|
62
|
+
#endif
|
|
63
|
+
|
|
64
|
+
window->R2D_GL_SHADING_LANGUAGE_VERSION = glGetString(GL_SHADING_LANGUAGE_VERSION);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* Creates a shader object, loads shader string, and compiles.
|
|
70
|
+
* Returns 0 if shader could not be compiled.
|
|
71
|
+
*/
|
|
72
|
+
GLuint R2D_GL_LoadShader(GLenum type, const GLchar *shaderSrc, char *shaderName) {
|
|
73
|
+
|
|
74
|
+
// Create the shader object
|
|
75
|
+
GLuint shader = glCreateShader(type);
|
|
76
|
+
|
|
77
|
+
if (shader == 0) {
|
|
78
|
+
R2D_GL_PrintError("Failed to create shader program");
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Load the shader source
|
|
83
|
+
glShaderSource(shader, 1, &shaderSrc, NULL);
|
|
84
|
+
|
|
85
|
+
// Compile the shader
|
|
86
|
+
glCompileShader(shader);
|
|
87
|
+
|
|
88
|
+
// Check the compile status
|
|
89
|
+
GLint compiled;
|
|
90
|
+
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
|
|
91
|
+
|
|
92
|
+
if (!compiled) {
|
|
93
|
+
GLint infoLen = 0;
|
|
94
|
+
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
|
|
95
|
+
|
|
96
|
+
if (infoLen > 1) {
|
|
97
|
+
char *infoLog = malloc(sizeof(char) * infoLen);
|
|
98
|
+
glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
|
|
99
|
+
printf("Error compiling shader \"%s\":\n%s\n", shaderName, infoLog);
|
|
100
|
+
free(infoLog);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
glDeleteShader(shader);
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return shader;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* Check if shader program was linked
|
|
113
|
+
*/
|
|
114
|
+
int R2D_GL_CheckLinked(GLuint program, char *name) {
|
|
115
|
+
|
|
116
|
+
GLint linked;
|
|
117
|
+
glGetProgramiv(program, GL_LINK_STATUS, &linked);
|
|
118
|
+
|
|
119
|
+
if (!linked) {
|
|
120
|
+
GLint infoLen = 0;
|
|
121
|
+
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
|
|
122
|
+
|
|
123
|
+
if (infoLen > 1) {
|
|
124
|
+
char *infoLog = malloc(sizeof(char) * infoLen);
|
|
125
|
+
glGetProgramInfoLog(program, infoLen, NULL, infoLog);
|
|
126
|
+
printf("Error linking program `%s`: %s\n", name, infoLog);
|
|
127
|
+
free(infoLog);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
glDeleteProgram(program);
|
|
131
|
+
return GL_FALSE;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return GL_TRUE;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
/*
|
|
139
|
+
* Calculate the viewport's scaled width and height
|
|
140
|
+
*/
|
|
141
|
+
void R2D_GL_GetViewportScale(R2D_Window *window, int *w, int *h, double *scale) {
|
|
142
|
+
|
|
143
|
+
double s = fmin(
|
|
144
|
+
window->width / (double)window->viewport.width,
|
|
145
|
+
window->height / (double)window->viewport.height
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
*w = window->viewport.width * s;
|
|
149
|
+
*h = window->viewport.height * s;
|
|
150
|
+
|
|
151
|
+
if (scale) *scale = s;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
/*
|
|
156
|
+
* Sets the viewport and matrix projection
|
|
157
|
+
*/
|
|
158
|
+
void R2D_GL_SetViewport(R2D_Window *window) {
|
|
159
|
+
|
|
160
|
+
int ortho_w = window->viewport.width;
|
|
161
|
+
int ortho_h = window->viewport.height;
|
|
162
|
+
int x, y, w, h; // calculated GL viewport values
|
|
163
|
+
|
|
164
|
+
x = 0; y = 0; w = window->width; h = window->height;
|
|
165
|
+
|
|
166
|
+
switch (window->viewport.mode) {
|
|
167
|
+
|
|
168
|
+
case R2D_FIXED:
|
|
169
|
+
w = window->orig_width;
|
|
170
|
+
h = window->orig_height;
|
|
171
|
+
y = window->height - h;
|
|
172
|
+
break;
|
|
173
|
+
|
|
174
|
+
case R2D_EXPAND:
|
|
175
|
+
ortho_w = w;
|
|
176
|
+
ortho_h = h;
|
|
177
|
+
break;
|
|
178
|
+
|
|
179
|
+
case R2D_SCALE:
|
|
180
|
+
R2D_GL_GetViewportScale(window, &w, &h, NULL);
|
|
181
|
+
// Center the viewport
|
|
182
|
+
x = window->width / 2.0 - w/2.0;
|
|
183
|
+
y = window->height / 2.0 - h/2.0;
|
|
184
|
+
break;
|
|
185
|
+
|
|
186
|
+
case R2D_STRETCH:
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
glViewport(x, y, w, h);
|
|
191
|
+
|
|
192
|
+
// Set orthographic projection matrix
|
|
193
|
+
orthoMatrix[0] = 2.0f / (GLfloat)ortho_w;
|
|
194
|
+
orthoMatrix[5] = -2.0f / (GLfloat)ortho_h;
|
|
195
|
+
|
|
196
|
+
#if GLES
|
|
197
|
+
R2D_GLES_ApplyProjection(orthoMatrix);
|
|
198
|
+
#else
|
|
199
|
+
if (R2D_GL2) {
|
|
200
|
+
R2D_GL2_ApplyProjection(ortho_w, ortho_h);
|
|
201
|
+
} else {
|
|
202
|
+
R2D_GL3_ApplyProjection(orthoMatrix);
|
|
203
|
+
}
|
|
204
|
+
#endif
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
/*
|
|
209
|
+
* Initialize OpenGL
|
|
210
|
+
*/
|
|
211
|
+
int R2D_GL_Init(R2D_Window *window) {
|
|
212
|
+
|
|
213
|
+
// Specify OpenGL contexts and set attributes
|
|
214
|
+
#if GLES
|
|
215
|
+
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
|
216
|
+
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
|
217
|
+
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
|
|
218
|
+
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
|
|
219
|
+
#else
|
|
220
|
+
// Use legacy OpenGL 2.1
|
|
221
|
+
if (FORCE_GL2) {
|
|
222
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
|
223
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
|
|
224
|
+
|
|
225
|
+
// Request an OpenGL 3.3 forward-compatible core profile
|
|
226
|
+
} else {
|
|
227
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
|
228
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
|
229
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
|
|
230
|
+
}
|
|
231
|
+
#endif
|
|
232
|
+
|
|
233
|
+
// Create and store the OpenGL context
|
|
234
|
+
if (FORCE_GL2) {
|
|
235
|
+
window->glcontext = NULL;
|
|
236
|
+
} else {
|
|
237
|
+
// Ask SDL to create an OpenGL context
|
|
238
|
+
window->glcontext = SDL_GL_CreateContext(window->sdl);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Check if a valid OpenGL context was created
|
|
242
|
+
if (window->glcontext) {
|
|
243
|
+
// Valid context found
|
|
244
|
+
|
|
245
|
+
// Initialize OpenGL ES 2.0
|
|
246
|
+
#if GLES
|
|
247
|
+
R2D_GLES_Init();
|
|
248
|
+
R2D_GL_SetViewport(window);
|
|
249
|
+
|
|
250
|
+
// Initialize OpenGL 3.3+
|
|
251
|
+
#else
|
|
252
|
+
// Initialize GLEW on Windows
|
|
253
|
+
#if WINDOWS
|
|
254
|
+
GLenum err = glewInit();
|
|
255
|
+
if (GLEW_OK != err) R2D_Error("GLEW", glewGetErrorString(err));
|
|
256
|
+
#endif
|
|
257
|
+
R2D_GL3_Init();
|
|
258
|
+
R2D_GL_SetViewport(window);
|
|
259
|
+
#endif
|
|
260
|
+
|
|
261
|
+
// Context could not be created
|
|
262
|
+
} else {
|
|
263
|
+
|
|
264
|
+
#if GLES
|
|
265
|
+
R2D_Error("GLES / SDL_GL_CreateContext", SDL_GetError());
|
|
266
|
+
|
|
267
|
+
#else
|
|
268
|
+
// Try to fallback using an OpenGL 2.1 context
|
|
269
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
|
270
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
|
|
271
|
+
|
|
272
|
+
// Try creating the context again
|
|
273
|
+
window->glcontext = SDL_GL_CreateContext(window->sdl);
|
|
274
|
+
|
|
275
|
+
// Check if this context was created
|
|
276
|
+
if (window->glcontext) {
|
|
277
|
+
// Valid context found
|
|
278
|
+
R2D_GL2 = true;
|
|
279
|
+
R2D_GL2_Init();
|
|
280
|
+
R2D_GL_SetViewport(window);
|
|
281
|
+
|
|
282
|
+
// Could not create any OpenGL contexts, hard failure
|
|
283
|
+
} else {
|
|
284
|
+
R2D_Error("GL2 / SDL_GL_CreateContext", SDL_GetError());
|
|
285
|
+
R2D_Log(R2D_ERROR, "An OpenGL context could not be created");
|
|
286
|
+
return -1;
|
|
287
|
+
}
|
|
288
|
+
#endif
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Store the context and print it if diagnostics is enabled
|
|
292
|
+
R2D_GL_StoreContextInfo(window);
|
|
293
|
+
if (R2D_diagnostics) R2D_GL_PrintContextInfo(window);
|
|
294
|
+
|
|
295
|
+
return 0;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
/*
|
|
300
|
+
* Creates a texture for rendering
|
|
301
|
+
*/
|
|
302
|
+
void R2D_GL_CreateTexture(GLuint *id, GLint format,
|
|
303
|
+
int w, int h,
|
|
304
|
+
const GLvoid *data, GLint filter) {
|
|
305
|
+
|
|
306
|
+
// If 0, then a new texture; generate name
|
|
307
|
+
if (*id == 0) glGenTextures(1, id);
|
|
308
|
+
|
|
309
|
+
// Bind the named texture to a texturing target
|
|
310
|
+
glBindTexture(GL_TEXTURE_2D, *id);
|
|
311
|
+
|
|
312
|
+
// Specifies the 2D texture image
|
|
313
|
+
glTexImage2D(
|
|
314
|
+
GL_TEXTURE_2D, 0, format, w, h,
|
|
315
|
+
0, format, GL_UNSIGNED_BYTE, data
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
// Set the filtering mode
|
|
319
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
|
|
320
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
/*
|
|
325
|
+
* Free a texture
|
|
326
|
+
*/
|
|
327
|
+
void R2D_GL_FreeTexture(GLuint *id) {
|
|
328
|
+
if (*id != 0) {
|
|
329
|
+
glDeleteTextures(1, id);
|
|
330
|
+
*id = 0;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
/*
|
|
336
|
+
* Draw a triangle
|
|
337
|
+
*/
|
|
338
|
+
void R2D_GL_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
339
|
+
GLfloat r1, GLfloat g1, GLfloat b1, GLfloat a1,
|
|
340
|
+
GLfloat x2, GLfloat y2,
|
|
341
|
+
GLfloat r2, GLfloat g2, GLfloat b2, GLfloat a2,
|
|
342
|
+
GLfloat x3, GLfloat y3,
|
|
343
|
+
GLfloat r3, GLfloat g3, GLfloat b3, GLfloat a3) {
|
|
344
|
+
|
|
345
|
+
#if GLES
|
|
346
|
+
R2D_GLES_DrawTriangle(x1, y1, r1, g1, b1, a1,
|
|
347
|
+
x2, y2, r2, g2, b2, a2,
|
|
348
|
+
x3, y3, r3, g3, b3, a3);
|
|
349
|
+
#else
|
|
350
|
+
if (R2D_GL2) {
|
|
351
|
+
R2D_GL2_DrawTriangle(x1, y1, r1, g1, b1, a1,
|
|
352
|
+
x2, y2, r2, g2, b2, a2,
|
|
353
|
+
x3, y3, r3, g3, b3, a3);
|
|
354
|
+
} else {
|
|
355
|
+
R2D_GL3_DrawTriangle(x1, y1, r1, g1, b1, a1,
|
|
356
|
+
x2, y2, r2, g2, b2, a2,
|
|
357
|
+
x3, y3, r3, g3, b3, a3);
|
|
358
|
+
}
|
|
359
|
+
#endif
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
/*
|
|
364
|
+
* Draw an image
|
|
365
|
+
*/
|
|
366
|
+
void R2D_GL_DrawImage(R2D_Image *img) {
|
|
367
|
+
#if GLES
|
|
368
|
+
R2D_GLES_DrawImage(img);
|
|
369
|
+
#else
|
|
370
|
+
if (R2D_GL2) {
|
|
371
|
+
R2D_GL2_DrawImage(img);
|
|
372
|
+
} else {
|
|
373
|
+
R2D_GL3_DrawImage(img);
|
|
374
|
+
}
|
|
375
|
+
#endif
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
/*
|
|
380
|
+
* Draw sprite
|
|
381
|
+
*/
|
|
382
|
+
void R2D_GL_DrawSprite(R2D_Sprite *spr) {
|
|
383
|
+
#if GLES
|
|
384
|
+
R2D_GLES_DrawSprite(spr);
|
|
385
|
+
#else
|
|
386
|
+
if (R2D_GL2) {
|
|
387
|
+
R2D_GL2_DrawSprite(spr);
|
|
388
|
+
} else {
|
|
389
|
+
R2D_GL3_DrawSprite(spr);
|
|
390
|
+
}
|
|
391
|
+
#endif
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
/*
|
|
396
|
+
* Draw text
|
|
397
|
+
*/
|
|
398
|
+
void R2D_GL_DrawText(R2D_Text *txt) {
|
|
399
|
+
#if GLES
|
|
400
|
+
R2D_GLES_DrawText(txt);
|
|
401
|
+
#else
|
|
402
|
+
if (R2D_GL2) {
|
|
403
|
+
R2D_GL2_DrawText(txt);
|
|
404
|
+
} else {
|
|
405
|
+
R2D_GL3_DrawText(txt);
|
|
406
|
+
}
|
|
407
|
+
#endif
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
/*
|
|
412
|
+
* Render and flush OpenGL buffers
|
|
413
|
+
*/
|
|
414
|
+
void R2D_GL_FlushBuffers() {
|
|
415
|
+
// Only implemented in our OpenGL 3.3+ and ES 2.0 renderers
|
|
416
|
+
#if GLES
|
|
417
|
+
// TODO: R2D_GLES_FlushBuffers();
|
|
418
|
+
#else
|
|
419
|
+
if (!R2D_GL2) R2D_GL3_FlushBuffers();
|
|
420
|
+
#endif
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
/*
|
|
425
|
+
* Clear buffers to given color values
|
|
426
|
+
*/
|
|
427
|
+
void R2D_GL_Clear(R2D_Color clr) {
|
|
428
|
+
glClearColor(clr.r, clr.g, clr.b, clr.a);
|
|
429
|
+
glClear(GL_COLOR_BUFFER_BIT);
|
|
430
|
+
}
|