ext/image_target.c in ray-0.1.1 vs ext/image_target.c in ray-0.2.0

- old
+ new

@@ -15,44 +15,72 @@ } VALUE ray_image_target_alloc(VALUE self) { if (!say_image_target_is_available()) rb_raise(rb_eRuntimeError, "Ray::RenderImage is not supported here"); - + say_image_target *target = say_image_target_create(); return Data_Wrap_Struct(ray_cImageTarget, NULL, say_image_target_free, target); } -/* @overload image=(img) */ +/* + * @overload image=(img) + * Sets the image this object will draw on + * @param [Ray::Image] img New image to draw on + */ VALUE ray_image_target_set_image(VALUE self, VALUE img) { rb_check_frozen(self); say_image_target_set_image(ray_rb2image_target(self), ray_rb2image(img)); rb_iv_set(self, "@image", img); return img; } -/* @return [Ray::Image] image the target draws on */ +/* @see image= */ VALUE ray_image_target_image(VALUE self) { return rb_iv_get(self, "@image"); } -/* Updates the content of the image target */ +/* + * Updates the content of the image target + * + * The pixels of the image will also be updated: + * Ray::ImageTarget.new image do |target| + * target.clear Ray::Color.red + * target.update + * end + * + * image[0, 0] # => RGBA(255, 0, 0, 255) + */ VALUE ray_image_target_update(VALUE self) { say_image_target_update(ray_rb2image_target(self)); return self; } -/* Binds an image target to draw directly on it */ +/* + * Binds an image target to draw directly on it + * + * This method is only useful when performing low-level OpenGL rendering. It + * is different from {#make_current} because it doesn't use the target's own + * OpenGL context. Instead, it will use the current context (ensuring there is + * one). + * + * Notice binding the image target (and, therefore, making it the current + * target) clears the depth buffer of the image, so that everything will be + * rendered over what was already on the image. + */ VALUE ray_image_target_bind(VALUE self) { say_image_target_bind(ray_rb2image_target(self)); return self; } /* - * Unbinds any image target. This is mostly not needed, as making a window the - * current target will call this automatically. + * Unbinds any image target + * + * This is rarely needed, as this method gets called automatically when a window + * is bound, and because windows and image targets do not share the same OpenGL + * context. */ VALUE ray_image_target_unbind(VALUE self) { /* * No need for an error when this is not supported, because it just means * we don't need to unbind anything. @@ -61,21 +89,41 @@ say_image_target_unbind(); return Qnil; } /* + * Checks availability of image targets + * + * Image targets are only part of OpenGL core since OpenGL 3 (although they may + * be supported as an extension in older versions). + * * @return [true, false] True when ImageTargets are available */ VALUE ray_image_target_available(VALUE self) { return say_image_target_is_available() ? Qtrue : Qfalse; } +/* + * Document-class: Ray::ImageTarget + * + * Image targets are objects that allow to draw any drawable object on an image + * instead of doing on-screen rendering. Off-screen rendering can be useful to + * pre-render some objects. + * + * Notice image targets modify the image they are drawing on directly. You may + * therefore not want to draw on a cached image, but rather on a copy thereof. + * + * @see Ray::Image + */ void Init_ray_image_target() { - ray_cImageTarget = rb_define_class_under(ray_mRay, "ImageTarget", ray_cTarget); + ray_cImageTarget = rb_define_class_under(ray_mRay, "ImageTarget", + ray_cTarget); rb_define_alloc_func(ray_cImageTarget, ray_image_target_alloc); - rb_define_singleton_method(ray_cImageTarget, "unbind", ray_image_target_unbind, 0); - rb_define_singleton_method(ray_cImageTarget, "available?", ray_image_target_available, 0); + rb_define_singleton_method(ray_cImageTarget, "unbind", + ray_image_target_unbind, 0); + rb_define_singleton_method(ray_cImageTarget, "available?", + ray_image_target_available, 0); rb_define_method(ray_cImageTarget, "image=", ray_image_target_set_image, 1); rb_define_method(ray_cImageTarget, "image", ray_image_target_image, 0); rb_define_method(ray_cImageTarget, "bind", ray_image_target_bind, 0);