Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

OSGMakeTransparentGraphOp.cpp

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002  *                                OpenSG                                     *
00003  *                                                                           *
00004  *                                                                           *
00005  *             Copyright (C) 2000-2002 by the OpenSG Forum                   *
00006  *                                                                           *
00007  *                            www.opensg.org                                 *
00008  *                                                                           *
00009  *   contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de          *
00010  *                                                                           *
00011 \*---------------------------------------------------------------------------*/
00012 /*---------------------------------------------------------------------------*\
00013  *                                License                                    *
00014  *                                                                           *
00015  * This library is free software; you can redistribute it and/or modify it   *
00016  * under the terms of the GNU Library General Public License as published    *
00017  * by the Free Software Foundation, version 2.                               *
00018  *                                                                           *
00019  * This library is distributed in the hope that it will be useful, but       *
00020  * WITHOUT ANY WARRANTY; without even the implied warranty of                *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00022  * Library General Public License for more details.                          *
00023  *                                                                           *
00024  * You should have received a copy of the GNU Library General Public         *
00025  * License along with this library; if not, write to the Free Software       *
00026  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 *
00027  *                                                                           *
00028 \*---------------------------------------------------------------------------*/
00029 /*---------------------------------------------------------------------------*\
00030  *                                Changes                                    *
00031  *                                                                           *
00032  *                                                                           *
00033  *                                                                           *
00034  *                                                                           *
00035  *                                                                           *
00036  *                                                                           *
00037 \*---------------------------------------------------------------------------*/
00038 
00039 
00040 #include <OSGBlendChunk.h>
00041 #include <OSGMakeTransparentGraphOp.h>
00042 #include <OSGPolygonChunk.h>
00043 #include <OSGSimpleMaterial.h>
00044 
00045 OSG_USING_NAMESPACE
00046 
00047 MakeTransparentGraphOp::MakeTransparentGraphOp(const char* name)
00048     : GraphOp(name),
00049       _transparency(0.5)
00050 {
00051 }
00052 
00053 GraphOp* MakeTransparentGraphOp::create()
00054 {
00055     return new MakeTransparentGraphOp();
00056 }
00057 
00058 
00059 // Similar to boost's next iterator function.  (I think it's from
00060 // boost, at least.)
00061 template<typename T>
00062 T next(T t) // Iterator passed by value.
00063 {
00064     return ++t;
00065 }
00066 
00067 
00068 bool MakeTransparentGraphOp::traverse(NodePtr& node)
00069 {
00070     // Find the materials.
00071     if (!GraphOp::traverse(node)) {
00072         return false;
00073     }
00074 
00075     // Now do the merge.
00076     MaterialObjectMap::iterator itr = _materialObjects.begin();
00077     for (; itr != _materialObjects.end(); ++itr)
00078     {
00079         MaterialPtr oldMaterial = itr->first;
00080         MaterialPtr newMaterial = MaterialPtr::dcast(deepClone(oldMaterial));
00081         if (newMaterial != NullFC)
00082         {
00083             std::cout << "Applying transparency:  ";
00084 
00085             applyTransparency(newMaterial);
00086 
00087             // Put the new material in the objects in this subtree.
00088             MaterialObjectList& currentList = itr->second;
00089             MaterialObjectList::iterator i = currentList.begin();
00090             for (; i != currentList.end(); ++i)
00091             {
00092                 i->setMaterial(newMaterial);
00093             }
00094         }
00095     }
00096 
00097     return true;
00098 }
00099 
00100 
00101 void MakeTransparentGraphOp::setParams(const std::string params)
00102 {
00103     ParamSet ps(params);   
00104 
00105     ps("transparency",  _transparency);
00106    
00107     std::string out = ps.getUnusedParams();
00108     if(out.length())
00109     {
00110         FWARNING(("MakeTransparentGraphOp doesn't have parameters '%s'.\n",
00111                 out.c_str()));
00112     }
00113 }
00114 
00115 std::string MakeTransparentGraphOp::usage(void)
00116 {
00117     return 
00118     "MakeTransparent: make used Materials transparent\n"
00119     "  Based on MaterialMergeGraphOp, merges Materials and sets their\n"
00120     "  transparency.\n"
00121     "Params: name (type, default)\n"
00122     "  transparency (Real32, 0.5f): transparency value\n";    
00123 }
00124 
00125 Action::ResultE MakeTransparentGraphOp::traverseEnter(NodePtr& node)
00126 {
00127     GeometryPtr geo = GeometryPtr::dcast(node->getCore());
00128     if (geo != NullFC)
00129     {
00130         addObject(MaterialObject(geo));
00131         return Action::Continue;
00132     }
00133 
00134     MaterialGroupPtr mg = MaterialGroupPtr::dcast(node->getCore());
00135     if (mg != NullFC)
00136     {
00137         addObject(MaterialObject(mg));
00138         return Action::Continue;
00139     }
00140 
00141     // Otherwise, keep looking.
00142     return Action::Continue;
00143 }
00144 
00145 Action::ResultE MakeTransparentGraphOp::traverseLeave(NodePtr& node, Action::ResultE res)
00146 {
00147     return res;
00148 }
00149 
00150 void MakeTransparentGraphOp::addObject(MaterialObject m)
00151 {
00152     MaterialPtr mat = m.getMaterial();
00153     if (mat == NullFC)
00154         return;
00155 
00156     _materialObjects[mat].push_back(m);
00157 }
00158 
00159 
00160 // Generally used to prevent templated functions from resolving to the
00161 // same signature.
00162 template<typename T>
00163 struct Type2Type {
00164     typedef T Original;
00165 };
00166 
00167 
00168 template<typename Chunk>
00169 typename Chunk::Ptr getOrAddChunk(ChunkMaterialPtr cm,
00170                                   Type2Type<Chunk> = Type2Type<Chunk>()) {
00171     osg::StateChunkPtr stateChunk = cm->find(Chunk::getClassType());
00172     typename Chunk::Ptr chunk = Chunk::Ptr::dcast(stateChunk);
00173     if (!chunk) {
00174         chunk = Chunk::create();
00175         beginEditCP(cm);
00176         cm->addChunk(chunk);
00177         endEditCP(cm);
00178     }
00179     return chunk;
00180 }
00181 
00182 
00183 void MakeTransparentGraphOp::applyTransparency(MaterialPtr m) {
00184  
00185     SimpleMaterialPtr sm = SimpleMaterialPtr::dcast(m);
00186     if (sm != NullFC) {
00187         std::cout << "SimpleMaterial" << std::endl;
00188         beginEditCP(sm);
00189         sm->setTransparency(1.0f - (1.0f - sm->getTransparency()) * 
00190                             _transparency);
00191         sm->setColorMaterial(GL_NONE);
00192         endEditCP(sm);
00193 
00194         PolygonChunkPtr polygonChunk = getOrAddChunk<PolygonChunk>(sm);
00195         beginEditCP(polygonChunk);
00196         polygonChunk->setCullFace(GL_BACK);
00197         endEditCP(polygonChunk);
00198         return;
00199     }
00200 
00201     ChunkMaterialPtr cm = ChunkMaterialPtr::dcast(m);
00202     if (cm != NullFC) {
00203         std::cout << "ChunkMaterial" << std::endl;
00204         BlendChunkPtr blendChunk = getOrAddChunk<BlendChunk>(cm);
00205         beginEditCP(blendChunk);
00206         blendChunk->setColor(Color4f(1, 1, 1, _transparency));
00207         blendChunk->setSrcFactor(GL_SRC_ALPHA);
00208         blendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA);
00209         endEditCP(blendChunk);
00210         return;
00211     }
00212 }

Generated on Thu Aug 25 04:07:09 2005 for OpenSG by  doxygen 1.4.3