OGRE  14.3
Object-Oriented Graphics Rendering Engine
DotScene Overview

DotScene (aka .scene) is just a standardized XML file format.

This file format is meant to be used to set up a scene or scene-part. It is useful for any type of application/ game. Editors can export to .scene format, and apps can load the format.

Besides Ogre, the jMonkeyEngine also supports loading .scene files.

What is DotScene?

DotScene file does not contain any mesh data, texture data, etc. It just contains elements that describe a scene.

A simple .scene file example:

<scene formatVersion="1.1">
<nodes>
<node name="Robot" id="3">
<position x="10.0" y="5" z="10.5" />
<scale x="1" y="1" z="1" />
<entity name="Robot" meshFile="robot.mesh"/>
</node>
<node name="Omni01" id="5">
<position x="-23" y="49" z="18" />
<rotation qx="0" qy="0" qz="0" qw="1" />
<scale x="1" y="1" z="1" />
<light name="Omni01" type="point">
<colourDiffuse r="0.4" g="0.4" b="0.5" />
<colourSpecular r="0.5" g="0.5" b="0.5" />
</light>
</node>
</nodes>
</scene>

User Data

To add logic properties to the scene you can use the <userData> node as following:

<entity meshFile="Cube.mesh" name="Cube" >
<userData>
<property data="1.0" name="mass" type="float" />
<property data="1.0" name="mass_radius" type="float" />
</userData>
</entity>

On the C++ side, these are acessible via e.g.

Ogre::SceneManager* mSceneMgr = ...;
mSceneMgr->getEntity("Cube")->getUserObjectBindings().getUserAny("mass");
UserObjectBindings & getUserObjectBindings()
Class that provides convenient interface to establish a linkage between custom user application objec...
Definition: OgreMovableObject.h:339
Manages the organisation and rendering of a 'scene': a collection of objects and potentially world ge...
Definition: OgreSceneManager.h:238
Entity * getEntity(const String &name) const
Get a reference to a previously created object instance.
const Any & getUserAny(void) const
Retrieves the custom key less user object associated with this class.

How to use DotScene

To use DotScene it has to be loaded as another OGRE Plugin.

In plugins.cfg, add the following line:

Plugin=Plugin_DotScene

The Plugin will be then automatically used when you call SceneNode::loadChildren() like

Ogre::SceneNode* attachmentNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
// Set the desired resource group first and then load the Scene
attachmentNode->loadChildren("myScene.scene");
void setWorldResourceGroupName(const String &groupName)
Sets the resource group that 'world' resources will use.
Definition: OgreResourceGroupManager.h:806
static ResourceGroupManager & getSingleton(void)
Get the singleton instance.
SceneNode * getRootSceneNode(void)
Gets the SceneNode at the root of the scene hierarchy.
Class representing a node in the scene graph.
Definition: OgreSceneNode.h:61
virtual SceneNode * createChildSceneNode(const Vector3 &translate=Vector3::ZERO, const Quaternion &rotate=Quaternion::IDENTITY)
Creates an unnamed new SceneNode as a child of this node.
void loadChildren(const String &filename)
Load a scene from a file as children of this node.

If there is a TerrainGroup defined in the .scene file, you can get it by:

attachmentNode->getUserObjectBindings().getUserAny("TerrainGroup");
UserObjectBindings & getUserObjectBindings()
Class that provides convenient interface to establish a linkage between custom user application objec...
Definition: OgreNode.h:658

The type is std::shared_ptr<Ogre::TerrainGroup>, hence attachmentNode owns it and will take it down on destruction.

Instancing

The DotScene Plugin can process the static / instanced attributes of the Entity definition to add them to the scene as either Static Geometry or Instanced meshes.

See also
Instancing User-Guide
Static Geometry

Static Geometry

If your scene has entities with the static property then the name referenced by the property is interpreted by the plugin as the name of the Static Geometry Group For example:

<entity meshFile="Cube.mesh" name="Cube" static="Foliage" />

The plugin requires that the Static Geometry group or instance is created before loading the Scene and built afterwards. Continuing with the example above, supose you created a scene with entities belonging to the "Foliage" group.

// Create the StaticGeometry
Ogre::StaticGeometry* sg = mSceneMgr->createStaticGeometry("Foliage");
attachmentNode->loadChildren("myScene.scene");
// Build the StaticGeometry after loading the Scene
sg->build();
StaticGeometry * createStaticGeometry(const String &name)
Creates a StaticGeometry instance suitable for use with this SceneManager.
Pre-transforms and batches up meshes for efficient use as static geometry in a scene.
Definition: OgreStaticGeometry.h:121
virtual void build(void)
Build the geometry.

Any configuration for the StaticGeometry should be done before the build() call.

Instance Manager

If your scene has entities with the instanced property then the name referenced by the property is interpreted by the plugin as the name of the Instance Manager For example:

<entity meshFile="Cube.mesh" name="Cube" instanced="Foliage" />

The plugin requires that the Instance Manager is created before loading the Scene. Continuing with the example above, supose you created a scene with entities that you want to create with the "Foliage" Instance Manager.

Note
Be aware that only the first submesh of the mesh is taken into account, if you have an Entity with many submeshes only the first one will be shown.
// Create the InstanceManager
Ogre::InstanceManager* im = mSceneMgr->createInstanceManager("Foliage", "Cube.mesh", "MyGroup", Ogre::InstanceManager::ShaderBased, 80, Ogre::IM_USEALL);
attachmentNode->loadChildren("myScene.scene");
This is the main starting point for the new instancing system.
Definition: OgreInstanceManager.h:59
InstanceManager * createInstanceManager(const String &customName, const String &meshName, const String &groupName, InstanceManager::InstancingTechnique technique, size_t numInstancesPerBatch, uint16 flags=0, unsigned short subMeshIdx=0)
Creates an InstanceManager interface to create & manipulate instanced entities You need to call this ...
@ IM_USEALL
Definition: OgreCommon.h:360
@ ShaderBased
Any SM 2.0+ InstanceBatchShader
Definition: OgreInstanceManager.h:63

Any configuration for the InstanceManager should be done before calling loadChildren()