bool readMatrix(osg::Matrix& matrix, osgDB::Input& fr, const char* keyword) { bool iteratorAdvanced = false; if (fr[0].matchWord(keyword) && fr[1].isOpenBracket()) { int entry = fr[0].getNoNestedBrackets(); fr += 2; int row=0; int col=0; double v; while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { if (fr[0].getFloat(v)) { matrix(row,col)=v; ++col; if (col>=4) { col = 0; ++row; } ++fr; } else fr.advanceOverCurrentFieldOrBlock(); } iteratorAdvanced = true; } return iteratorAdvanced; }
bool Locator_readLocalData(osg::Object& obj, osgDB::Input &fr) { osgVolume::Locator& locator = static_cast<osgVolume::Locator&>(obj); bool itrAdvanced = false; if (fr.matchSequence("Transform {")) { int tansform_entry = fr[0].getNoNestedBrackets(); fr += 2; int row=0; int col=0; double v; osg::Matrixd matrix; while (!fr.eof() && fr[0].getNoNestedBrackets()>tansform_entry) { if (fr[0].getFloat(v)) { matrix(row,col)=v; ++col; if (col>=4) { col = 0; ++row; } ++fr; } else fr.advanceOverCurrentFieldOrBlock(); } locator.setTransform(matrix); ++fr; itrAdvanced = true; } return itrAdvanced; }
bool View_readLocalData(osg::Object &obj, osgDB::Input &fr) { osgViewer::View &view = dynamic_cast<osgViewer::View&>(obj); bool iteratorAdvanced = false; bool matchedFirst = false; if ((matchedFirst = fr.matchSequence("setUpViewFor3DSphericalDisplay {")) || fr.matchSequence("setUpViewForPanoramicSphericalDisplay {")) { double radius = 1.0; double collar = 0.45; unsigned int screenNum = 0; unsigned int intensityFormat = 8; osg::Matrix matrix; std::string filename; osg::ref_ptr<osg::Image> intensityMap; int entry = fr[0].getNoNestedBrackets(); fr += 2; while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) { bool local_itrAdvanced = false; if (fr.read("radius", radius)) local_itrAdvanced = true; if (fr.read("collar", collar)) local_itrAdvanced = true; if (fr.read("screenNum", screenNum)) local_itrAdvanced = true; if (fr.read("intensityFile", filename)) local_itrAdvanced = true; if (fr.matchSequence("intensityMap {")) intensityMap = readIntensityImage(fr, local_itrAdvanced); if (fr.read("intensityFormat", intensityFormat)) local_itrAdvanced = true; if (readMatrix(matrix, fr, "projectorMatrix")) local_itrAdvanced = true; if (!local_itrAdvanced) ++fr; } // skip trailing '}' ++fr; iteratorAdvanced = true; if (!filename.empty()) { intensityMap = osgDB::readRefImageFile(filename); } if (intensityMap.valid()) { if (intensityFormat == 16) intensityMap->setInternalTextureFormat(GL_LUMINANCE16F_ARB); else if (intensityFormat == 32) intensityMap->setInternalTextureFormat(GL_LUMINANCE32F_ARB); // else intensityMap->setInternalTextureFormat(image->getPixelFormat()); } if (matchedFirst) view.setUpViewFor3DSphericalDisplay(radius, collar, screenNum, intensityMap.get(), matrix); else view.setUpViewForPanoramicSphericalDisplay(radius, collar, screenNum, intensityMap.get(), matrix); } int x = 0; int y = 0; int width = 128; int height = 1024; unsigned int screenNum = 0; if (fr.read("setUpViewOnSingleScreen", screenNum)) { view.setUpViewOnSingleScreen(screenNum); iteratorAdvanced = true; } if (fr.read("setUpViewAcrossAllScreens")) { view.setUpViewAcrossAllScreens(); iteratorAdvanced = true; } if (fr.read("setUpViewInWindow", x, y, width, height, screenNum)) { view.setUpViewInWindow(x, y, width, height, screenNum); } if (fr.read("setUpViewInWindow", x, y, width, height)) { view.setUpViewInWindow(x, y, width, height); } osg::ref_ptr<osg::Object> readObject; while ((readObject = fr.readObjectOfType(osgDB::type_wrapper<osg::Camera>())).valid()) { view.setCamera(static_cast<osg::Camera*>(readObject.get())); iteratorAdvanced = true; } if (fr.matchSequence("Slaves {")) { int entry = fr[0].getNoNestedBrackets(); fr += 2; while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) { readObject = fr.readObjectOfType(osgDB::type_wrapper<osg::Camera>()); if (readObject.valid()) view.addSlave(static_cast<osg::Camera*>(readObject.get())); else ++fr; } // skip trailing '}' ++fr; iteratorAdvanced = true; } return iteratorAdvanced; }
bool AnimationPath_readLocalData(osg::Object &obj, osgDB::Input &fr) { osg::AnimationPath *ap = dynamic_cast<osg::AnimationPath*>(&obj); if (!ap) return false; bool itAdvanced = false; if (fr[0].matchWord("LoopMode")) { if (fr[1].matchWord("SWING")) { ap->setLoopMode(AnimationPath::SWING); fr += 2; itAdvanced = true; } else if (fr[1].matchWord("LOOP")) { ap->setLoopMode(AnimationPath::LOOP); fr += 2; itAdvanced = true; } else if (fr[1].matchWord("NO_LOOPING")) { ap->setLoopMode(AnimationPath::NO_LOOPING); fr += 2; itAdvanced = true; } } if (fr.matchSequence("ControlPoints {")) { int entry = fr[0].getNoNestedBrackets(); fr += 2; double time; Vec3d position,scale; Quat rotation; while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { if (fr[0].getFloat(time) && fr[1].getFloat(position[0]) && fr[2].getFloat(position[1]) && fr[3].getFloat(position[2]) && fr[4].getFloat(rotation[0]) && fr[5].getFloat(rotation[1]) && fr[6].getFloat(rotation[2]) && fr[7].getFloat(rotation[3]) && fr[8].getFloat(scale[0]) && fr[9].getFloat(scale[1]) && fr[10].getFloat(scale[2])) { osg::AnimationPath::ControlPoint ctrlPoint(position,rotation,scale); ap->insert(time, ctrlPoint); fr+=11; } else fr.advanceOverCurrentFieldOrBlock(); } itAdvanced = true; } return itAdvanced; }
bool TextBase_readLocalData(osg::Object &obj, osgDB::Input &fr) { osgText::Text &text = static_cast<osgText::Text &>(obj); bool itAdvanced = false; // color if (fr[0].matchWord("color")) { osg::Vec4 c; if (fr[1].getFloat(c.x()) && fr[2].getFloat(c.y()) && fr[3].getFloat(c.z()) && fr[4].getFloat(c.w())) { text.setColor(c); fr += 4; itAdvanced = true; } } if (fr.matchSequence("font %w")) { text.setFont(fr[1].getStr()); fr += 2; itAdvanced = true; } if (fr[0].matchWord("fontResolution") || fr[0].matchWord("fontSize")) { unsigned int width; unsigned int height; if (fr[1].getUInt(width) && fr[2].getUInt(height)) { text.setFontResolution(width,height); fr += 3; itAdvanced = true; } } if (fr[0].matchWord("characterSize")) { float height; float aspectRatio; if (fr[1].getFloat(height) && fr[2].getFloat(aspectRatio)) { text.setCharacterSize(height,aspectRatio); fr += 3; itAdvanced = true; } } if (fr.matchSequence("characterSizeMode %w")) { std::string str = fr[1].getStr(); if (str=="OBJECT_COORDS") text.setCharacterSizeMode(osgText::Text::OBJECT_COORDS); else if (str=="SCREEN_COORDS") text.setCharacterSizeMode(osgText::Text::SCREEN_COORDS); else if (str=="OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT") text.setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT); } // maximum dimentsions of text box. if (fr[0].matchWord("maximumWidth")) { float width; if (fr[1].getFloat(width)) { text.setMaximumWidth(width); fr += 2; itAdvanced = true; } } if (fr[0].matchWord("maximumHeight")) { float height; if (fr[1].getFloat(height)) { text.setMaximumHeight(height); fr += 2; itAdvanced = true; } } if (fr[0].matchWord("lineSpacing")) { float height; if (fr[1].getFloat(height)) { text.setLineSpacing(height); fr += 2; itAdvanced = true; } } if (fr.matchSequence("alignment %w")) { std::string str = fr[1].getStr(); if (str=="LEFT_TOP") text.setAlignment(osgText::Text::LEFT_TOP); else if (str=="LEFT_CENTER") text.setAlignment(osgText::Text::LEFT_CENTER); else if (str=="LEFT_BOTTOM") text.setAlignment(osgText::Text::LEFT_BOTTOM); else if (str=="CENTER_TOP") text.setAlignment(osgText::Text::CENTER_TOP); else if (str=="CENTER_CENTER") text.setAlignment(osgText::Text::CENTER_CENTER); else if (str=="CENTER_BOTTOM") text.setAlignment(osgText::Text::CENTER_BOTTOM); else if (str=="RIGHT_TOP") text.setAlignment(osgText::Text::RIGHT_TOP); else if (str=="RIGHT_CENTER") text.setAlignment(osgText::Text::RIGHT_CENTER); else if (str=="RIGHT_BOTTOM") text.setAlignment(osgText::Text::RIGHT_BOTTOM); else if (str=="LEFT_BASE_LINE") text.setAlignment(osgText::Text::LEFT_BASE_LINE); else if (str=="CENTER_BASE_LINE") text.setAlignment(osgText::Text::CENTER_BASE_LINE); else if (str=="RIGHT_BASE_LINE") text.setAlignment(osgText::Text::RIGHT_BASE_LINE); else if (str=="LEFT_BOTTOM_BASE_LINE") text.setAlignment(osgText::Text::LEFT_BOTTOM_BASE_LINE); else if (str=="CENTER_BOTTOM_BASE_LINE") text.setAlignment(osgText::Text::CENTER_BOTTOM_BASE_LINE); else if (str=="RIGHT_BOTTOM_BASE_LINE") text.setAlignment(osgText::Text::RIGHT_BOTTOM_BASE_LINE); else if (str=="BASE_LINE") text.setAlignment(osgText::Text::BASE_LINE); fr += 2; itAdvanced = true; } if (fr.matchSequence("axisAlignment %w")) { std::string str = fr[1].getStr(); if (str=="XY_PLANE") text.setAxisAlignment(osgText::Text::XY_PLANE); else if (str=="REVERSED_XY_PLANE") text.setAxisAlignment(osgText::Text::REVERSED_XY_PLANE); else if (str=="XZ_PLANE") text.setAxisAlignment(osgText::Text::XZ_PLANE); else if (str=="REVERSED_XZ_PLANE") text.setAxisAlignment(osgText::Text::REVERSED_XZ_PLANE); else if (str=="YZ_PLANE") text.setAxisAlignment(osgText::Text::YZ_PLANE); else if (str=="REVERSED_YZ_PLANE") text.setAxisAlignment(osgText::Text::REVERSED_YZ_PLANE); else if (str=="SCREEN") text.setAxisAlignment(osgText::Text::SCREEN); fr += 2; itAdvanced = true; } if (fr.matchSequence("rotation")) { osg::Vec4 rotation; if (fr[1].getFloat(rotation.x()) && fr[2].getFloat(rotation.y()) && fr[3].getFloat(rotation.z()) && fr[4].getFloat(rotation.w())) { text.setRotation(rotation); fr += 4; itAdvanced = true; } } if (fr.matchSequence("autoRotateToScreen TRUE")) { text.setAutoRotateToScreen(true); fr += 2; itAdvanced = true; } if (fr.matchSequence("autoScaleToLimitScreenSizeToFontResolution TRUE")) { text.setCharacterSizeMode(osgText::Text::SCREEN_COORDS); fr += 2; itAdvanced = true; } if (fr.matchSequence("layout %w") && fr[1].getStr()) { std::string str = fr[1].getStr(); if (str=="LEFT_TO_RIGHT") text.setLayout(osgText::Text::LEFT_TO_RIGHT); else if (str=="RIGHT_TO_LEFT") text.setLayout(osgText::Text::RIGHT_TO_LEFT); else if (str=="VERTICAL") text.setLayout(osgText::Text::VERTICAL); fr += 2; itAdvanced = true; } // position if (fr[0].matchWord("position")) { osg::Vec3 p; if (fr[1].getFloat(p.x()) && fr[2].getFloat(p.y()) && fr[3].getFloat(p.z())) { text.setPosition(p); fr += 4; itAdvanced = true; } } // draw mode if (fr[0].matchWord("drawMode")) { int i; if (fr[1].getInt(i)) { text.setDrawMode(i); fr += 2; itAdvanced = true; } } // bounding box margin if (fr[0].matchWord("BoundingBoxMargin")) { float margin; if (fr[1].getFloat(margin)) { text.setBoundingBoxMargin(margin); fr += 2; itAdvanced = true; } } // bounding box color if (fr[0].matchWord("BoundingBoxColor")) { osg::Vec4 c; if (fr[1].getFloat(c.x()) && fr[2].getFloat(c.y()) && fr[3].getFloat(c.z()) && fr[4].getFloat(c.w())) { text.setBoundingBoxColor(c); fr += 5; itAdvanced = true; } } // text if (fr.matchSequence("text %s") && fr[1].getStr()) { text.setText(std::string(fr[1].getStr())); fr += 2; itAdvanced = true; } if (fr.matchSequence("text %i {")) { // pre 0.9.3 releases.. int entry = fr[0].getNoNestedBrackets(); int capacity; fr[1].getInt(capacity); osgText::String str; str.reserve(capacity); fr += 3; while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int c; if (fr[0].getUInt(c)) { ++fr; str.push_back(c); } else { ++fr; } } text.setText(str); itAdvanced = true; ++fr; } return itAdvanced; }
void buildHierarchy( osgDB::Input& fr, int level, osgAnimation::Bone* parent ) { bool isRecognized = false; if ( !parent ) return; if ( fr.matchSequence("OFFSET %f %f %f") ) { isRecognized = true; ++fr; osg::Vec3 offset; if ( fr.readSequence(offset) ) { // Process OFFSET section parent->setBindMatrixInBoneSpace( osg::Matrix::translate(offset) ); if ( _drawingFlag && parent->getNumParents() && level>0 ) parent->getParent(0)->addChild( createRefGeometry(offset, 0.5).get() ); } } if ( fr.matchSequence("CHANNELS %i") ) { isRecognized = true; // Process CHANNELS section int noChannels; fr[1].getInt( noChannels ); fr += 2; for ( int i=0; i<noChannels; ++i ) { // Process each channel std::string channelName; fr.readSequence( channelName ); alterChannel( channelName, _joints.back().second ); } } if ( fr.matchSequence("End Site {") ) { isRecognized = true; fr += 3; if ( fr.matchSequence("OFFSET %f %f %f") ) { ++fr; osg::Vec3 offsetEndSite; if ( fr.readSequence(offsetEndSite) ) { // Process End Site section osg::ref_ptr<osgAnimation::Bone> bone = new osgAnimation::Bone( parent->getName()+"End" ); bone->setBindMatrixInBoneSpace( osg::Matrix::translate(offsetEndSite) ); bone->setDataVariance( osg::Object::DYNAMIC ); parent->addChild( bone.get() ); if ( _drawingFlag ) parent->addChild( createRefGeometry(offsetEndSite, 0.5).get() ); } } fr.advanceOverCurrentFieldOrBlock(); } if ( fr.matchSequence("ROOT %w {") || fr.matchSequence("JOINT %w {") ) { isRecognized = true; // Process JOINT section osg::ref_ptr<osgAnimation::Bone> bone = new osgAnimation::Bone( fr[1].getStr() ); bone->setDefaultUpdateCallback(); bone->setDataVariance( osg::Object::DYNAMIC ); parent->addChild( bone.get() ); _joints.push_back( JointNode(bone, 0) ); int entry = fr[1].getNoNestedBrackets(); fr += 3; while ( !fr.eof() && fr[0].getNoNestedBrackets()>entry ) buildHierarchy( fr, entry, bone.get() ); fr.advanceOverCurrentFieldOrBlock(); } if ( !isRecognized ) { osg::notify(osg::WARN) << "BVH Reader: Unrecognized symbol " << fr[0].getStr() << ". Ignore current field or block." << std::endl; fr.advanceOverCurrentFieldOrBlock(); } }
void buildMotion( osgDB::Input& fr, osgAnimation::Animation* anim ) { int i=0, frames=0; float frameTime=0.033f; if ( !fr.readSequence("Frames:", frames) ) { osg::notify(osg::WARN) << "BVH Reader: Frame number setting not found, but an unexpected " << fr[0].getStr() << ". Set to 1." << std::endl; } ++fr; if ( !fr.readSequence("Time:", frameTime) ) { osg::notify(osg::WARN) << "BVH Reader: Frame time setting not found, but an unexpected " << fr[0].getStr() << ". Set to 0.033 (30FPS)." << std::endl; } // Each joint has a position animating channel and an euler animating channel std::vector< osg::ref_ptr<osgAnimation::Vec3LinearChannel> > posChannels; std::vector< osg::ref_ptr<osgAnimation::QuatSphericalLinearChannel> > rotChannels; for ( JointList::iterator itr=_joints.begin(); itr!=_joints.end(); ++itr ) { std::string name = itr->first->getName(); osg::ref_ptr<osgAnimation::Vec3KeyframeContainer> posKey = new osgAnimation::Vec3KeyframeContainer; osg::ref_ptr<osgAnimation::Vec3LinearSampler> posSampler = new osgAnimation::Vec3LinearSampler; osg::ref_ptr<osgAnimation::Vec3LinearChannel> posChannel = new osgAnimation::Vec3LinearChannel( posSampler.get() ); posSampler->setKeyframeContainer( posKey.get() ); posChannel->setName( "position" ); posChannel->setTargetName( name ); osg::ref_ptr<osgAnimation::QuatKeyframeContainer> rotKey = new osgAnimation::QuatKeyframeContainer; osg::ref_ptr<osgAnimation::QuatSphericalLinearSampler> rotSampler = new osgAnimation::QuatSphericalLinearSampler; osg::ref_ptr<osgAnimation::QuatSphericalLinearChannel> rotChannel = new osgAnimation::QuatSphericalLinearChannel( rotSampler.get() ); rotSampler->setKeyframeContainer( rotKey.get() ); rotChannel->setName( "quaternion" ); rotChannel->setTargetName( name ); posChannels.push_back( posChannel ); rotChannels.push_back( rotChannel ); } // Obtain motion data from the stream while ( !fr.eof() && i<frames ) { for ( unsigned int n=0; n<_joints.size(); ++n ) { osgAnimation::Vec3LinearChannel* posChannel = posChannels[n].get(); osgAnimation::QuatSphericalLinearChannel* rotChannel = rotChannels[n].get(); setKeyframe( fr, _joints[n].second, frameTime*(double)i, dynamic_cast<osgAnimation::Vec3KeyframeContainer*>(posChannel->getSampler()->getKeyframeContainer()), dynamic_cast<osgAnimation::QuatKeyframeContainer*>(rotChannel->getSampler()->getKeyframeContainer()) ); } i++; } // Add valid channels to the animate object for ( unsigned int n=0; n<_joints.size(); ++n ) { if ( posChannels[n]->getOrCreateSampler()->getOrCreateKeyframeContainer()->size()>0 ) anim->addChannel( posChannels[n].get() ); if ( rotChannels[n]->getOrCreateSampler()->getOrCreateKeyframeContainer()->size()>0 ) anim->addChannel( rotChannels[n].get() ); } }