pxmlw6n2f/Gazebo_Distributed_MPI/gazebo/rendering/Material.cc

223 lines
7.9 KiB
C++

/*
* Copyright (C) 2012 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include "gazebo/common/Color.hh"
#include "gazebo/rendering/ogre_gazebo.h"
#include "gazebo/common/Console.hh"
#include "gazebo/rendering/RenderEngine.hh"
#include "gazebo/rendering/Conversions.hh"
#include "gazebo/rendering/Material.hh"
using namespace gazebo;
using namespace rendering;
//////////////////////////////////////////////////
void Material::CreateMaterials()
{
Ogre::MaterialPtr mat;
Ogre::Technique *tech;
Ogre::Pass *pass;
Ogre::TextureUnitState *texState;
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_PURPLE_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
pass->setAmbient(1.0, 0.0, 1.0);
pass->setDiffuse(1.0, 0.0, 1.0, 0.5);
texState = pass->createTextureUnitState();
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(1, 0, 1));
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_RED_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
pass->setAmbient(1.0, 0.0, 0.0);
pass->setDiffuse(1.0, 0.0, 0.0, 0.5);
texState = pass->createTextureUnitState();
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(1, 0, 0));
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_GREEN_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
pass->setAmbient(0.0, 1.0, 0.0);
pass->setDiffuse(0.0, 1.0, 0.0, 0.5);
texState = pass->createTextureUnitState();
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(0, 1, 0));
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_BLUE_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
pass->setAmbient(0.0, 0.0, 1.0);
pass->setDiffuse(0.0, 0.0, 1.0, 0.5);
texState = pass->createTextureUnitState();
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(0, 0, 1));
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_TRANS_RED_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
tech->setDepthWriteEnabled(false);
pass->setAmbient(1.0, 0.0, 0.0);
pass->setDiffuse(1.0, 0.0, 0.0, 0.5);
pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
texState = pass->createTextureUnitState();
texState->setAlphaOperation(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, 0.5);
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(1, 0, 0));
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_TRANS_GREEN_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
tech->setDepthWriteEnabled(false);
pass->setAmbient(0.0, 1.0, 0.0);
pass->setDiffuse(0.0, 1.0, 0.0, 0.5);
pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
texState = pass->createTextureUnitState();
texState->setAlphaOperation(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, 0.5);
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(0, 1, 0));
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_TRANS_BLUE_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
tech->setDepthWriteEnabled(false);
pass->setAmbient(0.0, 0.0, 1.0);
pass->setDiffuse(0.0, 0.0, 1.0, 0.5);
pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
texState = pass->createTextureUnitState();
texState->setAlphaOperation(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, 0.5);
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(0, 0, 1));
mat = Ogre::MaterialManager::getSingleton().create(
"__GAZEBO_TRANS_PURPLE_MATERIAL__", "General");
tech = mat->getTechnique(0);
pass = tech->getPass(0);
tech->setLightingEnabled(false);
tech->setDepthWriteEnabled(false);
pass->setAmbient(1.0, 0.0, 1.0);
pass->setDiffuse(1.0, 0.0, 1.0, 0.5);
pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
texState = pass->createTextureUnitState();
texState->setAlphaOperation(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, 0.5);
texState->setColourOperationEx(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL,
Ogre::LBS_CURRENT, Ogre::ColourValue(1, 0, 1));
}
//////////////////////////////////////////////////
void Material::Update(const gazebo::common::Material *_mat)
{
Ogre::MaterialPtr matPtr;
if (Ogre::MaterialManager::getSingleton().resourceExists(_mat->GetName()))
matPtr = Ogre::MaterialManager::getSingleton().getByName(
_mat->GetName(), "General");
else
matPtr = Ogre::MaterialManager::getSingleton().create(
_mat->GetName(), "General");
Ogre::Pass *pass = matPtr->getTechnique(0)->getPass(0);
common::Color ambient = _mat->GetAmbient();
common::Color diffuse = _mat->GetDiffuse();
common::Color specular = _mat->GetSpecular();
common::Color emissive = _mat->GetEmissive();
pass->setLightingEnabled(_mat->GetLighting());
pass->setDiffuse(diffuse.r, diffuse.g, diffuse.b, diffuse.a);
pass->setAmbient(ambient.r, ambient.g, ambient.b);
if (diffuse.a < 1.0)
{
pass->setDepthWriteEnabled(false);
pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
}
pass->setSpecular(specular.r, specular.g, specular.b, specular.a);
pass->setSelfIllumination(emissive.r, emissive.g, emissive.b);
pass->setShininess(_mat->GetShininess());
// Only add the texture unit if it's not present in the material
if (!_mat->GetTextureImage().empty() &&
pass->getTextureUnitState(_mat->GetTextureImage()) == NULL)
{
// Make sure to add the path to the texture image.
RenderEngine::Instance()->AddResourcePath(_mat->GetTextureImage());
Ogre::TextureUnitState *texState = pass->createTextureUnitState(
_mat->GetTextureImage());
texState->setTextureName(_mat->GetTextureImage());
texState->setName(_mat->GetTextureImage());
}
}
//////////////////////////////////////////////////
bool Material::GetMaterialAsColor(const std::string &_materialName,
common::Color &_ambient, common::Color &_diffuse,
common::Color &_specular, common::Color &_emissive)
{
Ogre::MaterialPtr matPtr;
if (Ogre::MaterialManager::getSingleton().resourceExists(_materialName))
{
matPtr = Ogre::MaterialManager::getSingleton().getByName(_materialName,
"General");
if (matPtr.isNull())
return false;
Ogre::Technique *technique = matPtr->getTechnique(0);
if (technique)
{
Ogre::Pass *pass = technique->getPass(0);
if (pass)
{
_ambient = Conversions::Convert(pass->getAmbient());
_diffuse = Conversions::Convert(pass->getDiffuse());
_specular = Conversions::Convert(pass->getSpecular());
_emissive = Conversions::Convert(pass->getSelfIllumination());
return true;
}
}
}
return false;
}