Advertisement

Binder code generation using libclang + a preprocessor for c++ syntactic sugar

Started by August 02, 2012 04:46 PM
3 comments, last by WitchLord 12 years, 5 months ago
Writing binder code is a chore and I figured it wouldn't be too hard to use libclang + a python script to automatically generate them. In the end I spent far, far, faaaar more time on the python script than what it would have taken to write the binding code manually, but now it's at a state where it is actually useful in my code base. Configuration is done via a json script with lots of options for regular expression matching.

The very simple preprocessor, unrelated to the above allows you to use -> object dereferencing and * pointers, allowing more code to be copy and pasted between your c++ code base and AngelScript scripts and set typedefs for types that aren't AngelScript builtins. This also lets you tell your editor that your AngelScript files are c++ files so you get code completion, error checking etc.

As an example the following is all AngelScript code for a simple test in my engine before it goes through the preprocessor:
#include "System/Engine.h"
#include "Effect/MarchingCubes.h"
#include "Effect/MetaSphere.h"
#include "Physics/PhysicsWorld.h"
#include "Renderer/Renderer.h"
#include "Renderer/GfxDevice.h"
#include "Physics/RigidBody.h"
#include "Physics/RigidBodyNode.h"
#include "3D/Entity.h"
void mainscript(Engine* engine, RenderNode* n)
{
PhysicsWorld* w = engine->GetPhysicsWorld();
Shape* sphere = w->CreateSphereShape(1.0);
Shape* plane = w->CreateStaticPlaneShape(Vector3(0,1,0), 1);
RigidBody* sphereBody = w->CreateRigidBody(1.0, sphere);
sphereBody->SetTransform(Transform(Quaternion(0,0,0,1), Vector3(0, 50, 0)));
RigidBody* planeBody = w->CreateRigidBody(0.0, plane);
planeBody->SetTransform(Transform(Quaternion(0,0,0,1), Vector3(0, -1, 0)));
n->SetTransformIndex(sphereBody->GetRigidBodyNode()->GetTransformIndex());
w->AddRigidBody(sphereBody);
w->AddRigidBody(planeBody);
MetaSphere ms;
MarchingCubes mc(&ms, 0.7f);
Camera camera;
camera.SetLocalTransform(Transform(Quaternion(0, 0, 0, 1), Vector3(0, 0, 40)));
GfxDevice* gfx = engine->GetGfxDevice();
Renderer* rend = gfx->GetRenderer();
float add = 3.0/60.0f;
float time = 0;
while (gfx->IsOpen())
{
time += add;
//LogDebug("Render");
ms.Update(time);
mc.Lock();
for (int i = 0; i < ms.GetCount(); i++)
{
// TODO: this starts walking from inside the center of the sphere.
// As we only care about the surface, it'd be better if we could
// start at a surface cube rather than having to scan all cubes
// from the center of the sphere out to the surface.
Vector3 pos = ms.GetCenter(i);
mc.WalkVoxel(pos.x(),pos.y(),pos.z());
}
mc.Unlock();
mc.Update();
n->SetMesh(mc.GetMesh());
engine->Update();
engine->PrepareRendering(&camera);
rend->Render(n);
engine->FinishRendering();
gfx->SwapBuffers();
}
sphere->DelRef();
plane->DelRef();
sphereBody->DelRef();
planeBody->DelRef();
}


Use if you want, don't if you don't cool.png
Nice! Just what I need: Angelscript code looking extremely similar to C++! Just gave a quick look at the preprocessor... you´re basically performing a "search and replace" so "->" goes "." and " * " turns to "@", right? In other words, pointers end up being (safe) references? Haven´t tried it yet, but just came to my mind: What happens if I want to print some text that includes "->" and/or " * "? Will the preprocessor change those to "." and "@"?

I´ve also noticed I´ll need Boost to use this, right?
Advertisement
It's a regular expression search and replace pretty much, and I don't intend to do anything other than that with it. I consider it to be public domain so do with it what you want. "->" is directly replaced as is, * is doing a little bit more clever stuff to avoid replacing legitimate uses of it (such as a multiply operation). Boost is used for the regex capabilities and the foreach statement.
It would be nice to have "new" and "delete" now that we have "->" and " * "... ;)

I´ll see if I can add those myself, as soon as i can get rid of one nasty bug that´s been crashing my code for the last few days.
I've added a link to this on the wiki.

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

This topic is closed to new replies.

Advertisement