mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-19 15:31:28 +00:00
support for C++ code generation; importcpp and importobjc pragmas
This commit is contained in:
114
examples/c++iface/irrlichtex.nim
Normal file
114
examples/c++iface/irrlichtex.nim
Normal 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()
|
||||
|
||||
40
examples/objciface/gnustepex.nim
Normal file
40
examples/objciface/gnustepex.nim
Normal 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()
|
||||
|
||||
Reference in New Issue
Block a user