.doc/ext/rays/matrix.cpp in rays-0.1.48 vs .doc/ext/rays/matrix.cpp in rays-0.1.49

- old
+ new

@@ -66,10 +66,18 @@ return self; } static +VALUE transpose(VALUE self) +{ + CHECK; + THIS->transpose(); + return self; +} + +static VALUE translate(VALUE self) { CHECK; check_arg_count(__FILE__, __LINE__, "Matrix#translate", argc, 1, 2, 3); @@ -106,14 +114,14 @@ static VALUE to_a(VALUE self) { CHECK; return array( - THIS->x0, THIS->y0, THIS->z0, THIS->w0, - THIS->x1, THIS->y1, THIS->z1, THIS->w1, - THIS->x2, THIS->y2, THIS->z2, THIS->w2, - THIS->x3, THIS->y3, THIS->z3, THIS->w3); + THIS->x0, THIS->x1, THIS->x2, THIS->x3, + THIS->y0, THIS->y1, THIS->y2, THIS->y3, + THIS->z0, THIS->z1, THIS->z2, THIS->z3, + THIS->w0, THIS->w1, THIS->w2, THIS->w3); } static VALUE mult(VALUE self, VALUE val) { @@ -188,11 +196,56 @@ VALUE s_rotate(VALUE self) { return rotate(argc, argv, value(Rays::Matrix())); } +static +VALUE s_ortho(VALUE self) +{ + check_arg_count(__FILE__, __LINE__, "Matrix#ortho", argc, 4, 6); + coord l = to<coord>(argv[0]); + coord r = to<coord>(argv[1]); + coord t = to<coord>(argv[2]); + coord b = to<coord>(argv[3]); + if (argc == 4) + return value(Rays::ortho(l, r, t, b)); + else + return value(Rays::ortho(l, r, t, b, to<coord>(argv[4]), to<coord>(argv[5]))); +} + +static +VALUE s_perspective(VALUE self, VALUE fov_y, VALUE aspect_ratio, VALUE near, VALUE far) +{ + return value(Rays::perspective( + to<float>(fov_y), to<float>(aspect_ratio), to<coord>(near), to<coord>(far))); +} + +static +VALUE s_look_at(VALUE self) +{ + check_arg_count(__FILE__, __LINE__, "Matrix#ortho", argc, 3, 6, 9); + + if (argc == 3) + { + return value(Rays::look_at( + to<Rays::Point&>(argv[0]), + to<Rays::Point&>(argv[1]), + to<Rays::Point&>(argv[2]))); + } + else + { + return value(Rays::look_at( + to<coord>(argv[0]), to<coord>(argv[1]), to<coord>(argv[2]), + to<coord>(argv[3]), to<coord>(argv[4]), to<coord>(argv[5]), + argc >= 7 ? to<coord>(argv[6]) : 0, + argc >= 8 ? to<coord>(argv[7]) : 1, + argc >= 9 ? to<coord>(argv[8]) : 0)); + } +} + + static Class cMatrix; void Init_rays_matrix () { @@ -201,22 +254,27 @@ cMatrix = rb_define_class_under(mRays, "Matrix", rb_cObject); rb_define_alloc_func(cMatrix, alloc); rb_define_private_method(cMatrix, "initialize", RUBY_METHOD_FUNC(initialize), -1); rb_define_private_method(cMatrix, "initialize_copy", RUBY_METHOD_FUNC(initialize_copy), 1); rb_define_method(cMatrix, "reset", RUBY_METHOD_FUNC(reset), -1); - rb_define_method(cMatrix, "translate", RUBY_METHOD_FUNC(translate), -1); - rb_define_method(cMatrix, "scale", RUBY_METHOD_FUNC(scale), -1); - rb_define_method(cMatrix, "rotate", RUBY_METHOD_FUNC(rotate), -1); + cMatrix.define_method("transpose!", transpose); + cMatrix.define_method("translate!", translate); + cMatrix.define_method("scale!", scale); + cMatrix.define_method("rotate!", rotate); rb_define_method(cMatrix, "to_a", RUBY_METHOD_FUNC(to_a), 0); cMatrix.define_method("*", mult); cMatrix.define_method("[]=", set_at); cMatrix.define_method("[]", get_at); cMatrix.define_method("<=>", compare); rb_define_method(cMatrix, "inspect", RUBY_METHOD_FUNC(inspect), 0); rb_define_singleton_method(cMatrix, "translate", RUBY_METHOD_FUNC(s_translate), -1); rb_define_singleton_method(cMatrix, "scale", RUBY_METHOD_FUNC(s_scale), -1); rb_define_singleton_method(cMatrix, "rotate", RUBY_METHOD_FUNC(s_rotate), -1); + rb_define_singleton_method(cMatrix, "ortho", RUBY_METHOD_FUNC(s_ortho), -1); + rb_define_singleton_method(cMatrix, "perspective", RUBY_METHOD_FUNC(s_perspective), 4); + rb_define_singleton_method(cMatrix, "look_at", RUBY_METHOD_FUNC(s_look_at), -1); + } namespace Rucy {