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); } } } }
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; }
void Material::onDestroyAspect(UInt32 uiId, UInt32 uiAspect) { Inherited::onDestroyAspect(uiId, uiAspect); subRefCP(_pState); _pState = NullFC; }
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; }
CParticleEmitter::~CParticleEmitter() { subRefCP( m_pNode ); if( m_pParticles ) delete[] m_pParticles; if( m_pParticleType ) delete m_pParticleType; }
//! 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); }
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; }
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; } }
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(); }
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 ¶meters = *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; }
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; } } }
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; }
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; }
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
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; }
// 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(); }