Skip to content

Commit

Permalink
GRAPHICS: Add Renderable::collectMaterials()
Browse files Browse the repository at this point in the history
  • Loading branch information
DrMcCoy committed Jan 30, 2014
1 parent 3abaa6b commit 96a20c7
Show file tree
Hide file tree
Showing 9 changed files with 76 additions and 1 deletion.
12 changes: 12 additions & 0 deletions src/graphics/aurora/cube.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <OgreMesh.h>
#include <OgreMeshManager.h>
#include <OgreEntity.h>
#include <OgreSubEntity.h>

#include "common/ustring.h"
#include "common/util.h"
Expand Down Expand Up @@ -186,6 +187,17 @@ void Cube::setSelectable(bool selectable) {
Renderable::setSelectable(selectable);
}

void Cube::collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic, bool makeTransparent) {
Ogre::MaterialPtr material = _entity->getSubEntity(0)->getMaterial();
if (makeDynamic)
_entity->setMaterial((material = MaterialMan.makeDynamic(material)));

if (makeTransparent)
MaterialMan.setTransparent(material, true);

materials.push_back(material);
}

} // End of namespace Aurora

} // End of namespace Graphics
4 changes: 4 additions & 0 deletions src/graphics/aurora/cube.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ class Cube : public Renderable {
/** Change whether the cube can be selected (picked) by the user. */
void setSelectable(bool selectable);

protected:
/** Collect all materials used in the cube, optionally making them dynamic and/or transparent as well. */
void collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic = false, bool makeTransparent = false);

private:
Ogre::Entity *_entity;
};
Expand Down
11 changes: 11 additions & 0 deletions src/graphics/aurora/model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <OgreSceneManager.h>
#include <OgreMeshManager.h>
#include <OgreEntity.h>
#include <OgreSubEntity.h>
#include <OgreAnimation.h>
#include <OgreAnimationState.h>

Expand Down Expand Up @@ -257,6 +258,16 @@ void Model::showBoundingBox(bool show) {
}
}

void Model::collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic, bool makeTransparent) {
for (EntityList::iterator e = _entities.begin(); e != _entities.end(); ++e) {
Ogre::MaterialPtr material = (*e)->getSubEntity(0)->getMaterial();
if (makeDynamic)
(*e)->setMaterial((material = MaterialMan.makeDynamic(material)));

materials.push_back(material);
}
}

void Model::createNode(NodeEntity *&nodeEntity, State *state, Common::UString name, Ogre::SceneNode *parent) {
if (name.empty())
name = Common::generateIDRandomString();
Expand Down
4 changes: 3 additions & 1 deletion src/graphics/aurora/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,10 @@ class Model : public Renderable {
State *_currentState;


void setState(State *state);
/** Collect all materials used in the model, optionally making them dynamic and/or transparent as well. */
void collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic = false, bool makeTransparent = false);

void setState(State *state);

// General loading helpers

Expand Down
10 changes: 10 additions & 0 deletions src/graphics/aurora/quad.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,16 @@ void Quad::update() {
_needUpdate = false;
}

void Quad::collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic, bool makeTransparent) {
if (makeDynamic)
_entity->setMaterial((_material = MaterialMan.makeDynamic(_material)));

if (makeTransparent)
MaterialMan.setTransparent(_material, true);

materials.push_back(_material);
}

} // End of namespace Aurora

} // End of namespace Graphics
5 changes: 5 additions & 0 deletions src/graphics/aurora/quad.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ class Quad : public Renderable {
void setVisible(bool visible);


protected:
/** Collect all materials used in the quad, optionally making them dynamic and/or transparent as well. */
void collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic = false, bool makeTransparent = false);


private:
Common::UString _textureName;

Expand Down
20 changes: 20 additions & 0 deletions src/graphics/aurora/text.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,26 @@ void Text::setSelectable(bool selectable) {
Renderable::setSelectable(selectable);
}

void Text::collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic, bool makeTransparent) {
for (Ogre::Node::ChildNodeIterator c = _rootNode->getChildIterator(); c.hasMoreElements(); c.moveNext()) {
Ogre::SceneNode *node = (Ogre::SceneNode *) c.current()->second;

for (uint i = 0; i < node->numAttachedObjects(); i++) {
Ogre::MovableObject *object = node->getAttachedObject(i);

Ogre::Entity *entity = dynamic_cast<Ogre::Entity *>(object);
if (!entity)
continue;

for (uint j = 0; j < entity->getNumSubEntities(); j++) {
Ogre::SubEntity *subEntity = entity->getSubEntity(j);

materials.push_back(subEntity->getMaterial());
}
}
}
}

} // End of namespace Aurora

} // End of namespace Graphics
4 changes: 4 additions & 0 deletions src/graphics/aurora/text.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ class Text : public Renderable {
/** Change whether the text object can be selected (picked) by the user. */
void setSelectable(bool selectable);

protected:
/** Collect all materials used in the text object, optionally making them dynamic and/or transparent as well. */
void collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic = false, bool makeTransparent = false);

private:
FontHandle _font;

Expand Down
7 changes: 7 additions & 0 deletions src/graphics/renderable.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@
#ifndef GRAPHICS_RENDERABLE_H
#define GRAPHICS_RENDERABLE_H

#include <list>

#include <OgrePrerequisites.h>

#include "common/ustring.h"

namespace Ogre {
Expand Down Expand Up @@ -101,6 +105,9 @@ class Renderable {

void destroyAnimation(const Common::UString &name);
void destroyAnimation(Ogre::Animation *anim);

/** Collect all materials used in the renderable, optionally making them dynamic and/or transparent as well. */
virtual void collectMaterials(std::list<Ogre::MaterialPtr> &materials, bool makeDynamic = false, bool makeTransparent = false) = 0;
};

} // End of namespace Graphics
Expand Down

0 comments on commit 96a20c7

Please sign in to comment.