1. Wrapping Functions When Matrix is Involved

Hello,

I know a matrix is an array of numbers. However I'm not sure how one would wrap them when making a wrapper. For example.

C Code

http://newtondynamics.com/wiki/index.php5?title=NewtonCreateBox --Documentation in case needed 
 
NewtonCollision* NewtonCreateBox( const NewtonWorld* newtonWorld, dFloat dx, dFloat dy, dFloat dz, int shapeID, const dFloat *offsetMatrix) 

Eu Code

public constant xNewtonCreateBox = define_c_func(nd,"NewtonCreateBox",{C_POINTER,C_FLOAT,C_FLOAT,C_FLOAT,C_INT,C_POINTER},C_POINTER) 
 
public function NewtonCreateBox(atom world,atom x,atom y,atom z,atom id,atom matrix) 
 
 return c_func(xNewtonCreateBox,{world,x,y,z,id,matrix}) 
	 
end function 

The code above appears correct, but I feel I am wrapping part of it wrong, perhaps? I know the matrix is a pointer float.

new topic     » topic index » view message » categorize

2. Re: Wrapping Functions When Matrix is Involved

You just need to allocate the space for the floats, poke them into that space, and then pass the pointer to the function.

Not sure why we don't have peek/poke float functions in the standard library. But this is how you'd do it:

procedure poke_float32( atom ptr, object value ) 
 
    if atom( value ) then 
        value = {value} 
    end if 
 
    for i = 1 to length( value ) do 
        poke( ptr, atom_to_float32(value[i]) ) 
        ptr += sizeof(C_FLOAT) 
    end for 
 
end procedure 
 
public constant xNewtonCreateBox = define_c_func( nd,"NewtonCreateBox", {C_POINTER,C_FLOAT,C_FLOAT,C_FLOAT,C_INT,C_POINTER}, C_POINTER ) 
 
public function NewtonCreateBox( atom world, atom x, atom y, atom z, atom id, sequence matrix ) 
 
    -- we assume matrix is of non-zero length 
    atom p_matrix = allocate_data( sizeof(C_FLOAT) * length(matrix), TRUE ) -- cleanup = TRUE 
 
    poke_float32( p_matrix, matrix ) 
 
    return c_func( xNewtonCreateBox, {world,x,y,z,id,p_matrix} ) 
end function 

-Greg

new topic     » goto parent     » topic index » view message » categorize

3. Re: Wrapping Functions When Matrix is Involved

ghaberek said...

You just need to allocate the space for the floats, poke them into that space, and then pass the pointer to the function.

Not sure why we don't have peek/poke float functions in the standard library. But this is how you'd do it:

procedure poke_float32( atom ptr, object value ) 
 
    if atom( value ) then 
        value = {value} 
    end if 
 
    for i = 1 to length( value ) do 
        poke( ptr, atom_to_float32(value[i]) ) 
        ptr += sizeof(C_FLOAT) 
    end for 
 
end procedure 
 
public constant xNewtonCreateBox = define_c_func( nd,"NewtonCreateBox", {C_POINTER,C_FLOAT,C_FLOAT,C_FLOAT,C_INT,C_POINTER}, C_POINTER ) 
 
public function NewtonCreateBox( atom world, atom x, atom y, atom z, atom id, sequence matrix ) 
 
    -- we assume matrix is of non-zero length 
    atom p_matrix = allocate_data( sizeof(C_FLOAT) * length(matrix), TRUE ) -- cleanup = TRUE 
 
    poke_float32( p_matrix, matrix ) 
 
    return c_func( xNewtonCreateBox, {world,x,y,z,id,p_matrix} ) 
end function 

-Greg

Thanks, this works, except for I don't think Euphoria has a sizeof function. I briefed through the manual, but didn't find anything. Unless allocate() can be subsistuted for sizeof?

new topic     » goto parent     » topic index » view message » categorize

4. Re: Wrapping Functions When Matrix is Involved

include std/dll.e 
 
? sizeof(C_FLOAT) 

4

Euphoria 4.1 beta 2

8.41.2.5

sizeof

<built-in> function sizeof( atom data_type )

Parameters:

data_type A C data type constant

Returns the size, in bytes of the specified data type.

https://sites.google.com/site/euphoriagtk/Screenshotfrom2019-05-2710-14-42.png

new topic     » goto parent     » topic index » view message » categorize

5. Re: Wrapping Functions When Matrix is Involved

irv said...
include std/dll.e 
 
? sizeof(C_FLOAT) 

4

Euphoria 4.1 beta 2

8.41.2.5

sizeof

<built-in> function sizeof( atom data_type )

Parameters:

data_type A C data type constant

Returns the size, in bytes of the specified data type.

https://sites.google.com/site/euphoriagtk/Screenshotfrom2019-05-2710-14-42.png

I see. I'm still using 4.0.5. I'm now switched to using Eu 4.1.0 Beta 2 and its working quite well and of course sizeof works now!

new topic     » goto parent     » topic index » view message » categorize

6. Re: Wrapping Functions When Matrix is Involved

Icy_Viking said...

I see. I'm still using 4.0.5

The more people who use 4.1, the sooner any bugs will be found, and the sooner they can be fixed.

I think that EuGTK is complex enough to be a fair test of Eu 4.1, and so far, only one "sort of" bug has shown up. It could also simply be documented as an "illegal operation", without inconveniencing anyone significantly. Don't let that stop you from using 4.1 b 2.

new topic     » goto parent     » topic index » view message » categorize

7. Re: Wrapping Functions When Matrix is Involved

irv said...
Icy_Viking said...

I see. I'm still using 4.0.5

The more people who use 4.1, the sooner any bugs will be found, and the sooner they can be fixed.

I think that EuGTK is complex enough to be a fair test of Eu 4.1, and so far, only one "sort of" bug has shown up. It could also simply be documented as an "illegal operation", without inconveniencing anyone significantly. Don't let that stop you from using 4.1 b 2.

I just edited my post. I just switched to 4.1.0 Beta 2 and so far everything is working. Also, that sizeof function is handy. Now all we need is a useful way to easily wrap structs, or if Eu had a struct function of its own.

new topic     » goto parent     » topic index » view message » categorize

8. Re: Wrapping Functions When Matrix is Involved

Icy_Viking said...

Now all we need is a useful way to easily wrap structs, or if Eu had a struct function of its own.

There several options available in The Archive. I wrap all my structs by hand without much difficulty. See this comment.

I'd like to get Matt's memstruct* changes merged it after we get a proper 4.1 release out. It seems ripe for being a "version 4.2" feature.

(*Although I'm strongly considering changing "memstruct" to just "struct" -- but I suppose we'll burn that bridge when we get to it.)

So how is that 4.1 release going, anyway? I'm still struggling with the spaghetti soup that is the monolithic Makefile.

It's slow-going and I've been putting more effort into Euphoria MVC because I think more work is need to refresh the website.

If anything, rebuilding the website will act as a good proof-of-concept that 4.1 is viable for full release.

-Greg

new topic     » goto parent     » topic index » view message » categorize

9. Re: Wrapping Functions When Matrix is Involved

ghaberek said...
Icy_Viking said...

Now all we need is a useful way to easily wrap structs, or if Eu had a struct function of its own.

There several options available in The Archive. I wrap all my structs by hand without much difficulty. See this comment.

I'd like to get Matt's memstruct* changes merged it after we get a proper 4.1 release out. It seems ripe for being a "version 4.2" feature.

(*Although I'm strongly considering changing "memstruct" to just "struct" -- but I suppose we'll burn that bridge when we get to it.)

So how is that 4.1 release going, anyway? I'm still struggling with the spaghetti soup that is the monolithic Makefile.

It's slow-going and I've been putting more effort into Euphoria MVC because I think more work is need to refresh the website.

If anything, rebuilding the website will act as a good proof-of-concept that 4.1 is viable for full release.

-Greg

4.1.0 beta 2 is going well for me. I'll take a look at that comment. Also, adding/changing memstruct to struct would be a good idea I think and would be a good idea to include as a feature in 4.2. Also, a new re-built website would also be nice as well.

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu