abexsoft / ruby-ogre

Ruby-ogre is a ruby extension for Ogre.
Other
6 stars 2 forks source link

ruby-ogre

Ruby-ogre is a ruby binding for Ogre.

Installation

Add this line to your application's Gemfile:

gem 'ruby-ogre'

And then execute:

$ bundle

Or install it yourself as:

$ gem install ruby-ogre

Usages

Run a sample application.

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

How to install from source.

If you want to compile from source, try the following.

$ git clone git://github.com/abexsoft/ruby-ogre.git 
$ cd ruby-ogre 
$ rake download 
$ rake compile 
$ rake build 
$ gem build ruby-ogre.gemspec
$ gem install ruby-ogre-<version>-<arch>.gem 

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 abexsoft@gmail.com