rays 0.1.27 → 0.1.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.doc/ext/rays/exception.cpp +45 -0
- data/.doc/ext/rays/native.cpp +2 -0
- data/.doc/ext/rays/painter.cpp +7 -2
- data/.doc/ext/rays/shader.cpp +100 -6
- data/VERSION +1 -1
- data/ext/rays/defs.h +1 -0
- data/ext/rays/exception.cpp +45 -0
- data/ext/rays/native.cpp +2 -0
- data/ext/rays/painter.cpp +7 -2
- data/ext/rays/shader.cpp +101 -5
- data/include/rays/exception.h +11 -0
- data/include/rays/ruby/bitmap.h +0 -1
- data/include/rays/ruby/bounds.h +0 -2
- data/include/rays/ruby/camera.h +0 -1
- data/include/rays/ruby/color.h +0 -2
- data/include/rays/ruby/color_space.h +0 -1
- data/include/rays/ruby/defs.h +30 -0
- data/include/rays/ruby/exception.h +28 -0
- data/include/rays/ruby/font.h +0 -1
- data/include/rays/ruby/image.h +0 -1
- data/include/rays/ruby/matrix.h +0 -1
- data/include/rays/ruby/painter.h +0 -1
- data/include/rays/ruby/point.h +0 -2
- data/include/rays/ruby/polygon.h +0 -1
- data/include/rays/ruby/polyline.h +0 -1
- data/include/rays/ruby/rays.h +0 -1
- data/include/rays/ruby/shader.h +0 -1
- data/include/rays/ruby.h +2 -0
- data/include/rays/shader.h +48 -1
- data/lib/rays/painter.rb +6 -5
- data/lib/rays/point.rb +1 -0
- data/lib/rays/shader.rb +18 -5
- data/rays.gemspec +2 -2
- data/src/exception.cpp +13 -0
- data/src/image.cpp +6 -4
- data/src/ios/bitmap.mm +18 -1
- data/src/opengl.cpp +21 -7
- data/src/opengl.h +5 -3
- data/src/osx/bitmap.mm +18 -1
- data/src/osx/font.mm +0 -2
- data/src/osx/opengl.mm +17 -2
- data/src/painter.cpp +196 -125
- data/src/shader.cpp +333 -53
- data/src/shader.h +53 -14
- data/src/shader_program.cpp +53 -27
- data/src/shader_program.h +8 -1
- data/src/shader_source.cpp +2 -2
- data/src/texture.cpp +75 -63
- data/test/test_image.rb +45 -10
- data/test/test_painter.rb +26 -4
- data/test/test_point.rb +6 -5
- data/test/test_rays.rb +2 -2
- data/test/test_shader.rb +151 -14
- metadata +11 -6
data/include/rays/ruby/polygon.h
CHANGED
data/include/rays/ruby/rays.h
CHANGED
data/include/rays/ruby/shader.h
CHANGED
data/include/rays/ruby.h
CHANGED
data/include/rays/shader.h
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
#define __RAYS_SHADER_H__
|
5
5
|
|
6
6
|
|
7
|
+
#include <vector>
|
7
8
|
#include <xot/pimpl.h>
|
8
9
|
#include <rays/defs.h>
|
9
10
|
#include <rays/coord.h>
|
@@ -14,6 +15,7 @@ namespace Rays
|
|
14
15
|
|
15
16
|
|
16
17
|
class Image;
|
18
|
+
class ShaderEnv;
|
17
19
|
|
18
20
|
|
19
21
|
class Shader
|
@@ -23,7 +25,14 @@ namespace Rays
|
|
23
25
|
|
24
26
|
public:
|
25
27
|
|
26
|
-
Shader (
|
28
|
+
Shader (
|
29
|
+
const char* fragment_shader_source = NULL,
|
30
|
+
const char* vertex_shader_source = NULL);
|
31
|
+
|
32
|
+
Shader (
|
33
|
+
const char* fragment_shader_source,
|
34
|
+
const char* vertex_shader_source,
|
35
|
+
ShaderEnv env);
|
27
36
|
|
28
37
|
~Shader ();
|
29
38
|
|
@@ -55,6 +64,10 @@ namespace Rays
|
|
55
64
|
|
56
65
|
void set_uniform (const char* name, const Image& texture);
|
57
66
|
|
67
|
+
const char* vertex_shader_source () const;
|
68
|
+
|
69
|
+
const char* fragment_shader_source () const;
|
70
|
+
|
58
71
|
operator bool () const;
|
59
72
|
|
60
73
|
bool operator ! () const;
|
@@ -70,6 +83,40 @@ namespace Rays
|
|
70
83
|
};// Shader
|
71
84
|
|
72
85
|
|
86
|
+
class ShaderEnv
|
87
|
+
{
|
88
|
+
|
89
|
+
public:
|
90
|
+
|
91
|
+
typedef std::vector<String> NameList;
|
92
|
+
|
93
|
+
enum Flags
|
94
|
+
{
|
95
|
+
IGNORE_NO_UNIFORM_LOCATION_ERROR = 0x1 << 0,
|
96
|
+
};
|
97
|
+
|
98
|
+
ShaderEnv (
|
99
|
+
const NameList& attribute_position_names = {},
|
100
|
+
const NameList& attribute_texcoord_names = {},
|
101
|
+
const NameList& attribute_color_names = {},
|
102
|
+
const char* varying_position_name = NULL,
|
103
|
+
const char* varying_texcoord_name = NULL,
|
104
|
+
const char* varying_color_name = NULL,
|
105
|
+
const NameList& uniform_position_matrix_names = {},
|
106
|
+
const NameList& uniform_texcoord_matrix_names = {},
|
107
|
+
const NameList& uniform_texcoord_min_names = {},
|
108
|
+
const NameList& uniform_texcoord_max_names = {},
|
109
|
+
const NameList& uniform_texcoord_offset_names = {},
|
110
|
+
const NameList& uniform_texture_names = {},
|
111
|
+
uint flags = 0);
|
112
|
+
|
113
|
+
struct Data;
|
114
|
+
|
115
|
+
Xot::PSharedImpl<Data> self;
|
116
|
+
|
117
|
+
};// ShaderEnv
|
118
|
+
|
119
|
+
|
73
120
|
}// Rays
|
74
121
|
|
75
122
|
|
data/lib/rays/painter.rb
CHANGED
@@ -27,15 +27,15 @@ module Rays
|
|
27
27
|
if block
|
28
28
|
attributes.each do |key, value|
|
29
29
|
attributes[key] = __send__ key
|
30
|
-
__send__ key, *value
|
30
|
+
__send__ key, *(value.nil? ? [nil] : value)
|
31
31
|
end
|
32
|
-
|
33
32
|
Xot::BlockUtil.instance_eval_or_block_call self, &block
|
34
|
-
|
33
|
+
end
|
34
|
+
ensure
|
35
|
+
if block
|
35
36
|
attributes.each do |key, value|
|
36
|
-
__send__ key, *value
|
37
|
+
__send__ key, *(value.nil? ? [nil] : value)
|
37
38
|
end
|
38
|
-
|
39
39
|
pop(*types)
|
40
40
|
end
|
41
41
|
end
|
@@ -92,6 +92,7 @@ module Rays
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def shader=(shader, **uniforms)
|
95
|
+
shader = Shader.new shader if shader.is_a?(String)
|
95
96
|
shader.uniform(**uniforms) if shader && !uniforms.empty?
|
96
97
|
set_shader shader
|
97
98
|
end
|
data/lib/rays/point.rb
CHANGED
data/lib/rays/shader.rb
CHANGED
@@ -10,11 +10,24 @@ module Rays
|
|
10
10
|
|
11
11
|
class Shader
|
12
12
|
|
13
|
-
def initialize(
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
def initialize(
|
14
|
+
fragment_shader_source,
|
15
|
+
vertex_shader_source = nil,
|
16
|
+
builtin_variable_names = nil,
|
17
|
+
ignore_no_uniform_location_error: false,
|
18
|
+
**uniforms, &block)
|
19
|
+
|
20
|
+
setup(
|
21
|
+
fragment_shader_source, vertex_shader_source,
|
22
|
+
builtin_variable_names&.values_at(
|
23
|
+
:attribute_position, :attribute_texcoord, :attribute_color,
|
24
|
+
:varying_position, :varying_texcoord, :varying_color,
|
25
|
+
:uniform_position_matrix, :uniform_texcoord_matrix,
|
26
|
+
:uniform_texcoord_min, :uniform_texcoord_max, :uniform_texcoord_offset,
|
27
|
+
:uniform_texture),
|
28
|
+
ignore_no_uniform_location_error)
|
29
|
+
|
30
|
+
uniform(**uniforms) unless uniforms.empty?
|
18
31
|
|
19
32
|
Xot::BlockUtil.instance_eval_or_block_call self, &block if block
|
20
33
|
end
|
data/rays.gemspec
CHANGED
@@ -28,8 +28,8 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.platform = Gem::Platform::RUBY
|
29
29
|
s.required_ruby_version = '>= 2.6.0'
|
30
30
|
|
31
|
-
s.add_runtime_dependency 'xot', '~> 0.1.
|
32
|
-
s.add_runtime_dependency 'rucy', '~> 0.1.
|
31
|
+
s.add_runtime_dependency 'xot', '~> 0.1.29'
|
32
|
+
s.add_runtime_dependency 'rucy', '~> 0.1.29'
|
33
33
|
|
34
34
|
s.files = `git ls-files`.split $/
|
35
35
|
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
|
data/src/exception.cpp
CHANGED
@@ -20,6 +20,12 @@ namespace Rays
|
|
20
20
|
}
|
21
21
|
|
22
22
|
|
23
|
+
ShaderError::ShaderError (const char* str)
|
24
|
+
: Super(str)
|
25
|
+
{
|
26
|
+
}
|
27
|
+
|
28
|
+
|
23
29
|
namespace ErrorFunctions
|
24
30
|
{
|
25
31
|
|
@@ -37,6 +43,13 @@ namespace Rays
|
|
37
43
|
throw OpenGLError(Xot::error_text(file, line, s));
|
38
44
|
}
|
39
45
|
|
46
|
+
void
|
47
|
+
shader_error (const char* file, int line, const char* format, ...)
|
48
|
+
{
|
49
|
+
XOT_STRINGF(format, s);
|
50
|
+
throw ShaderError(Xot::error_text(file, line, s));
|
51
|
+
}
|
52
|
+
|
40
53
|
}// ErrorFunctions
|
41
54
|
|
42
55
|
|
data/src/image.cpp
CHANGED
@@ -58,9 +58,11 @@ namespace Rays
|
|
58
58
|
}
|
59
59
|
|
60
60
|
static Bitmap&
|
61
|
-
get_bitmap (Image
|
61
|
+
get_bitmap (Image* image)
|
62
62
|
{
|
63
|
-
|
63
|
+
assert(image);
|
64
|
+
|
65
|
+
Image::Data* self = image->self.get();
|
64
66
|
|
65
67
|
if (!image)
|
66
68
|
{
|
@@ -230,13 +232,13 @@ namespace Rays
|
|
230
232
|
Bitmap&
|
231
233
|
Image::bitmap ()
|
232
234
|
{
|
233
|
-
return get_bitmap(
|
235
|
+
return get_bitmap(this);
|
234
236
|
}
|
235
237
|
|
236
238
|
const Bitmap&
|
237
239
|
Image::bitmap () const
|
238
240
|
{
|
239
|
-
return get_bitmap(const_cast<Image
|
241
|
+
return get_bitmap(const_cast<Image*>(this));
|
240
242
|
}
|
241
243
|
|
242
244
|
Image::operator bool () const
|
data/src/ios/bitmap.mm
CHANGED
@@ -224,9 +224,26 @@ namespace Rays
|
|
224
224
|
return bitmap.self->modified;
|
225
225
|
}
|
226
226
|
|
227
|
+
static CFStringRef
|
228
|
+
get_bitmap_type (const char* path_)
|
229
|
+
{
|
230
|
+
String path = path_;
|
231
|
+
path = path.downcase();
|
232
|
+
if (path.ends_with(".png")) return kUTTypePNG;
|
233
|
+
if (path.ends_with(".gif")) return kUTTypeGIF;
|
234
|
+
if (path.ends_with(".bmp")) return kUTTypeBMP;
|
235
|
+
if (path.ends_with(".jpg") || path.ends_with(".jpeg")) return kUTTypeJPEG;
|
236
|
+
if (path.ends_with(".tif") || path.ends_with(".tiff")) return kUTTypeTIFF;
|
237
|
+
return nil;
|
238
|
+
}
|
239
|
+
|
227
240
|
void
|
228
241
|
Bitmap_save (const Bitmap& bmp, const char* path_)
|
229
242
|
{
|
243
|
+
const CFStringRef type = get_bitmap_type(path_);
|
244
|
+
if (!type)
|
245
|
+
argument_error(__FILE__, __LINE__, "unknown image file type");
|
246
|
+
|
230
247
|
std::shared_ptr<CGImage> img(bmp.self->get_image(), CGImageRelease);
|
231
248
|
if (!img)
|
232
249
|
rays_error(__FILE__, __LINE__, "getting CGImage failed.");
|
@@ -237,7 +254,7 @@ namespace Rays
|
|
237
254
|
rays_error(__FILE__, __LINE__, "creating NSURL failed.");
|
238
255
|
|
239
256
|
std::shared_ptr<CGImageDestination> dest(
|
240
|
-
CGImageDestinationCreateWithURL((CFURLRef) url,
|
257
|
+
CGImageDestinationCreateWithURL((CFURLRef) url, type, 1, NULL),
|
241
258
|
safe_cfrelease);
|
242
259
|
if (!dest)
|
243
260
|
rays_error(__FILE__, __LINE__, "CGImageDestinationCreateWithURL() failed.");
|
data/src/opengl.cpp
CHANGED
@@ -8,10 +8,10 @@ namespace Rays
|
|
8
8
|
{
|
9
9
|
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
bool
|
12
|
+
OpenGL_has_error ()
|
13
13
|
{
|
14
|
-
return glGetError();
|
14
|
+
return glGetError() != GL_NO_ERROR;
|
15
15
|
}
|
16
16
|
|
17
17
|
static String
|
@@ -24,12 +24,12 @@ namespace Rays
|
|
24
24
|
case GL_INVALID_VALUE: return "GL_INVALID_VALUE";
|
25
25
|
case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
|
26
26
|
case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
|
27
|
-
#
|
27
|
+
#if !defined(GL_VERSION_3_0)
|
28
28
|
case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW";
|
29
29
|
case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW";
|
30
|
+
case GL_INVALID_FRAMEBUFFER_OPERATION: return "GL_INVALID_FRAMEBUFFER_OPERATION";
|
31
|
+
case GL_TABLE_TOO_LARGE: return "GL_TABLE_TOO_LARGE";
|
30
32
|
#endif
|
31
|
-
case 0x506: return "GL_INVALID_FRAMEBUFFER_OPERATION";
|
32
|
-
case 0x8031: return "GL_TABLE_TOO_LARGE";
|
33
33
|
default: return "UNKNOWN ERROR";
|
34
34
|
}
|
35
35
|
}
|
@@ -37,10 +37,24 @@ namespace Rays
|
|
37
37
|
void
|
38
38
|
OpenGL_check_error (const char* file, int line)
|
39
39
|
{
|
40
|
-
GLenum e =
|
40
|
+
GLenum e = glGetError();
|
41
41
|
if (e != GL_NO_ERROR)
|
42
42
|
opengl_error(file, line, "OpenGL error %s", get_error_name(e).c_str());
|
43
43
|
}
|
44
44
|
|
45
|
+
void
|
46
|
+
OpenGL_check_error (const char* file, int line, const char* format, ...)
|
47
|
+
{
|
48
|
+
XOT_STRINGF(format, s);
|
49
|
+
|
50
|
+
GLenum e = glGetError();
|
51
|
+
if (e != GL_NO_ERROR)
|
52
|
+
{
|
53
|
+
opengl_error(
|
54
|
+
file, line,
|
55
|
+
"OpenGL error %s: %s", get_error_name(e).c_str(), s.c_str());
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
45
59
|
|
46
60
|
}// Rays
|
data/src/opengl.h
CHANGED
@@ -22,13 +22,15 @@ namespace Rays
|
|
22
22
|
{
|
23
23
|
|
24
24
|
|
25
|
-
void
|
25
|
+
void OpenGL_set_context (Context context);
|
26
26
|
|
27
27
|
Context OpenGL_get_context ();
|
28
28
|
|
29
|
-
|
29
|
+
bool OpenGL_has_error ();
|
30
30
|
|
31
|
-
void
|
31
|
+
void OpenGL_check_error (const char* file, int line);
|
32
|
+
|
33
|
+
void OpenGL_check_error (const char* file, int line, const char* format, ...);
|
32
34
|
|
33
35
|
|
34
36
|
}// Rays
|
data/src/osx/bitmap.mm
CHANGED
@@ -223,9 +223,26 @@ namespace Rays
|
|
223
223
|
return bitmap.self->modified;
|
224
224
|
}
|
225
225
|
|
226
|
+
static CFStringRef
|
227
|
+
get_bitmap_type (const char* path_)
|
228
|
+
{
|
229
|
+
String path = path_;
|
230
|
+
path = path.downcase();
|
231
|
+
if (path.ends_with(".png")) return kUTTypePNG;
|
232
|
+
if (path.ends_with(".gif")) return kUTTypeGIF;
|
233
|
+
if (path.ends_with(".bmp")) return kUTTypeBMP;
|
234
|
+
if (path.ends_with(".jpg") || path.ends_with(".jpeg")) return kUTTypeJPEG;
|
235
|
+
if (path.ends_with(".tif") || path.ends_with(".tiff")) return kUTTypeTIFF;
|
236
|
+
return nil;
|
237
|
+
}
|
238
|
+
|
226
239
|
void
|
227
240
|
Bitmap_save (const Bitmap& bmp, const char* path_)
|
228
241
|
{
|
242
|
+
const CFStringRef type = get_bitmap_type(path_);
|
243
|
+
if (!type)
|
244
|
+
argument_error(__FILE__, __LINE__, "unknown image file type");
|
245
|
+
|
229
246
|
std::shared_ptr<CGImage> img(bmp.self->get_image(), CGImageRelease);
|
230
247
|
if (!img)
|
231
248
|
rays_error(__FILE__, __LINE__, "getting CGImage failed.");
|
@@ -236,7 +253,7 @@ namespace Rays
|
|
236
253
|
rays_error(__FILE__, __LINE__, "creating NSURL failed.");
|
237
254
|
|
238
255
|
std::shared_ptr<CGImageDestination> dest(
|
239
|
-
CGImageDestinationCreateWithURL((CFURLRef) url,
|
256
|
+
CGImageDestinationCreateWithURL((CFURLRef) url, type, 1, NULL),
|
240
257
|
safe_cfrelease);
|
241
258
|
if (!dest)
|
242
259
|
rays_error(__FILE__, __LINE__, "CGImageDestinationCreateWithURL() failed.");
|
data/src/osx/font.mm
CHANGED
@@ -104,8 +104,6 @@ namespace Rays
|
|
104
104
|
|
105
105
|
CGRect rect = CGRectMake(x, context_height - height - y, width, height);
|
106
106
|
CGContextClearRect(context, rect);
|
107
|
-
//CGContextSetRGBFillColor(context, 0, 0, 0, 1);
|
108
|
-
//CGContextFillRect(context, rect);
|
109
107
|
CGContextSetRGBFillColor(context, 1, 1, 1, 1);
|
110
108
|
|
111
109
|
CGContextSaveGState(context);
|
data/src/osx/opengl.mm
CHANGED
@@ -29,8 +29,23 @@ namespace Rays
|
|
29
29
|
static Context context = NULL;
|
30
30
|
if (!context)
|
31
31
|
{
|
32
|
-
|
33
|
-
|
32
|
+
NSOpenGLPixelFormatAttribute attribs[] =
|
33
|
+
{
|
34
|
+
//NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
|
35
|
+
//NSOpenGLPFAAccelerated, NSOpenGLPFANoRecovery,
|
36
|
+
//NSOpenGLPFADoubleBuffer,
|
37
|
+
NSOpenGLPFAAllowOfflineRenderers,
|
38
|
+
NSOpenGLPFAColorSize, 32,
|
39
|
+
NSOpenGLPFADepthSize, 32,
|
40
|
+
//NSOpenGLPFAMultisample,
|
41
|
+
//NSOpenGLPFASampleBuffers, 1,
|
42
|
+
//NSOpenGLPFASamples, 4,
|
43
|
+
0
|
44
|
+
};
|
45
|
+
NSOpenGLPixelFormat* pf = [[[NSOpenGLPixelFormat alloc]
|
46
|
+
initWithAttributes: attribs] autorelease];
|
47
|
+
context = [[[NSOpenGLContext alloc]
|
48
|
+
initWithFormat: pf shareContext: nil] autorelease];
|
34
49
|
}
|
35
50
|
return context;
|
36
51
|
}
|