Revision: 8534
http://playerstage.svn.sourceforge.net/playerstage/?rev=8534&view=rev
Author: natepak
Date: 2010-01-28 17:56:15 +0000 (Thu, 28 Jan 2010)
Log Message:
-----------
Added ability to turn on and off per-pixel lighting. Added a function to
calculate normals for a mesh
Modified Paths:
--------------
code/gazebo/trunk/cmake/SearchForStuff.cmake
code/gazebo/trunk/server/Mesh.cc
code/gazebo/trunk/server/Mesh.hh
code/gazebo/trunk/server/MeshManager.cc
code/gazebo/trunk/server/Vector3.cc
code/gazebo/trunk/server/Vector3.hh
code/gazebo/trunk/server/World.cc
code/gazebo/trunk/server/World.hh
code/gazebo/trunk/server/gui/MainMenu.cc
code/gazebo/trunk/server/gui/MainMenu.hh
code/gazebo/trunk/server/rendering/OgreVisual.cc
code/gazebo/trunk/server/rendering/RTShaderSystem.cc
code/gazebo/trunk/server/rendering/RTShaderSystem.hh
code/gazebo/trunk/worlds/pioneer2dx.world
Modified: code/gazebo/trunk/cmake/SearchForStuff.cmake
===================================================================
--- code/gazebo/trunk/cmake/SearchForStuff.cmake 2010-01-27 20:08:57 UTC
(rev 8533)
+++ code/gazebo/trunk/cmake/SearchForStuff.cmake 2010-01-28 17:56:15 UTC
(rev 8534)
@@ -59,7 +59,7 @@
${OGRE_LDFLAGS})
# Try to find the OGRE RTShaderSystem library
- find_library(ogre_rtshader_lib OgreRTShaderSystem ENV LD_LIBRARY_PATH)
+ find_library(ogre_rtshader_lib OgreRTShaderSystem ${OGRE_LIBRARY_DIRS} ENV
LD_LIBRARY_PATH)
if (ogre_rtshader_lib)
APPEND_TO_CACHED_LIST(gazeboserver_link_libs
${gazeboserver_link_libs_desc}
Modified: code/gazebo/trunk/server/Mesh.cc
===================================================================
--- code/gazebo/trunk/server/Mesh.cc 2010-01-27 20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/Mesh.cc 2010-01-28 17:56:15 UTC (rev 8534)
@@ -261,7 +261,17 @@
}
+////////////////////////////////////////////////////////////////////////////////
+/// Recalculate all the normals.
+void Mesh::RecalculateNormals()
+{
+ std::vector<SubMesh*>::iterator iter;
+ for (iter = this->submeshes.begin(); iter != this->submeshes.begin(); iter++)
+ (*iter)->RecalculateNormals();
+}
+
+
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// SUBMESH
@@ -550,3 +560,30 @@
iiter != this->indices.end(); iiter++)
(*indArr)[i++] = (*iiter);
}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Recalculate all the normals.
+void SubMesh::RecalculateNormals()
+{
+ unsigned int i;
+
+ // Reset all the normals
+ for (i=0; i < this->normals.size(); i++)
+ this->normals[i].Set(0,0,0);
+
+ // For each face, which is defined by three indices, calculate the normals
+ for (i=0; i < this->indices.size(); i+=3)
+ {
+ Vector3 v1 = this->vertices[this->indices[i]];
+ Vector3 v2 = this->vertices[this->indices[i+1]];
+ Vector3 v3 = this->vertices[this->indices[i+2]];
+ Vector3 n = Vector3::GetNormal(v1, v2, v3);
+ this->normals[this->indices[i]] += n;
+ this->normals[this->indices[i+1]] += n;
+ this->normals[this->indices[i+2]] += n;
+ }
+
+ // Normalize the results
+ for (i=0; i < this->normals.size(); i++)
+ this->normals[i].Normalize();
+}
Modified: code/gazebo/trunk/server/Mesh.hh
===================================================================
--- code/gazebo/trunk/server/Mesh.hh 2010-01-27 20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/Mesh.hh 2010-01-28 17:56:15 UTC (rev 8534)
@@ -64,6 +64,9 @@
/// \brief Put all the data into flat arrays
public: void FillArrays(float **vertArr, unsigned int **indArr) const;
+ /// \brief Recalculate all the normals.
+ public: void RecalculateNormals();
+
private: std::string name;
private: std::vector<SubMesh *> submeshes;
private: std::vector<Material *> materials;
@@ -152,6 +155,9 @@
/// \brief Put all the data into flat arrays
public: void FillArrays(float **vertArr, unsigned int **indArr) const;
+ /// \brief Recalculate all the normals.
+ public: void RecalculateNormals();
+
private: std::vector< Vector3 > vertices;
private: std::vector< Vector3 > normals;
private: std::vector< Vector2<double> > texCoords;
Modified: code/gazebo/trunk/server/MeshManager.cc
===================================================================
--- code/gazebo/trunk/server/MeshManager.cc 2010-01-27 20:08:57 UTC (rev
8533)
+++ code/gazebo/trunk/server/MeshManager.cc 2010-01-28 17:56:15 UTC (rev
8534)
@@ -225,6 +225,8 @@
}
}
}
+
+ mesh->RecalculateNormals();
}
@@ -323,6 +325,8 @@
// Set the indices
for (i=0;i<36; i++)
subMesh->AddIndex(ind[i]);
+
+ subMesh->RecalculateNormals();
}
////////////////////////////////////////////////////////////////////////////////
@@ -419,6 +423,8 @@
// Set the indices
for (i=0;i<36; i++)
subMesh->AddIndex(ind[i]);
+
+ mesh->RecalculateNormals();
}
////////////////////////////////////////////////////////////////////////////////
@@ -522,6 +528,8 @@
for (j=0; j<3; j++)
subMesh->SetNormal(subMesh->GetIndex(i+j), norm );
}
+
+ mesh->RecalculateNormals();
}
////////////////////////////////////////////////////////////////////////////////
@@ -632,6 +640,8 @@
for (j=0; j<3; j++)
subMesh->SetNormal(subMesh->GetIndex(i+j), norm );
}
+
+ mesh->RecalculateNormals();
}
////////////////////////////////////////////////////////////////////////////////
@@ -755,5 +765,7 @@
verticeIndex++;
}
}
+
+ mesh->RecalculateNormals();
}
Modified: code/gazebo/trunk/server/Vector3.cc
===================================================================
--- code/gazebo/trunk/server/Vector3.cc 2010-01-27 20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/Vector3.cc 2010-01-28 17:56:15 UTC (rev 8534)
@@ -130,6 +130,17 @@
return perp;
}
+////////////////////////////////////////////////////////////////////////////////
+/// Get a normal vector to a triangle
+Vector3 Vector3::GetNormal(const Vector3 &v1, const Vector3 &v2,
+ const Vector3 &v3)
+{
+ Vector3 a = v2 - v1;
+ Vector3 b = v3 - v1;
+ Vector3 n = a.GetCrossProd(b);
+ n.Normalize();
+ return n;
+}
////////////////////////////////////////////////////////////////////////////////
// Equals operator
Modified: code/gazebo/trunk/server/Vector3.hh
===================================================================
--- code/gazebo/trunk/server/Vector3.hh 2010-01-27 20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/Vector3.hh 2010-01-28 17:56:15 UTC (rev 8534)
@@ -72,6 +72,10 @@
/// \brief Return a vector that is perpendicular to this one.
public: Vector3 GetPerpendicular() const;
+ /// \brief Get a normal vector to a triangle
+ public: static Vector3 GetNormal(const Vector3 &v1, const Vector3 &v2,
+ const Vector3 &v3);
+
/// \brief Equal operator
public: const Vector3 &operator=( const Vector3 &pt );
Modified: code/gazebo/trunk/server/World.cc
===================================================================
--- code/gazebo/trunk/server/World.cc 2010-01-27 20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/World.cc 2010-01-28 17:56:15 UTC (rev 8534)
@@ -64,6 +64,7 @@
this->showCameras = false;
this->wireframe = false;
this->showPhysics = false;
+ this->perPixelLighting = true;
this->physicsEngine = NULL;
this->server = NULL;
this->graphics = NULL;
@@ -770,7 +771,6 @@
return this->showPhysics;
}
-
////////////////////////////////////////////////////////////////////////////////
/// Set whether to show the joints
void World::SetShowPhysics(bool show)
@@ -779,8 +779,22 @@
this->showPhysicsSignal(this->showPhysics);
}
+////////////////////////////////////////////////////////////////////////////////
+/// Set to use perpixel lighting or pervertex lighting
+void World::SetPerPixelLighting( bool pp )
+{
+ this->perPixelLighting = pp;
+ this->perPixelLightingSignal(pp);
+}
////////////////////////////////////////////////////////////////////////////////
+/// Get to use perpixel lighting or pervertex lighting
+bool World::GetPerPixelLighting()
+{
+ return this->perPixelLighting;
+}
+
+////////////////////////////////////////////////////////////////////////////////
// Update the simulation interface
void World::UpdateSimulationIface()
{
Modified: code/gazebo/trunk/server/World.hh
===================================================================
--- code/gazebo/trunk/server/World.hh 2010-01-27 20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/World.hh 2010-01-28 17:56:15 UTC (rev 8534)
@@ -218,6 +218,12 @@
/// \brief Get whether to view as wireframe
public: bool GetShowPhysics();
+ /// \brief Set to use perpixel lighting or pervertex lighting
+ public: void SetPerPixelLighting( bool pp );
+
+ /// \brief Get use perpixel lighting or pervertex lighting
+ public: bool GetPerPixelLighting();
+
/// \brief Goto a position in time
public: void GotoTime(double pos);
@@ -246,7 +252,9 @@
private: bool wireframe;
+ private: bool perPixelLighting;
+
/// \brief Load a model
/// \param node Pointer to the XMLConfig node
/// \param parent The parent model
@@ -318,6 +326,12 @@
showBoundingBoxesSignal.connect(subscriber);
}
+ /// \brief Connect a boost::slot the use per pixel lighting signal
+ public: template<typename T>
+ void ConnectPerPixelLightingSignal( T subscriber )
+ {
+ perPixelLightingSignal.connect(subscriber);
+ }
/// \brief Get the names of interfaces defined in the tree of a model
private: void GetInterfaceNames(Entity* m, std::vector<std::string>& list);
@@ -374,6 +388,7 @@
private: boost::signal<void (bool)> showPhysicsSignal;
private: boost::signal<void (bool)> showJointsSignal;
private: boost::signal<void (bool)> showBoundingBoxesSignal;
+ private: boost::signal<void (bool)> perPixelLightingSignal;
private: std::deque<WorldState> worldStates;
private: std::deque<WorldState>::iterator worldStatesInsertIter;
Modified: code/gazebo/trunk/server/gui/MainMenu.cc
===================================================================
--- code/gazebo/trunk/server/gui/MainMenu.cc 2010-01-27 20:08:57 UTC (rev
8533)
+++ code/gazebo/trunk/server/gui/MainMenu.cc 2010-01-28 17:56:15 UTC (rev
8534)
@@ -65,6 +65,7 @@
{ "Show Contacts", 0, &gazebo::MainMenu::ShowContactsCB,0, FL_MENU_TOGGLE,
FL_NORMAL_LABEL, 0, 14, 0},
{ "Show Lights", 0, &gazebo::MainMenu::ShowLightsCB,0, FL_MENU_TOGGLE,
FL_NORMAL_LABEL, 0, 14, 0},
{ "Show Cameras", 0, &gazebo::MainMenu::ShowCamerasCB,0, FL_MENU_TOGGLE,
FL_NORMAL_LABEL, 0, 14, 0},
+ { "Per-Pixel Lighting", 0, &gazebo::MainMenu::PerPixelLightingCB,0,
FL_MENU_TOGGLE|FL_MENU_VALUE, FL_NORMAL_LABEL, 0, 14, 0},
{ 0 },
{ 0 }
@@ -175,3 +176,10 @@
{
World::Instance()->SetShowCameras( !World::Instance()->GetShowCameras() );
}
+
+////////////////////////////////////////////////////////////////////////////////
+// Use per-pixel lighting
+void MainMenu::PerPixelLightingCB(Fl_Widget * /*w*/, void * /*data*/)
+{
+ World::Instance()->SetPerPixelLighting(
!World::Instance()->GetPerPixelLighting() );
+}
Modified: code/gazebo/trunk/server/gui/MainMenu.hh
===================================================================
--- code/gazebo/trunk/server/gui/MainMenu.hh 2010-01-27 20:08:57 UTC (rev
8533)
+++ code/gazebo/trunk/server/gui/MainMenu.hh 2010-01-28 17:56:15 UTC (rev
8534)
@@ -61,6 +61,8 @@
public: static void ShowCamerasCB(Fl_Widget * /*w*/, void * /*data*/);
+ public: static void PerPixelLightingCB(Fl_Widget * /*w*/, void * /*data*/);
+
};
}
Modified: code/gazebo/trunk/server/rendering/OgreVisual.cc
===================================================================
--- code/gazebo/trunk/server/rendering/OgreVisual.cc 2010-01-27 20:08:57 UTC
(rev 8533)
+++ code/gazebo/trunk/server/rendering/OgreVisual.cc 2010-01-28 17:56:15 UTC
(rev 8534)
@@ -160,10 +160,15 @@
this->sceneNode->removeAndDestroyAllChildren();
*/
+ for (int i=0; i < this->sceneNode->numAttachedObjects(); i++)
+ RTShaderSystem::Instance()->DetachEntity(
+ (Ogre::Entity*)(this->sceneNode->getAttachedObject(i)) );
+
if (this->sceneNode)
OgreAdaptor::Instance()->sceneMgr->destroySceneNode(this->sceneNode);
if (this->boundingBoxNode)
OgreAdaptor::Instance()->sceneMgr->destroySceneNode(this->boundingBoxNode);
+
}
////////////////////////////////////////////////////////////////////////////////
@@ -220,7 +225,6 @@
obj = (Ogre::MovableObject*)this->sceneNode->getCreator()->createEntity(
stream.str(), meshName);
- RTShaderSystem::Instance()->GenerateShaders((Ogre::Entity*)(obj));
}
catch (Ogre::Exception e)
{
@@ -302,6 +306,9 @@
return;
this->sceneNode->attachObject(obj);
+ Ogre::Entity *ent = dynamic_cast<Ogre::Entity*>(obj);
+ if (ent)
+ RTShaderSystem::Instance()->AttachEntity(ent);
obj->setUserAny( Ogre::Any(this) );
}
Modified: code/gazebo/trunk/server/rendering/RTShaderSystem.cc
===================================================================
--- code/gazebo/trunk/server/rendering/RTShaderSystem.cc 2010-01-27
20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/rendering/RTShaderSystem.cc 2010-01-28
17:56:15 UTC (rev 8534)
@@ -24,6 +24,8 @@
* SVN: $Id:$
*/
+#include <boost/bind.hpp>
+#include "World.hh"
#include "GazeboError.hh"
#include "GazeboMessage.hh"
#include "OgreAdaptor.hh"
@@ -35,6 +37,10 @@
/// Constructor
RTShaderSystem::RTShaderSystem()
{
+#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
+ World::Instance()->ConnectPerPixelLightingSignal(
boost::bind(&RTShaderSystem::SetPerPixelLighting, this, _1) );
+ this->curLightingModel = RTShaderSystem::SSLM_PerPixelLighting;
+#endif
}
////////////////////////////////////////////////////////////////////////////////
@@ -146,10 +152,60 @@
}
////////////////////////////////////////////////////////////////////////////////
+// Set an Ogre::Entity to use RT shaders
+void RTShaderSystem::AttachEntity(Ogre::Entity *entity)
+{
+#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
+ this->GenerateShaders(entity);
+ this->entities.push_back(entity);
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Remove and entity
+void RTShaderSystem::DetachEntity(Ogre::Entity *entity)
+{
+#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
+ this->entities.remove(entity);
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Set the lighting model
+void RTShaderSystem::SetLightingModel(LightingModel model)
+{
+#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
+ if (model == this->curLightingModel)
+ return;
+
+ this->curLightingModel = model;
+
+ std::list<Ogre::Entity*>::iterator iter;
+
+ // Update all the shaders
+ for (iter = this->entities.begin(); iter != this->entities.end(); iter++)
+ {
+ this->GenerateShaders(*iter);
+ }
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Set the lighting model to per pixel or per vertex
+void RTShaderSystem::SetPerPixelLighting( bool s)
+{
+ if (s)
+ this->SetLightingModel( SSLM_PerPixelLighting );
+ else
+ this->SetLightingModel( SSLM_PerVertexLighting );
+}
+
+////////////////////////////////////////////////////////////////////////////////
/// Generate shaders for an entity
void RTShaderSystem::GenerateShaders(Ogre::Entity *entity)
{
#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
+
for (unsigned int i=0; i < entity->getNumSubEntities(); ++i)
{
Ogre::SubEntity* curSubEntity = entity->getSubEntity(i);
@@ -188,25 +244,33 @@
// Remove all sub render states.
renderState->reset();
-/*#ifdef RTSHADER_SYSTEM_BUILD_CORE_SHADERS
- if (mCurLightingModel == SSLM_PerVertexLighting)
+#ifdef RTSHADER_SYSTEM_BUILD_CORE_SHADERS
+ if (this->curLightingModel == SSLM_PerVertexLighting)
{
- RTShader::SubRenderState* perPerVertexLightModel =
mShaderGenerator->createSubRenderState(RTShader::FFPLighting::Type);
+ Ogre::RTShader::SubRenderState* perPerVertexLightModel =
this->shaderGenerator->createSubRenderState(Ogre::RTShader::FFPLighting::Type);
renderState->addSubRenderState(perPerVertexLightModel);
}
#endif
#ifdef RTSHADER_SYSTEM_BUILD_EXT_SHADERS
- else if (mCurLightingModel == SSLM_PerPixelLighting)
+ else if (this->curLightingModel == SSLM_PerPixelLighting)
{
- */
- Ogre::RTShader::SubRenderState* perPixelLightModel =
this->shaderGenerator->createSubRenderState(Ogre::RTShader::PerPixelLighting::Type);
+ Ogre::RTShader::SubRenderState* perPixelLightModel =
this->shaderGenerator->createSubRenderState(Ogre::RTShader::PerPixelLighting::Type);
renderState->addSubRenderState(perPixelLightModel);
- //}
+ }
}
+
+ // Invalidate this material in order to re-generate its shaders.
+
this->shaderGenerator->invalidateMaterial(Ogre::RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME,
curMaterialName);
+
+
}
#endif
+
+
+#endif
}
-
+
+
Modified: code/gazebo/trunk/server/rendering/RTShaderSystem.hh
===================================================================
--- code/gazebo/trunk/server/rendering/RTShaderSystem.hh 2010-01-27
20:08:57 UTC (rev 8533)
+++ code/gazebo/trunk/server/rendering/RTShaderSystem.hh 2010-01-28
17:56:15 UTC (rev 8534)
@@ -28,6 +28,7 @@
#define RTSHADERSYSTEM_HH
#include <Ogre.h>
+#include <list>
#include "config.h"
#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
@@ -42,6 +43,14 @@
class RTShaderSystem : public SingletonT<RTShaderSystem>
{
+ public: enum LightingModel
+ {
+ SSLM_PerVertexLighting,
+ SSLM_PerPixelLighting,
+ SSLM_NormalMapLightingTangentSpace,
+ SSLM_NormalMapLightingObjectSpace,
+ };
+
/// \brief Constructor
private: RTShaderSystem();
@@ -51,9 +60,16 @@
/// \brief Init the run time shader system
public: void Init();
- /// \brief Generate shaders for an entity
- public: void GenerateShaders(Ogre::Entity *entity);
-
+ /// \brief Set the lighting model
+ public: void SetLightingModel(LightingModel model);
+
+ /// \brief Set an Ogre::Entity to use RT shaders
+ public: void AttachEntity(Ogre::Entity *entity);
+
+ /// \brief Remove and entity
+ public: void DetachEntity(Ogre::Entity *entity);
+
+ /// \brief Set a viewport to use shaders
public: static void AttachViewport(Ogre::Viewport *vp)
{
#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
@@ -62,9 +78,18 @@
#endif
}
+ /// Set the lighting model to per pixel or per vertex
+ public: void SetPerPixelLighting( bool s);
+
+ /// \brief Generate shaders for an entity
+ private: void GenerateShaders(Ogre::Entity *entity);
+
+
#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
private: Ogre::RTShader::ShaderGenerator *shaderGenerator;
private: ShaderGeneratorTechniqueResolverListener *materialMgrListener;
+ private: LightingModel curLightingModel;
+ private: std::list<Ogre::Entity*> entities;
#endif
private: friend class DestroyerT<RTShaderSystem>;
Modified: code/gazebo/trunk/worlds/pioneer2dx.world
===================================================================
--- code/gazebo/trunk/worlds/pioneer2dx.world 2010-01-27 20:08:57 UTC (rev
8533)
+++ code/gazebo/trunk/worlds/pioneer2dx.world 2010-01-28 17:56:15 UTC (rev
8534)
@@ -38,7 +38,7 @@
</rendering:gui>
<rendering:ogre>
- <ambient>0.8 0.8 0.8 1.0</ambient>
+ <ambient>0.1 0.1 0.1 1.0</ambient>
<sky>
<material>Gazebo/CloudySky</material>
</sky>
@@ -67,7 +67,7 @@
<size>2000 2000</size>
<segments>10 10</segments>
<uvTile>2000 2000</uvTile>
- <material>Gazebo/GrayGrid</material>
+ <material>Gazebo/Grey</material>
</geom:plane>
</body:plane>
</model:physical>
@@ -86,7 +86,7 @@
<visual>
<scale>0.2 0.2 0.2</scale>
<mesh>unit_sphere</mesh>
- <material>Gazebo/Rocky</material>
+ <material>Gazebo/Grey</material>
</visual>
</geom:sphere>
</body:sphere>
@@ -200,17 +200,17 @@
<!-- White Point light -->
<model:renderable name="point_white">
- <xyz>-3 0 10</xyz>
+ <xyz>0 0 5</xyz>
<static>true</static>
<light>
<type>point</type>
<diffuseColor>0.8 0.8 0.8</diffuseColor>
<specularColor>0.1 0.1 0.1</specularColor>
- <range>20</range>
+ <range>10</range>
<!-- Constant(0-1) Linear(0-1) Quadratic -->
- <attenuation>0.8 0.02 0</attenuation>
+ <attenuation>0.5 0.01 0</attenuation>
</light>
</model:renderable>
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit