Methods
Wrapping some procs
After that, we use some methods in C++:
We have vertices's type already wrapped: Vec3ArrayRef.
The method push_back accepts and object typed osg::Vec3 as first parameter. So we start wrapping that type and constructor:
type
Vec3Obj {.importcpp: "osg::Vec3",
header: "<osg/Array>", bycopy.} = object
proc newVec3*(x,y,z:cdouble): Vec3Obj {.
importcpp: "osg::Vec3(@)", header: "<osg/Array>", constructor.}
Nothing to comment about Vec3Obj type, but a couple of things about the newVec3 constructor:
osg::Vec3(@): here@means all the parameters of thenewVec3proc. So '@will be replaced withx,y,z.constructor:- Also note: cdouble
Tip
I suggest compiling the nim code with --nimcache:myfolder. This way, you can inspect the generated .cpp files and see if what is being generated looks like it should. So execute:
After that, we can wrap the method push_back:
proc pushBack*(arr:Vec3ArrayRef; v:Vec3Obj) {.cdecl,
importcpp: "#->push_back(#)", header: "<osg/Array>".}
Vec3ArrayRef and Vec3Obj. It is worth noting:
-
importcpp: "#->push_back(#)": where#represents the parameters in order; so the first#appearance represent the first parameter in the proc (arr:Vec3ArrayRef) and the second#represent the second parameter in the proc (v:Vec3Obj). !!! note We could use@representing the remaining parameters in the proc when we have used#before. So above's would be equivalent to :importcpp: "#->push_back(@)", but@would represent the second, third, ... or whatever remaining proc parameters. -
->: also note that here we are using->insted of a.to call the method. This is plain C++ code. In C++, the dot operator is applied to the actual object while the arrow operator is used with a pointer to an object (which is our case now).
We would use the wrapped method as follows: