void FaceSpatializeIndexed<BasicTraits>::CategoryRaw::addData (OpenSGFaceBase<OpenSGTraits>* node, const FaceIterator& face)
{
   GeoPositions3f::StoredFieldType*  p = m_coord->getFieldPtr();
   GeoNormals3f::StoredFieldType*    n = m_normal->getFieldPtr();
   //GeoIndicesUI32::StoredFieldType*  i = m_index->getFieldPtr();

   // find offset of positions and normals in the new geometry
   u32 i, k;
   m_offsetIt = m_offset.find(face.getGeometry());
   if (m_offsetIt == m_offset.end()) {
      // insert new offsets entry into map
      HashMapPair offsetPair = 
	m_offset.insert(HashMap::value_type(face.getGeometry(), quad()));
      m_offsetIt = offsetPair.first;

      m_offsetIt->second.position = m_coord->size();
      GeoPositionsPtr faceP = m_original.getPositions();
      addRefCP(faceP);
      for (k=0; k<faceP->getSize(); ++k) {
	 p->addValue(faceP->getValue(k));
      }
      if (m_hasNormal) {
 	 m_offsetIt->second.normal = m_normal->size();
	 GeoNormalsPtr faceN = m_original.getNormals();
	 addRefCP(faceN);
	 for (k=0; k<faceN->getSize(); ++k) {
	    n->addValue(faceN->getValue(k));
	 }
	 subRefCP(faceN);
      }
      subRefCP(faceP);
   }

   // insert indices
   if (face.getLength() == 3) {
      for (k=0; k<3; ++k) {
	 m_index->insertValue(face.getPositionIndex(k)+m_offsetIt->second.position, m_quadOffset++);
	 i = 1;
	 if (m_hasNormal) {
	    m_index->insertValue(face.getNormalIndex(k)+m_offsetIt->second.normal,     m_quadOffset++);
	    ++i;
	 }
	 for (; i<m_indexStride; ++i) {
	    m_index->insertValue(0, m_quadOffset++);
	 }
      }
   } else {
      for (k=0; k<4; ++k) {
	 m_index->addValue(face.getPositionIndex(k)+m_offsetIt->second.position);
	 i = 1;
	 if (m_hasNormal) {
	    m_index->addValue(face.getNormalIndex(k)+m_offsetIt->second.normal);
	    ++i;
	 }
	 for (; i<m_indexStride; ++i) {
	    m_index->addValue(0);
	 }
      }
   }
}
Exemple #2
0
PhongMaterial::~PhongMaterial(void)
{
    subRefCP(_materialChunk);
    subRefCP(_blendChunk);
    subRefCP(_vpChunk);
    subRefCP(_fpChunk);
}
SimpleTexturedMaterial::~SimpleTexturedMaterial(void)
{  
    subRefCP(_sfImage.getValue());

    subRefCP(_textureChunk      );
    subRefCP(_texGenChunk       );
}
void ScanParseSkel::endImage()
{
    _imageDataPtr = 0;
    addImageValue(_image);
    subRefCP(_image);
    _image = NullFC;
}
ScanParseSkel::~ScanParseSkel(void)
{
    if (_image != NullFC)
        subRefCP(_image);
    if(_pLexer != NULL)
        delete _pLexer;
}
Exemple #6
0
void Material::onDestroyAspect(UInt32 uiId, UInt32 uiAspect)
{
    Inherited::onDestroyAspect(uiId, uiAspect);

    subRefCP(_pState);
    
    _pState = NullFC;
}
Exemple #7
0
OSG_USING_NAMESPACE

int main (int argc, char *argv[])
{
    osgInit(argc, argv);

    FieldContainerFactory::the()->setThrowInvalidPointerException(true);

#ifdef OSG_INVALID_PTR_CHECK
    try
    {
        NodePtr planeNode1 = makePlane(2,2, 1,1);
        NodePtr planeNode2 = planeNode1;

        addRefCP(planeNode1);
        subRefCP(planeNode1);

        if(planeNode1 == NullFC)
        {
            printf("planeNode1 == NullFC\n");
        }

        // now call subRefCP on a NullFC pointer!
        subRefCP(planeNode1);
        // now call subRefCP on a invalid pointer!
        subRefCP(planeNode2);

        NodePtr planeNode3 = makePlane(2,2, 1,1);
        NodePtr planeNode4 = planeNode3;

        addRefCP(planeNode3);
        subRefCP(planeNode3);

        NodeCorePtr core1 = planeNode4->getCore();

        NodeCorePtr core2 = planeNode3->getCore();
    }

    catch(InvalidPointerException &e)
    {
        printf("error: '%s'\n", e.what());
    }
#endif

    return 0;
}
Exemple #8
0
CParticleEmitter::~CParticleEmitter()
{
  subRefCP( m_pNode );

  if( m_pParticles )
    delete[] m_pParticles;

  if( m_pParticleType )
    delete m_pParticleType;
}
Exemple #9
0
//! Destructor
DVRVolume::~DVRVolume(void)
{
    SINFO << "~DVRVolume this: " 
          << this 
          << std::endl
          << "~DVRVolume appearance: "          
          << getAppearance() 
          << std::endl
          << "~DVRVolume::subRefCP(Appearance)" 
          << std::endl;

    subRefCP(_sfAppearance.getValue());

    SINFO << "~DVRVolume::subRefCP(Geometry)" 
          << std::endl;
//        << "~DVRVolume geometry: " 
//        << int(_sfGeometry.getValue()) 
//        << std::endl;

    subRefCP(_sfGeometry.getValue());

    SINFO << "~DVRVolume::subRefCP(Shader)"                << std::endl;
    SINFO << "~DVRVolume shader: "          << getShader() << std::endl;

    subRefCP(_sfShader.getValue());

    SINFO << "~DVRVolume::subRefCP(RenderMaterial)" 
          << std::endl
          << "~DVRVolume renderMaterial: " 
          << getRenderMaterial() 
          << std::endl;

    subRefCP(_sfRenderMaterial.getValue());

    SINFO << "~DVRVolume::subRefCP(TextureStorage)"
          << std::endl
          << "~DVRVolume textureStorage: " 
          << getTextureStorage() 
          << std::endl;

    subRefCP(_sfTextureStorage.getValue());
}
void FaceSpatialize<BasicTraits>::CategoryRaw::addData (OpenSGFaceBase<OpenSGTraits>* node,
							const FaceIterator&           face)
{
   GeoPositions3f::StoredFieldType*  p = m_coord->getFieldPtr();
   GeoNormals3f::StoredFieldType*    n = m_normal->getFieldPtr();
   //GeoIndicesUI32::StoredFieldType*  i = m_index->getFieldPtr();

   GeoPositionsPtr faceP = node->getPositions();
   addRefCP(faceP);
   u32 k;
   for (k=0; k<faceP->getSize(); ++k) {
      p->addValue(faceP->getValue(k));
      if (face.getLength()==3) { 
	 m_index->insertValue(p->size()-1, m_quadOffset++);
      } else {
	 m_index->addValue(p->size()-1);
      }
   }
   if (!m_hasNormal) {
#if 1
      Vec3f p0(faceP->getValue(0));
      Vec3f p1(faceP->getValue(1));
      Vec3f p2(faceP->getValue(2));
      p2 -= p1; p0 -= p1; 
      if (m_ccw) {
	 p0.crossThis(p2); p0.normalize();
	 n->addValue(p0);
      } else {
	 p2.crossThis(p0); p2.normalize();
	 n->addValue(p2);
      }
#endif
   } else { // per-vertex normals or per-face normals
      GeoNormalsPtr faceN = node->getNormals();
      addRefCP(faceN);
      for (k=0; k<faceN->getSize(); ++k) {
	 n->addValue(faceN->getValue(k));
      }
      subRefCP(faceN);
   }
   subRefCP(faceP);
}
Exemple #11
0
void OOCOSGFeeder::feedBoth(GeoReceiver *rec, GeoReceiver::pntRec pfunc, 
                              GeoReceiver::triRec tfunc)
{
    _rec = rec;
    _pfunc = pfunc;
    _tfunc = tfunc;
    _pntindexbase = 0;
    
    _pntprog = _triprog = 0;
    _nextpntprog = _nexttriprog = 0.f;
    
    if(_npts != 0)
        SLOG << "Progress: ";
    
    if(_root != NullFC)
    {
        traverse(_root, 
                 osgTypedMethodFunctor1ObjPtrCPtrRef<Action::ResultE,
                                                     OOCOSGFeeder,
                                                     NodePtr>(
                                                         this, 
                                                         &OOCOSGFeeder::enter));
    }
    else
    {
        for(UInt32 f = 0; f < _filenames.size(); ++f)
        {
            NodePtr root;

            _poss.clear();

            root = SceneFileHandler::the().read(_filenames[f].c_str(), NULL);

            if(root == NullFC)
            {
                FWARNING(("OOCOSGFeeder::doFeed: couldn't load %s, ignored!\n",
                            _filenames[f].c_str()));
                continue;
            }

            traverse(root, 
                 osgTypedMethodFunctor1ObjPtrCPtrRef<Action::ResultE,
                                                     OOCOSGFeeder,
                                                     NodePtr>(
                                                         this, 
                                                         &OOCOSGFeeder::enter));
        
            subRefCP(root);
        }
    }
    
    if(_npts != 0)
        PLOG << "100%" << endLog;
}
Exemple #12
0
void State::clearChunks(void)
{
    MFStateChunkPtr::iterator chunksIt  = _mfChunks.begin();
    MFStateChunkPtr::iterator chunksEnd = _mfChunks.end  ();

    for(; chunksIt != chunksEnd; ++chunksIt)
    {
        subRefCP(*chunksIt);

        *chunksIt = NullFC;
    }
}
MultiPassMaterial::~MultiPassMaterial(void)
{
    MFMaterialPtr::iterator matIt  = _mfMaterials.begin();
    MFMaterialPtr::iterator matEnd = _mfMaterials.end ();
    
    while(matIt != matEnd)
    {
        subRefCP(*matIt);

        ++matIt;
    }
}
Exemple #14
0
void MaterialPool::clear(void)
{
    MFMaterialPtr::iterator       matIt        = _mfMaterials.begin();
    MFMaterialPtr::const_iterator endMaterials = _mfMaterials.end  ();

    while(matIt != endMaterials)
    {
        subRefCP(*matIt);
        ++matIt;
    }
    _mfMaterials.clear();
    _mats.clear();
}
Exemple #15
0
void MaterialPool::sub(UInt32 index)
{
    MFMaterialPtr::iterator matIt = _mfMaterials.begin();

    matIt += index;

    if(matIt != _mfMaterials.end())
    {
        subRefCP(*matIt);
        _mats.erase(*matIt);
        _mfMaterials.erase(matIt);
    }
}
// react to keys
void keyboard(unsigned char k, int x, int y)
{
    switch(k)
    {
    case 27: { 
      hier.destroy();
      subRefCP(scene);
      delete all;
      Profiler::the().dump(SLOG);
      exit(0);
    }
    }
}
//! Remove the i-th clip object
void DVRClipObjects::remove(UInt32 n)
{
    MFDVRClipGeometryPtr::iterator it = _mfClipObjects.begin();

    for(UInt32 i = 0; i < n && it != _mfClipObjects.end(); i++) 
        it++;  

    if(it != _mfClipObjects.end())
    {
        subRefCP(*it);
        _mfClipObjects.erase(it);    
    }
}
/*! init client window
 *
 *  If manageClientViewports is set, then all viewports from the
 *  cluster window are duplcated to the client window.
 */
void MultiDisplayWindow::clientInit( void )
{
    bool             changed = false;
    ViewportPtr      vp,cvp;

    if(getManageClientViewports() == false ||
       getClientWindow() == NullFC)
        return;

    // check if something changed
    if(getMFPort()->size() == getClientWindow()->getMFPort()->size())
    {
        for(UInt32 v = 0 ; v < getMFPort()->size() && !changed ; v++)
        {
            vp  = getPort(v);
            cvp = getClientWindow()->getPort(v);
            if( vp->getRoot() != cvp->getRoot() ||
                vp->getLeft() != cvp->getLeft() ||
                vp->getRight() != cvp->getRight() ||
                vp->getBottom() != cvp->getBottom() ||
                vp->getTop() != cvp->getTop() ||
                vp->getBackground() != cvp->getBackground() ||
                vp->getMFForegrounds()->size() !=
                    cvp->getMFForegrounds()->size() )
                changed = true;
        }
    }
    else
    {
        changed = true;
    }

    if(changed)
    {
        beginEditCP(getClientWindow());
        // remove all viewports
        while(getClientWindow()->getMFPort()->size())
        {
            vp = getClientWindow()->getPort(0);
            getClientWindow()->subPort(0);
            subRefCP(vp);
        }
        // duplicate viewports
        for(UInt32 v=0 ; v<getMFPort()->size() ;v++)
        {
            getClientWindow()->addPort(ViewportPtr::dcast(getPort(v)->shallowCopy()));
        }
        endEditCP(getClientWindow());
    }
}
void ShaderParameterChunk::clearUniformParameters(void)
{
    MFShaderParameterPtr &parameters = *editMFParameters();
    UInt32 size = parameters.size();

    for(UInt32 i=0;i<size;++i)
        subRefCP(parameters[i]);

    parameters.clear();

    if(_parameter_access != NULL)
        _parameter_access->updateMap();

    _cleared_parameters = true;
}
Exemple #20
0
void MaterialPool::onDestroy(void)
{
    // if we're in shutdown this is the prototype ...
    if(OSG::GlobalSystemState == OSG::Shutdown)
        return;

    MFMaterialPtr::iterator       matIt        = _mfMaterials.begin();
    MFMaterialPtr::const_iterator endMaterials = _mfMaterials.end  ();

    FINFO(("MaterialPool::onDestroy : subrefing %u materials\n", _mfMaterials.size()));
    while(matIt != endMaterials)
    {
        subRefCP(*matIt);
        ++matIt;
    }
}
//! Remove a clip object
void DVRClipObjects::remove(DVRClipGeometryPtr obj)
{
    if(obj == NullFC)
        return;

    for(MFDVRClipGeometryPtr::iterator i  = _mfClipObjects.begin(); 
                                       i != _mfClipObjects.end(); 
                                       i++)
    {
        if(*i == obj)
        {
            _mfClipObjects.erase(i);
            subRefCP(obj);
            break;
        }
    }
}
Exemple #22
0
PCSSShadowMap::~PCSSShadowMap(void)
{
    if(_tiledeco != NullFC)
        subRefCP(_tiledeco);

    subRefCP(_colorMap);
    subRefCP(_shadowFactorMap);
    subRefCP(_shadowSHL);
    subRefCP(_shadowCmat);
    subRefCP(_combineSHL);
    subRefCP(_combineDepth);
    subRefCP(_combineCmat);
    subRefCP(_pf);

#ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP
    if(_fb != 0)
        glDeleteFramebuffersEXT(1, &_fb);
    if(_rb_depth != 0)
        glDeleteRenderbuffersEXT(1, &_rb_depth);
#endif
    if(_fb2 != 0)
        glDeleteFramebuffersEXT(1, &_fb2);
}
void MultiPassMaterial::subMaterial(MaterialPtr mat)
{
    if(mat == NullFC)
        return;

    UInt32 i;
    
    for(i = 0; i < _mfMaterials.size(); ++i)
    {
        if(_mfMaterials[i] == mat)
        {
            subRefCP(mat);
            _mfMaterials.erase(_mfMaterials.begin() + i);
            return;
        }
    }

    SWARNING << "MultiPassMaterial::subMaterial(" << this << ") has no material "
             << mat << std::endl;
}
Exemple #24
0
bool State::subChunk(UInt32 classid, Int32 index)
{
    if(index < 0 || index > StateChunkClass::getNumSlots(classid))
    {
        SWARNING << "subChunk: index " << index << " > Numslots "
                 << StateChunkClass::getNumSlots(classid)
                 << ",  ignored!" << std::endl;
        return true;
    }

    if(_mfChunks[classid + index] == NullFC)
        return true;

    // remove the chunk from the state

    subRefCP(_mfChunks[classid + index]);

    _mfChunks[classid + index] = NullFC;

    return false;
}
Exemple #25
0
bool State::subChunk(StateChunkPtr chunk)
{
    if(chunk == NullFC)
        return true;

    UInt32 cindex =  chunk->getClassId();
    UInt32 csize  = _mfChunks.size();

    // special case: find it in the slots
    UInt8 nslots = chunk->getClass()->getNumSlots();
    UInt8 ci;

    for(ci = cindex; ci < cindex + nslots && ci < csize; ci++)
    {
        if(_mfChunks[ci] == chunk)
        {
            break;
        }
    }

    if(ci >= cindex + nslots)    // chunk not found
    {
        SWARNING << "subChunk: chunk "
                 << chunk
                 << " of class "
                 << chunk->getClass()->getName()
                 << " not found!"
                 << std::endl;
        return true;
    }

    // remove the chunk from the state

    subRefCP(_mfChunks[ci]);

    _mfChunks[ci] = NullFC;

    return false;
}
OpenSGEnvironmentSceneGraphAttachment::~OpenSGEnvironmentSceneGraphAttachment() {
	if (envGroupeNode->getNChildren() > 0) {
		printd(ERROR,
				"OpenSGEnvironmentSceneGraphAttachment::destructor(): Environment Group-Node still has children attached! FORCING REMOVE!\n");
		for (int i=envGroupeNode->getNChildren()-1; i >= 0 ; i--) {
#if OSG_MAJOR_VERSION >= 2
			envGroupeNode->subChild(i);
#else //OpenSG1:
			beginEditCP(envGroupeNode);
				envGroupeNode->subChild(i);
			endEditCP(envGroupeNode);
#endif
		} // for
	} // if

#if OSG_MAJOR_VERSION >= 2
	if (envTransNode->getParent() != NULL) {
		printd(ERROR,
				"OpenSGEnvironmentSceneGraphAttachment::destructor(): Environment Transformation Node still in SceneGraph! FORCING REMOVE!\n");
		NodeRecPtr parentNode = envTransNode->getParent();
		parentNode->subChild(envTransNode);
	} // if

#else //OpenSG1:
	if (envTransNode->getParent() != NullFC) {
		printd(ERROR,
				"OpenSGEnvironmentSceneGraphAttachment::destructor(): Environment Transformation Node still in SceneGraph! FORCING REMOVE!\n");
		NodePtr parentNode = envTransNode->getParent();
		beginEditCP(parentNode);
			parentNode->subChild(envTransNode);
		endEditCP(parentNode);
	} // if

	subRefCP(envTransNode);
#endif
} // ~OpenSGEnvironmentSceneGraphAttachment
Exemple #27
0
void MaterialPool::sub(const MaterialPtr &mat)
{
    if(_mats.count(mat) == 0)
    {
        SWARNING << "MaterialPool(" << this << ")::sub: " << mat 
                 << " is not one of my materials!" << std::endl;
        return;
    }

    MFMaterialPtr::iterator matIt = _mfMaterials.find(mat);

    if(matIt != _mfMaterials.end())
    {
        _mats.erase(mat);
        subRefCP(mat);

        _mfMaterials.erase(matIt);
    }
    else
    {
        SWARNING << "MaterialPool(" << this << ")::sub: " << mat 
                 << " is not one of my materials!" << std::endl;
    }
}
void MultiDisplayWindow::serverRender(WindowPtr         serverWindow,
                                      UInt32            id,
                                      DrawActionBase *action )
{
    TileCameraDecoratorPtr deco;
    ViewportPtr serverPort;
    ViewportPtr clientPort;
    StereoBufferViewportPtr clientStereoPort;
    UInt32 sv,cv;
    Int32 l,r,t,b;
    Int32 cleft,cright,ctop,cbottom;

    // sync, otherwise viewports will be out of date

    if(!getHServers())
    {
        setHServers(getServers().size());
    }
    if(!getVServers())
    {
        setVServers(1);
    }

    UInt32 row   =id/getHServers();
    UInt32 column=id%getHServers();

    // calculate width and height from local width and height
    UInt32 width  = serverWindow->getWidth() ;
    UInt32 height = serverWindow->getHeight();

    if(getWidth()==0)
    {
        setWidth( width*getHServers() );
    }
    if(getHeight()==0)
    {
        setHeight( height*getVServers() );
    }

    Int32 left   = column * width  - column * getXOverlap();
    Int32 bottom = row    * height - row    * getYOverlap();
    Int32 right  = left   + width  - 1;
    Int32 top    = bottom + height - 1;
    Real64 scaleCWidth  =
        ((width - getXOverlap()) * (getHServers() - 1) + width) /
        (float)getWidth();
    Real64 scaleCHeight =
        ((height - getYOverlap())* (getVServers() - 1) + height)/
        (float)getHeight();

    bool   isVirtualPort = false;

    // duplicate viewports
    for(cv = 0, sv = 0; cv < getPort().size(); ++cv)
    {
        clientPort = getPort()[cv];

#if 0
        isVirtualPort = clientPort->getType().isDerivedFrom(FBOViewport::getClassType());

        if(isVirtualPort)
        {
            // TODO -- seems wrong to render this on all servers, though rendering
            // then transmitting the texture doesn't seem like a good idea either.
            if(serverWindow->getPort().size() <= sv)
            {
                serverPort = ViewportPtr::dcast(clientPort->shallowCopy());
                beginEditCP(serverWindow);
                serverWindow->addPort(serverPort);
                endEditCP(serverWindow);
            }
            else
            {
                serverPort = serverWindow->getPort()[sv];
                if(serverWindow->getPort()[sv]->getType() !=
                        clientPort->getType())
                {
                    // there is a viewport with the wrong type
                    subRefCP(serverWindow->getPort()[sv]);
                    serverPort = ViewportPtr::dcast(clientPort->shallowCopy());
                    beginEditCP(serverWindow);
                    {
                        serverWindow->getPort()[sv] = serverPort;
                    }
                    endEditCP(serverWindow);
                }
            }
            // update changed viewport fields
            updateViewport(serverPort,clientPort);
        }
        else
#endif
        {
            clientStereoPort =
                dynamic_cast<StereoBufferViewportPtr>(clientPort);

            cleft   = (Int32)(clientPort->getPixelLeft()      * scaleCWidth)   ;
            cbottom = (Int32)(clientPort->getPixelBottom()    * scaleCHeight)  ;
            cright  = (Int32)((clientPort->getPixelRight()+1) * scaleCWidth) -1;
            ctop    = (Int32)((clientPort->getPixelTop()+1)   * scaleCHeight)-1;

            if(cright  < left   ||
                    cleft   > right  ||
                    ctop    < bottom ||
                    cbottom > top      )
            {
                // invisible on this server screen
                continue;
            }

            // calculate overlapping viewport
            l = osgMax(cleft  ,left  ) - left;
            b = osgMax(cbottom,bottom) - bottom;
            r = osgMin(cright ,right ) - left;
            t = osgMin(ctop   ,top   ) - bottom;

            if(serverWindow->getPort().size() <= sv)
            {
                serverPort =
                    dynamic_cast<ViewportPtr>(clientPort->shallowCopy());

                deco = TileCameraDecorator::create();

                serverWindow->addPort(serverPort);

                serverPort->setCamera(deco);
            }
            else
            {
                serverPort = serverWindow->getPort()[sv];

                deco = dynamic_cast<TileCameraDecoratorPtr>(
                           serverPort->getCamera());

                if(serverWindow->getPort()[sv]->getType() !=
                        clientPort->getType())
                {
                    // there is a viewport with the wrong type
                    serverPort =
                        dynamic_cast<ViewportPtr>(clientPort->shallowCopy());

                    serverWindow->replacePort(sv,
                                              serverPort);//[sv] = serverPort;
                    serverPort->setCamera(deco);
                }
                else
                {
                    deco = dynamic_cast<TileCameraDecoratorPtr>(
                               serverPort->getCamera());
                }
            }

            // update changed viewport fields
            updateViewport(serverPort,clientPort);

            // set viewport size
            serverPort->setSize(Real32(l),Real32(b),Real32(r),Real32(t));

            // use pixel even if pixel = 1
            if(serverPort->getLeft() == 1.0)
                serverPort->setLeft(1.0001);

            if(serverPort->getRight() == 1.0)
                serverPort->setRight(1.0001);

            if(serverPort->getTop() == 1.0)
                serverPort->setTop(1.0001);

            if(serverPort->getBottom() == 1.0)
                serverPort->setBottom(1.0001);

            // calculate tile parameters
            deco->setFullWidth ( cright-cleft );
            deco->setFullHeight( ctop-cbottom );
            deco->setSize( ( l+left-cleft     ) / (float)( cright-cleft ),
                           ( b+bottom-cbottom ) / (float)( ctop-cbottom ),
                           ( r+left-cleft     ) / (float)( cright-cleft ),
                           ( t+bottom-cbottom ) / (float)( ctop-cbottom ) );
            deco->setDecoratee( clientPort->getCamera() );
        }
        sv++;
    }

    // remove unused ports
    while(serverWindow->getPort().size()>sv)
    {
        serverWindow->subPort(sv);
    }

    Inherited::serverRender(serverWindow,id,action);
}
void SpaceNavigatorSSM::mouseButtonPress(UInt16 button, Int16 x, Int16 y)
{
	switch (button)
	{
		case MouseLeft:
			// test if an object is picked
			if(_objectPicking)
			{
				Line ray = calcViewRay(x, y);
				IntersectAction *iAct = IntersectAction::create();
				iAct->setLine(ray);
				iAct->apply(this->getRoot());

				// we have a hit
				if(iAct->didHit())
				{
					_pickedObjectNode = iAct->getHitObject();
					#ifdef SPACENAVIGATOR_DEBUG_OUTPUT
					std::cout << "SpaceNavigatorSSM: Object transformation mode active ( " << getName(_pickedObjectNode) << " )" << std::endl;
					#endif // SPACENAVIGATOR_DEBUG_OUTPUT

					// go up in the graph to the next transformation
					while(!_pickedObjectNode->getCore()->getType().isDerivedFrom(Transform::getClassType()))
					{
						if(_pickedObjectNode->getParent() != this->getRoot())
							_pickedObjectNode = _pickedObjectNode->getParent();
						else
						{
							// insert a new transformation node
							NodePtr pickedObject = iAct->getHitObject();
							TransformPtr newTransform = Transform::create();
							Matrix m;
							m.setIdentity();
							beginEditCP(newTransform, Transform::MatrixFieldMask);
								newTransform->setMatrix(m);
							endEditCP(newTransform, Transform::MatrixFieldMask);

							NodePtr newTransformNode = Node::create();

							beginEditCP(newTransformNode, Node::CoreFieldMask);
								newTransformNode->setCore(newTransform);
							endEditCP(newTransformNode, Node::CoreFieldMask);
							
							NodePtr pickedObjectParent = pickedObject->getParent();

							// add reference because reCount would be 0 and then it will
							// be deleted
							addRefCP(pickedObject);

							beginEditCP(pickedObjectParent);
								pickedObjectParent->replaceChildBy(pickedObject, newTransformNode);
							endEditCP(pickedObjectParent);

							beginEditCP(newTransformNode);
								newTransformNode->addChild(pickedObject);
							endEditCP(newTransformNode);
							
							// sub the reference which was added before
							subRefCP(pickedObject);

							_pickedObjectNode = newTransformNode;
						}
					}

					// a transformation was found and the objects bounding box is showed
					this->setHighlight(_pickedObjectNode);
				}
			}
			_navigator.buttonPress(Navigator::LEFT_MOUSE,x,y);
			break;

		case MouseMiddle: 
			_navigator.buttonPress(Navigator::MIDDLE_MOUSE,x,y);
			break;

		case MouseRight:
			// release picked object and switch off bounding box rendering
			if(_objectPicking)
			{
				_pickedObjectNode = NullFC;
				this->setHighlight(NullFC);
				#ifdef SPACENAVIGATOR_DEBUG_OUTPUT
					std::cout << "SpaceNavigatorSSM: Camera transformation mode active" << std::endl;
				#endif // SPACENAVIGATOR_DEBUG_OUTPUT
			}
			_navigator.buttonPress(Navigator::RIGHT_MOUSE,x,y);
			break;

		case MouseUp:     
			_navigator.buttonPress(Navigator::UP_MOUSE,x,y);
			break;

		case MouseDown:    
			_navigator.buttonPress(Navigator::DOWN_MOUSE,x,y);
			break;
		}

		_mousebuttons |= 1 << button;
		_lastx = x;
		_lasty = y;
}
Exemple #30
0
// react to keys
void keyboard(unsigned char k, int x, int y)
{
    Real32 bumpHeight;

    switch(k)
    {
        case 27:
        case 'q':
            glutDestroyWindow(glutGetWindow());
            delete _mgr;
            subRefCP(_gwin);
            return;
        break;
        case 'r':
            if(_cgfxmat != NullFC)
            {
                // reload cgfx material.
                beginEditCP(_cgfxmat);
                    _cgfxmat->setEffectFile(_cgfxmat->getEffectFile());
                endEditCP(_cgfxmat);
            }
        break;
        case 'w':
            SceneFileHandler::the().write(_scene, "scene.osb.gz", true);
            printf("wrote scene.osb.gz\n");
        break;
        case 'e':
            SceneFileHandler::the().write(_scene, "scene.osg");
            printf("wrote scene.osg\n");
        break;
        case 'b':
            if(_cgfxmat != NullFC && _cgfxmat->getParameter("bumpHeight", bumpHeight))
            {
                bumpHeight += 0.1;
                beginEditCP(_cgfxmat, CGFXMaterial::ParametersFieldMask);
                    _cgfxmat->setParameter("bumpHeight", bumpHeight);
                endEditCP(_cgfxmat, CGFXMaterial::ParametersFieldMask);
                glutPostRedisplay();
            }
        break;
        case 'n':
            if(_cgfxmat != NullFC && _cgfxmat->getParameter("bumpHeight", bumpHeight))
            {
                bumpHeight -= 0.1;
                beginEditCP(_cgfxmat, CGFXMaterial::ParametersFieldMask);
                    _cgfxmat->setParameter("bumpHeight", bumpHeight);
                endEditCP(_cgfxmat, CGFXMaterial::ParametersFieldMask);
                glutPostRedisplay();
            }
        break;
        case 't':
            if(_cgfxmat != NullFC)
            {
                Int32 technique = _cgfxmat->getTechnique();
                technique = 1 - technique;
                printf("setting technique to '%s'\n", _cgfxmat->getTechniqueString(technique).c_str());
                beginEditCP(_cgfxmat, CGFXMaterial::TechniqueFieldMask);
                    _cgfxmat->setTechnique(technique);
                endEditCP(_cgfxmat, CGFXMaterial::TechniqueFieldMask);
                glutPostRedisplay();
            }
        break;
    }

    glutPostRedisplay();
}