Skip to content

Commit 2fbc4cf

Browse files
committed
Add plane class
1 parent 4977d6c commit 2fbc4cf

File tree

5 files changed

+125
-2
lines changed

5 files changed

+125
-2
lines changed

lib/ODE/Collision/Plane.pm

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package ODE::Collision::Plane;
2+
use strict;
3+
use warnings;
4+
use vars qw(@ISA);
5+
require DynaLoader;
6+
our @ISA = qw(DynaLoader);
7+
8+
bootstrap ODE::Collision::Plane;
9+
10+
1;
11+
12+
__END__
13+
14+
=head1 NAME
15+
16+
ODE::Collision::Plane - Plane Geometry for Collision Detection
17+
18+
=head1 SYNOPSIS
19+
20+
use ODE;
21+
use ODE::Collision::Plane;
22+
23+
=head1 METHODS
24+
25+
26+
27+
=head1 ACKNOWLEDGEMENTS
28+
29+
Documentation almost taken verbatim from L<ODE's|http://opende.sourceforge.net/docs/group__collide__sphere.html>.
30+
31+
=head1 AUTHORS
32+
33+
See L<ODE/AUTHORS>.
34+
35+
=head1 COPYRIGHT AND LICENSE
36+
37+
See L<ODE/COPYRIGHT AND LICENSE>.
38+

lib/ODE/Collision/Plane.xs

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "EXTERN.h"
2+
#include "perl.h"
3+
#include "XSUB.h"
4+
#include "ppport.h"
5+
#include "helper.h"
6+
7+
#include <ode/ode.h>
8+
9+
MODULE = ODE::Collision::Plane PACKAGE = ODE::Collision::Plane PREFIX = ocp_
10+
11+
dGeomID
12+
ocp_create_plane( space, a, b, c, d )
13+
dSpaceID space
14+
dReal a
15+
dReal b
16+
dReal c
17+
dReal d
18+
PREINIT:
19+
char *CLASS = "ODE::Collision::Plane";
20+
CODE:
21+
RETVAL = dCreatePlane( space, a, b, c, d );
22+
OUTPUT:
23+
RETVAL
24+
25+
void
26+
ocp_set_params( plane, a, b, c, d )
27+
dGeomID plane
28+
dReal a
29+
dReal b
30+
dReal c
31+
dReal d
32+
CODE:
33+
dGeomPlaneSetParams( plane, a, b, c, d );
34+
35+
AV *
36+
ocp_get_params( plane )
37+
dGeomID plane
38+
CODE:
39+
dVector4 params;
40+
dGeomPlaneGetParams( plane, params );
41+
RETVAL = dv4_to_av(params);
42+
OUTPUT:
43+
RETVAL
44+

src/helper.h

+11
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ AV *dv3_to_av( dVector3 v )
1313
return array_ref;
1414
}
1515

16+
AV *dv4_to_av( dVector4 v )
17+
{
18+
AV* array_ref = newAV();
19+
av_push( array_ref, newSVnv(v[0]) );
20+
av_push( array_ref, newSVnv(v[1]) );
21+
av_push( array_ref, newSVnv(v[2]) );
22+
av_push( array_ref, newSVnv(v[3]) );
23+
sv_2mortal( (SV *)array_ref );
24+
return array_ref;
25+
}
26+
1627
AV *ptr_to_av( dReal *p, int count )
1728
{
1829
AV* array_ref = newAV();

t/00-load.t

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ use Test::Most 'bail';
55
BEGIN {
66
my @modules = qw /
77
ODE
8-
ODE::Collision::Sphere
98
ODE::Collision::Box
9+
ODE::Collision::Plane
1010
ODE::Collision::Space
11-
ODE::Objects::World
11+
ODE::Collision::Sphere
1212
ODE::Objects::Body
13+
ODE::Objects::World
1314
/;
1415
plan tests => scalar @modules;
1516

t/01-plane.t

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!perl
2+
use strict;
3+
use warnings;
4+
use Test::More;
5+
use ODE::Collision::Space;
6+
use ODE::Collision::Plane;
7+
8+
can_ok( 'ODE::Collision::Plane', qw( create_plane set_params get_params ) );
9+
10+
my $space_id = ODE::Collision::Space::simple_space_create();
11+
12+
# params (a, b, c, d) where (a, b, c) is a unit vector
13+
my @params = ( 0.3, 0.4, undef, 0.6 );
14+
$params[2] = sqrt( 1 - $params[0] * $params[0] - $params[1] * $params[1] );
15+
16+
my $plane = ODE::Collision::Plane::create_plane($space_id, @params);
17+
ok( $plane, 'create_plane' );
18+
19+
cmp_ok( abs( ODE::Collision::Plane::get_params($plane)->[0] - $params[0] ),
20+
'<', 1e-5, 'get_params a' );
21+
cmp_ok( abs( ODE::Collision::Plane::get_params($plane)->[1] - $params[1] ),
22+
'<', 1e-5, 'get_params b' );
23+
cmp_ok( abs( ODE::Collision::Plane::get_params($plane)->[2] - $params[2] ),
24+
'<', 1e-5, 'get_params c' );
25+
cmp_ok( abs( ODE::Collision::Plane::get_params($plane)->[3] - $params[3] ),
26+
'<', 1e-5, 'get_params d' );
27+
28+
done_testing();
29+

0 commit comments

Comments
 (0)