support for C++ code generation; importcpp and importobjc pragmas

This commit is contained in:
Araq
2011-08-07 21:02:09 +02:00
parent 7748dbc0b2
commit 5131b3cea4
29 changed files with 512 additions and 189 deletions

View File

@@ -0,0 +1,114 @@
# Horrible example of how to interface with a C++ engine ... ;-)
{.link: "/usr/lib/libIrrlicht.so".}
{.emit: """
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
""".}
const
irr = "<irrlicht/irrlicht.h>"
type
TDimension2d {.final, header: irr, importc: "dimension2d".} = object
Tvector3df {.final, header: irr, importc: "vector3df".} = object
TColor {.final, header: irr, importc: "SColor".} = object
TIrrlichtDevice {.final, header: irr, importc: "IrrlichtDevice".} = object
TIVideoDriver {.final, header: irr, importc: "IVideoDriver".} = object
TISceneManager {.final, header: irr, importc: "ISceneManager".} = object
TIGUIEnvironment {.final, header: irr, importc: "IGUIEnvironment".} = object
TIAnimatedMesh {.final, header: irr, importc: "IAnimatedMesh".} = object
TIAnimatedMeshSceneNode {.final, header: irr,
importc: "IAnimatedMeshSceneNode".} = object
TITexture {.final, header: irr, importc: "ITexture".} = object
PIrrlichtDevice = ptr TIrrlichtDevice
PIVideoDriver = ptr TIVideoDriver
PISceneManager = ptr TISceneManager
PIGUIEnvironment = ptr TIGUIEnvironment
PIAnimatedMesh = ptr TIAnimatedMesh
PIAnimatedMeshSceneNode = ptr TIAnimatedMeshSceneNode
PITexture = ptr TITexture
proc dimension2d(x, y: cint): TDimension2d {.
header: irr, importc: "dimension2d<u32>".}
proc vector3df(x,y,z: cint): Tvector3df {.
header: irr, importc: "vector3df".}
proc SColor(r,g,b,a: cint): TColor {.
header: irr, importc: "SColor".}
proc createDevice(): PIrrlichtDevice {.
header: irr, importc: "createDevice".}
proc run(device: PIrrlichtDevice): bool {.
header: irr, importcpp: "run".}
proc getVideoDriver(dev: PIrrlichtDevice): PIVideoDriver {.
header: irr, importcpp: "getVideoDriver".}
proc getSceneManager(dev: PIrrlichtDevice): PISceneManager {.
header: irr, importcpp: "getSceneManager".}
proc getGUIEnvironment(dev: PIrrlichtDevice): PIGUIEnvironment {.
header: irr, importcpp: "getGUIEnvironment".}
proc getMesh(smgr: PISceneManager, path: cstring): PIAnimatedMesh {.
header: irr, importcpp: "getMesh".}
proc drawAll(smgr: PISceneManager) {.
header: irr, importcpp: "drawAll".}
proc drawAll(guienv: PIGUIEnvironment) {.
header: irr, importcpp: "drawAll".}
proc drop(dev: PIrrlichtDevice) {.
header: irr, importcpp: "drop".}
proc getTexture(driver: PIVideoDriver, path: cstring): PITexture {.
header: irr, importcpp: "getTexture".}
proc endScene(driver: PIVideoDriver) {.
header: irr, importcpp: "endScene".}
proc beginScene(driver: PIVideoDriver, a, b: bool, c: TColor) {.
header: irr, importcpp: "beginScene".}
proc addAnimatedMeshSceneNode(
smgr: PISceneManager, mesh: PIAnimatedMesh): PIAnimatedMeshSceneNode {.
header: irr, importcpp: "addAnimatedMeshSceneNode".}
proc setMaterialTexture(n: PIAnimatedMeshSceneNode, x: cint, t: PITexture) {.
header: irr, importcpp: "setMaterialTexture".}
proc addCameraSceneNode(smgr: PISceneManager, x: cint, a, b: TVector3df) {.
header: irr, importcpp: "addCameraSceneNode".}
var device = createDevice()
if device == nil: quit "device is nil"
var driver = device.getVideoDriver()
var smgr = device.getSceneManager()
var guienv = device.getGUIEnvironment()
var mesh = smgr.getMesh("/home/andreas/download/irrlicht-1.7.2/media/sydney.md2")
if mesh == nil:
device.drop()
quit "no mesh!"
var node = smgr.addAnimatedMeshSceneNode(mesh)
if node != nil:
#node->setMaterialFlag(EMF_LIGHTING, false)
#node->setMD2Animation(scene::EMAT_STAND)
node.setMaterialTexture(0,
driver.getTexture(
"/home/andreas/download/irrlicht-1.7.2/media/media/sydney.bmp"))
smgr.addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0))
while device.run():
driver.beginScene(true, true, SColor(255,100,101,140))
smgr.drawAll()
guienv.drawAll()
driver.endScene()
device.drop()

View File

@@ -0,0 +1,40 @@
# horrible example of how to interface with GNUStep ...
{.passL: "-lobjc".}
{.emit: """
#include <objc/Object.h>
@interface Greeter:Object
{
}
- (void)greet:(long)x y:(long)dummy;
@end
#include <stdio.h>
@implementation Greeter
- (void)greet:(long)x y:(long)dummy
{
printf("Hello, World!\n");
}
@end
#include <stdlib.h>
""".}
type
TId {.importc: "id", header: "<objc/Object.h>", final.} = distinct int
proc newGreeter: TId {.importobjc: "Greeter new", nodecl.}
proc greet(self: TId, x, y: int) {.importobjc: "greet", nodecl.}
proc free(self: TId) {.importobjc: "free", nodecl.}
var g = newGreeter()
g.greet(12, 34)
g.free()