Skip to content

Commit 775434f

Browse files
committed
Add new vector typemaps
dVector3 and dVector4 now return arrays and not arrayrefs.
1 parent cfb719b commit 775434f

File tree

9 files changed

+78
-47
lines changed

9 files changed

+78
-47
lines changed

lib/ODE/Collision/Box.xs

+2-10
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,11 @@ ocb_set_lengths( box, lx, ly, lz )
2929
CODE:
3030
dGeomBoxSetLengths( box, lx, ly, lz );
3131

32-
AV*
32+
dVector3
3333
ocb_get_lengths( box )
3434
dGeomID box
3535
CODE:
36-
// make our destination vector
37-
AV* array_ref = newAV();
38-
dVector3 lengths;
39-
dGeomBoxGetLengths( box, lengths );
40-
av_push( array_ref, newSVnv(lengths[0]) );
41-
av_push( array_ref, newSVnv(lengths[1]) );
42-
av_push( array_ref, newSVnv(lengths[2]) );
43-
RETVAL = array_ref;
44-
sv_2mortal( (SV *)RETVAL );
36+
dGeomBoxGetLengths( box, RETVAL );
4537
OUTPUT:
4638
RETVAL
4739

lib/ODE/Collision/Plane.xs

+2-4
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,11 @@ ocp_set_params( plane, a, b, c, d )
3232
CODE:
3333
dGeomPlaneSetParams( plane, a, b, c, d );
3434

35-
AV *
35+
dVector4
3636
ocp_get_params( plane )
3737
dGeomID plane
3838
CODE:
39-
dVector4 params;
40-
dGeomPlaneGetParams( plane, params );
41-
RETVAL = dv4_to_av(params);
39+
dGeomPlaneGetParams( plane, RETVAL );
4240
OUTPUT:
4341
RETVAL
4442

lib/ODE/Objects/Body.xs

+7-3
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ oob_set_position( body, x, y, z )
3131
CODE:
3232
dBodySetPosition( body, x, y, z );
3333

34-
AV *
34+
dReal *
3535
oob_get_position( body )
3636
dBodyID body
37+
PREINIT:
38+
U32 size_RETVAL;
3739
CODE:
38-
dReal *p = dBodyGetPosition( body );
39-
RETVAL = ptr_to_av( p, 3 );
40+
size_RETVAL = 3;
41+
RETVAL = dBodyGetPosition( body );
4042
OUTPUT:
4143
RETVAL
44+
CLEANUP:
45+
XSRETURN(size_RETVAL);
4246

lib/ODE/Objects/World.xs

+2-5
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,14 @@ oow_set_gravity( world, x, y, z )
3030
CODE:
3131
dWorldSetGravity( world, x, y, z );
3232

33-
AV*
33+
dVector3
3434
oow_get_gravity( world )
3535
dWorldID world
3636
CODE:
37-
dVector3 gravity;
38-
dWorldGetGravity( world, gravity );
39-
RETVAL = dv3_to_av( gravity );
37+
dWorldGetGravity( world, RETVAL );
4038
OUTPUT:
4139
RETVAL
4240

43-
4441
void
4542
oow_set_erp( world, erp )
4643
dWorldID world

t/body.t

+4-6
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@ my @position = ( 1, 2, 3 );
1616

1717
ODE::Objects::Body::set_position( $body, @position );
1818

19-
cmp_ok( abs( ODE::Objects::Body::get_position($body)->[0] - $position[0] ),
20-
'<', 1e-5, 'get_position x' );
21-
cmp_ok( abs( ODE::Objects::Body::get_position($body)->[1] - $position[1] ),
22-
'<', 1e-5, 'get_position y' );
23-
cmp_ok( abs( ODE::Objects::Body::get_position($body)->[2] - $position[2] ),
24-
'<', 1e-5, 'get_position z' );
19+
my @_position = ODE::Objects::Body::get_position($body);
20+
cmp_ok( abs( $_position[0] - $position[0] ), '<', 1e-5, 'get_position x' );
21+
cmp_ok( abs( $_position[1] - $position[1] ), '<', 1e-5, 'get_position y' );
22+
cmp_ok( abs( $_position[2] - $position[2] ), '<', 1e-5, 'get_position z' );
2523

2624
done_testing();
2725

t/box.t

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ my $space = ODE::Collision::Space::simple_space_create();
1313
ok( my $box = ODE::Collision::Box::create_box( $space, 0.3, 0.4, 0.5 ),
1414
'creating box 0.3 x 0.4 x 0.5' );
1515

16-
my $lengths = ODE::Collision::Box::get_lengths($box);
17-
cmp_ok( abs( $lengths->[0] - 0.3 ),
16+
my @lengths = ODE::Collision::Box::get_lengths($box);
17+
cmp_ok( abs( $lengths[0] - 0.3 ),
1818
'<', 1e-5, 'get_lengths got proper initialization value (x)' );
19-
cmp_ok( abs( $lengths->[1] - 0.4 ),
19+
cmp_ok( abs( $lengths[1] - 0.4 ),
2020
'<', 1e-5, 'get_lengths got proper initialization value (y)' );
21-
cmp_ok( abs( $lengths->[2] - 0.5 ),
21+
cmp_ok( abs( $lengths[2] - 0.5 ),
2222
'<', 1e-5, 'get_lengths got proper initialization value (z)' );
2323

2424
done_testing();

t/plane.t

+5-8
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,11 @@ $params[2] = sqrt( 1 - $params[0] * $params[0] - $params[1] * $params[1] );
1616
my $plane = ODE::Collision::Plane::create_plane( $space, @params );
1717
ok( $plane, 'create_plane' );
1818

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' );
19+
my @_params = ODE::Collision::Plane::get_params($plane);
20+
cmp_ok( abs( $_params[0] - $params[0] ), '<', 1e-5, 'get_params a' );
21+
cmp_ok( abs( $_params[1] - $params[1] ), '<', 1e-5, 'get_params b' );
22+
cmp_ok( abs( $_params[2] - $params[2] ), '<', 1e-5, 'get_params c' );
23+
cmp_ok( abs( $_params[3] - $params[3] ), '<', 1e-5, 'get_params d' );
2724

2825
done_testing();
2926

t/world.t

+4-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,10 @@ my $world = ODE::Objects::World::create();
1111
my @gravity = ( 1, 2, 3 );
1212
ODE::Objects::World::set_gravity( $world, @gravity );
1313

14-
cmp_ok( abs( ODE::Objects::World::get_gravity($world)->[0] - $gravity[0] ),
15-
'<', 1e-5, 'get_gravity x' );
16-
cmp_ok( abs( ODE::Objects::World::get_gravity($world)->[1] - $gravity[1] ),
17-
'<', 1e-5, 'get_gravity y' );
18-
cmp_ok( abs( ODE::Objects::World::get_gravity($world)->[2] - $gravity[2] ),
19-
'<', 1e-5, 'get_gravity z' );
14+
my @_gravity = ODE::Objects::World::get_gravity($world);
15+
cmp_ok( abs( $_gravity[0] - $gravity[0] ), '<', 1e-5, 'get_gravity x' );
16+
cmp_ok( abs( $_gravity[1] - $gravity[1] ), '<', 1e-5, 'get_gravity y' );
17+
cmp_ok( abs( $_gravity[2] - $gravity[2] ), '<', 1e-5, 'get_gravity z' );
2018

2119
done_testing();
2220

typemap

+48-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
TYPEMAP
22
int T_IV
33
dReal T_NV
4-
4+
dReal * T_ARRAY
5+
dVector3 O_VEC3
6+
dVector4 O_VEC4
57
dBodyID T_PTR
68
dGeomID T_PTR
79
dSpaceID T_PTR
@@ -19,6 +21,27 @@ O_OBJECT
1921
XSRETURN_UNDEF;
2022
}
2123

24+
# These are copies of the T_ARRAY typemap.
25+
O_VEC3
26+
U32 ix_$var = $argoff;
27+
$var = $ntype(items -= $argoff);
28+
while ( items-- ) {
29+
DO_ARRAY_ELEM;
30+
ix_$var++;
31+
}
32+
/* this is the number of elements in the array */
33+
ix_$var -= $argoff
34+
35+
O_VEC4
36+
U32 ix_$var = $argoff;
37+
$var = $ntype(items -= $argoff);
38+
while ( items-- ) {
39+
DO_ARRAY_ELEM;
40+
ix_$var++;
41+
}
42+
/* this is the number of elements in the array */
43+
ix_$var -= $argoff
44+
2245
OUTPUT
2346

2447
# The Perl object is blessed into 'CLASS', which should be a
@@ -33,3 +56,27 @@ O_OBJECT
3356
XSRETURN_UNDEF;
3457
}
3558

59+
# These are copies of the T_ARRAY typemap, but modified to accept
60+
# fixed sized arrays of double values.
61+
O_VEC3
62+
{
63+
U32 v_index;
64+
EXTEND( SP, 3 );
65+
for ( v_index = 0; v_index < 3; v_index++ ) {
66+
ST( v_index ) = sv_newmortal();
67+
sv_setnv( ST(v_index), (double)${var}[v_index] );
68+
}
69+
XSRETURN(3);
70+
}
71+
72+
O_VEC4
73+
{
74+
U32 v_index;
75+
EXTEND( SP, 4 );
76+
for ( v_index = 0; v_index < 4; v_index++ ) {
77+
ST( v_index ) = sv_newmortal();
78+
sv_setnv( ST(v_index), (double)${var}[v_index] );
79+
}
80+
XSRETURN(4);
81+
}
82+

0 commit comments

Comments
 (0)