rays 0.1.27 → 0.1.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/rays/exception.cpp +45 -0
  3. data/.doc/ext/rays/native.cpp +2 -0
  4. data/.doc/ext/rays/painter.cpp +7 -2
  5. data/.doc/ext/rays/shader.cpp +100 -6
  6. data/VERSION +1 -1
  7. data/ext/rays/defs.h +1 -0
  8. data/ext/rays/exception.cpp +45 -0
  9. data/ext/rays/native.cpp +2 -0
  10. data/ext/rays/painter.cpp +7 -2
  11. data/ext/rays/shader.cpp +101 -5
  12. data/include/rays/exception.h +11 -0
  13. data/include/rays/ruby/bitmap.h +0 -1
  14. data/include/rays/ruby/bounds.h +0 -2
  15. data/include/rays/ruby/camera.h +0 -1
  16. data/include/rays/ruby/color.h +0 -2
  17. data/include/rays/ruby/color_space.h +0 -1
  18. data/include/rays/ruby/defs.h +30 -0
  19. data/include/rays/ruby/exception.h +28 -0
  20. data/include/rays/ruby/font.h +0 -1
  21. data/include/rays/ruby/image.h +0 -1
  22. data/include/rays/ruby/matrix.h +0 -1
  23. data/include/rays/ruby/painter.h +0 -1
  24. data/include/rays/ruby/point.h +0 -2
  25. data/include/rays/ruby/polygon.h +0 -1
  26. data/include/rays/ruby/polyline.h +0 -1
  27. data/include/rays/ruby/rays.h +0 -1
  28. data/include/rays/ruby/shader.h +0 -1
  29. data/include/rays/ruby.h +2 -0
  30. data/include/rays/shader.h +48 -1
  31. data/lib/rays/painter.rb +6 -5
  32. data/lib/rays/point.rb +1 -0
  33. data/lib/rays/shader.rb +18 -5
  34. data/rays.gemspec +2 -2
  35. data/src/exception.cpp +13 -0
  36. data/src/image.cpp +6 -4
  37. data/src/ios/bitmap.mm +18 -1
  38. data/src/opengl.cpp +21 -7
  39. data/src/opengl.h +5 -3
  40. data/src/osx/bitmap.mm +18 -1
  41. data/src/osx/font.mm +0 -2
  42. data/src/osx/opengl.mm +17 -2
  43. data/src/painter.cpp +196 -125
  44. data/src/shader.cpp +333 -53
  45. data/src/shader.h +53 -14
  46. data/src/shader_program.cpp +53 -27
  47. data/src/shader_program.h +8 -1
  48. data/src/shader_source.cpp +2 -2
  49. data/src/texture.cpp +75 -63
  50. data/test/test_image.rb +45 -10
  51. data/test/test_painter.rb +26 -4
  52. data/test/test_point.rb +6 -5
  53. data/test/test_rays.rb +2 -2
  54. data/test/test_shader.rb +151 -14
  55. metadata +11 -6
@@ -4,7 +4,6 @@
4
4
  #define __RAYS_RUBY_POLYGON_H__
5
5
 
6
6
 
7
- #include <rucy/rucy.h>
8
7
  #include <rucy/class.h>
9
8
  #include <rucy/extension.h>
10
9
  #include <rays/polygon.h>
@@ -4,7 +4,6 @@
4
4
  #define __RAYS_RUBY_POLYLINE_H__
5
5
 
6
6
 
7
- #include <rucy/rucy.h>
8
7
  #include <rucy/class.h>
9
8
  #include <rucy/extension.h>
10
9
  #include <rays/polyline.h>
@@ -4,7 +4,6 @@
4
4
  #define __RAYS_RUBY_RAYS_H__
5
5
 
6
6
 
7
- #include <rucy/rucy.h>
8
7
  #include <rucy/module.h>
9
8
  #include <rucy/extension.h>
10
9
  #include <rays/rays.h>
@@ -4,7 +4,6 @@
4
4
  #define __RAYS_RUBY_SHADER_H__
5
5
 
6
6
 
7
- #include <rucy/rucy.h>
8
7
  #include <rucy/class.h>
9
8
  #include <rucy/extension.h>
10
9
  #include <rays/shader.h>
data/include/rays/ruby.h CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
 
7
7
  #include <rays/ruby/rays.h>
8
+ #include <rays/ruby/defs.h>
9
+ #include <rays/ruby/exception.h>
8
10
 
9
11
  #include <rays/ruby/point.h>
10
12
  #include <rays/ruby/bounds.h>
@@ -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 (const char* source = NULL);
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
@@ -33,6 +33,7 @@ module Rays
33
33
  when 1 then [x]
34
34
  when 2 then [x, y]
35
35
  when 3 then [x, y, z]
36
+ when 4 then [x, y, z, 1.0]
36
37
  else raise ArgumentError
37
38
  end
38
39
  end
data/lib/rays/shader.rb CHANGED
@@ -10,11 +10,24 @@ module Rays
10
10
 
11
11
  class Shader
12
12
 
13
- def initialize(source = nil, **uniforms, &block)
14
- if source
15
- setup source
16
- uniform(**uniforms) unless uniforms.empty?
17
- end
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.27'
32
- s.add_runtime_dependency 'rucy', '~> 0.1.27'
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& image)
61
+ get_bitmap (Image* image)
62
62
  {
63
- Image::Data* self = image.self.get();
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(*this);
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&>(*this));
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, kUTTypePNG, 1, NULL),
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
- GLenum
12
- OpenGL_get_error ()
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
- #ifndef IOS
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 = OpenGL_get_error();
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 OpenGL_set_context (Context context);
25
+ void OpenGL_set_context (Context context);
26
26
 
27
27
  Context OpenGL_get_context ();
28
28
 
29
- GLenum OpenGL_get_error ();
29
+ bool OpenGL_has_error ();
30
30
 
31
- void OpenGL_check_error (const char* file, int line);
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, kUTTypePNG, 1, NULL),
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
- NSOpenGLPixelFormat* pf = [NSOpenGLView defaultPixelFormat];
33
- context = [[NSOpenGLContext alloc] initWithFormat: pf shareContext: nil];
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
  }