ruby-ogre

Overview

Ruby-ogre is a ruby extension library set for Ogre, OIS and OgreProcedural.

How to install

This project has a pre-compiled gem.

 $ sudo gem install pkg/ruby-ogre-<version>-<arch>.gem

Usages

Run a sample application.

 $ /var/lib/gems/<ruby-version>/gems/ruby-ogre-<version>-<arch>/sample/Charactor/sinbad

How to compile

see INSTALL.md

About APIs

This is a wrapper library set converted by Swig. Swig is a excellent tool, but it has several limitations to make complete wrapper interfaces.(ex. not supported nested class.)
So I list some notes here.

Documents for original APIs.

Basic Conversion

** C++ **
root = new Ogre::Root("");
root->initialise(true, "Sinbad");
root->addFrameListener(this);

** Ruby **
root = Ogre::Root.new("")
root.initialise(true, "Sinbad")
root.add_frame_listener(self)

Nested Class

Swig does not support the nested class, so ruby-ogre doesn't support it. Luckily, it does not matter so much because the main classes of Ogre are the top level classes.

To be precise, swig has a workaroud for the nested class syntax that expands it to a top level class. I tried this (ref. bindings/ogre/interface/OgreResourceGroupManager.i), but it is not introduced into all of the nested classes and definitions. I'm grad to receive some pull request or another cool idea about this.

Iterator (complex template)

There is another swig problem, template expansion. As same as the nested class problem, swig has a workaround but ogre has some complex templates enough to beat me =). Though I tried to fight these templates (see, bindings/ogre/interface/OgreConfigFile.i), I could not expand finally.

Instead, I took a policy to define "each" method on the class with the major iterator. (see, bindings/ogre/interface/OgreConfigFile.i::each_Settings). But as same as the nested class problem, it is not introduced into all. I'm glad if I can receive some pull request or another cool idea about this.

 ** C++ **
 Ogre::ConfigFile cf;
 cf.load("./resources.cfg");
 Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
 Ogre::String secName, typeName, archName;
 while (seci.hasMoreElements())
 {
    secName = seci.peekNextKey();
    Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
    Ogre::ConfigFile::SettingsMultiMap::iterator i;
    for (i = settings->begin(); i != settings->end(); ++i)
    {
        typeName = i->first;
        archName = i->second;
        Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
            archName, typeName, secName);
    }
 }


 ** Ruby **
 cf = Ogre::ConfigFile.new
 cf.load("./resources.cfg")
 cf.each_settings {|secName, typeName, archName|
   Ogre::ResourceGroupManager::get_singleton().add_resource_location(
            archName, typeName, secName)
 }

Scope

Most ruby objects have a corresponding C++ object pointer. So it will occurs a segmentation fault if you store a root object into a local scope value, like the following example.

def init
  root = Ogre::Root.new("")
end

License

Ruby-ogre is licensed under MIT License.

Copyright (C) 2012 [email protected]