mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-06 16:15:33 +00:00
Set alpha value of character animations according to Invisibility / Chameleon effects.
This commit is contained in:
parent
9fcb4fad5c
commit
37a7ee8fcd
9 changed files with 125 additions and 39 deletions
|
@ -727,6 +727,8 @@ void CharacterController::update(float duration)
|
||||||
const MWWorld::Class &cls = MWWorld::Class::get(mPtr);
|
const MWWorld::Class &cls = MWWorld::Class::get(mPtr);
|
||||||
Ogre::Vector3 movement(0.0f);
|
Ogre::Vector3 movement(0.0f);
|
||||||
|
|
||||||
|
updateVisibility();
|
||||||
|
|
||||||
if(!cls.isActor())
|
if(!cls.isActor())
|
||||||
{
|
{
|
||||||
if(mAnimQueue.size() > 1)
|
if(mAnimQueue.size() > 1)
|
||||||
|
@ -1130,4 +1132,25 @@ void CharacterController::updateContinuousVfx()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CharacterController::updateVisibility()
|
||||||
|
{
|
||||||
|
if (!mPtr.getClass().isActor())
|
||||||
|
return;
|
||||||
|
float alpha = 1.f;
|
||||||
|
if (mPtr.getClass().getCreatureStats(mPtr).getMagicEffects().get(ESM::MagicEffect::Invisibility).mMagnitude)
|
||||||
|
{
|
||||||
|
if (mPtr.getRefData().getHandle() == "player")
|
||||||
|
alpha = 0.4f;
|
||||||
|
else
|
||||||
|
alpha = 0.f;
|
||||||
|
}
|
||||||
|
float chameleon = mPtr.getClass().getCreatureStats(mPtr).getMagicEffects().get(ESM::MagicEffect::Chameleon).mMagnitude;
|
||||||
|
if (chameleon)
|
||||||
|
{
|
||||||
|
alpha *= std::max(0.2f, (100.f - chameleon)/100.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
mAnimation->setAlpha(alpha);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,6 +173,8 @@ class CharacterController
|
||||||
|
|
||||||
bool updateNpcState(bool onground, bool inwater, bool isrunning, bool sneak);
|
bool updateNpcState(bool onground, bool inwater, bool isrunning, bool sneak);
|
||||||
|
|
||||||
|
void updateVisibility();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CharacterController(const MWWorld::Ptr &ptr, MWRender::Animation *anim);
|
CharacterController(const MWWorld::Ptr &ptr, MWRender::Animation *anim);
|
||||||
virtual ~CharacterController();
|
virtual ~CharacterController();
|
||||||
|
|
|
@ -215,6 +215,8 @@ public:
|
||||||
void addEffect (const std::string& model, int effectId, bool loop = false, const std::string& bonename = "", std::string texture = "");
|
void addEffect (const std::string& model, int effectId, bool loop = false, const std::string& bonename = "", std::string texture = "");
|
||||||
void removeEffect (int effectId);
|
void removeEffect (int effectId);
|
||||||
void getLoopingEffects (std::vector<int>& out);
|
void getLoopingEffects (std::vector<int>& out);
|
||||||
|
|
||||||
|
virtual void setAlpha(float alpha) {}
|
||||||
private:
|
private:
|
||||||
void updateEffects(float duration);
|
void updateEffects(float duration);
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <OgreParticleSystem.h>
|
#include <OgreParticleSystem.h>
|
||||||
#include <OgreSubEntity.h>
|
#include <OgreSubEntity.h>
|
||||||
|
|
||||||
|
#include <extern/shiny/Main/Factory.hpp>
|
||||||
|
|
||||||
#include "../mwworld/esmstore.hpp"
|
#include "../mwworld/esmstore.hpp"
|
||||||
#include "../mwworld/inventorystore.hpp"
|
#include "../mwworld/inventorystore.hpp"
|
||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
|
@ -116,7 +118,8 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, int v
|
||||||
mViewMode(viewMode),
|
mViewMode(viewMode),
|
||||||
mShowWeapons(false),
|
mShowWeapons(false),
|
||||||
mShowShield(true),
|
mShowShield(true),
|
||||||
mFirstPersonOffset(0.f, 0.f, 0.f)
|
mFirstPersonOffset(0.f, 0.f, 0.f),
|
||||||
|
mAlpha(1.f)
|
||||||
{
|
{
|
||||||
mNpc = mPtr.get<ESM::NPC>()->mBase;
|
mNpc = mPtr.get<ESM::NPC>()->mBase;
|
||||||
|
|
||||||
|
@ -219,6 +222,7 @@ void NpcAnimation::updateNpcBase()
|
||||||
|
|
||||||
void NpcAnimation::updateParts()
|
void NpcAnimation::updateParts()
|
||||||
{
|
{
|
||||||
|
mAlpha = 1.f;
|
||||||
const MWWorld::Class &cls = MWWorld::Class::get(mPtr);
|
const MWWorld::Class &cls = MWWorld::Class::get(mPtr);
|
||||||
MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr);
|
MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr);
|
||||||
|
|
||||||
|
@ -647,6 +651,7 @@ void NpcAnimation::showWeapons(bool showWeapon)
|
||||||
{
|
{
|
||||||
removeIndividualPart(ESM::PRT_Weapon);
|
removeIndividualPart(ESM::PRT_Weapon);
|
||||||
}
|
}
|
||||||
|
mAlpha = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NpcAnimation::showShield(bool show)
|
void NpcAnimation::showShield(bool show)
|
||||||
|
@ -705,4 +710,56 @@ void NpcAnimation::permanentEffectAdded(const ESM::MagicEffect *magicEffect, boo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NpcAnimation::setAlpha(float alpha)
|
||||||
|
{
|
||||||
|
if (alpha == mAlpha)
|
||||||
|
return;
|
||||||
|
mAlpha = alpha;
|
||||||
|
|
||||||
|
for (int i=0; i<ESM::PRT_Count; ++i)
|
||||||
|
{
|
||||||
|
if (mObjectParts[i].isNull())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (unsigned int j=0; j<mObjectParts[i]->mEntities.size(); ++j)
|
||||||
|
{
|
||||||
|
Ogre::Entity* ent = mObjectParts[i]->mEntities[j];
|
||||||
|
if (ent != mObjectParts[i]->mSkelBase)
|
||||||
|
applyAlpha(alpha, ent, mObjectParts[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NpcAnimation::applyAlpha(float alpha, Ogre::Entity *ent, NifOgre::ObjectScenePtr scene)
|
||||||
|
{
|
||||||
|
ent->getSubEntity(0)->setRenderQueueGroup(alpha != 1.f || ent->getSubEntity(0)->getMaterial()->isTransparent()
|
||||||
|
? RQG_Alpha : RQG_Main);
|
||||||
|
|
||||||
|
|
||||||
|
Ogre::MaterialPtr mat = scene->mMaterialControllerMgr.getWritableMaterial(ent);
|
||||||
|
if (mAlpha == 1.f)
|
||||||
|
{
|
||||||
|
// Don't bother remembering what the original values were. Just remove the techniques and let the factory restore them.
|
||||||
|
mat->removeAllTechniques();
|
||||||
|
sh::Factory::getInstance()._ensureMaterial(mat->getName(), "Default");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ogre::Material::TechniqueIterator techs = mat->getTechniqueIterator();
|
||||||
|
while(techs.hasMoreElements())
|
||||||
|
{
|
||||||
|
Ogre::Technique *tech = techs.getNext();
|
||||||
|
Ogre::Technique::PassIterator passes = tech->getPassIterator();
|
||||||
|
while(passes.hasMoreElements())
|
||||||
|
{
|
||||||
|
Ogre::Pass *pass = passes.getNext();
|
||||||
|
pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
|
||||||
|
Ogre::ColourValue diffuse = pass->getDiffuse();
|
||||||
|
diffuse.a = alpha;
|
||||||
|
pass->setDiffuse(diffuse);
|
||||||
|
pass->setVertexColourTracking(pass->getVertexColourTracking() &~Ogre::TVC_DIFFUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,8 @@ private:
|
||||||
|
|
||||||
Ogre::SharedPtr<SayAnimationValue> mSayAnimationValue;
|
Ogre::SharedPtr<SayAnimationValue> mSayAnimationValue;
|
||||||
|
|
||||||
|
float mAlpha;
|
||||||
|
|
||||||
void updateNpcBase();
|
void updateNpcBase();
|
||||||
|
|
||||||
NifOgre::ObjectScenePtr insertBoundedPart(const std::string &model, int group, const std::string &bonename,
|
NifOgre::ObjectScenePtr insertBoundedPart(const std::string &model, int group, const std::string &bonename,
|
||||||
|
@ -78,6 +80,8 @@ private:
|
||||||
void addPartGroup(int group, int priority, const std::vector<ESM::PartReference> &parts,
|
void addPartGroup(int group, int priority, const std::vector<ESM::PartReference> &parts,
|
||||||
bool enchantedGlow=false, Ogre::Vector3* glowColor=NULL);
|
bool enchantedGlow=false, Ogre::Vector3* glowColor=NULL);
|
||||||
|
|
||||||
|
void applyAlpha(float alpha, Ogre::Entity* ent, NifOgre::ObjectScenePtr scene);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @param ptr
|
* @param ptr
|
||||||
|
@ -109,6 +113,9 @@ public:
|
||||||
|
|
||||||
/// Rebuilds the NPC, updating their root model, animation sources, and equipment.
|
/// Rebuilds the NPC, updating their root model, animation sources, and equipment.
|
||||||
void rebuild();
|
void rebuild();
|
||||||
|
|
||||||
|
/// Make the NPC only partially visible
|
||||||
|
virtual void setAlpha(float alpha);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,14 +60,14 @@ RenderingManager::RenderingManager(OEngine::Render::OgreRenderer& _rend, const b
|
||||||
MWWorld::Fallback* fallback)
|
MWWorld::Fallback* fallback)
|
||||||
: mRendering(_rend)
|
: mRendering(_rend)
|
||||||
, mFallback(fallback)
|
, mFallback(fallback)
|
||||||
, mObjects(mRendering)
|
|
||||||
, mActors(mRendering, this)
|
|
||||||
, mPlayerAnimation(NULL)
|
, mPlayerAnimation(NULL)
|
||||||
, mAmbientMode(0)
|
, mAmbientMode(0)
|
||||||
, mSunEnabled(0)
|
, mSunEnabled(0)
|
||||||
, mPhysicsEngine(engine)
|
, mPhysicsEngine(engine)
|
||||||
, mTerrain(NULL)
|
, mTerrain(NULL)
|
||||||
{
|
{
|
||||||
|
mActors = new MWRender::Actors(mRendering, this);
|
||||||
|
mObjects = new MWRender::Objects(mRendering);
|
||||||
// select best shader mode
|
// select best shader mode
|
||||||
bool openGL = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL") != std::string::npos);
|
bool openGL = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL") != std::string::npos);
|
||||||
bool glES = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL ES") != std::string::npos);
|
bool glES = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL ES") != std::string::npos);
|
||||||
|
@ -162,8 +162,8 @@ RenderingManager::RenderingManager(OEngine::Render::OgreRenderer& _rend, const b
|
||||||
mRootNode = mRendering.getScene()->getRootSceneNode();
|
mRootNode = mRendering.getScene()->getRootSceneNode();
|
||||||
mRootNode->createChildSceneNode("player");
|
mRootNode->createChildSceneNode("player");
|
||||||
|
|
||||||
mObjects.setRootNode(mRootNode);
|
mObjects->setRootNode(mRootNode);
|
||||||
mActors.setRootNode(mRootNode);
|
mActors->setRootNode(mRootNode);
|
||||||
|
|
||||||
mCamera = new MWRender::Camera(mRendering.getCamera());
|
mCamera = new MWRender::Camera(mRendering.getCamera());
|
||||||
|
|
||||||
|
@ -201,6 +201,8 @@ RenderingManager::~RenderingManager ()
|
||||||
delete mCompositors;
|
delete mCompositors;
|
||||||
delete mWater;
|
delete mWater;
|
||||||
delete mVideoPlayer;
|
delete mVideoPlayer;
|
||||||
|
delete mActors;
|
||||||
|
delete mObjects;
|
||||||
delete mFactory;
|
delete mFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,10 +212,10 @@ MWRender::SkyManager* RenderingManager::getSkyManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
MWRender::Objects& RenderingManager::getObjects(){
|
MWRender::Objects& RenderingManager::getObjects(){
|
||||||
return mObjects;
|
return *mObjects;
|
||||||
}
|
}
|
||||||
MWRender::Actors& RenderingManager::getActors(){
|
MWRender::Actors& RenderingManager::getActors(){
|
||||||
return mActors;
|
return *mActors;
|
||||||
}
|
}
|
||||||
|
|
||||||
OEngine::Render::Fader* RenderingManager::getFader()
|
OEngine::Render::Fader* RenderingManager::getFader()
|
||||||
|
@ -223,8 +225,8 @@ OEngine::Render::Fader* RenderingManager::getFader()
|
||||||
|
|
||||||
void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store)
|
void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store)
|
||||||
{
|
{
|
||||||
mObjects.removeCell(store);
|
mObjects->removeCell(store);
|
||||||
mActors.removeCell(store);
|
mActors->removeCell(store);
|
||||||
mDebugging->cellRemoved(store);
|
mDebugging->cellRemoved(store);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,7 +242,7 @@ void RenderingManager::toggleWater()
|
||||||
|
|
||||||
void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store)
|
void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store)
|
||||||
{
|
{
|
||||||
mObjects.buildStaticGeometry (*store);
|
mObjects->buildStaticGeometry (*store);
|
||||||
sh::Factory::getInstance().unloadUnreferencedMaterials();
|
sh::Factory::getInstance().unloadUnreferencedMaterials();
|
||||||
mDebugging->cellAdded(store);
|
mDebugging->cellAdded(store);
|
||||||
waterAdded(store);
|
waterAdded(store);
|
||||||
|
@ -254,8 +256,8 @@ void RenderingManager::addObject (const MWWorld::Ptr& ptr){
|
||||||
|
|
||||||
void RenderingManager::removeObject (const MWWorld::Ptr& ptr)
|
void RenderingManager::removeObject (const MWWorld::Ptr& ptr)
|
||||||
{
|
{
|
||||||
if (!mObjects.deleteObject (ptr))
|
if (!mObjects->deleteObject (ptr))
|
||||||
mActors.deleteObject (ptr);
|
mActors->deleteObject (ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position)
|
void RenderingManager::moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position)
|
||||||
|
@ -295,9 +297,9 @@ RenderingManager::updateObjectCell(const MWWorld::Ptr &old, const MWWorld::Ptr &
|
||||||
parent->removeChild(child);
|
parent->removeChild(child);
|
||||||
|
|
||||||
if (MWWorld::Class::get(old).isActor()) {
|
if (MWWorld::Class::get(old).isActor()) {
|
||||||
mActors.updateObjectCell(old, cur);
|
mActors->updateObjectCell(old, cur);
|
||||||
} else {
|
} else {
|
||||||
mObjects.updateObjectCell(old, cur);
|
mObjects->updateObjectCell(old, cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,7 +317,7 @@ void RenderingManager::rebuildPtr(const MWWorld::Ptr &ptr)
|
||||||
if(ptr.getRefData().getHandle() == "player")
|
if(ptr.getRefData().getHandle() == "player")
|
||||||
anim = mPlayerAnimation;
|
anim = mPlayerAnimation;
|
||||||
else if(MWWorld::Class::get(ptr).isActor())
|
else if(MWWorld::Class::get(ptr).isActor())
|
||||||
anim = dynamic_cast<NpcAnimation*>(mActors.getAnimation(ptr));
|
anim = dynamic_cast<NpcAnimation*>(mActors->getAnimation(ptr));
|
||||||
if(anim)
|
if(anim)
|
||||||
{
|
{
|
||||||
anim->rebuild();
|
anim->rebuild();
|
||||||
|
@ -380,8 +382,8 @@ void RenderingManager::update (float duration, bool paused)
|
||||||
if(paused)
|
if(paused)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mActors.update (duration);
|
mActors->update (duration);
|
||||||
mObjects.update (duration);
|
mObjects->update (duration);
|
||||||
|
|
||||||
|
|
||||||
mSkyManager->update(duration);
|
mSkyManager->update(duration);
|
||||||
|
@ -657,7 +659,7 @@ void RenderingManager::requestMap(MWWorld::Ptr::CellStore* cell)
|
||||||
{
|
{
|
||||||
assert(mTerrain);
|
assert(mTerrain);
|
||||||
|
|
||||||
Ogre::AxisAlignedBox dims = mObjects.getDimensions(cell);
|
Ogre::AxisAlignedBox dims = mObjects->getDimensions(cell);
|
||||||
Ogre::Vector2 center(cell->mCell->getGridX() + 0.5, cell->mCell->getGridY() + 0.5);
|
Ogre::Vector2 center(cell->mCell->getGridX() + 0.5, cell->mCell->getGridY() + 0.5);
|
||||||
dims.merge(mTerrain->getWorldBoundingBox(center));
|
dims.merge(mTerrain->getWorldBoundingBox(center));
|
||||||
|
|
||||||
|
@ -667,7 +669,7 @@ void RenderingManager::requestMap(MWWorld::Ptr::CellStore* cell)
|
||||||
mLocalMap->requestMap(cell, dims.getMinimum().z, dims.getMaximum().z);
|
mLocalMap->requestMap(cell, dims.getMinimum().z, dims.getMaximum().z);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mLocalMap->requestMap(cell, mObjects.getDimensions(cell));
|
mLocalMap->requestMap(cell, mObjects->getDimensions(cell));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::preCellChange(MWWorld::Ptr::CellStore* cell)
|
void RenderingManager::preCellChange(MWWorld::Ptr::CellStore* cell)
|
||||||
|
@ -677,13 +679,13 @@ void RenderingManager::preCellChange(MWWorld::Ptr::CellStore* cell)
|
||||||
|
|
||||||
void RenderingManager::disableLights(bool sun)
|
void RenderingManager::disableLights(bool sun)
|
||||||
{
|
{
|
||||||
mObjects.disableLights();
|
mObjects->disableLights();
|
||||||
sunDisable(sun);
|
sunDisable(sun);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::enableLights(bool sun)
|
void RenderingManager::enableLights(bool sun)
|
||||||
{
|
{
|
||||||
mObjects.enableLights();
|
mObjects->enableLights();
|
||||||
sunEnable(sun);
|
sunEnable(sun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -859,7 +861,7 @@ void RenderingManager::processChangedSettings(const Settings::CategorySettingVec
|
||||||
|
|
||||||
if (rebuild)
|
if (rebuild)
|
||||||
{
|
{
|
||||||
mObjects.rebuildStaticGeometry();
|
mObjects->rebuildStaticGeometry();
|
||||||
if (mTerrain)
|
if (mTerrain)
|
||||||
mTerrain->applyMaterials(Settings::Manager::getBool("enabled", "Shadows"),
|
mTerrain->applyMaterials(Settings::Manager::getBool("enabled", "Shadows"),
|
||||||
Settings::Manager::getBool("split", "Shadows"));
|
Settings::Manager::getBool("split", "Shadows"));
|
||||||
|
@ -976,13 +978,13 @@ void RenderingManager::setupExternalRendering (MWRender::ExternalRendering& rend
|
||||||
|
|
||||||
Animation* RenderingManager::getAnimation(const MWWorld::Ptr &ptr)
|
Animation* RenderingManager::getAnimation(const MWWorld::Ptr &ptr)
|
||||||
{
|
{
|
||||||
Animation *anim = mActors.getAnimation(ptr);
|
Animation *anim = mActors->getAnimation(ptr);
|
||||||
|
|
||||||
if(!anim && ptr.getRefData().getHandle() == "player")
|
if(!anim && ptr.getRefData().getHandle() == "player")
|
||||||
anim = mPlayerAnimation;
|
anim = mPlayerAnimation;
|
||||||
|
|
||||||
if (!anim)
|
if (!anim)
|
||||||
anim = mObjects.getAnimation(ptr);
|
anim = mObjects->getAnimation(ptr);
|
||||||
|
|
||||||
return anim;
|
return anim;
|
||||||
}
|
}
|
||||||
|
|
|
@ -242,8 +242,8 @@ private:
|
||||||
|
|
||||||
OEngine::Render::OgreRenderer &mRendering;
|
OEngine::Render::OgreRenderer &mRendering;
|
||||||
|
|
||||||
MWRender::Objects mObjects;
|
MWRender::Objects* mObjects;
|
||||||
MWRender::Actors mActors;
|
MWRender::Actors* mActors;
|
||||||
|
|
||||||
MWRender::NpcAnimation *mPlayerAnimation;
|
MWRender::NpcAnimation *mPlayerAnimation;
|
||||||
|
|
||||||
|
|
|
@ -63,11 +63,12 @@ Ogre::MaterialPtr MaterialControllerManager::getWritableMaterial(Ogre::MovableOb
|
||||||
else if (Ogre::ParticleSystem* partSys = dynamic_cast<Ogre::ParticleSystem*>(movable))
|
else if (Ogre::ParticleSystem* partSys = dynamic_cast<Ogre::ParticleSystem*>(movable))
|
||||||
mat = Ogre::MaterialManager::getSingleton().getByName(partSys->getMaterialName());
|
mat = Ogre::MaterialManager::getSingleton().getByName(partSys->getMaterialName());
|
||||||
|
|
||||||
// Make sure techniques are created
|
|
||||||
sh::Factory::getInstance()._ensureMaterial(mat->getName(), "Default");
|
|
||||||
|
|
||||||
static int count=0;
|
static int count=0;
|
||||||
mat = mat->clone(mat->getName() + Ogre::StringConverter::toString(count++));
|
Ogre::String newName = mat->getName() + Ogre::StringConverter::toString(count++);
|
||||||
|
sh::Factory::getInstance().createMaterialInstance(newName, mat->getName());
|
||||||
|
// Make sure techniques are created
|
||||||
|
sh::Factory::getInstance()._ensureMaterial(newName, "Default");
|
||||||
|
mat = Ogre::MaterialManager::getSingleton().getByName(newName);
|
||||||
|
|
||||||
mClonedMaterials[movable] = mat;
|
mClonedMaterials[movable] = mat;
|
||||||
|
|
||||||
|
@ -84,7 +85,7 @@ MaterialControllerManager::~MaterialControllerManager()
|
||||||
{
|
{
|
||||||
for (std::map<Ogre::MovableObject*, Ogre::MaterialPtr>::iterator it = mClonedMaterials.begin(); it != mClonedMaterials.end(); ++it)
|
for (std::map<Ogre::MovableObject*, Ogre::MaterialPtr>::iterator it = mClonedMaterials.begin(); it != mClonedMaterials.end(); ++it)
|
||||||
{
|
{
|
||||||
Ogre::MaterialManager::getSingleton().remove(it->second->getName());
|
sh::Factory::getInstance().destroyMaterialInstance(it->second->getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,9 +98,7 @@
|
||||||
#if VERTEXCOLOR_MODE != 2
|
#if VERTEXCOLOR_MODE != 2
|
||||||
shUniform(float4, materialAmbient) @shAutoConstant(materialAmbient, surface_ambient_colour)
|
shUniform(float4, materialAmbient) @shAutoConstant(materialAmbient, surface_ambient_colour)
|
||||||
#endif
|
#endif
|
||||||
#if VERTEXCOLOR_MODE != 2
|
|
||||||
shUniform(float4, materialDiffuse) @shAutoConstant(materialDiffuse, surface_diffuse_colour)
|
shUniform(float4, materialDiffuse) @shAutoConstant(materialDiffuse, surface_diffuse_colour)
|
||||||
#endif
|
|
||||||
#if VERTEXCOLOR_MODE != 1
|
#if VERTEXCOLOR_MODE != 1
|
||||||
shUniform(float4, materialEmissive) @shAutoConstant(materialEmissive, surface_emissive_colour)
|
shUniform(float4, materialEmissive) @shAutoConstant(materialEmissive, surface_emissive_colour)
|
||||||
#endif
|
#endif
|
||||||
|
@ -234,9 +232,7 @@
|
||||||
lightResult.xyz += lightAmbient.xyz * materialAmbient.xyz + materialEmissive.xyz;
|
lightResult.xyz += lightAmbient.xyz * materialAmbient.xyz + materialEmissive.xyz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if VERTEXCOLOR_MODE != 2
|
|
||||||
lightResult.a *= materialDiffuse.a;
|
lightResult.a *= materialDiffuse.a;
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -339,9 +335,7 @@
|
||||||
#if VERTEXCOLOR_MODE != 2
|
#if VERTEXCOLOR_MODE != 2
|
||||||
shUniform(float4, materialAmbient) @shAutoConstant(materialAmbient, surface_ambient_colour)
|
shUniform(float4, materialAmbient) @shAutoConstant(materialAmbient, surface_ambient_colour)
|
||||||
#endif
|
#endif
|
||||||
#if VERTEXCOLOR_MODE != 2
|
|
||||||
shUniform(float4, materialDiffuse) @shAutoConstant(materialDiffuse, surface_diffuse_colour)
|
shUniform(float4, materialDiffuse) @shAutoConstant(materialDiffuse, surface_diffuse_colour)
|
||||||
#endif
|
|
||||||
#if VERTEXCOLOR_MODE != 1
|
#if VERTEXCOLOR_MODE != 1
|
||||||
shUniform(float4, materialEmissive) @shAutoConstant(materialEmissive, surface_emissive_colour)
|
shUniform(float4, materialEmissive) @shAutoConstant(materialEmissive, surface_emissive_colour)
|
||||||
#endif
|
#endif
|
||||||
|
@ -434,9 +428,7 @@
|
||||||
lightResult.xyz += lightAmbient.xyz * materialAmbient.xyz + materialEmissive.xyz;
|
lightResult.xyz += lightAmbient.xyz * materialAmbient.xyz + materialEmissive.xyz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if VERTEXCOLOR_MODE != 2
|
|
||||||
lightResult.a *= materialDiffuse.a;
|
lightResult.a *= materialDiffuse.a;
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// shadows only for the first (directional) light
|
// shadows only for the first (directional) light
|
||||||
|
|
Loading…
Reference in a new issue