Finished SFML::Rect. Will still have to add rdoc comments when I get the energy and properly debug test the functionality.

git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1670 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
groogy 2010-11-17 21:47:03 +00:00
parent 06d6f9b81d
commit 6366c02d19

View File

@ -85,6 +85,115 @@ static void Rect_internal_ValidateTypes( VALUE aFirst, VALUE aSecond, VALUE aThi
} }
} }
/* call-seq:
* Rect.new( x, y ) -> true or false
* Rect.new( vector2 ) -> true or false
*
*/
static VALUE Rect_Contains( int argc, VALUE * args, VALUE self )
{
VALUE pointX = Qnil;
VALUE pointY = Qnil;
VALUE left = rb_funcall( self, rb_intern( "left" ), 0 );
VALUE top = rb_funcall( self, rb_intern( "top" ), 0 );
VALUE width = rb_funcall( self, rb_intern( "width" ), 0 );
VALUE height = rb_funcall( self, rb_intern( "height" ), 0 );
switch( argc )
{
case 1:
pointX = rb_funcall( args[0], rb_intern( "x" ), 0 );
pointY = rb_funcall( args[0], rb_intern( "y" ), 0 );
break;
case 2:
VALIDATE_CLASS( args[0], rb_cNumeric, "x" );
VALIDATE_CLASS( args[1], rb_cNumeric, "y" );
pointX = args[0];
pointY = args[1];
break;
default:
rb_raise( rb_eArgError, "Expected 1 or 2 arguments but was given %d", argc );
}
VALUE first = rb_funcall( pointX, rb_intern( ">=" ), 1, left );
VALUE second = rb_funcall( pointX, rb_intern( "<" ), 1, rb_funcall( left, rb_intern( "+" ), 1, width ) );
VALUE third = rb_funcall( pointY, rb_intern( ">=" ), 1, top );
VALUE fourth = rb_funcall( pointY, rb_intern( "<" ), 1, rb_funcall( top, rb_intern( "+" ), 1, height ) );
if( first == Qtrue && second == Qtrue && third == Qtrue && fourth == Qtrue )
{
return Qtrue;
}
else
{
return Qfalse;
}
}
static VALUE Rect_Intersect( VALUE self, VALUE aRect )
{
VALUE selfLeft = rb_funcall( self, rb_intern( "left" ), 0 );
VALUE selfTop = rb_funcall( self, rb_intern( "top" ), 0 );
VALUE selfWidth = rb_funcall( self, rb_intern( "width" ), 0 );
VALUE selfHeight = rb_funcall( self, rb_intern( "height" ), 0 );
VALUE selfRight = rb_funcall( selfLeft, rb_intern( "+" ), 1, selfWidth );
VALUE selfBottom = rb_funcall( selfTop, rb_intern( "+" ), 1, selfHeight );
VALUE rectLeft = rb_funcall( aRect, rb_intern( "left" ), 0 );
VALUE rectTop = rb_funcall( aRect, rb_intern( "top" ), 0 );
VALUE rectWidth = rb_funcall( aRect, rb_intern( "width" ), 0 );
VALUE rectHeight = rb_funcall( aRect, rb_intern( "height" ), 0 );
VALUE rectRight = rb_funcall( rectLeft, rb_intern( "+" ), 1, rectWidth );
VALUE rectBottom = rb_funcall( rectTop, rb_intern( "+" ), 1, rectHeight );
VALUE left, top, right, bottom;
if( rb_funcall( selfLeft, rb_intern( ">" ), 1, rectLeft ) == Qtrue )
{
left = selfLeft;
}
else
{
left = rectLeft;
}
if( rb_funcall( selfTop, rb_intern( ">" ), 1, rectTop ) == Qtrue )
{
top = selfTop;
}
else
{
top = rectTop;
}
if( rb_funcall( selfRight , rb_intern( ">" ), 1, rectRight ) == Qtrue )
{
right = selfRight;
}
else
{
right = rectRight;
}
if( rb_funcall( selfBottom , rb_intern( ">" ), 1, rectBottom ) == Qtrue )
{
bottom = selfBottom;
}
else
{
bottom = rectBottom;
}
if( rb_funcall( left, rb_intern( "<" ), 1, right) == Qtrue && rb_funcall( top, rb_intern( "<" ), 1, bottom) == Qtrue )
{
VALUE newWidth = rb_funcall( right, rb_intern( "-" ), 1, left );
VALUE newHeight = rb_funcall( bottom, rb_intern( "-" ), 1, top );
return rb_funcall( globalRectClass, rb_intern( "new" ), 4, left, top, newWidth, newHeight );
}
else
{
return Qnil;
}
}
/* call-seq: /* call-seq:
* Rect.new() -> rect * Rect.new() -> rect
@ -95,7 +204,7 @@ static void Rect_internal_ValidateTypes( VALUE aFirst, VALUE aSecond, VALUE aThi
* *
* Create a new rect instance. * Create a new rect instance.
*/ */
static VALUE Rect_Initialize( int argc, VALUE *args VALUE self ) static VALUE Rect_Initialize( int argc, VALUE *args, VALUE self )
{ {
VALUE arg0 = Qnil; VALUE arg0 = Qnil;
VALUE arg1 = Qnil; VALUE arg1 = Qnil;
@ -108,7 +217,7 @@ static VALUE Rect_Initialize( int argc, VALUE *args VALUE self )
rb_iv_set( self, "@height", INT2NUM( 0 ) ); rb_iv_set( self, "@height", INT2NUM( 0 ) );
break; break;
case 1: case 1:
Color_internal_CopyFrom( self, args[0] ); Rect_internal_CopyFrom( self, args[0] );
break; break;
case 2: case 2:
arg0 = Vector2_ForceType( args[0] ); arg0 = Vector2_ForceType( args[0] );
@ -116,7 +225,7 @@ static VALUE Rect_Initialize( int argc, VALUE *args VALUE self )
rb_iv_set( self, "@left", rb_funcall( arg0, rb_intern( "x" ), 0 ) ); rb_iv_set( self, "@left", rb_funcall( arg0, rb_intern( "x" ), 0 ) );
rb_iv_set( self, "@top", rb_funcall( arg0, rb_intern( "y" ), 0 ) ); rb_iv_set( self, "@top", rb_funcall( arg0, rb_intern( "y" ), 0 ) );
rb_iv_set( self, "@width", rb_funcall( arg1, rb_intern( "x" ), 0 ) ); rb_iv_set( self, "@width", rb_funcall( arg1, rb_intern( "x" ), 0 ) );
rb_iv_set( self, "@height", rb_funcall( arg2, rb_intern( "y" ), 0 ) ); rb_iv_set( self, "@height", rb_funcall( arg1, rb_intern( "y" ), 0 ) );
break; break;
case 4: case 4:
Rect_internal_ValidateTypes( args[0], args[1], args[2], args[3] ); Rect_internal_ValidateTypes( args[0], args[1], args[2], args[3] );
@ -128,13 +237,13 @@ static VALUE Rect_Initialize( int argc, VALUE *args VALUE self )
default: default:
rb_raise( rb_eArgError, "Expected 0, 3 or 4 arguments but was given %d", argc ); rb_raise( rb_eArgError, "Expected 0, 3 or 4 arguments but was given %d", argc );
} }
return self;
rb_iv_set( self, "@dataType", CLASS_OF( rb_iv_get( self, "@left" ) ) ); rb_iv_set( self, "@dataType", CLASS_OF( rb_iv_get( self, "@left" ) ) );
return self; return self;
} }
void Init_Rect void Init_Rect( void )
{
/* SFML namespace which contains the classes of this module. */ /* SFML namespace which contains the classes of this module. */
VALUE sfml = rb_define_module( "SFML" ); VALUE sfml = rb_define_module( "SFML" );
/* Utility class for manipulating 2D axis aligned rectangles. /* Utility class for manipulating 2D axis aligned rectangles.
@ -160,20 +269,19 @@ void Init_Rect
* Usage example: * Usage example:
* *
* # Define a rectangle, located at (0, 0) with a size of 20x5 * # Define a rectangle, located at (0, 0) with a size of 20x5
* r1 = SFML::Rect.new(0, 0, 20, 5) * r1 = SFML::Rect.new( 0, 0, 20, 5 )
* *
* # Define another rectangle, located at (4, 2) with a size of 18x10 * # Define another rectangle, located at (4, 2) with a size of 18x10
* position = SFML::Vector2.new(4, 2) * position = SFML::Vector2.new( 4, 2 )
* size = SFML::Vector2.new(18, 10) * size = SFML::Vector2.new( 18, 10 )
* r2 = SFML::Rect.new(position, size) * r2 = SFML::Rect.new( position, size )
* *
* # Test intersections with the point (3, 1) * # Test intersections with the point (3, 1)
* b1 = r1.contains(3, 1); # true * b1 = r1.contains( 3, 1 ) # true
* b2 = r2.contains(3, 1); # false * b2 = r2.contains( 3, 1 ) # false
* *
* # Test the intersection between r1 and r2 * # Test the intersection between r1 and r2
* result = SFML::Rect.new * result = r1.intersects( r2 ) # If r1 don't intersect r2 then result would be nil
* b3 = r1.intersects(r2, result) # true
* # result == (4, 2, 16, 3) * # result == (4, 2, 16, 3)
* *
*/ */
@ -181,6 +289,8 @@ void Init_Rect
// Instance methods // Instance methods
rb_define_method( globalRectClass, "initialize", Rect_Initialize, -2 ); rb_define_method( globalRectClass, "initialize", Rect_Initialize, -2 );
rb_define_method( globalRectClass, "contains", Rect_Contains, -2 );
rb_define_method( globalRectClass, "intersects", Rect_Contains, 1 );
// Instance operators // Instance operators