Game-Collisions
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Game/Collisions/AABB.pm view on Meta::CPAN
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package Game::Collisions::AABB;
$Game::Collisions::AABB::VERSION = '0.5';
use utf8;
use v5.14;
use warnings;
use List::Util ();
use Scalar::Util ();
use Carp 'confess';
use constant _X => 0;
use constant _Y => 1;
use constant _LENGTH => 2;
use constant _HEIGHT => 3;
use constant _MAX_X => 4;
use constant _MAX_Y => 5;
use constant _PARENT_NODE => 6;
use constant _LEFT_NODE => 7;
use constant _RIGHT_NODE => 8;
use constant _USER_DATA => 9;
use constant _DO_CALL_USER_DATA => 10;
sub new
{
my ($class, $args) = @_;
my $do_call_user_data = defined( $args->{user_data} )
&& Scalar::Util::blessed( $args->{user_data} )
&& $args->{user_data}->isa( 'Game::Collisions::UserData' );
my $self = [
$args->{x},
$args->{y},
$args->{length},
$args->{height},
$args->{x} + $args->{length},
$args->{y} + $args->{height},
undef, # parent node
undef, # left node
undef, # right node
$args->{user_data},
$do_call_user_data,
];
bless $self => $class;
}
sub x { $_[0]->[_X] }
sub y { $_[0]->[_Y] }
sub length { $_[0]->[_LENGTH] }
sub height { $_[0]->[_HEIGHT] }
sub left_node { $_[0]->[_LEFT_NODE] }
sub right_node { $_[0]->[_RIGHT_NODE] }
sub parent { $_[0]->[_PARENT_NODE] }
sub user_data { $_[0]->[_USER_DATA] }
sub _do_call_user_data { $_[0]->[_DO_CALL_USER_DATA] }
sub set_left_node
{
my ($self, $node) = @_;
return $self->_set_node( $node, _LEFT_NODE );
}
sub set_right_node
{
my ($self, $node) = @_;
return $self->_set_node( $node, _RIGHT_NODE );
}
sub set_parent
{
my ($self, $parent) = @_;
my $current_parent = $self->[_PARENT_NODE];
$self->[_PARENT_NODE] = $parent;
return $current_parent;
}
sub set_user_data
{
my ($self, $data) = @_;
my $do_call_user_data = defined( $data )
&& Scalar::Util::blessed( $data )
&& $data->isa( 'Game::Collisions::UserData' );
$self->[_USER_DATA] = $data;
$self->[_DO_CALL_USER_DATA] = $do_call_user_data;
return;
}
sub resize_all_parents
{
my ($self) = @_;
my @nodes_to_resize = ($self);
while( @nodes_to_resize ) {
my $next_node = shift @nodes_to_resize;
push @nodes_to_resize, $next_node->parent
if defined $next_node->parent;
$next_node->_resize_to_fit_children;
}
return;
}
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.581 second using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )