Implemented billboard="on" option for image, bullet and paragraph tags
This commit is contained in:
parent
74cf1168e0
commit
52ff51e0eb
@ -129,7 +129,10 @@ public:
|
|||||||
path_loop_mode(osg::AnimationPath::NO_LOOPING),
|
path_loop_mode(osg::AnimationPath::NO_LOOPING),
|
||||||
animation_material_time_offset(0.0),
|
animation_material_time_offset(0.0),
|
||||||
animation_material_time_multiplier(1.0),
|
animation_material_time_multiplier(1.0),
|
||||||
animation_material_loop_mode(AnimationMaterial::NO_LOOPING) {}
|
animation_material_loop_mode(AnimationMaterial::NO_LOOPING),
|
||||||
|
autoRotate(false),
|
||||||
|
autoScale(false) {}
|
||||||
|
|
||||||
|
|
||||||
bool requiresPosition() const
|
bool requiresPosition() const
|
||||||
{
|
{
|
||||||
@ -173,6 +176,8 @@ public:
|
|||||||
AnimationMaterial::LoopMode animation_material_loop_mode;
|
AnimationMaterial::LoopMode animation_material_loop_mode;
|
||||||
std::string animation_material_filename;
|
std::string animation_material_filename;
|
||||||
std::string fade;
|
std::string fade;
|
||||||
|
bool autoRotate;
|
||||||
|
bool autoScale;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ModelData
|
struct ModelData
|
||||||
@ -247,19 +252,21 @@ public:
|
|||||||
layout(osgText::Text::LEFT_TO_RIGHT),
|
layout(osgText::Text::LEFT_TO_RIGHT),
|
||||||
alignment(osgText::Text::LEFT_BASE_LINE),
|
alignment(osgText::Text::LEFT_BASE_LINE),
|
||||||
axisAlignment(osgText::Text::XZ_PLANE),
|
axisAlignment(osgText::Text::XZ_PLANE),
|
||||||
|
characterSizeMode(osgText::Text::OBJECT_COORDS),
|
||||||
characterSize(0.04f),
|
characterSize(0.04f),
|
||||||
maximumHeight(1.0f),
|
maximumHeight(1.0f),
|
||||||
maximumWidth(1.0f),
|
maximumWidth(1.0f),
|
||||||
color(1.0f,1.0f,1.0f,1.0f) {}
|
color(1.0f,1.0f,1.0f,1.0f) {}
|
||||||
|
|
||||||
std::string font;
|
std::string font;
|
||||||
osgText::Text::Layout layout;
|
osgText::Text::Layout layout;
|
||||||
osgText::Text::AlignmentType alignment;
|
osgText::Text::AlignmentType alignment;
|
||||||
osgText::Text::AxisAlignment axisAlignment;
|
osgText::Text::AxisAlignment axisAlignment;
|
||||||
float characterSize;
|
osgText::Text::CharacterSizeMode characterSizeMode;
|
||||||
float maximumHeight;
|
float characterSize;
|
||||||
float maximumWidth;
|
float maximumHeight;
|
||||||
osg::Vec4 color;
|
float maximumWidth;
|
||||||
|
osg::Vec4 color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,6 +72,10 @@ public:
|
|||||||
_alignmentMap["RIGHT_BASE_LINE"] = osgText::Text::RIGHT_BASE_LINE;
|
_alignmentMap["RIGHT_BASE_LINE"] = osgText::Text::RIGHT_BASE_LINE;
|
||||||
_alignmentMap["BASE_LINE"] = osgText::Text::LEFT_BASE_LINE;
|
_alignmentMap["BASE_LINE"] = osgText::Text::LEFT_BASE_LINE;
|
||||||
|
|
||||||
|
_characterSizeModeMap["OBJECT_COORDS"] = osgText::Text::OBJECT_COORDS;
|
||||||
|
_characterSizeModeMap["SCREEN_COORDS"] = osgText::Text::SCREEN_COORDS;
|
||||||
|
_characterSizeModeMap["OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT"] = osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT;
|
||||||
|
|
||||||
_stringKeyMap["Home"]=' ';
|
_stringKeyMap["Home"]=' ';
|
||||||
_stringKeyMap["Start"]= osgGA::GUIEventAdapter::KEY_Home;
|
_stringKeyMap["Start"]= osgGA::GUIEventAdapter::KEY_Home;
|
||||||
_stringKeyMap["Next"]= osgGA::GUIEventAdapter::KEY_Page_Down;
|
_stringKeyMap["Next"]= osgGA::GUIEventAdapter::KEY_Page_Down;
|
||||||
@ -185,6 +189,7 @@ public:
|
|||||||
bool getTrimmedProperty(osgDB::XmlNode*cur, const char* token, std::string& value) const;
|
bool getTrimmedProperty(osgDB::XmlNode*cur, const char* token, std::string& value) const;
|
||||||
bool getProperty(osgDB::XmlNode*cur, const char* token, osgText::Text::Layout& value) const;
|
bool getProperty(osgDB::XmlNode*cur, const char* token, osgText::Text::Layout& value) const;
|
||||||
bool getProperty(osgDB::XmlNode*cur, const char* token, osgText::Text::AlignmentType& value) const;
|
bool getProperty(osgDB::XmlNode*cur, const char* token, osgText::Text::AlignmentType& value) const;
|
||||||
|
bool getProperty(osgDB::XmlNode*cur, const char* token, osgText::Text::CharacterSizeMode& value) const;
|
||||||
|
|
||||||
bool getProperties(osgDB::XmlNode*cur, osgPresentation::SlideShowConstructor::PositionData& value) const;
|
bool getProperties(osgDB::XmlNode*cur, osgPresentation::SlideShowConstructor::PositionData& value) const;
|
||||||
bool getProperties(osgDB::XmlNode*cur, osgPresentation::SlideShowConstructor::FontData& value) const;
|
bool getProperties(osgDB::XmlNode*cur, osgPresentation::SlideShowConstructor::FontData& value) const;
|
||||||
@ -198,15 +203,17 @@ public:
|
|||||||
typedef std::map<std::string,osg::Vec4> ColorMap;
|
typedef std::map<std::string,osg::Vec4> ColorMap;
|
||||||
typedef std::map<std::string,osgText::Text::Layout> LayoutMap;
|
typedef std::map<std::string,osgText::Text::Layout> LayoutMap;
|
||||||
typedef std::map<std::string,osgText::Text::AlignmentType> AlignmentMap;
|
typedef std::map<std::string,osgText::Text::AlignmentType> AlignmentMap;
|
||||||
|
typedef std::map<std::string,osgText::Text::CharacterSizeMode> CharacterSizeModeMap;
|
||||||
typedef std::map<std::string, unsigned int> StringKeyMap;
|
typedef std::map<std::string, unsigned int> StringKeyMap;
|
||||||
|
|
||||||
std::string expandEnvVarsInFileName(const std::string& filename) const;
|
std::string expandEnvVarsInFileName(const std::string& filename) const;
|
||||||
|
|
||||||
|
|
||||||
ColorMap _colorMap;
|
ColorMap _colorMap;
|
||||||
LayoutMap _layoutMap;
|
LayoutMap _layoutMap;
|
||||||
AlignmentMap _alignmentMap;
|
AlignmentMap _alignmentMap;
|
||||||
StringKeyMap _stringKeyMap;
|
CharacterSizeModeMap _characterSizeModeMap;
|
||||||
|
StringKeyMap _stringKeyMap;
|
||||||
|
|
||||||
typedef std::map<std::string, osg::ref_ptr<osgDB::XmlNode> > TemplateMap;
|
typedef std::map<std::string, osg::ref_ptr<osgDB::XmlNode> > TemplateMap;
|
||||||
mutable TemplateMap _templateMap;
|
mutable TemplateMap _templateMap;
|
||||||
@ -459,6 +466,20 @@ bool ReaderWriterP3DXML::getProperty(osgDB::XmlNode*cur, const char* token, osgT
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ReaderWriterP3DXML::getProperty(osgDB::XmlNode*cur, const char* token, osgText::Text::CharacterSizeMode& value) const
|
||||||
|
{
|
||||||
|
osgDB::XmlNode::Properties::iterator pitr = cur->properties.find(token);
|
||||||
|
if (pitr==cur->properties.end()) return false;
|
||||||
|
|
||||||
|
const std::string& str = pitr->second;
|
||||||
|
CharacterSizeModeMap::const_iterator itr = _characterSizeModeMap.find(str);
|
||||||
|
if (itr!=_characterSizeModeMap.end())
|
||||||
|
{
|
||||||
|
value = itr->second;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool ReaderWriterP3DXML::getProperties(osgDB::XmlNode*cur, osgPresentation::SlideShowConstructor::PositionData& value) const
|
bool ReaderWriterP3DXML::getProperties(osgDB::XmlNode*cur, osgPresentation::SlideShowConstructor::PositionData& value) const
|
||||||
{
|
{
|
||||||
bool propertiesRead=false;
|
bool propertiesRead=false;
|
||||||
@ -698,6 +719,20 @@ bool ReaderWriterP3DXML::getProperties(osgDB::XmlNode*cur, osgPresentation::Slid
|
|||||||
propertiesRead = true;
|
propertiesRead = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getProperty(cur, "billboard", str))
|
||||||
|
{
|
||||||
|
value.autoRotate = (str != "off" && str != "Off" && str != "OFF");
|
||||||
|
OSG_NOTIFY(_notifyLevel)<<"billboard, str="<<str<<", autoRotate="<<value.autoRotate<<std::endl;
|
||||||
|
propertiesRead = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getProperty(cur, "scale_to_screen",str))
|
||||||
|
{
|
||||||
|
value.autoScale = (str != "off" && str != "Off" && str != "OFF");
|
||||||
|
OSG_NOTIFY(_notifyLevel)<<"scale-to-screen, str="<<str<<", autoRotate="<<value.autoScale<<std::endl;
|
||||||
|
propertiesRead = true;
|
||||||
|
}
|
||||||
|
|
||||||
return propertiesRead;
|
return propertiesRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -719,6 +754,13 @@ bool ReaderWriterP3DXML::getProperties(osgDB::XmlNode*cur, osgPresentation::Slid
|
|||||||
OSG_NOTIFY(_notifyLevel)<<"read height \""<<value.characterSize<<"\""<<std::endl;
|
OSG_NOTIFY(_notifyLevel)<<"read height \""<<value.characterSize<<"\""<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getProperty(cur, "character_size_mode", value.characterSizeMode))
|
||||||
|
{
|
||||||
|
propertiesRead = true;
|
||||||
|
|
||||||
|
OSG_NOTIFY(_notifyLevel)<<"read character_size_mode \""<<value.characterSizeMode<<"\""<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
if (getProperty(cur, "layout", value.layout))
|
if (getProperty(cur, "layout", value.layout))
|
||||||
{
|
{
|
||||||
propertiesRead = true;
|
propertiesRead = true;
|
||||||
|
@ -542,6 +542,7 @@ void SlideShowConstructor::addBullet(const std::string& bullet, PositionData& po
|
|||||||
text->setFont(fontData.font);
|
text->setFont(fontData.font);
|
||||||
text->setColor(fontData.color);
|
text->setColor(fontData.color);
|
||||||
text->setCharacterSize(fontData.characterSize*_slideHeight);
|
text->setCharacterSize(fontData.characterSize*_slideHeight);
|
||||||
|
text->setCharacterSizeMode(fontData.characterSizeMode);
|
||||||
text->setFontResolution(110,120);
|
text->setFontResolution(110,120);
|
||||||
text->setMaximumWidth(fontData.maximumWidth*_slideWidth);
|
text->setMaximumWidth(fontData.maximumWidth*_slideWidth);
|
||||||
text->setLayout(fontData.layout);
|
text->setLayout(fontData.layout);
|
||||||
@ -549,6 +550,16 @@ void SlideShowConstructor::addBullet(const std::string& bullet, PositionData& po
|
|||||||
text->setAxisAlignment(fontData.axisAlignment);
|
text->setAxisAlignment(fontData.axisAlignment);
|
||||||
text->setPosition(localPosition);
|
text->setPosition(localPosition);
|
||||||
|
|
||||||
|
if (positionData.autoRotate)
|
||||||
|
{
|
||||||
|
text->setAxisAlignment(osgText::Text::SCREEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (positionData.autoScale)
|
||||||
|
{
|
||||||
|
text->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
|
||||||
|
}
|
||||||
|
|
||||||
text->setText(bullet);
|
text->setText(bullet);
|
||||||
|
|
||||||
osg::BoundingBox bb = text->getBound();
|
osg::BoundingBox bb = text->getBound();
|
||||||
@ -595,6 +606,7 @@ void SlideShowConstructor::addParagraph(const std::string& paragraph, PositionDa
|
|||||||
text->setFont(fontData.font);
|
text->setFont(fontData.font);
|
||||||
text->setColor(fontData.color);
|
text->setColor(fontData.color);
|
||||||
text->setCharacterSize(fontData.characterSize*_slideHeight);
|
text->setCharacterSize(fontData.characterSize*_slideHeight);
|
||||||
|
text->setCharacterSizeMode(fontData.characterSizeMode);
|
||||||
text->setFontResolution(110,120);
|
text->setFontResolution(110,120);
|
||||||
text->setMaximumWidth(fontData.maximumWidth*_slideWidth);
|
text->setMaximumWidth(fontData.maximumWidth*_slideWidth);
|
||||||
text->setLayout(fontData.layout);
|
text->setLayout(fontData.layout);
|
||||||
@ -602,6 +614,15 @@ void SlideShowConstructor::addParagraph(const std::string& paragraph, PositionDa
|
|||||||
text->setAxisAlignment(fontData.axisAlignment);
|
text->setAxisAlignment(fontData.axisAlignment);
|
||||||
text->setPosition(localPosition);
|
text->setPosition(localPosition);
|
||||||
|
|
||||||
|
if (positionData.autoRotate)
|
||||||
|
{
|
||||||
|
text->setAxisAlignment(osgText::Text::SCREEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (positionData.autoScale)
|
||||||
|
{
|
||||||
|
text->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
|
||||||
|
}
|
||||||
text->setText(paragraph);
|
text->setText(paragraph);
|
||||||
|
|
||||||
osg::BoundingBox bb = text->getBound();
|
osg::BoundingBox bb = text->getBound();
|
||||||
@ -819,21 +840,37 @@ void SlideShowConstructor::addImage(const std::string& filename, const PositionD
|
|||||||
|
|
||||||
float image_width = _slideWidth*positionData.scale.x();
|
float image_width = _slideWidth*positionData.scale.x();
|
||||||
float image_height = image_width*aspectRatio*positionData.scale.y()/positionData.scale.x();
|
float image_height = image_width*aspectRatio*positionData.scale.y()/positionData.scale.x();
|
||||||
float offset = height*image_height*0.1f;
|
float offset = 0.0f; //height*image_height*0.1f;
|
||||||
|
|
||||||
osg::Vec3 pos = computePositionInModelCoords(positionData) + osg::Vec3(-image_width*0.5f+offset,-offset,-image_height*0.5f-offset);
|
osg::Vec3 pos = computePositionInModelCoords(positionData);
|
||||||
|
osg::Vec3 image_local_pos = osg::Vec3(-image_width*0.5f+offset,-offset,-image_height*0.5f-offset);
|
||||||
osg::Geode* picture = new osg::Geode;
|
osg::Vec3 image_pos = positionData.autoRotate ? image_local_pos : (pos+image_local_pos);
|
||||||
osg::Node* subgraph = picture;
|
|
||||||
|
|
||||||
|
|
||||||
bool usedTextureRectangle = false;
|
bool usedTextureRectangle = false;
|
||||||
osg::Geometry* pictureQuad = createTexturedQuadGeometry(pos, positionData.rotate, image_width, image_height, image, usedTextureRectangle);
|
osg::Geometry* pictureQuad = createTexturedQuadGeometry(image_pos, positionData.rotate, image_width, image_height, image, usedTextureRectangle);
|
||||||
osg::StateSet* pictureStateSet = pictureQuad->getOrCreateStateSet();
|
osg::StateSet* pictureStateSet = pictureQuad->getOrCreateStateSet();
|
||||||
|
|
||||||
attachTexMat(pictureStateSet, imageData, s, t, usedTextureRectangle);
|
attachTexMat(pictureStateSet, imageData, s, t, usedTextureRectangle);
|
||||||
|
|
||||||
picture->addDrawable(pictureQuad);
|
osg::Node* subgraph = 0;
|
||||||
|
|
||||||
|
if (positionData.autoRotate)
|
||||||
|
{
|
||||||
|
osg::Billboard* picture = new osg::Billboard;
|
||||||
|
picture->setMode(osg::Billboard::POINT_ROT_EYE);
|
||||||
|
picture->setNormal(osg::Vec3(0.0f,-1.0f,0.0f));
|
||||||
|
picture->setAxis(osg::Vec3(0.0f,0.0f,1.0f));
|
||||||
|
picture->addDrawable(pictureQuad,pos);
|
||||||
|
subgraph = picture;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
osg::Geode* picture = new osg::Geode;
|
||||||
|
picture->addDrawable(pictureQuad);
|
||||||
|
subgraph = picture;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// attach any meterial animation.
|
// attach any meterial animation.
|
||||||
if (positionData.requiresMaterialAnimation())
|
if (positionData.requiresMaterialAnimation())
|
||||||
@ -853,7 +890,7 @@ void SlideShowConstructor::addImage(const std::string& filename, const PositionD
|
|||||||
osg::MatrixTransform* animation_transform = new osg::MatrixTransform;
|
osg::MatrixTransform* animation_transform = new osg::MatrixTransform;
|
||||||
animation_transform->setDataVariance(osg::Object::DYNAMIC);
|
animation_transform->setDataVariance(osg::Object::DYNAMIC);
|
||||||
animation_transform->setUpdateCallback(
|
animation_transform->setUpdateCallback(
|
||||||
new osgUtil::TransformCallback(picture->getBound().center(),
|
new osgUtil::TransformCallback(subgraph->getBound().center(),
|
||||||
osg::Vec3(positionData.rotation[1],positionData.rotation[2],positionData.rotation[3]),
|
osg::Vec3(positionData.rotation[1],positionData.rotation[2],positionData.rotation[3]),
|
||||||
osg::DegreesToRadians(positionData.rotation[0])));
|
osg::DegreesToRadians(positionData.rotation[0])));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user