You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
(49) |
May
(163) |
Jun
(76) |
Jul
(125) |
Aug
(54) |
Sep
(140) |
Oct
(163) |
Nov
(98) |
Dec
(33) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(152) |
Feb
(165) |
Mar
(122) |
Apr
(154) |
May
(259) |
Jun
(159) |
Jul
(207) |
Aug
(237) |
Sep
(125) |
Oct
(288) |
Nov
(138) |
Dec
(59) |
2003 |
Jan
(213) |
Feb
(155) |
Mar
(159) |
Apr
(223) |
May
(293) |
Jun
(227) |
Jul
(164) |
Aug
(147) |
Sep
(120) |
Oct
(152) |
Nov
(159) |
Dec
(119) |
2004 |
Jan
(59) |
Feb
(133) |
Mar
(145) |
Apr
(135) |
May
(65) |
Jun
(63) |
Jul
(64) |
Aug
(91) |
Sep
(78) |
Oct
(38) |
Nov
(58) |
Dec
(103) |
2005 |
Jan
(109) |
Feb
(24) |
Mar
(49) |
Apr
(70) |
May
(53) |
Jun
(51) |
Jul
(75) |
Aug
(38) |
Sep
(44) |
Oct
(85) |
Nov
(57) |
Dec
(224) |
2006 |
Jan
(134) |
Feb
(35) |
Mar
(68) |
Apr
(46) |
May
(24) |
Jun
(210) |
Jul
(66) |
Aug
(90) |
Sep
(64) |
Oct
(15) |
Nov
(52) |
Dec
(10) |
2007 |
Jan
(37) |
Feb
(48) |
Mar
(32) |
Apr
(20) |
May
(39) |
Jun
(72) |
Jul
(45) |
Aug
(15) |
Sep
(61) |
Oct
(44) |
Nov
(70) |
Dec
(24) |
2008 |
Jan
(28) |
Feb
(100) |
Mar
(63) |
Apr
(86) |
May
(43) |
Jun
(58) |
Jul
(19) |
Aug
(25) |
Sep
(53) |
Oct
(29) |
Nov
(35) |
Dec
(15) |
2009 |
Jan
(14) |
Feb
(43) |
Mar
(17) |
Apr
(38) |
May
(19) |
Jun
(17) |
Jul
(11) |
Aug
(13) |
Sep
(53) |
Oct
(55) |
Nov
(56) |
Dec
(56) |
2010 |
Jan
(39) |
Feb
(110) |
Mar
(70) |
Apr
(36) |
May
(35) |
Jun
(43) |
Jul
(19) |
Aug
(20) |
Sep
(27) |
Oct
(18) |
Nov
(33) |
Dec
(45) |
2011 |
Jan
(34) |
Feb
(14) |
Mar
(17) |
Apr
(24) |
May
(22) |
Jun
(16) |
Jul
(10) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <cr...@us...> - 2011-04-27 20:47:20
|
Revision: 8037 http://ravl.svn.sourceforge.net/ravl/?rev=8037&view=rev Author: craftit Date: 2011-04-27 20:47:13 +0000 (Wed, 27 Apr 2011) Log Message: ----------- Add LayoutGridC Modified Paths: -------------- main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc main/Ravl/Contrib/OpenSceneGraph/defs.mk main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml Added Paths: ----------- main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.cc main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.hh Added: main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.cc (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.cc 2011-04-27 20:47:13 UTC (rev 8037) @@ -0,0 +1,117 @@ + +#include "Ravl/OpenSceneGraph/LayoutGrid.hh" +#include "Ravl/OpenSceneGraph/TypeConvert.hh" +#include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/RLog.hh" + +namespace RavlOSGN { + + //: Constructor + + LayoutGridC::LayoutGridC(bool create) + : LayoutC(create), + m_stackAxis1(0), + m_stackAxis2(1) + { + } + + //: XML factory constructor + + LayoutGridC::LayoutGridC(const XMLFactoryContextC &factory) + : LayoutC(true) + { + Setup(factory); + } + + //: Update the layout + + bool LayoutGridC::UpdateLayout() + { + rDebug("Updating layout. "); + + unsigned colMax = 1; + const unsigned viewSize = m_nodes.size(); + unsigned rowMax = RavlN::Floor(RavlN::Sqrt(viewSize)); + colMax = rowMax; + if(RavlN::Sqr(rowMax) < viewSize) + colMax++; + + // Sort out grid displays + Vector3dC rowStart(0,0,0); + unsigned at = 0; + + std::vector<float> colSizes(colMax); + + for(unsigned c = 0;c < colMax;c++) { + float width = 0; + for(unsigned r = 0;r < rowMax;r++) { + unsigned at = r * colMax + c; + if(at >= m_nodes.size()) + break; + float csize = m_nodes[at]->Bounds()._max[m_stackAxis2] - m_nodes[at]->Bounds()._min[m_stackAxis2]; + if(csize > width) + width = csize; + } + colSizes[c] = width; + } + + + for(unsigned r = 0;r < rowMax;r++) { + float hight = m_gap; + Vector3dC vat = rowStart; + + // Work out the row hight. + for(unsigned c = 0;c < colMax && at < m_nodes.size();c++,at++) { + float rsize = m_nodes[at]->Bounds()._max[m_stackAxis1] - m_nodes[at]->Bounds()._min[m_stackAxis1]; + if(rsize > hight) + hight = rsize; + Vector3dC correctedPosition = vat - MakeVector3d(m_nodes[at]->Bounds()._min); + m_nodes[at]->SetPosition(correctedPosition); + rDebug("Start %s ",RavlN::StringOf(correctedPosition).data()); + vat[m_stackAxis2] += colSizes[c] + m_gap; + } + rowStart[m_stackAxis1] += hight + m_gap; + } + + return true; + } + + //: Process a callback. + + void LayoutGridC::DoCallback() + { + LayoutC::DoCallback(); + } + + //: Do setup from factory + + bool LayoutGridC::Setup(const XMLFactoryContextC &factory) + { + m_stackAxis1 = factory.AttributeInt("stackAxis1",0); + if(m_stackAxis1 < 0 || m_stackAxis1 > 2) { + rError("Invalid 1st stack axis %d ",m_stackAxis1); + throw RavlN::ExceptionBadConfigC("Invalid stack axis. "); + } + m_stackAxis2 = factory.AttributeInt("stackAxis2",1); + if(m_stackAxis2 < 0 || m_stackAxis2 > 2) { + rError("Invalid 2nd stack axis %d ",m_stackAxis2); + throw RavlN::ExceptionBadConfigC("Invalid stack axis. "); + } + m_gap = factory.AttributeReal("gap",0.1); + LayoutC::Setup(factory); + return true; + } + + //: Called when owner handles drop to zero. + + void LayoutGridC::ZeroOwners() + { + LayoutC::ZeroOwners(); + } + + void LinkLayoutGrid() + {} + + static RavlN::XMLFactoryRegisterConvertC<LayoutGridC,LayoutC> g_registerXMLFactoryLayout("RavlOSGN::LayoutGridC"); + +} Added: main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.hh (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/LayoutGrid.hh 2011-04-27 20:47:13 UTC (rev 8037) @@ -0,0 +1,48 @@ +/* + * File: LayoutGrid.hh + * Author: charlesgalambos + * + * Created on April 25, 2011, 10:13 AM + */ + +#ifndef RAVLOSGN_LayoutGrid_HH +#define RAVLOSGN_LayoutGrid_HH + +#include "Ravl/OpenSceneGraph/Layout.hh" + +namespace RavlOSGN { + + //: Base class for automatic layouts + + class LayoutGridC + : public LayoutC + { + public: + LayoutGridC(bool create); + //: Constructor + + LayoutGridC(const XMLFactoryContextC &factory); + //: XML factory constructor + + protected: + virtual bool UpdateLayout(); + //: Update the layout + + virtual void DoCallback(); + //: Process a callback. + + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + + int m_stackAxis1; + int m_stackAxis2; + float m_gap; + }; + +} + +#endif /* LayoutGrid_HH */ + Modified: main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-25 20:34:41 UTC (rev 8036) +++ main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-27 20:47:13 UTC (rev 8037) @@ -15,6 +15,7 @@ extern void LinkModelFile(); extern void LinkLayout(); extern void LinkLayoutStack(); + extern void LinkLayoutGrid(); void LinkGtkGlExtInit() { @@ -32,5 +33,6 @@ LinkModelFile(); LinkLayout(); LinkLayoutStack(); + LinkLayoutGrid(); } } Modified: main/Ravl/Contrib/OpenSceneGraph/defs.mk =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-04-25 20:34:41 UTC (rev 8036) +++ main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-04-27 20:47:13 UTC (rev 8037) @@ -16,12 +16,12 @@ HEADERS=Drawable.hh Sphere.hh Image.hh ImageByteRGBA.hh ImageByteRGB.hh Text.hh \ TriMesh.hh TexTriMesh.hh Node.hh Geode.hh Group.hh Transform.hh ModelFile.hh \ HUD.hh OpenSceneGraphWidget.hh Box.hh CanvasManipulator.hh TypeConvert.hh \ - Layout.hh LayoutStack.hh + Layout.hh LayoutStack.hh LayoutGrid.hh SOURCES=Drawable.cc Sphere.cc Image.cc ImageByteRGBA.cc ImageByteRGB.cc Text.cc \ TriMesh.cc TexTriMesh.cc Node.cc Geode.cc Group.cc Transform.cc ModelFile.cc \ HUD.cc OpenSceneGraphWidget.cc Box.cc CanvasManipulator.cc TypeConvert.cc \ - Layout.cc LayoutStack.cc + Layout.cc LayoutStack.cc LayoutGrid.cc PLIB=RavlGUIOpenSceneGraph Modified: main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml 2011-04-25 20:34:41 UTC (rev 8036) +++ main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml 2011-04-27 20:47:13 UTC (rev 8037) @@ -15,12 +15,13 @@ <Node typename="RavlOSGN::ImageByteRGBAC" filename="/Users/charlesgalambos/Build/share/RAVL/pixmaps/monkey.ppm" alpha="0.75" /> </ImageTransform> --> - <Stack typename="RavlOSGN::LayoutStackC" gap="0.1" > + <Stack typename="RavlOSGN::LayoutGridC" gap="0.1" > <Nodes> <Box1 typename="RavlOSGN::BoxC" colour="0.0 0.0 1.0 1.0" size="1.0 1.0 1.0" position="0 0 0" /> <Box2 typename="RavlOSGN::BoxC" colour="0.0 1.0 0.0 1.0" size="1.0 1.0 1.0" position="0 0 0" /> - <Box3 typename="RavlOSGN::BoxC" colour="1.0 0.0 0.0 1.0" size="1.0 2.0 1.0" position="0 0 0" /> + <Box3 typename="RavlOSGN::BoxC" colour="1.0 0.0 0.0 1.0" size="1.0 1.0 1.0" position="0 0 0" /> <Sphere typename="RavlOSGN::SphereC" colour="0.0 1.0 1.0 1.0" radius="0.5" /> + <Box4 typename="RavlOSGN::BoxC" colour="1.0 0.0 1.0 1.0" size="1.0 1.0 1.0" position="0 0 0" /> </Nodes> </Stack> <HUD typename="RavlOSGN::HUDC" coords="0 768 0 1024" > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-25 20:34:48
|
Revision: 8036 http://ravl.svn.sourceforge.net/ravl/?rev=8036&view=rev Author: craftit Date: 2011-04-25 20:34:41 +0000 (Mon, 25 Apr 2011) Log Message: ----------- Add some basic layout functionality. Modified Paths: -------------- main/Ravl/Contrib/OpenSceneGraph/Box.cc main/Ravl/Contrib/OpenSceneGraph/Group.cc main/Ravl/Contrib/OpenSceneGraph/Group.hh main/Ravl/Contrib/OpenSceneGraph/HUD.cc main/Ravl/Contrib/OpenSceneGraph/HUD.hh main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc main/Ravl/Contrib/OpenSceneGraph/Node.cc main/Ravl/Contrib/OpenSceneGraph/Node.hh main/Ravl/Contrib/OpenSceneGraph/defs.mk main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml Added Paths: ----------- main/Ravl/Contrib/OpenSceneGraph/Layout.cc main/Ravl/Contrib/OpenSceneGraph/Layout.hh main/Ravl/Contrib/OpenSceneGraph/LayoutStack.cc main/Ravl/Contrib/OpenSceneGraph/LayoutStack.hh Modified: main/Ravl/Contrib/OpenSceneGraph/Box.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Box.cc 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/Box.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -11,6 +11,8 @@ #include "Ravl/OpenSceneGraph/Box.hh" #include "Ravl/OpenSceneGraph/TypeConvert.hh" +#include "Ravl/XMLFactoryRegister.hh" + #include <osg/Shape> #include <osg/ShapeDrawable> @@ -85,5 +87,17 @@ return true; } + + //: Called when owner handles drop to zero. + void BoxC::ZeroOwners() + { + DrawableC::ZeroOwners(); + } + + void LinkBox() + {} + static RavlN::XMLFactoryRegisterConvertC<BoxC,DrawableC> g_registerXMLFactoryBox("RavlOSGN::BoxC"); + + } Modified: main/Ravl/Contrib/OpenSceneGraph/Group.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Group.cc 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/Group.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -45,32 +45,18 @@ bool GroupC::AddChild(const NodeC::RefT &node) { - if (!m_node || !node.IsValid()) + if(!node.IsValid()) return false; - - NodeC::RefT nodeRef = node; - ref_ptr<Group> groupRef = m_node->asGroup(); - if (!groupRef) - return false; - - groupRef->addChild(nodeRef->Node()); - - return true; + + return AddChildNode(*node); } bool GroupC::RemoveChild(const NodeC::RefT &node) { - if (!m_node || !node.IsValid()) + if(!node.IsValid()) return false; - - NodeC::RefT nodeRef = node; - ref_ptr<Group> groupRef = m_node->asGroup(); - if (!groupRef) - return false; - - groupRef->removeChild(nodeRef->Node()); - - return true; + + return RemoveChildNode(*node); } bool GroupC::AddChildNode(const NodeC &node) { @@ -107,6 +93,13 @@ return true; } + //: Process a callback. + + void GroupC::DoCallback() + { + NodeC::DoCallback(); + } + //: Do setup from factory bool GroupC::Setup(const XMLFactoryContextC &factory) Modified: main/Ravl/Contrib/OpenSceneGraph/Group.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Group.hh 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/Group.hh 2011-04-25 20:34:41 UTC (rev 8036) @@ -23,7 +23,7 @@ //: Group object. class GroupC - : public NodeC + : public NodeC { public: GroupC(bool create = true); @@ -36,16 +36,16 @@ virtual ~GroupC(); //: Dtor. - virtual bool AddChild(const NodeC::RefT &node); + bool AddChild(const NodeC::RefT &node); //: Add a node object to the group. - virtual bool RemoveChild(const NodeC::RefT &node); + bool RemoveChild(const NodeC::RefT &node); //: Remove a node object from the group. - bool AddChildNode(const NodeC &node); + virtual bool AddChildNode(const NodeC &node); //: Add a node object to the group. - bool RemoveChildNode(const NodeC &node); + virtual bool RemoveChildNode(const NodeC &node); //: Remove a node object from the group. bool RemoveChildren(); @@ -55,6 +55,9 @@ typedef RavlN::SmartCallbackPtrC<GroupC> CBRefT; protected: + virtual void DoCallback(); + //: Process a callback. + bool Setup(const XMLFactoryContextC &factory); //: Do setup from factory Modified: main/Ravl/Contrib/OpenSceneGraph/HUD.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/HUD.cc 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/HUD.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -66,27 +66,23 @@ } - bool HUDC::AddChild(const NodeC::RefT &node) + bool HUDC::AddChildNode(const NodeC &node) { - if (!m_modelViewMatrix || !node.IsValid()) + if (!m_modelViewMatrix) return false; - NodeC::RefT nodeRef = node; - - m_modelViewMatrix->addChild(nodeRef->Node()); - + m_modelViewMatrix->addChild(const_cast<NodeC &>(node).Node()); + return true; } - bool HUDC::RemoveChild(const NodeC::RefT &node) + bool HUDC::RemoveChildNode(const NodeC &node) { - if (!m_modelViewMatrix || !node.IsValid()) + if (!m_modelViewMatrix) return false; - - NodeC::RefT nodeRef = node; - - m_modelViewMatrix->removeChild(nodeRef->Node()); - + + m_modelViewMatrix->removeChild(const_cast<NodeC &>(node).Node()); + return true; } Modified: main/Ravl/Contrib/OpenSceneGraph/HUD.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/HUD.hh 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/HUD.hh 2011-04-25 20:34:41 UTC (rev 8036) @@ -39,10 +39,10 @@ virtual ~HUDC(); //: Dtor. - virtual bool AddChild(const NodeC::RefT &node); + virtual bool AddChildNode(const NodeC &node); //: Add a node object to the display. - virtual bool RemoveChild(const NodeC::RefT &node); + virtual bool RemoveChildNode(const NodeC &node); //: Remove a node object from the display. typedef RavlN::SmartOwnerPtrC<HUDC> RefT; Added: main/Ravl/Contrib/OpenSceneGraph/Layout.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Layout.cc (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/Layout.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -0,0 +1,115 @@ + +#include "Ravl/OpenSceneGraph/Layout.hh" +#include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/RLog.hh" +#include <osg/ComputeBoundsVisitor> + + +namespace RavlOSGN { + + //: Constructor + + LayoutEntryC::LayoutEntryC(const NodeC &element) + : m_element(&element) + { + AddChildNode(element); + + //SetPosition(Vector3dC(0,0,0)); + //SetScale(Vector3dC(1.0,1.0,1.0)); + + Node()->setDataVariance(osg::Object::DYNAMIC); + + ComputeBounds(); + + } + + bool LayoutEntryC::ComputeBounds() + { + osg::ComputeBoundsVisitor boundsVisitor; + m_element->Node()->accept(boundsVisitor); + m_bounds = boundsVisitor.getBoundingBox(); + rDebug("Bounds %f %f %f : %f %f %f", + m_bounds._min[0],m_bounds._min[1],m_bounds._min[2], + m_bounds._max[0],m_bounds._max[1],m_bounds._max[2] + ); + return true; + } + + void LayoutEntryC::SetTargetPosition(const Vector3dC &position) + { + rDebug("Target position %s ",RavlN::StringOf(position).data()); + m_targetPosition = position; + SetPosition(position); + } + + //--------------------------------------------------------------- + + //: Default constructor + LayoutC::LayoutC(bool create) + : GroupC(create) + {} + + //: XML factory constructor + LayoutC::LayoutC(const XMLFactoryContextC &factory) + : GroupC(true) + { + Setup(factory); + } + + //: Add a node object to the group. + bool LayoutC::AddChildNode(const NodeC &node) + { + LayoutEntryC::RefT le = new LayoutEntryC(node); + m_nodes.push_back(le); + GroupC::AddChildNode(*le); + UpdateLayout(); + return true; + } + + //: Remove a node object from the group. + bool LayoutC::RemoveChildNode(const NodeC &node) + { + for(std::vector<LayoutEntryC::RefT>::iterator i= m_nodes.begin();i != m_nodes.end();i++) { + if((*i)->ElementRef() = &node) { + m_nodes.erase(i); + GroupC::RemoveChildNode(**i); + return true; + } + } + UpdateLayout(); + return false; + } + + //: Do setup from factory + bool LayoutC::Setup(const XMLFactoryContextC &factory) + { + GroupC::Setup(factory); + return true; + } + + //: Update the layout + bool LayoutC::UpdateLayout() + { + for(unsigned i =0;i < m_nodes.size();i++) { + m_nodes[i]->SetPosition(Vector3dC(i*1.0,0.0,0.0)); + } + return true; + } + + //: Called when owner handles drop to zero. + void LayoutC::ZeroOwners() + { + GroupC::ZeroOwners(); + } + + //: Process a callback. + void LayoutC::DoCallback() { + GroupC::DoCallback(); + } + + void LinkLayout() + {} + + static RavlN::XMLFactoryRegisterConvertC<LayoutC,GroupC> g_registerXMLFactoryLayout("RavlOSGN::LayoutC"); + +} \ No newline at end of file Added: main/Ravl/Contrib/OpenSceneGraph/Layout.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Layout.hh (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/Layout.hh 2011-04-25 20:34:41 UTC (rev 8036) @@ -0,0 +1,100 @@ +/* + * File: Layout.hh + * Author: charlesgalambos + * + * Created on April 25, 2011, 9:54 AM + */ + +#ifndef RAVLOSG_LAYOUT_HH +#define RAVLOSG_LAYOUT_HH + +#include "Ravl/OpenSceneGraph/Group.hh" +#include "Ravl/OpenSceneGraph/Transform.hh" +#include <osg/BoundingBox> + +namespace RavlOSGN { + using RavlN::Vector3dC; + + //: Layout entry. + + class LayoutEntryC + : public TransformPositionAttitudeC + { + public: + LayoutEntryC(const NodeC &element); + //: Constructor + + bool ComputeBounds(); + //: Compute bounds of entry. + + NodeC::RefT &ElementRef() + { return m_element; } + //: Access element we're managing. + + const Vector3dC &TargetPosition() const + { return m_targetPosition; } + + void SetTargetPosition(const Vector3dC &position); + + const osg::BoundingBox &Bounds() const + { return m_bounds; } + + typedef RavlN::SmartOwnerPtrC<LayoutEntryC> RefT; + //: Owner handle. + + typedef RavlN::SmartCallbackPtrC<LayoutEntryC> CBRefT; + //: Callback handle + + protected: + Vector3dC m_targetPosition; + + NodeC::RefT m_element; + + osg::BoundingBox m_bounds; + }; + + //: Base class for automatic layouts + + class LayoutC + : public GroupC + { + public: + LayoutC(bool create = true); + //: Constructor + + LayoutC(const XMLFactoryContextC &factory); + //: XML factory constructor + + virtual bool AddChildNode(const NodeC &node); + //: Add a node object to the group. + + virtual bool RemoveChildNode(const NodeC &node); + //: Remove a node object from the group. + + typedef RavlN::SmartOwnerPtrC<LayoutC> RefT; + //: Owner handle. + + typedef RavlN::SmartCallbackPtrC<LayoutC> CBRefT; + //: Callback handle + + protected: + virtual bool UpdateLayout(); + //: Update the layout + + virtual void DoCallback(); + //: Process a callback. + + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + + std::vector<LayoutEntryC::RefT> m_nodes; + + }; +} + + +#endif /* LAYOUT_HH */ + Added: main/Ravl/Contrib/OpenSceneGraph/LayoutStack.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/LayoutStack.cc (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/LayoutStack.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -0,0 +1,76 @@ + +#include "Ravl/OpenSceneGraph/LayoutStack.hh" +#include "Ravl/OpenSceneGraph/TypeConvert.hh" +#include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/RLog.hh" + +namespace RavlOSGN { + + //: Constructor + + LayoutStackC::LayoutStackC(bool create) + : LayoutC(create), + m_stackAxis(0) + { + } + + //: XML factory constructor + + LayoutStackC::LayoutStackC(const XMLFactoryContextC &factory) + : LayoutC(true) + { + Setup(factory); + } + + //: Update the layout + + bool LayoutStackC::UpdateLayout() + { + rDebug("Updating layout. "); + Vector3dC start(0,0,0); + for(unsigned i = 0;i < m_nodes.size();i++) { + float size= m_nodes[i]->Bounds()._max[m_stackAxis] - m_nodes[i]->Bounds()._min[m_stackAxis]; + start[m_stackAxis] += size; + Vector3dC correctedStart = start - MakeVector3d(m_nodes[i]->Bounds()._min); + rDebug("Start %s ",RavlN::StringOf(correctedStart).data()); + m_nodes[i]->SetPosition(correctedStart); + start[m_stackAxis] += m_gap; + } + + return true; + } + + //: Process a callback. + + void LayoutStackC::DoCallback() + { + LayoutC::DoCallback(); + } + + //: Do setup from factory + + bool LayoutStackC::Setup(const XMLFactoryContextC &factory) + { + m_stackAxis = factory.AttributeInt("stackAxis",0); + if(m_stackAxis < 0 || m_stackAxis > 2) { + rError("Invalid stack axis %d ",m_stackAxis); + throw RavlN::ExceptionBadConfigC("Invalid stack axis. "); + } + m_gap = factory.AttributeReal("gap",0.0); + LayoutC::Setup(factory); + return true; + } + + //: Called when owner handles drop to zero. + + void LayoutStackC::ZeroOwners() + { + LayoutC::ZeroOwners(); + } + + void LinkLayoutStack() + {} + + static RavlN::XMLFactoryRegisterConvertC<LayoutStackC,LayoutC> g_registerXMLFactoryLayout("RavlOSGN::LayoutStackC"); + +} Added: main/Ravl/Contrib/OpenSceneGraph/LayoutStack.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/LayoutStack.hh (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/LayoutStack.hh 2011-04-25 20:34:41 UTC (rev 8036) @@ -0,0 +1,47 @@ +/* + * File: LayoutStack.hh + * Author: charlesgalambos + * + * Created on April 25, 2011, 10:13 AM + */ + +#ifndef RAVLOSGN_LAYOUTSTACK_HH +#define RAVLOSGN_LAYOUTSTACK_HH + +#include "Ravl/OpenSceneGraph/Layout.hh" + +namespace RavlOSGN { + + //: Base class for automatic layouts + + class LayoutStackC + : public LayoutC + { + public: + LayoutStackC(bool create); + //: Constructor + + LayoutStackC(const XMLFactoryContextC &factory); + //: XML factory constructor + + protected: + virtual bool UpdateLayout(); + //: Update the layout + + virtual void DoCallback(); + //: Process a callback. + + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + + int m_stackAxis; + float m_gap; + }; + +} + +#endif /* LAYOUTSTACK_HH */ + Modified: main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -59,6 +59,9 @@ NodeC::ZeroOwners(); } - static RavlN::XMLFactoryRegisterConvertC<ModelFileC,NodeC> g_registerXMLFactoryGroup("RavlOSGN::ModelFileC"); + void LinkModelFile() + {} + static RavlN::XMLFactoryRegisterConvertC<ModelFileC,NodeC> g_registerXMLFactoryModelFile("RavlOSGN::ModelFileC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -11,6 +11,10 @@ extern void LinkText(); extern void LinkTransform(); extern void LinkHUD(); + extern void LinkBox(); + extern void LinkModelFile(); + extern void LinkLayout(); + extern void LinkLayoutStack(); void LinkGtkGlExtInit() { @@ -24,5 +28,9 @@ LinkText(); LinkTransform(); LinkHUD(); + LinkBox(); + LinkModelFile(); + LinkLayout(); + LinkLayoutStack(); } } Modified: main/Ravl/Contrib/OpenSceneGraph/Node.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Node.cc 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/Node.cc 2011-04-25 20:34:41 UTC (rev 8036) @@ -42,7 +42,7 @@ virtual void operator()(Node *node, NodeVisitor *nv) { if (m_node.IsValid()) - { m_node->SigCallback()(); } + { m_node->DoCallback(); } traverse(node, nv); } @@ -83,6 +83,7 @@ if(factory.AttributeBool("bringToFront",false)) { BringToFront(); } + return true; } @@ -149,5 +150,12 @@ node = nd->Node(); return true; } + + //: Process a callback. + void NodeC::DoCallback() + { + m_sigCallback(); + } + } Modified: main/Ravl/Contrib/OpenSceneGraph/Node.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Node.hh 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/Node.hh 2011-04-25 20:34:41 UTC (rev 8036) @@ -24,6 +24,7 @@ namespace RavlOSGN { class NodeC; + class NodeCallbackC; using RavlN::XMLFactoryContextC; // Class for holding a reference back an arbitary object. @@ -158,6 +159,9 @@ { return m_node->getName(); } //: Access name of node. protected: + virtual void DoCallback(); + //: Process a callback. + bool Setup(const XMLFactoryContextC &factory); //: Do setup from factory @@ -167,6 +171,8 @@ osg::ref_ptr<osg::Node> m_node; osg::ref_ptr<osg::NodeCallback> m_callback; RavlN::Signal0C m_sigCallback; + + friend class NodeCallbackC; }; Modified: main/Ravl/Contrib/OpenSceneGraph/defs.mk =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-04-25 20:34:41 UTC (rev 8036) @@ -15,11 +15,13 @@ HEADERS=Drawable.hh Sphere.hh Image.hh ImageByteRGBA.hh ImageByteRGB.hh Text.hh \ TriMesh.hh TexTriMesh.hh Node.hh Geode.hh Group.hh Transform.hh ModelFile.hh \ - HUD.hh OpenSceneGraphWidget.hh Box.hh CanvasManipulator.hh TypeConvert.hh + HUD.hh OpenSceneGraphWidget.hh Box.hh CanvasManipulator.hh TypeConvert.hh \ + Layout.hh LayoutStack.hh SOURCES=Drawable.cc Sphere.cc Image.cc ImageByteRGBA.cc ImageByteRGB.cc Text.cc \ TriMesh.cc TexTriMesh.cc Node.cc Geode.cc Group.cc Transform.cc ModelFile.cc \ - HUD.cc OpenSceneGraphWidget.cc Box.cc CanvasManipulator.cc TypeConvert.cc + HUD.cc OpenSceneGraphWidget.cc Box.cc CanvasManipulator.cc TypeConvert.cc \ + Layout.cc LayoutStack.cc PLIB=RavlGUIOpenSceneGraph Modified: main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml 2011-04-23 11:18:55 UTC (rev 8035) +++ main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml 2011-04-25 20:34:41 UTC (rev 8036) @@ -5,13 +5,24 @@ <OpenSceneGraphWidget typename="RavlOSGN::OpenSceneGraphWidgetC" width="300" height="300" > <Scene typename="RavlOSGN::GroupC"> <Nodes> + <!-- <Sphere typename="RavlOSGN::SphereC" colour="0.0 1.0 0.0 1.0" /> + <Box typename="RavlOSGN::BoxC" colour="0.0 0.0 1.0 1.0" size="1.0 1.0 1.0" position="-1 0 0" /> <TextTransform typename="RavlOSGN::TransformPositionAttitudeC" position="1 0 0" axis="1 0 0" angle="1.5707963267948966" scale="0.1 0.1 0.1" > <Node typename="RavlOSGN::TextC" text="Some text!" colour="1.0 0.0 0.0 1.0" alignment="CentreBaseLine" axisAlignment="Screen" size="0.5" /> </TextTransform> <ImageTransform typename="RavlOSGN::TransformPositionAttitudeC" position="1 0 0" axis="1 0 0" angle="1.5707963267948966" coords="0 -1 0 1"> <Node typename="RavlOSGN::ImageByteRGBAC" filename="/Users/charlesgalambos/Build/share/RAVL/pixmaps/monkey.ppm" alpha="0.75" /> </ImageTransform> + --> + <Stack typename="RavlOSGN::LayoutStackC" gap="0.1" > + <Nodes> + <Box1 typename="RavlOSGN::BoxC" colour="0.0 0.0 1.0 1.0" size="1.0 1.0 1.0" position="0 0 0" /> + <Box2 typename="RavlOSGN::BoxC" colour="0.0 1.0 0.0 1.0" size="1.0 1.0 1.0" position="0 0 0" /> + <Box3 typename="RavlOSGN::BoxC" colour="1.0 0.0 0.0 1.0" size="1.0 2.0 1.0" position="0 0 0" /> + <Sphere typename="RavlOSGN::SphereC" colour="0.0 1.0 1.0 1.0" radius="0.5" /> + </Nodes> + </Stack> <HUD typename="RavlOSGN::HUDC" coords="0 768 0 1024" > <Node typename="RavlOSGN::GeodeC" bringToFront="true" > <Draw typename="RavlOSGN::TextC" text="HUUD!" colour="0.0 1.0 0.0 1.0" position="100 100 -1" size="100" alignment="CentreBaseLine" axisAlignment="Screen" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-23 11:19:02
|
Revision: 8035 http://ravl.svn.sourceforge.net/ravl/?rev=8035&view=rev Author: craftit Date: 2011-04-23 11:18:55 +0000 (Sat, 23 Apr 2011) Log Message: ----------- Improvements to XML config. Modified Paths: -------------- main/Ravl/Contrib/OpenSceneGraph/Geode.cc main/Ravl/Contrib/OpenSceneGraph/Group.cc main/Ravl/Contrib/OpenSceneGraph/HUD.cc main/Ravl/Contrib/OpenSceneGraph/Image.cc main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc main/Ravl/Contrib/OpenSceneGraph/Node.cc main/Ravl/Contrib/OpenSceneGraph/Text.cc main/Ravl/Contrib/OpenSceneGraph/Text.hh main/Ravl/Contrib/OpenSceneGraph/Transform.cc main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml Modified: main/Ravl/Contrib/OpenSceneGraph/Geode.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Geode.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/Geode.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -35,7 +35,13 @@ : NodeC(factory) { m_node = new osg::Geode(); + // Short hand for a single child node. DrawableC::RefT drawable; + if(factory.UseComponent("Draw",drawable)) { + AddDrawable(drawable); + } + + // Full list of drawables. factory.UseComponentGroup("Drawables",*this,&GeodeC::AddDrawable); } Modified: main/Ravl/Contrib/OpenSceneGraph/Group.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Group.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/Group.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -113,9 +113,15 @@ { NodeC::Setup(factory); + // Short hand if we just want a single child node. + NodeC::RefT node; + if(factory.UseComponent("Node",node,true)) { + AddChild(node); + } + + // Full list of child nodes. std::vector<NodeC::RefT> children; factory.UseComponentGroup("Nodes",*this,&GroupC::AddChild); - return true; } Modified: main/Ravl/Contrib/OpenSceneGraph/HUD.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/HUD.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/HUD.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -11,7 +11,7 @@ #include "Ravl/OpenSceneGraph/HUD.hh" #include "Ravl/XMLFactoryRegister.hh" - +#include "Ravl/RLog.hh" #include <osg/Projection> #include <osg/Matrix> #include <osg/MatrixTransform> @@ -42,8 +42,8 @@ HUDC::HUDC(const XMLFactoryContextC &factory) : GroupC(false) { - RavlN::RealRange2dC coords(0, 0, 1, 1); - factory.Attribute("coords",coords); + RavlN::RealRange2dC coords; + factory.Attribute("coords",coords,RavlN::RealRange2dC(0, 1, 0, 1)); BuildNode(coords); GroupC::Setup(factory); } @@ -51,6 +51,7 @@ //: Build node. bool HUDC::BuildNode(const RavlN::RealRange2dC &coords) { + rDebug("BuildNode Coords:%s ",RavlN::StringOf(coords).data()); ref_ptr<Projection> projectionMatrix = new Projection; projectionMatrix->setMatrix(Matrix::ortho2D(coords.LCol(), coords.RCol(), coords.TRow(), coords.BRow())); @@ -95,6 +96,9 @@ GroupC::ZeroOwners(); } + void LinkHUD() + {} + static RavlN::XMLFactoryRegisterConvertC<HUDC,GroupC> g_registerXMLFactoryGroup("RavlOSGN::HUDC"); } Modified: main/Ravl/Contrib/OpenSceneGraph/Image.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Image.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/Image.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -11,6 +11,7 @@ #include "Ravl/OpenSceneGraph/Image.hh" #include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/RLog.hh" #include <osg/PrimitiveSet> #include <osg/Geode> #include <osg/Texture2D> @@ -32,8 +33,8 @@ : m_alphaImageEnabled(factory.AttributeBool("enableAlpha",false)), m_alpha(factory.AttributeReal("alpha",1.0)) { - RavlN::RealRange2dC coords(1,1); - factory.Attribute("coords",coords); + RavlN::RealRange2dC coords; + factory.Attribute("coords",coords,RavlN::RealRange2dC(-1,1)); BuildNode(coords); } @@ -51,6 +52,7 @@ //: Build the node bool ImageC::BuildNode(const RavlN::RealRange2dC &coords) { + rDebug("Building image node. Range=%s ",RavlN::StringOf(coords).data()); ref_ptr<Geometry> geometryRef = new Geometry(); ref_ptr<Vec3Array> vertexArray = new Vec3Array(); Modified: main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -42,10 +42,15 @@ RavlN::StringC filename = context.AttributeString("filename",""); if(!filename.IsEmpty()) { RavlImageN::ImageC<RavlImageN::ByteRGBAValueC> image; + rDebug("Loading image '%s' ",filename.data()); if(RavlN::Load(filename,image)) { - SetImage(image); + if(!SetImage(image)) { + rError("Failed to setup image. %s ",context.Path().data()); + throw RavlN::ExceptionBadConfigC("Failed to setup image."); + } } else { rWarning("Failed to load file '%s' ",filename.data()); + throw RavlN::ExceptionBadConfigC("Failed to load image."); } } } Modified: main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -10,7 +10,8 @@ extern void LinkGroup(); extern void LinkText(); extern void LinkTransform(); - + extern void LinkHUD(); + void LinkGtkGlExtInit() { RegisterGtkGlExtInit(); @@ -22,5 +23,6 @@ LinkGroup(); LinkText(); LinkTransform(); + LinkHUD(); } } Modified: main/Ravl/Contrib/OpenSceneGraph/Node.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Node.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/Node.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -80,7 +80,9 @@ bool NodeC::Setup(const XMLFactoryContextC &factory) { - + if(factory.AttributeBool("bringToFront",false)) { + BringToFront(); + } return true; } Modified: main/Ravl/Contrib/OpenSceneGraph/Text.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Text.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/Text.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -11,6 +11,7 @@ #include "Ravl/OpenSceneGraph/Text.hh" #include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/RLog.hh" #include <osgText/Text> #define DODEBUG 0 @@ -41,7 +42,29 @@ osgText::TextBase::CENTER_BOTTOM_BASE_LINE, osgText::TextBase::RIGHT_BOTTOM_BASE_LINE }; + + const char * g_lookupTextAlignmentStr[] = + { + "LeftTop", + "LeftCentre", + "LeftBottom", + "CentreTop", + "CentreCentre", + "CentreBottom", + "RightTop", + "RightCentre", + "RightBottom", + "LeftBaseLine", + "CentreBaseLine", + "RightBaseLine", + "LeftBottomBaseLine", + "CentreBottomBaseLine", + "RightBottomBaseLine", + 0 + }; + + osgText::Text::AxisAlignment g_lookupTextAxisAlignment[] = { osgText::TextBase::XY_PLANE, @@ -53,14 +76,67 @@ osgText::TextBase::SCREEN }; + const char * g_lookupTextAxisAlignmentStr[] = + { + "XYPlane", + "XYPlaneReversed", + "XZPlane", + "XZPlaneReversed", + "YZPlane", + "YZPlaneReversed", + "Screen" + }; } namespace RavlOSGN { - using namespace osg; using namespace osgText; + // -------------------------------------------------------------------- + + std::istream &operator>>(std::istream &strm,TextAlignmentT &textAlignment) { + std::string name; + strm >> name; + for(unsigned i = 0;g_lookupTextAlignmentStr[i] != 0;i++) { + if(name == g_lookupTextAlignmentStr[i]) { + textAlignment = static_cast<TextAlignmentT>(i); + return strm; + } + } + rError("Unexpected alignment type '%s' ",name.data()); + throw RavlN::ExceptionInvalidStreamC("Unexpected alignment type."); + return strm; + } + + std::ostream &operator<<(std::ostream &strm,TextAlignmentT textAlignment) { + strm << g_lookupTextAlignmentStr[(int) textAlignment]; + return strm; + } + + // -------------------------------------------------------------------- + + std::istream &operator>>(std::istream &strm,TextAxisAlignmentT &textAxisAlignment) { + std::string name; + strm >> name; + for(unsigned i = 0;g_lookupTextAxisAlignmentStr[i] != 0;i++) { + if(name == g_lookupTextAxisAlignmentStr[i]) { + textAxisAlignment = static_cast<TextAxisAlignmentT>(i); + return strm; + } + } + rError("Unexpected alignment type '%s' ",name.data()); + throw RavlN::ExceptionInvalidStreamC("Unexpected alignment type."); + return strm; + } + + std::ostream &operator<<(std::ostream &strm,TextAxisAlignmentT textAxisAlignment) { + strm << g_lookupTextAxisAlignmentStr[(int) textAxisAlignment]; + return strm; + } + + // -------------------------------------------------------------------- + TextC::TextC(const std::string &text) { ref_ptr<Text> textRef = new Text(); @@ -78,6 +154,46 @@ m_drawable = textRef; RavlN::StringC text = context.AttributeString("text",""); textRef->setText(text.data()); + float size; + if(context.Attribute("size",size)) { + if(!SetSize(size)) { + rError("Failed to set size to %f ",size); + throw RavlN::ExceptionBadConfigC("Failed to set size."); + } + } + + std::string fontFilename; + if(context.Attribute("font",fontFilename)) { + if(!SetFont(fontFilename)) { + rError("Failed to set font to %s ",fontFilename.data()); + throw RavlN::ExceptionBadConfigC("Failed to set font."); + } + } + + TextAlignmentT alignment; + if(context.Attribute("alignment",alignment)) { + if(!SetAlignment(alignment)) { + rError("Failed to set alignment to %s ",RavlN::StringOf(alignment).data()); + throw RavlN::ExceptionBadConfigC("Failed to set alignment."); + } + } + + TextAxisAlignmentT axis; + if(context.Attribute("axisAlignment",axis)) { + if(!SetAxisAlignment(axis)) { + rError("Failed to set axis alignment to %s ",RavlN::StringOf(axis).data()); + throw RavlN::ExceptionBadConfigC("Failed to set axis alignment."); + } + } + + RavlN::Vector3dC position; + if(context.Attribute("position",position,RavlN::Vector3dC(0,0,0))) { + if(!SetPosition(position)) { + rError("Failed to set position to %s ",RavlN::StringOf(position).data()); + throw RavlN::ExceptionBadConfigC("Failed to set position."); + } + } + DrawableC::Setup(context); } Modified: main/Ravl/Contrib/OpenSceneGraph/Text.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Text.hh 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/Text.hh 2011-04-23 11:18:55 UTC (rev 8035) @@ -41,6 +41,9 @@ TextAlignRightBottomBaseLine }; + std::istream &operator>>(std::istream &,TextAlignmentT &textAlignment); + std::ostream &operator<<(std::ostream &,TextAlignmentT textAlignment); + enum TextAxisAlignmentT { TextAxisXYPlane = 0, @@ -52,6 +55,9 @@ TextAxisScreen }; + std::istream &operator>>(std::istream &,TextAxisAlignmentT &textAxisAlignment); + std::ostream &operator<<(std::ostream &,TextAxisAlignmentT textAxisAlignment); + //! userlevel=Normal //: Text object. @@ -80,8 +86,8 @@ bool SetAxisAlignment(TextAxisAlignmentT axis); //: Set the alignment to the axes (or screen of you want billboard alignment). - - bool SetColour(const RavlImageN::RealRGBAValueC &colour); + + virtual bool SetColour(const RavlImageN::RealRGBAValueC &colour); //: Set the text colour. bool SetPosition(const RavlN::Vector3dC &position); Modified: main/Ravl/Contrib/OpenSceneGraph/Transform.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Transform.cc 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/Transform.cc 2011-04-23 11:18:55 UTC (rev 8035) @@ -12,7 +12,7 @@ #include "Ravl/OpenSceneGraph/Transform.hh" #include "Ravl/OpenSceneGraph/TypeConvert.hh" #include "Ravl/XMLFactoryRegister.hh" - +#include "Ravl/RLog.hh" #include <osg/Transform> #define DODEBUG 0 @@ -60,13 +60,14 @@ // ------------------------------------------------------------------------ + //: XML constructor. + TransformPositionAttitudeC::TransformPositionAttitudeC(const XMLFactoryContextC &context) : TransformC(false) { m_node = new PositionAttitudeTransform(); Setup(context); } - //: XML constructor. TransformPositionAttitudeC::TransformPositionAttitudeC(bool create) @@ -88,14 +89,30 @@ RavlN::Vector3dC position(0,0,0); if(factory.Attribute("position",position)) { - SetPosition(position); + if(!SetPosition(position)) { + rError("Failed to set position to %s ",RavlN::StringOf(position).data()); + throw RavlN::ExceptionBadConfigC("Failed to set transform position."); + } } RavlN::Vector3dC scale(1.0,1.0,1.0); if(factory.Attribute("scale",scale)) { - SetScale(scale); + if(!SetScale(scale)) { + rError("Failed to set scale to %s ",RavlN::StringOf(position).data()); + throw RavlN::ExceptionBadConfigC("Failed to set transform scale."); + } } + float angle = 0; + + RavlN::Vector3dC axis(1.0,0.0,0.0); + if(factory.Attribute("axis",axis) && factory.Attribute("angle",angle)) { + if(!SetAttitude(RavlN::Quatern3dC(axis,angle))) { + rError("Failed to set attitude to %s %f ",RavlN::StringOf(position).data(),angle); + throw RavlN::ExceptionBadConfigC("Failed to set transform attitude."); + } + } + return true; } Modified: main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml 2011-04-22 14:11:56 UTC (rev 8034) +++ main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml 2011-04-23 11:18:55 UTC (rev 8035) @@ -2,19 +2,21 @@ <?RAVL class='RavlN::XMLTreeC' ?> <Config verbose="false"> - <OpenSceneGraphWidget typename="RavlOSGN::OpenSceneGraphWidgetC" > + <OpenSceneGraphWidget typename="RavlOSGN::OpenSceneGraphWidgetC" width="300" height="300" > <Scene typename="RavlOSGN::GroupC"> <Nodes> - <SphereGeode typename="RavlOSGN::GeodeC"> - <Drawables> - <Sphere typename="RavlOSGN::SphereC" colour="0.0 1.0 0.0 0.0" /> - <Text typename="RavlOSGN::TextC" text="H!" colour="1.0 0.0 0.0 1.0" /> - </Drawables> - </SphereGeode> - <ImageTransform typename="RavlOSGN::TransformPositionAttitudeC" > - <AnImage typename="RavlOSGN::ImageByteRGBC"> - </AnImage> + <Sphere typename="RavlOSGN::SphereC" colour="0.0 1.0 0.0 1.0" /> + <TextTransform typename="RavlOSGN::TransformPositionAttitudeC" position="1 0 0" axis="1 0 0" angle="1.5707963267948966" scale="0.1 0.1 0.1" > + <Node typename="RavlOSGN::TextC" text="Some text!" colour="1.0 0.0 0.0 1.0" alignment="CentreBaseLine" axisAlignment="Screen" size="0.5" /> + </TextTransform> + <ImageTransform typename="RavlOSGN::TransformPositionAttitudeC" position="1 0 0" axis="1 0 0" angle="1.5707963267948966" coords="0 -1 0 1"> + <Node typename="RavlOSGN::ImageByteRGBAC" filename="/Users/charlesgalambos/Build/share/RAVL/pixmaps/monkey.ppm" alpha="0.75" /> </ImageTransform> + <HUD typename="RavlOSGN::HUDC" coords="0 768 0 1024" > + <Node typename="RavlOSGN::GeodeC" bringToFront="true" > + <Draw typename="RavlOSGN::TextC" text="HUUD!" colour="0.0 1.0 0.0 1.0" position="100 100 -1" size="100" alignment="CentreBaseLine" axisAlignment="Screen" /> + </Node> + </HUD> </Nodes> </Scene> </OpenSceneGraphWidget> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-22 14:12:04
|
Revision: 8034 http://ravl.svn.sourceforge.net/ravl/?rev=8034&view=rev Author: craftit Date: 2011-04-22 14:11:56 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Add XML constructors. Modified Paths: -------------- main/Ravl/Contrib/OpenSceneGraph/Box.cc main/Ravl/Contrib/OpenSceneGraph/Box.hh main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh main/Ravl/Contrib/OpenSceneGraph/Drawable.cc main/Ravl/Contrib/OpenSceneGraph/Drawable.hh main/Ravl/Contrib/OpenSceneGraph/Geode.cc main/Ravl/Contrib/OpenSceneGraph/Geode.hh main/Ravl/Contrib/OpenSceneGraph/Group.cc main/Ravl/Contrib/OpenSceneGraph/Group.hh main/Ravl/Contrib/OpenSceneGraph/HUD.cc main/Ravl/Contrib/OpenSceneGraph/HUD.hh main/Ravl/Contrib/OpenSceneGraph/Image.cc main/Ravl/Contrib/OpenSceneGraph/Image.hh main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.cc main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.hh main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.hh main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc main/Ravl/Contrib/OpenSceneGraph/ModelFile.hh main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc main/Ravl/Contrib/OpenSceneGraph/Node.cc main/Ravl/Contrib/OpenSceneGraph/Node.hh main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc main/Ravl/Contrib/OpenSceneGraph/Sphere.cc main/Ravl/Contrib/OpenSceneGraph/Sphere.hh main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.cc main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.hh main/Ravl/Contrib/OpenSceneGraph/Text.cc main/Ravl/Contrib/OpenSceneGraph/Text.hh main/Ravl/Contrib/OpenSceneGraph/Transform.cc main/Ravl/Contrib/OpenSceneGraph/Transform.hh main/Ravl/Contrib/OpenSceneGraph/TriMesh.cc main/Ravl/Contrib/OpenSceneGraph/TriMesh.hh main/Ravl/Contrib/OpenSceneGraph/defs.mk Added Paths: ----------- main/Ravl/Contrib/OpenSceneGraph/TypeConvert.cc main/Ravl/Contrib/OpenSceneGraph/TypeConvert.hh main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidgetXML.cc Modified: main/Ravl/Contrib/OpenSceneGraph/Box.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Box.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Box.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,7 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Box.hh" +#include "Ravl/OpenSceneGraph/TypeConvert.hh" #include <osg/Shape> #include <osg/ShapeDrawable> @@ -27,25 +28,27 @@ BoxC::BoxC(const RavlN::Vector3dC &position, const RavlN::Vector3dC &size) { - m_box = new osg::Box(Vec3(position.X(), position.Y(), position.Z()),size.X(), size.Y(), size.Z()); - m_drawable = new ShapeDrawable(m_box); + BuildNode(position,size); } - BoxC::~BoxC() + //: XML Factory constructor + + BoxC::BoxC(const XMLFactoryContextC &factory) { + Setup(factory); } - bool BoxC::SetColour(const RavlImageN::RealRGBAValueC &colour) + BoxC::~BoxC() { - if (!m_drawable) - return false; - - ref_ptr<ShapeDrawable> shapeDrawableRef = dynamic_cast<ShapeDrawable*>(m_drawable.get()); - if (!shapeDrawableRef) - return false; - - shapeDrawableRef->setColor(Vec4(colour.Red(), colour.Green(), colour.Blue(), colour.Alpha())); - + } + + //: Create the node. + + bool BoxC::BuildNode(const RavlN::Vector3dC &position, + const RavlN::Vector3dC &size) + { + m_box = new osg::Box(MakeVec3(position),size.X(), size.Y(), size.Z()); + m_drawable = new ShapeDrawable(m_box); return true; } @@ -69,4 +72,18 @@ return true; } + //: Setup box. + bool BoxC::Setup(const XMLFactoryContextC &factory) + { + RavlN::Vector3dC position(0,0,0); + RavlN::Vector3dC size(1,1,1); + factory.Attribute("position",position); + factory.Attribute("size",size); + BuildNode(position,size); + + DrawableC::Setup(factory); + + return true; + } + } Modified: main/Ravl/Contrib/OpenSceneGraph/Box.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Box.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Box.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -33,21 +33,32 @@ const RavlN::Vector3dC &size = RavlN::Vector3dC(1,1,1)); //: Ctor. + BoxC(const XMLFactoryContextC &factory); + //: XML Factory constructor + virtual ~BoxC(); //: Dtor. - bool SetColour(const RavlImageN::RealRGBAValueC &colour); - //: Set the Box colour. - bool SetPosition(const RavlN::Vector3dC &position); //: Set the Box centre position. bool SetSize(const RavlN::Vector3dC &size); //: Set the Box radius. - typedef RavlN::SmartPtrC<BoxC> RefT; + typedef RavlN::SmartOwnerPtrC<BoxC> RefT; + typedef RavlN::SmartCallbackPtrC<BoxC> CBRefT; + + protected: + bool BuildNode(const RavlN::Vector3dC &position = RavlN::Vector3dC(0, 0, 0), + const RavlN::Vector3dC &size = RavlN::Vector3dC(1,1,1)); + //: Create the node. - protected: + bool Setup(const XMLFactoryContextC &factory); + //: Setup box. + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + osg::ref_ptr<osg::Box> m_box; }; Modified: main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -12,6 +12,11 @@ namespace RavlOSGN { using namespace osg; +#ifdef OSGGA_CAMERA_MANIPULATOR + CanvasManipulatorC::CanvasManipulatorC() + { + } +#else CanvasManipulatorC::CanvasManipulatorC() { @@ -436,5 +441,6 @@ } return z; } +#endif } Modified: main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -8,17 +8,22 @@ #ifndef RAVLOSGN_CANVASMANIPULATOR_HH #define RAVLOSGN_CANVASMANIPULATOR_HH -#include <osgGA/MatrixManipulator> +#include <osgGA/TrackballManipulator> namespace RavlOSGN { class CanvasManipulatorC +#ifndef OSGGA_CAMERA_MANIPULATOR : public osgGA::MatrixManipulator +#else + : public osgGA::TrackballManipulator +#endif { public: CanvasManipulatorC(); +#ifndef OSGGA_CAMERA_MANIPULATOR virtual const char* className() const { return "CanvasManipulator"; } @@ -146,7 +151,7 @@ osg::Quat _rotation; double _distance; float _trackballSize; - +#endif }; } Modified: main/Ravl/Contrib/OpenSceneGraph/Drawable.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Drawable.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Drawable.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,10 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Drawable.hh" +#include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/OpenSceneGraph/Geode.hh" +#include "Ravl/RLog.hh" +#include <osg/ShapeDrawable> #define DODEBUG 0 #if DODEBUG @@ -27,12 +31,61 @@ { } + DrawableC::DrawableC(const XMLFactoryContextC &factory) + { + Setup(factory); + } + + DrawableC::DrawableC(osg::Drawable *drawable) : m_drawable(drawable) {} + + //! Do setup from factory. + bool DrawableC::Setup(const XMLFactoryContextC &factory) + { + RavlImageN::RealRGBAValueC colour(1.0,1.0,1.0,1.0); + if(factory.Attribute("colour",colour)){ + SetColour(colour); + } + + return true; + } + + //: Called when owner handles drop to zero. + void DrawableC::ZeroOwners() + { + RavlN::RCLayerBodyC::ZeroOwners(); + } + bool DrawableC::SetColour(const RavlImageN::RealRGBAValueC &colour) + { + if (!m_drawable) + return false; + + ShapeDrawable *shapeDrawableRef = dynamic_cast<ShapeDrawable*>(m_drawable.get()); + if(shapeDrawableRef == 0) { + rWarning("Can't set colour on non shape drawable. "); + return false; + } + + shapeDrawableRef->setColor(Vec4(colour.Red(), colour.Green(), colour.Blue(), colour.Alpha())); + + return true; + } + + DrawableC::~DrawableC() { } + GeodeC::RefT ConvertDrawableToGeode(const DrawableC::RefT &drawable) + { + GeodeC::RefT ret = new GeodeC(*drawable); + return ret; + } + + DP_REGISTER_CONVERSION(ConvertDrawableToGeode,1.0); + + } Modified: main/Ravl/Contrib/OpenSceneGraph/Drawable.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Drawable.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Drawable.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -14,18 +14,21 @@ #ifndef RAVLGUI_OPENSCENEGRAPHDRAWABLE_HEADER #define RAVLGUI_OPENSCENEGRAPHDRAWABLE_HEADER 1 -#include "Ravl/SmartPtr.hh" +#include "Ravl/SmartLayerPtr.hh" +#include "Ravl/XMLFactory.hh" +#include "Ravl/Image/RealRGBAValue.hh" #include <osg/ref_ptr> #include <osg/Drawable> namespace RavlOSGN { + using RavlN::XMLFactoryContextC; //! userlevel=Normal //: Drawable object base class. class DrawableC - : public RavlN::RCBodyVC + : public RavlN::RCLayerBodyC { public: DrawableC(osg::Drawable *drawable); @@ -34,16 +37,29 @@ DrawableC(); //: Ctor. + DrawableC(const XMLFactoryContextC &factory); + //: XML Factory constructor + virtual ~DrawableC(); //: Dtor. - + + virtual bool SetColour(const RavlImageN::RealRGBAValueC &colour); + //: Set the colour of shape drawables. + osg::ref_ptr<osg::Drawable> Drawable() { return m_drawable; } //: Access the object smart pointer. - typedef RavlN::SmartPtrC<DrawableC> RefT; + typedef RavlN::SmartOwnerPtrC<DrawableC> RefT; + typedef RavlN::SmartCallbackPtrC<DrawableC> CBRefT; protected: + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory. + osg::ref_ptr<osg::Drawable> m_drawable; }; Modified: main/Ravl/Contrib/OpenSceneGraph/Geode.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Geode.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Geode.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,7 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Geode.hh" +#include "Ravl/XMLFactoryRegister.hh" #include <osg/Geode> #define DODEBUG 0 @@ -28,6 +29,15 @@ { m_node = new osg::Geode(); } + + //: XML Factory constructor + GeodeC::GeodeC(const XMLFactoryContextC &factory) + : NodeC(factory) + { + m_node = new osg::Geode(); + DrawableC::RefT drawable; + factory.UseComponentGroup("Drawables",*this,&GeodeC::AddDrawable); + } GeodeC::GeodeC(const DrawableC &drawable) { @@ -37,8 +47,16 @@ GeodeC::~GeodeC() { + } + //: Called when owner handles drop to zero. + + void GeodeC::ZeroOwners() + { + NodeC::ZeroOwners(); + } + bool GeodeC::AddDrawable(const DrawableC::RefT &drawable) { if (!m_node || !drawable.IsValid()) @@ -53,5 +71,6 @@ return true; } - + + static RavlN::XMLFactoryRegisterConvertC<GeodeC,NodeC> g_registerXMLFactoryGeode("RavlOSGN::GeodeC"); } Modified: main/Ravl/Contrib/OpenSceneGraph/Geode.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Geode.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Geode.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -33,15 +33,22 @@ GeodeC(const DrawableC &drawable); //: Ctor. + GeodeC(const XMLFactoryContextC &factory); + //: XML Factory constructor + virtual ~GeodeC(); //: Dtor. bool AddDrawable(const DrawableC::RefT &drawable); //: Add a drawble object to the geode. - typedef RavlN::SmartPtrC<GeodeC> RefT; + typedef RavlN::SmartOwnerPtrC<GeodeC> RefT; + typedef RavlN::SmartCallbackPtrC<GeodeC> CBRefT; + + protected: + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. - protected: }; } Modified: main/Ravl/Contrib/OpenSceneGraph/Group.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Group.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Group.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,8 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Group.hh" +#include "Ravl/XMLFactoryRegister.hh" + #include <osg/Group> #define DODEBUG 0 @@ -30,10 +32,17 @@ m_node = new Group(); } - GroupC::~GroupC() + //: XML Factory constructor + GroupC::GroupC(const XMLFactoryContextC &factory) + : NodeC(factory) { + m_node = new Group(); + Setup(factory); } - + + GroupC::~GroupC() + {} + bool GroupC::AddChild(const NodeC::RefT &node) { if (!m_node || !node.IsValid()) @@ -97,5 +106,29 @@ return true; } + + //: Do setup from factory + + bool GroupC::Setup(const XMLFactoryContextC &factory) + { + NodeC::Setup(factory); + + std::vector<NodeC::RefT> children; + factory.UseComponentGroup("Nodes",*this,&GroupC::AddChild); + return true; + } + + //: Called when owner handles drop to zero. + void GroupC::ZeroOwners() + { + NodeC::ZeroOwners(); + } + + void LinkGroup() + {} + + static RavlN::XMLFactoryRegisterConvertC<GroupC,NodeC> g_registerXMLFactoryGroup("RavlOSGN::GroupC"); + + } Modified: main/Ravl/Contrib/OpenSceneGraph/Group.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Group.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Group.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -30,6 +30,9 @@ //: Ctor. //!param: create - If true, a new group object will be allocated. + GroupC(const XMLFactoryContextC &factory); + //: XML Factory constructor + virtual ~GroupC(); //: Dtor. @@ -48,9 +51,16 @@ bool RemoveChildren(); //: Remove all node objects from the group. - typedef RavlN::SmartPtrC<GroupC> RefT; + typedef RavlN::SmartOwnerPtrC<GroupC> RefT; + typedef RavlN::SmartCallbackPtrC<GroupC> CBRefT; protected: + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + }; } Modified: main/Ravl/Contrib/OpenSceneGraph/HUD.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/HUD.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/HUD.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,8 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/HUD.hh" +#include "Ravl/XMLFactoryRegister.hh" + #include <osg/Projection> #include <osg/Matrix> #include <osg/MatrixTransform> @@ -29,6 +31,26 @@ HUDC::HUDC(const RavlN::RealRange2dC &coords) : GroupC(false) { + BuildNode(coords); + } + + HUDC::~HUDC() + { + } + + //: Factory constructor. + HUDC::HUDC(const XMLFactoryContextC &factory) + : GroupC(false) + { + RavlN::RealRange2dC coords(0, 0, 1, 1); + factory.Attribute("coords",coords); + BuildNode(coords); + GroupC::Setup(factory); + } + + //: Build node. + bool HUDC::BuildNode(const RavlN::RealRange2dC &coords) + { ref_ptr<Projection> projectionMatrix = new Projection; projectionMatrix->setMatrix(Matrix::ortho2D(coords.LCol(), coords.RCol(), coords.TRow(), coords.BRow())); @@ -39,11 +61,9 @@ m_node = projectionMatrix; m_modelViewMatrix = modelViewMatrix; + return true; } - HUDC::~HUDC() - { - } bool HUDC::AddChild(const NodeC::RefT &node) { @@ -69,4 +89,12 @@ return true; } + //: Zero owners reached. + void HUDC::ZeroOwners() + { + GroupC::ZeroOwners(); + } + + static RavlN::XMLFactoryRegisterConvertC<HUDC,GroupC> g_registerXMLFactoryGroup("RavlOSGN::HUDC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/HUD.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/HUD.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/HUD.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -33,6 +33,9 @@ //: Ctor. //!param: coords - The 2D coordinate space of the display in the format (min row, min col, max row, max col). + HUDC(const XMLFactoryContextC &factory); + //: Factory constructor. + virtual ~HUDC(); //: Dtor. @@ -42,9 +45,19 @@ virtual bool RemoveChild(const NodeC::RefT &node); //: Remove a node object from the display. - typedef RavlN::SmartPtrC<HUDC> RefT; + typedef RavlN::SmartOwnerPtrC<HUDC> RefT; + typedef RavlN::SmartCallbackPtrC<HUDC> CBRefT; + + protected: + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory - protected: + bool BuildNode(const RavlN::RealRange2dC &coords); + //: Build node. + + virtual void ZeroOwners(); + //: Zero owners reached. + osg::ref_ptr<osg::MatrixTransform> m_modelViewMatrix; }; Modified: main/Ravl/Contrib/OpenSceneGraph/Image.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Image.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Image.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,7 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Image.hh" +#include "Ravl/XMLFactoryRegister.hh" #include <osg/PrimitiveSet> #include <osg/Geode> #include <osg/Texture2D> @@ -26,10 +27,30 @@ using namespace osg; + //: Factory constructor. + ImageC::ImageC(const XMLFactoryContextC &factory) + : m_alphaImageEnabled(factory.AttributeBool("enableAlpha",false)), + m_alpha(factory.AttributeReal("alpha",1.0)) + { + RavlN::RealRange2dC coords(1,1); + factory.Attribute("coords",coords); + BuildNode(coords); + } + ImageC::ImageC(const RavlN::RealRange2dC &coords) : m_alphaImageEnabled(false), m_alpha(1.0) { + BuildNode(coords); + } + + ImageC::~ImageC() + { + } + + //: Build the node + bool ImageC::BuildNode(const RavlN::RealRange2dC &coords) + { ref_ptr<Geometry> geometryRef = new Geometry(); ref_ptr<Vec3Array> vertexArray = new Vec3Array(); @@ -72,11 +93,9 @@ m_node = geodeRef; m_geometry = geometryRef; + return true; } - ImageC::~ImageC() - { - } bool ImageC::SetSize(const RavlN::RealRange2dC &coords) { @@ -162,4 +181,12 @@ return true; } + //: Zero owners reached. + void ImageC::ZeroOwners() + { + NodeC::ZeroOwners(); + } + + static RavlN::XMLFactoryRegisterConvertC<ImageC,NodeC> g_registerXMLFactoryImageRGB("RavlOSGN::ImageC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/Image.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Image.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Image.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -29,6 +29,9 @@ : public NodeC { public: + ImageC(const XMLFactoryContextC &factory); + //: Factory constructor. + virtual ~ImageC(); //: Dtor. @@ -42,12 +45,26 @@ bool SetAlpha(float alpha); //: Set an alpha value for the entire image. + typedef RavlN::SmartOwnerPtrC<ImageC> RefT; + //: Reference type. + + typedef RavlN::SmartCallbackPtrC<ImageC> CBRefT; + //: Reference type. + protected: + ImageC(const RavlN::RealRange2dC &coords = RavlN::RealRange2dC(1, 1)); //: Ctor. //!param: coords - The 2D position of the image in the X/Y plane. + bool BuildNode(const RavlN::RealRange2dC &coords); + //: Build the node + bool UpdateAlphaRenderState(osg::ref_ptr<osg::StateSet> &stateSetRef); + //: Set rendering state. + + virtual void ZeroOwners(); + //: Zero owners reached. osg::ref_ptr<osg::Geometry> m_geometry; bool m_alphaImageEnabled; Modified: main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,10 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/ImageByteRGB.hh" +#include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/IO.hh" +#include "Ravl/RLog.hh" + #include <osg/PrimitiveSet> #include <osg/Geode> #include <osg/Texture2D> @@ -34,6 +38,22 @@ ImageByteRGBC::~ImageByteRGBC() { } + + //: Factory constructor + + ImageByteRGBC::ImageByteRGBC(const XMLFactoryContextC &context) + : ImageC(context) + { + RavlN::StringC filename = context.AttributeString("filename",""); + if(!filename.IsEmpty()) { + RavlImageN::ImageC<RavlImageN::ByteRGBValueC> image; + if(RavlN::Load(filename,image)) { + SetImage(image); + } else { + rWarning("Failed to load file '%s' ",filename.data()); + } + } + } bool ImageByteRGBC::SetImage(RavlImageN::ImageC<RavlImageN::ByteRGBValueC> &image) { @@ -73,4 +93,15 @@ return true; } + //: Zero owners reached. + void ImageByteRGBC::ZeroOwners() + { + ImageC::ZeroOwners(); + } + + void LinkImageByteRGB() + {} + + static RavlN::XMLFactoryRegisterConvertC<ImageByteRGBC,ImageC> g_registerXMLFactoryImageRGB("RavlOSGN::ImageByteRGBC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/ImageByteRGB.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -31,16 +31,25 @@ //: Ctor. //!param: coords - The 2D position of the image in the X/Y plane. + ImageByteRGBC(const XMLFactoryContextC &context); + //: Factory constructor + virtual ~ImageByteRGBC(); //: Dtor. bool SetImage(RavlImageN::ImageC<RavlImageN::ByteRGBValueC> &image); //: Set the object image. - typedef RavlN::SmartPtrC<ImageByteRGBC> RefT; + typedef RavlN::SmartOwnerPtrC<ImageByteRGBC> RefT; //: Reference type. + + typedef RavlN::SmartCallbackPtrC<ImageByteRGBC> CBRefT; + //: Reference type. protected: + virtual void ZeroOwners(); + //: Zero owners reached. + RavlImageN::ImageC<RavlImageN::ByteRGBValueC> m_image; }; Modified: main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,9 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/ImageByteRGBA.hh" +#include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/IO.hh" +#include "Ravl/RLog.hh" #include <osg/PrimitiveSet> #include <osg/Geode> #include <osg/Texture2D> @@ -31,10 +34,27 @@ { } + //: Factory constructor + + ImageByteRGBAC::ImageByteRGBAC(const XMLFactoryContextC &context) + : ImageC(context) + { + RavlN::StringC filename = context.AttributeString("filename",""); + if(!filename.IsEmpty()) { + RavlImageN::ImageC<RavlImageN::ByteRGBAValueC> image; + if(RavlN::Load(filename,image)) { + SetImage(image); + } else { + rWarning("Failed to load file '%s' ",filename.data()); + } + } + } + ImageByteRGBAC::~ImageByteRGBAC() { } + bool ImageByteRGBAC::SetImage(RavlImageN::ImageC<RavlImageN::ByteRGBAValueC> &image) { if (!(image.IsValid() && (image.Size() > 0) && image.IsContinuous())) @@ -72,5 +92,17 @@ return true; } + + //: Zero owners reached. + void ImageByteRGBAC::ZeroOwners() + { + ImageC::ZeroOwners(); + } + + void LinkImageByteRGBA() + {} + + static RavlN::XMLFactoryRegisterConvertC<ImageByteRGBAC,ImageC> g_registerXMLFactoryImageRGBA("RavlOSGN::ImageByteRGBAC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/ImageByteRGBA.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -27,20 +27,29 @@ : public ImageC { public: + ImageByteRGBAC(const XMLFactoryContextC &context); + //: Factory constructor + ImageByteRGBAC(const RavlN::RealRange2dC &coords = RavlN::RealRange2dC(1, 1)); //: Ctor. //!param: coords - The 2D position of the image in the X/Y plane. - + virtual ~ImageByteRGBAC(); //: Dtor. bool SetImage(RavlImageN::ImageC<RavlImageN::ByteRGBAValueC> &image); //: Set the object image. - typedef RavlN::SmartPtrC<ImageByteRGBAC> RefT; + typedef RavlN::SmartOwnerPtrC<ImageByteRGBAC> RefT; //: Reference type. + + typedef RavlN::SmartCallbackPtrC<ImageByteRGBAC> CBRefT; + //: Reference type. protected: + virtual void ZeroOwners(); + //: Zero owners reached. + RavlImageN::ImageC<RavlImageN::ByteRGBAValueC> m_image; }; Modified: main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/ModelFile.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,7 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/ModelFile.hh" +#include "Ravl/XMLFactoryRegister.hh" #include <osgDB/ReadFile> #define DODEBUG 0 @@ -26,11 +27,38 @@ ModelFileC::ModelFileC(const std::string &filename) { - m_node = osgDB::readNodeFile(filename); + BuildNode(filename); } + //: XML Factory constructor + + ModelFileC::ModelFileC(const XMLFactoryContextC &factory) + { + std::string filename = factory.AttributeString("filename",""); + BuildNode(filename); + NodeC::Setup(factory); + } + ModelFileC::~ModelFileC() { } + //: Build the node + bool ModelFileC::BuildNode(const std::string &filename) + { + if(filename.empty()) + return false; + m_node = osgDB::readNodeFile(filename); + return m_node; + } + + //: Zero owners reached. + + void ModelFileC::ZeroOwners() + { + NodeC::ZeroOwners(); + } + + static RavlN::XMLFactoryRegisterConvertC<ModelFileC,NodeC> g_registerXMLFactoryGroup("RavlOSGN::ModelFileC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/ModelFile.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/ModelFile.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/ModelFile.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -30,13 +30,22 @@ ModelFileC(const std::string &filename); //: Ctor. //!param: filename - Filename of the model to load. - + + ModelFileC(const XMLFactoryContextC &factory); + //: XML Factory constructor + virtual ~ModelFileC(); //: Dtor. - typedef RavlN::SmartPtrC<ModelFileC> RefT; + typedef RavlN::SmartOwnerPtrC<ModelFileC> RefT; + typedef RavlN::SmartCallbackPtrC<ModelFileC> CBRefT; protected: + virtual void ZeroOwners(); + //: Zero owners reached. + + bool BuildNode(const std::string &filename); + //: Build the node }; } Modified: main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/MustLinkGtkGlExtInit.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -4,10 +4,23 @@ extern bool RegisterGtkGlExtInit(); extern bool LinkOpenSceneGraphWidget(); + extern void LinkImageByteRGBA(); + extern void LinkImageByteRGB(); + extern void LinkSphere(); + extern void LinkGroup(); + extern void LinkText(); + extern void LinkTransform(); void LinkGtkGlExtInit() { RegisterGtkGlExtInit(); LinkOpenSceneGraphWidget(); + + LinkImageByteRGBA(); + LinkImageByteRGB(); + LinkSphere(); + LinkGroup(); + LinkText(); + LinkTransform(); } } Modified: main/Ravl/Contrib/OpenSceneGraph/Node.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Node.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Node.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,8 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Node.hh" +#include "Ravl/XMLFactoryRegister.hh" + #include <osg/Node> #include <osg/StateSet> #include <osg/Referenced> @@ -56,6 +58,13 @@ } + //: XML Factory constructor + NodeC::NodeC(const XMLFactoryContextC &factory) + : m_sigCallback(true) + { + + } + //! Destructor. NodeC::~NodeC() @@ -67,6 +76,22 @@ } } + //: Do setup from factory + + bool NodeC::Setup(const XMLFactoryContextC &factory) + { + + return true; + } + + //: Called when owner handles drop to zero. + + void NodeC::ZeroOwners() + { + RavlN::RCLayerBodyC::ZeroOwners(); + } + + bool NodeC::EnableCallback(const bool enable) { if (!m_node) Modified: main/Ravl/Contrib/OpenSceneGraph/Node.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Node.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Node.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -19,10 +19,12 @@ #include <osg/Node> #include <osg/NodeCallback> #include "Ravl/Threads/Signal.hh" +#include "Ravl/XMLFactory.hh" namespace RavlOSGN { class NodeC; + using RavlN::XMLFactoryContextC; // Class for holding a reference back an arbitary object. @@ -90,11 +92,14 @@ //: Node base object. class NodeC - : public RavlN::RCBodyVC + : public RavlN::RCLayerBodyC { public: NodeC(); //: Ctor. + + NodeC(const XMLFactoryContextC &factory); + //: XML Factory constructor virtual ~NodeC(); //: Dtor. @@ -113,7 +118,8 @@ { return m_node; } //: Access the object smart pointer. - typedef RavlN::SmartPtrC<NodeC> RefT; + typedef RavlN::SmartOwnerPtrC<NodeC> RefT; + typedef RavlN::SmartCallbackPtrC<NodeC> CBRefT; static bool GetNode(osg::Node *,NodeC::RefT &node); //: Get node handle if it exists. @@ -152,6 +158,12 @@ { return m_node->getName(); } //: Access name of node. protected: + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + osg::ref_ptr<osg::Node> m_node; osg::ref_ptr<osg::NodeCallback> m_callback; RavlN::Signal0C m_sigCallback; Modified: main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -59,15 +59,20 @@ {} OpenSceneGraphWidgetBodyC::OpenSceneGraphWidgetBodyC(const RavlN::XMLFactoryContextC &factory) - : m_width(100), - m_height(100), + : m_width(factory.AttributeInt("width",100)), + m_height(factory.AttributeInt("height",100)), m_osgViewer(NULL), m_osgWindow(NULL), m_clearColour(0.5, 0.5, 0.5, 1.0), m_defaultManipulator(factory.AttributeString("manipulator","TrackerBall").data()), m_frameRate(factory.AttributeReal("frameRate",60)) - {} - + { + factory.Attribute("clearColour",m_clearColour); + NodeC::RefT scene; + if(factory.UseComponent("Scene",scene)) + SetScene(*scene); + } + OpenSceneGraphWidgetBodyC::~OpenSceneGraphWidgetBodyC() { if (m_osgViewer) @@ -90,7 +95,14 @@ m_osgViewer = new osgViewer::ViewerGtk(); +#ifdef OSGGA_CAMERA_MANIPULATOR + // Used in 2.9 + osgGA::CameraManipulator *manipulator = 0; +#else + // Used in 2.8 osgGA::MatrixManipulator *manipulator = 0; +#endif + if(m_defaultManipulator == "TrackerBall") { manipulator = new osgGA::TrackballManipulator; } else if(m_defaultManipulator == "Terrain") { Modified: main/Ravl/Contrib/OpenSceneGraph/Sphere.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Sphere.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Sphere.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,9 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Sphere.hh" +#include "Ravl/RLog.hh" +#include "Ravl/XMLFactoryRegister.hh" + #include <osg/Shape> #include <osg/ShapeDrawable> @@ -22,7 +25,7 @@ namespace RavlOSGN { - + using RavlN::RealT; using namespace osg; SphereC::SphereC(const RavlN::Vector3dC &position, RavlN::RealT radius) @@ -30,23 +33,32 @@ m_sphere = new Sphere(Vec3(position.X(), position.Y(), position.Z()), radius); m_drawable = new ShapeDrawable(m_sphere); } - - SphereC::~SphereC() + + //: XML Factory constructor + + + SphereC::SphereC(const XMLFactoryContextC &factory) + : DrawableC(factory) { + RavlN::Vector3dC position; + factory.Attribute("position",position,RavlN::Vector3dC(0,0,0)); + RealT radius = factory.AttributeReal("radius",1.0); + + m_sphere = new Sphere(Vec3(position.X(), position.Y(), position.Z()), radius); + m_drawable = new ShapeDrawable(m_sphere); + + RavlImageN::RealRGBAValueC colour(1.0,1.0,1.0,1.0); + factory.Attribute("colour",colour,RavlImageN::RealRGBAValueC(1.0,1.0,1.0,1.0)); + if(!SetColour(colour)) { + rWarning("Failed to set sphere colour."); + RavlAssert(0); // This shouldn't fail! + } + } - bool SphereC::SetColour(const RavlImageN::RealRGBAValueC &colour) + + SphereC::~SphereC() { - if (!m_drawable) - return false; - - ref_ptr<ShapeDrawable> shapeDrawableRef = dynamic_cast<ShapeDrawable*>(m_drawable.get()); - if (!shapeDrawableRef) - return false; - - shapeDrawableRef->setColor(Vec4(colour.Red(), colour.Green(), colour.Blue(), colour.Alpha())); - - return true; } bool SphereC::SetPosition(const RavlN::Vector3dC &position) @@ -68,5 +80,16 @@ return true; } + + //: Called when owner handles drop to zero. + void SphereC::ZeroOwners() + { + DrawableC::ZeroOwners(); + } + + void LinkSphere() + {} + static RavlN::XMLFactoryRegisterConvertC<SphereC,DrawableC> g_registerXMLFactorySphere("RavlOSGN::SphereC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/Sphere.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Sphere.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Sphere.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -16,7 +16,6 @@ #include "Ravl/OpenSceneGraph/Drawable.hh" #include "Ravl/Vector3d.hh" -#include "Ravl/Image/RealRGBAValue.hh" #include <osg/Shape> namespace RavlOSGN @@ -32,22 +31,26 @@ SphereC(const RavlN::Vector3dC &position = RavlN::Vector3dC(0, 0, 0), RavlN::RealT radius = 1.0); //: Ctor. + + SphereC(const XMLFactoryContextC &factory); + //: XML Factory constructor virtual ~SphereC(); //: Dtor. - bool SetColour(const RavlImageN::RealRGBAValueC &colour); - //: Set the sphere colour. - bool SetPosition(const RavlN::Vector3dC &position); //: Set the sphere centre position. bool SetSize(RavlN::RealT radius); //: Set the sphere radius. - typedef RavlN::SmartPtrC<SphereC> RefT; + typedef RavlN::SmartOwnerPtrC<SphereC> RefT; + typedef RavlN::SmartCallbackPtrC<SphereC> CBRefT; protected: + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + osg::ref_ptr<osg::Sphere> m_sphere; }; Modified: main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,10 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/TexTriMesh.hh" +#include "Ravl/RLog.hh" +#include "Ravl/XMLFactoryRegister.hh" +#include "Ravl/IO.hh" + #include <osg/Geode> #include <osg/Geometry> #include <osg/Texture2D> @@ -38,10 +42,36 @@ SetMesh(texTriMesh); } + //: XML Factory constructor + + TexTriMeshC::TexTriMeshC(const XMLFactoryContextC &factory) + { + m_node = new Geode; + Setup(factory); + } + TexTriMeshC::~TexTriMeshC() { } + + //: Do setup from factory + bool TexTriMeshC::Setup(const XMLFactoryContextC &factory) + { + NodeC::Setup(factory); + RavlN::StringC filename; + if(factory.Attribute("loadTriMesh",filename)) { + Ravl3DN::TexTriMeshC triMesh; + if(RavlN::Load(filename,triMesh)) { + SetMesh(triMesh); + } else { + rWarning("Failed to load '%s' ",filename.data()); + } + } + return true; + } + + bool TexTriMeshC::SetMesh(const Ravl3DN::TexTriMeshC &texTriMesh) { if (!m_node) @@ -107,5 +137,13 @@ return true; } + + //: Called when owner handles drop to zero. + + void TexTriMeshC::ZeroOwners() { + TriMeshC::ZeroOwners(); + } + static RavlN::XMLFactoryRegisterConvertC<TexTriMeshC,TriMeshC> g_registerXMLFactoryTexTriMesh("RavlOSGN::TexTriMeshC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/TexTriMesh.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -33,15 +33,24 @@ TexTriMeshC(const Ravl3DN::TexTriMeshC &texTriMesh); //: Ctor. + TexTriMeshC(const XMLFactoryContextC &factory); + //: XML Factory constructor + virtual ~TexTriMeshC(); //: Dtor. bool SetMesh(const Ravl3DN::TexTriMeshC &texTriMesh); // Set the node to display the mesh. - typedef RavlN::SmartPtrC<TexTriMeshC> RefT; - + typedef RavlN::SmartOwnerPtrC<TexTriMeshC> RefT; + typedef RavlN::SmartCallbackPtrC<TexTriMeshC> CBRefT; + protected: + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. }; } Modified: main/Ravl/Contrib/OpenSceneGraph/Text.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Text.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Text.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,7 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Text.hh" +#include "Ravl/XMLFactoryRegister.hh" #include <osgText/Text> #define DODEBUG 0 @@ -69,6 +70,17 @@ m_drawable = textRef; } + //: Factory + + TextC::TextC(const XMLFactoryContextC &context) + { + ref_ptr<Text> textRef = new Text(); + m_drawable = textRef; + RavlN::StringC text = context.AttributeString("text",""); + textRef->setText(text.data()); + DrawableC::Setup(context); + } + TextC::~TextC() { } @@ -172,5 +184,16 @@ return true; } + + void LinkText() + {} + + //: Called when owner handles drop to zero. + + void TextC::ZeroOwners() { + DrawableC::ZeroOwners(); + } + + static RavlN::XMLFactoryRegisterConvertC<TextC,DrawableC> g_registerXMLFactorySphere("RavlOSGN::TextC"); } Modified: main/Ravl/Contrib/OpenSceneGraph/Text.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Text.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Text.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -62,7 +62,10 @@ TextC(const std::string &text); //: Ctor. //!param: text - Initial text value. - + + TextC(const XMLFactoryContextC &context); + //: Factory + virtual ~TextC(); //: Dtor. @@ -87,9 +90,13 @@ bool SetSize(RavlN::RealT size); //: Set the text size in scene graph coordinates. - typedef RavlN::SmartPtrC<TextC> RefT; + typedef RavlN::SmartOwnerPtrC<TextC> RefT; + typedef RavlN::SmartCallbackPtrC<TextC> CBRefT; protected: + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + }; } Modified: main/Ravl/Contrib/OpenSceneGraph/Transform.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Transform.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Transform.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,9 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/Transform.hh" +#include "Ravl/OpenSceneGraph/TypeConvert.hh" +#include "Ravl/XMLFactoryRegister.hh" + #include <osg/Transform> #define DODEBUG 0 @@ -31,10 +34,41 @@ m_node = new Transform(); } + //: XML constructor. + TransformC::TransformC(const XMLFactoryContextC &context) + { + m_node = new Transform(); + GroupC::Setup(context); + } + TransformC::~TransformC() { } + + //: Do setup from factory + bool TransformC::Setup(const XMLFactoryContextC &factory) + { + GroupC::Setup(factory); + return true; + } + //: Called when owner handles drop to zero. + void TransformC::ZeroOwners() + { + GroupC::ZeroOwners(); + } + + // ------------------------------------------------------------------------ + + TransformPositionAttitudeC::TransformPositionAttitudeC(const XMLFactoryContextC &context) + : TransformC(false) + { + m_node = new PositionAttitudeTransform(); + Setup(context); + } + //: XML constructor. + + TransformPositionAttitudeC::TransformPositionAttitudeC(bool create) : TransformC(false) { @@ -46,6 +80,25 @@ { } + //: Do setup from factory + + bool TransformPositionAttitudeC::Setup(const XMLFactoryContextC &factory) + { + TransformC::Setup(factory); + + RavlN::Vector3dC position(0,0,0); + if(factory.Attribute("position",position)) { + SetPosition(position); + } + + RavlN::Vector3dC scale(1.0,1.0,1.0); + if(factory.Attribute("scale",scale)) { + SetScale(scale); + } + + return true; + } + bool TransformPositionAttitudeC::SetPosition(const RavlN::Vector3dC &position) { if (!m_node) @@ -55,7 +108,7 @@ if (!transformRef) return false; - transformRef->setPosition(Vec3(position.X(), position.Y(), position.Z())); + transformRef->setPosition(MakeVec3(position)); return true; } @@ -70,8 +123,8 @@ return false; Vec3 vecPosition = transformRef->getPosition(); - position = RavlN::Vector3dC(vecPosition.x(), vecPosition.y(), vecPosition.z()); - + position = MakeVector3d(vecPosition); + return true; } @@ -102,6 +155,17 @@ return true; } + + //: Called when owner handles drop to zero. + void TransformPositionAttitudeC::ZeroOwners() + { + TransformC::ZeroOwners(); + } + void LinkTransform() + {} + + static RavlN::XMLFactoryRegisterConvertC<TransformPositionAttitudeC,TransformC> g_registerXMLFactoryTransformPositionAttitude("RavlOSGN::TransformPositionAttitudeC"); + static RavlN::XMLFactoryRegisterConvertC<TransformC,GroupC> g_registerXMLFactoryTransform("RavlOSGN::TransformC"); } Modified: main/Ravl/Contrib/OpenSceneGraph/Transform.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/Transform.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/Transform.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -34,12 +34,22 @@ //: Ctor. //!param: create - If true, a new transform object will be allocated. + TransformC(const XMLFactoryContextC &context); + //: XML constructor. + virtual ~TransformC(); //: Dtor. - typedef RavlN::SmartPtrC<TransformC> RefT; + typedef RavlN::SmartOwnerPtrC<TransformC> RefT; + typedef RavlN::SmartCallbackPtrC<TransformC> CBRefT; protected: + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. + }; //! userlevel=Normal @@ -52,6 +62,9 @@ TransformPositionAttitudeC(bool create = true); //!param: create - If true, a new position and attitude transform object will be allocated. + TransformPositionAttitudeC(const XMLFactoryContextC &context); + //: XML constructor. + virtual ~TransformPositionAttitudeC(); //: Dtor. @@ -67,9 +80,16 @@ bool SetScale(const RavlN::Vector3dC &scale); //: Set the transform scale. - typedef RavlN::SmartPtrC<TransformPositionAttitudeC> RefT; + typedef RavlN::SmartOwnerPtrC<TransformPositionAttitudeC> RefT; + typedef RavlN::SmartCallbackPtrC<TransformPositionAttitudeC> CBRefT; + + protected: + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. - protected: }; } Modified: main/Ravl/Contrib/OpenSceneGraph/TriMesh.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/TriMesh.cc 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/TriMesh.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -10,6 +10,9 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/TriMesh.hh" +#include "Ravl/IO.hh" +#include "Ravl/RLog.hh" +#include "Ravl/XMLFactoryRegister.hh" #include <osg/Geode> #define DODEBUG 0 @@ -36,10 +39,34 @@ SetMesh(triMesh); } + //: XML Factory constructor + + TriMeshC::TriMeshC(const XMLFactoryContextC &factory) + : NodeC(factory) + { + Setup(factory); + } + TriMeshC::~TriMeshC() { } + //: Do setup from factory + bool TriMeshC::Setup(const XMLFactoryContextC &factory) + { + NodeC::Setup(factory); + RavlN::StringC filename; + if(factory.Attribute("loadTriMesh",filename)) { + Ravl3DN::TriMeshC triMesh; + if(RavlN::Load(filename,triMesh)) { + SetMesh(triMesh); + } else { + rWarning("Failed to load '%s' ",filename.data()); + } + } + return true; + } + bool TriMeshC::SetMesh(const Ravl3DN::TriMeshC &triMesh) { if (!m_node) @@ -104,4 +131,12 @@ return true; } + //: Called when owner handles drop to zero. + void TriMeshC::ZeroOwners() + { + NodeC::ZeroOwners(); + } + + static RavlN::XMLFactoryRegisterConvertC<TriMeshC,NodeC> g_registerXMLFactoryTriMesh("RavlOSGN::TriMeshC"); + } Modified: main/Ravl/Contrib/OpenSceneGraph/TriMesh.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/TriMesh.hh 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/TriMesh.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -33,16 +33,27 @@ TriMeshC(const Ravl3DN::TriMeshC &triMesh); //: Ctor. + + TriMeshC(const XMLFactoryContextC &factory); + //: XML Factory constructor + virtual ~TriMeshC(); //: Dtor. bool SetMesh(const Ravl3DN::TriMeshC &triMesh); // Set the node to display the mesh. - typedef RavlN::SmartPtrC<TriMeshC> RefT; + typedef RavlN::SmartOwnerPtrC<TriMeshC> RefT; + typedef RavlN::SmartCallbackPtrC<TriMeshC> CBRefT; + + protected: + bool Setup(const XMLFactoryContextC &factory); + //: Do setup from factory + + virtual void ZeroOwners(); + //: Called when owner handles drop to zero. - protected: osg::ref_ptr<osg::Geometry> m_geometry; Ravl3DN::TriMeshC m_triMesh; }; Added: main/Ravl/Contrib/OpenSceneGraph/TypeConvert.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/TypeConvert.cc (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/TypeConvert.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -0,0 +1,6 @@ + +#include "Ravl/OpenSceneGraph/TypeConvert.hh" + +namespace RavlOSGN { + +} \ No newline at end of file Added: main/Ravl/Contrib/OpenSceneGraph/TypeConvert.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/TypeConvert.hh (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/TypeConvert.hh 2011-04-22 14:11:56 UTC (rev 8034) @@ -0,0 +1,36 @@ +/* + * File: TypeConvert.hh + * Author: charlesgalambos + * + * Created on April 22, 2011, 1:24 PM + */ + +#ifndef RAVLOSG_TYPECONVERT_HH +#define RAVLOSG_TYPECONVERT_HH + +#include <osg/Vec3> +#include <osg/Vec4> +#include "Ravl/Vector3d.hh" +#include "Ravl/Vector4d.hh" + +namespace RavlOSGN { + + inline osg::Vec3 MakeVec3(const RavlN::Vector3dC &vec) + { return osg::Vec3(vec.X(),vec.Y(),vec.Z()); } + + + inline osg::Vec4 MakeVec4(const RavlN::Vector4dC &vec) + { return osg::Vec4(vec.X(),vec.Y(),vec.Z(),vec.W()); } + + inline RavlN::Vector3dC MakeVector3d(const osg::Vec3 &vec) + { return RavlN::Vector3dC(vec.x(),vec.y(),vec.z()); } + + + inline RavlN::Vector4dC MakeVector4d(const osg::Vec4 &vec) + { return RavlN::Vector4dC(vec.x(),vec.y(),vec.z(),vec.w()); } + +} + + +#endif /* TYPECONVERT_HH */ + Modified: main/Ravl/Contrib/OpenSceneGraph/defs.mk =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-04-22 14:10:09 UTC (rev 8033) +++ main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-04-22 14:11:56 UTC (rev 8034) @@ -13,26 +13,29 @@ # NOTE: Do NOT comment out the GTKGLExt, if its not enabled though it may # compile this library will not work. -HEADERS=Drawable.hh Sphere.hh Image.hh ImageByteRGBA.hh ImageByteRGB.hh Text.hh TriMesh.hh TexTriMesh.hh \ - Node.hh Geode.hh Group.hh Transform.hh ModelFile.hh HUD.hh \ - OpenSceneGraphWidget.hh Box.hh CanvasManipulator.hh +HEADERS=Drawable.hh Sphere.hh Image.hh ImageByteRGBA.hh ImageByteRGB.hh Text.hh \ + TriMesh.hh TexTriMesh.hh Node.hh Geode.hh Group.hh Transform.hh ModelFile.hh \ + HUD.hh OpenSceneGraphWidget.hh Box.hh CanvasManipulator.hh TypeConvert.hh -SOURCES=Drawable.cc Sphere.cc Image.cc ImageByteRGBA.cc ImageByteRGB.cc Text.cc TriMesh.cc TexTriMesh.cc \ - Node.cc Geode.cc Group.cc Transform.cc ModelFile.cc HUD.cc \ - OpenSceneGraphWidget.cc Box.cc CanvasManipulator.cc +SOURCES=Drawable.cc Sphere.cc Image.cc ImageByteRGBA.cc ImageByteRGB.cc Text.cc \ + TriMesh.cc TexTriMesh.cc Node.cc Geode.cc Group.cc Transform.cc ModelFile.cc \ + HUD.cc OpenSceneGraphWidget.cc Box.cc CanvasManipulator.cc TypeConvert.cc PLIB=RavlGUIOpenSceneGraph -MAINS=exOpenSceneGraphWidget.cc +MAINS=exOpenSceneGraphWidgetXML.cc MUSTLINK=MustLinkGtkGlExtInit.cc -USESLIBS=RavlCore RavlGeom RavlImage RavlGUI Ravl3D OpenGL GTK OpenSceneGraphGtk +USESLIBS=RavlCore RavlGeom RavlImage RavlGUI Ravl3D OpenGL GTK \ + OpenSceneGraphGtk RavlXMLFactory RavlRLog PROGLIBS=RavlOS RavlImageIO RavlExtImgIO #EHT=Ravl.API.GUI.OpenSceneGraph.html -AUXFILES=OpenSceneGraphGtk.def +EXTERNALLIBS=OpenSceneGraphGtk.def -AUXDIR=lib/RAVL/libdep +AUXFILES=exOpenSceneGraph.xml + +AUXDIR=share/RAVL/OpenSceneGraph Added: main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraph.xml 2011-04-22 14:11:56 UTC (rev 8034) @@ -0,0 +1,22 @@ +<?xml version='1.0' encoding='UTF-8' ?> +<?RAVL class='RavlN::XMLTreeC' ?> + +<Config verbose="false"> + <OpenSceneGraphWidget typename="RavlOSGN::OpenSceneGraphWidgetC" > + <Scene typename="RavlOSGN::GroupC"> + <Nodes> + <SphereGeode typename="RavlOSGN::GeodeC"> + <Drawables> + <Sphere typename="RavlOSGN::SphereC" colour="0.0 1.0 0.0 0.0" /> + <Text typename="RavlOSGN::TextC" text="H!" colour="1.0 0.0 0.0 1.0" /> + </Drawables> + </SphereGeode> + <ImageTransform typename="RavlOSGN::TransformPositionAttitudeC" > + <AnImage typename="RavlOSGN::ImageByteRGBC"> + </AnImage> + </ImageTransform> + </Nodes> + </Scene> + </OpenSceneGraphWidget> + +</Config> \ No newline at end of file Added: main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidgetXML.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidgetXML.cc (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidgetXML.cc 2011-04-22 14:11:56 UTC (rev 8034) @@ -0,0 +1,93 @@ +// This file is part of RAVL, Recognition And Vision Library +// Copyright (C) 2010, OmniPerception Ltd. +// This code may be redistributed under the terms of the GNU Lesser +// General Public License (LGPL). See the lgpl.licence file for details or +// see http://www.gnu.org/copyleft/lesser.html +// file-header-ends-here +//////////////////////////////////////////////////////////////// +//! file = "Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidget.cc" +//! lib = RavlGUIOpenSceneGraph +//! author = "Warren Moore" + +#include "Ravl/GUI/Manager.hh" +#include "Ravl/EntryPnt.hh" +#include "Ravl/Option.hh" +#include "Ravl/GUI/Window.hh" +#include "Ravl/GUI/Button.hh" +#include "Ravl/GUI/LBox.hh" +#include "Ravl/DP/FileFormatIO.hh" +#include "Ravl/GUI/MouseEvent.hh" +#include "Ravl/OS/Date.hh" +#include "Ravl/OpenSceneGraph/OpenSceneGraphWidget.hh" +#include "Ravl/Image/RealRGBAValue.hh" +#include "Ravl/Resource.hh" +#include "Ravl/RLog.hh" + +using namespace RavlN; +using namespace RavlGUIN; +using namespace RavlOSGN; + +bool pressFunc(MouseEventC &me,OpenSceneGraphWidgetC &osgWidget) { + cerr << "Press " << me.Row() << " " << me.Col() << "\n"; + return true; +} + +bool releaseFunc(MouseEventC &me) { + cerr << "Release " << me.Row() << " " << me.Col() << "\n"; + return true; +} + +int DoMain(int argc, char *argv[]) +{ + //: parse options + RavlN::OptionC opt(argc, argv); + RavlN::SetResourceRoot(opt.String("i", PROJECT_OUT, "Install location. ")); + RavlN::StringC configFile = opt.String("c", RavlN::Resource("RAVL/OpenSceneGraph", "exOpenSceneGraph.xml"), "Configuration file"); + RavlN::StringC logFile = opt.String("l", "stderr", "Log file. "); + RavlN::StringC logLevel = opt.String("ll", "debug", "Logging level. "); + + RavlN::StringC logModuleName = opt.String("lm","","Log messages from a specific module "); + RavlN::StringC logModulePath = opt.String("lmp","","Log messages from a specific path "); + + bool verbose = opt.Boolean("v", true, "Verbose, Output context information. "); + bool loadOnly = opt.Boolean("lo", false, "Load model only. "); + bool formatList = opt.Boolean("fl", false, "Format list. "); + + RavlGUIN::Manager.Init(argc, argv); + opt.Check(); + + RavlN::RLogInit(argc, argv, logFile.chars(), verbose); + RavlN::RLogSubscribeL(logLevel.chars()); + if(!logModuleName.IsEmpty() || !logModulePath.IsEmpty()) + RavlN::RLogSubscribe(logModuleName,logModulePath,rlog::Log_Debug); + + rInfo("exOpenSceneGraphXML Built:%s ",__DATE__); + + RavlN::XMLFactoryC::RefT mainFactory = new RavlN::XMLFactoryC(configFile); + RavlN::XMLFactoryContextC factory(*mainFactory); + + WindowC win(100, 100, "OpenSceneGraph"); + OpenSceneGraphWidgetC osgWidget; + + if(!factory.UseComponent("OpenSceneGraphWidget",osgWidget,false,typeid(OpenSceneGraphWidgetC))) { + rError("No open scene graph widget found. "); + return 1; + } + + Connect(osgWidget.Signal("button_press_event"), &pressFunc,MouseEventC(),osgWidget); + Connect(osgWidget.Signal("button_release_event"), &releaseFunc); + + RavlGUIN::LBoxC vbox = VBox(osgWidget); + + win.Add(vbox); + + Manager.Execute(); + + win.Show(); + + Manager.Wait(); + + return 0; +} + +RAVL_ENTRY_POINT(DoMain); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-22 14:10:15
|
Revision: 8033 http://ravl.svn.sourceforge.net/ravl/?rev=8033&view=rev Author: craftit Date: 2011-04-22 14:10:09 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Add helpers for dealing with lists of objects. Modified Paths: -------------- main/Ravl/OS/XMLFactory/XMLFactory.hh main/Ravl/OS/XMLFactory/testXMLFactory.cc Modified: main/Ravl/OS/XMLFactory/XMLFactory.hh =================================================================== --- main/Ravl/OS/XMLFactory/XMLFactory.hh 2011-04-20 15:25:12 UTC (rev 8032) +++ main/Ravl/OS/XMLFactory/XMLFactory.hh 2011-04-22 14:10:09 UTC (rev 8033) @@ -20,7 +20,11 @@ #include "Ravl/Threads/Mutex.hh" #include "Ravl/OS/SysLog.hh" #include "Ravl/RCWrap.hh" +#include "Ravl/Collection.hh" +#include "Ravl/Traits.hh" +#include <vector> + #define rThrowBadConfigContextOnFailS(CONTEXT, METHOD, ARGS) { \ if (!CONTEXT.METHOD) { \ RavlN::StrOStreamC strm; \ @@ -343,6 +347,7 @@ // This will only check the local context for the component, creating // a new instance if its not found. + template<class DataT> bool CreateComponent(const StringC &name,DataT &data,bool suppressErrorMessages = false) const; //: Create a new instance of the named component. @@ -382,6 +387,60 @@ } //: Access node + template<class DataT> + bool UseComponentGroup(const StringC &group,std::vector<DataT> &list,const std::type_info &defaultType=typeid(void)) const { + XMLFactoryContextC childContext; + if(!ChildContext(group,childContext)) + return false; + for(RavlN::DLIterC<XMLTreeC> it(childContext.Children());it;it++) { + DataT value; + if(!childContext.UseChildComponent(it->Name(),value,false,defaultType)) { + SysLog(SYSLOG_ERR,"Failed to load child component %s, at %s ",it->Name().data(),childContext.Path().data()); + throw RavlN::ExceptionBadConfigC("Failed to load component"); + } + list.push_back(value); + } + return true; + } + //: Load component list. + // Returns true if child group exists, though it still may be empty. + + template<class DataT> + bool UseComponentGroup(const StringC &group,CollectionC<DataT> &list,const std::type_info &defaultType=typeid(void)) const { + XMLFactoryContextC childContext; + if(!ChildContext(group,childContext)) + return false; + for(RavlN::DLIterC<XMLTreeC> it(childContext.Children());it;it++) { + DataT value; + if(!childContext.UseChildComponent(it->Name(),value,false,defaultType)) { + SysLog(SYSLOG_ERR,"Failed to load child component %s, at %s ",it->Name().data(),childContext.Path().data()); + throw RavlN::ExceptionBadConfigC("Failed to load component"); + } + list.Append(value); + } + return true; + } + //: Load component list. + // Returns true if child group exists, though it still may be empty. + + template<typename ObjT,typename DataT,typename RetT> + bool UseComponentGroup(const StringC &group,ObjT &obj,RetT (ObjT::*addMethod)(DataT),const std::type_info &defaultType=typeid(void)) const { + XMLFactoryContextC childContext; + if(!ChildContext(group,childContext)) + return false; + for(RavlN::DLIterC<XMLTreeC> it(childContext.Children());it;it++) { + typename TraitsC<DataT>::BaseTypeT value; + if(!childContext.UseChildComponent(it->Name(),value,false,defaultType)) { + SysLog(SYSLOG_ERR,"Failed to load child component %s, at %s ",it->Name().data(),childContext.Path().data()); + throw RavlN::ExceptionBadConfigC("Failed to load component"); + } + (obj.*addMethod)(value); + } + return true; + } + //: Load component list. + // Returns true if child group exists, though it still may be empty. + protected: mutable XMLFactoryNodeC::RefT m_iNode; RCAbstractC m_factory; Modified: main/Ravl/OS/XMLFactory/testXMLFactory.cc =================================================================== --- main/Ravl/OS/XMLFactory/testXMLFactory.cc 2011-04-20 15:25:12 UTC (rev 8032) +++ main/Ravl/OS/XMLFactory/testXMLFactory.cc 2011-04-22 14:10:09 UTC (rev 8033) @@ -42,9 +42,11 @@ { public: TestClassC() + : m_count(0) { linkXMLFactoryRegister(); } TestClassC(const XMLFactoryContextC &factory) + : m_count(0) { linkXMLFactoryRegister(); SysLog(SYSLOG_DEBUG,"Factory path '%s' XMLNode:'%s' ",factory.Path().chars(),factory.Node().Name().chars()); @@ -58,8 +60,23 @@ } typedef RavlN::SmartPtrC<TestClassC> RefT; + + bool AddChildTest(TestClassC::RefT &theClass) { + m_count++; + return true; + } + + bool AddChildTestConst(TestClassC::RefT &theClass) { + m_count++; + return true; + } + + int Count() const + { return m_count; } + protected: TestClassC::RefT m_child; + int m_count; }; //need to declare stream operators too @@ -104,6 +121,10 @@ " <Test2 typename=\"RavlN::TestClassC\" >\n" " <child typename=\"RavlN::TestClassC\" noChild=\"true\" />\n" " </Test2>\n" + " <Nodes> \n" + " <Test3 typename=\"RavlN::TestClassC\" />\n" + " <Test4 typename=\"RavlN::TestClassC\" />\n" + " </Nodes> \n" "</Config>\n" ); @@ -140,5 +161,19 @@ if(childFactory2 != childFactory3) return __LINE__; + std::vector<RavlN::TestClassC::RefT> children; + if(!ctxt.UseComponentGroup("Nodes",children)) + return __LINE__; + if(children.size()!=2) + return __LINE__; + + if(!ctxt.UseComponentGroup("Nodes",*m_testChild,&TestClassC::AddChildTest)) + return __LINE__; + if(m_testChild->Count() != 2) + return __LINE__; + if(!ctxt.UseComponentGroup("Nodes",*m_testChild,&TestClassC::AddChildTestConst)) + return __LINE__; + if(m_testChild->Count() != 4) + return __LINE__; return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-20 15:25:19
|
Revision: 8032 http://ravl.svn.sourceforge.net/ravl/?rev=8032&view=rev Author: ees1wc Date: 2011-04-20 15:25:12 +0000 (Wed, 20 Apr 2011) Log Message: ----------- Added easier-to-use constructors & extra param setting methods; some tidying Modified Paths: -------------- main/Ravl/Image/Processing/Lines/PPHT.cc main/Ravl/Image/Processing/Lines/PPHT.hh main/Ravl/Image/Processing/Lines/testLineDet.cc Modified: main/Ravl/Image/Processing/Lines/PPHT.cc =================================================================== --- main/Ravl/Image/Processing/Lines/PPHT.cc 2011-04-20 12:44:42 UTC (rev 8031) +++ main/Ravl/Image/Processing/Lines/PPHT.cc 2011-04-20 15:25:12 UTC (rev 8032) @@ -38,18 +38,82 @@ namespace RavlImageN { + using namespace RavlN; + using namespace RavlConstN; + #ifdef __sgi__ // Help the compiler a bit... static DPOPortBodyC<Curve2dLineSegmentC> out1; static DPIPortBodyC<Curve2dLineSegmentC> out2; static DPOPortBodyC<ImageC<ByteT> > out3; #endif + + void PPHoughTransformBodyC::RecomputeParams() + { + RealT factor = fullDir ? pi : pi/2.0; // 1/2 orientation range + arrSize = Round(factor/radsPerBin); + radsPerBin = factor / ((RealT) arrSize); // recompute allowing for rounding. + angleCount = Array1dC<IntT>(IndexRangeC(-arrSize,arrSize)); + angRange = (edgelAngRange/2.0) / radsPerBin; + + ONDEBUG(cerr << "Using " << (fullDir ? "full" : "half") << " dir. Bins:" << arrSize << " \n"); + } ///////////////////////////////////////////////////////////////////////////////// - // Construct new do-da. + // Default constructor + + PPHoughTransformBodyC::PPHoughTransformBodyC() + : useMagSort(false), + cWidth(3), + maxGap(6), + minLength(8), + dynthresh(0.001), + gradEstNeigh(6), + p(600), // Just an estimate.... + falsep(0.999999), + edgelAngRange(pi/2.0), + maxTime(-1), // For ever ! + doSHT(false), + feedBack(false), + cachv(-2), + cachr(-2), + useSobol(false), + fullDir(false), + radsPerBin(0.01), + firstTime(true) + { RecomputeParams(); } + + // Constructor + + PPHoughTransformBodyC:: + PPHoughTransformBodyC(bool Directed, RealT AngleRes, RealT AngRange, + bool UseSobol, RealT MaxPTime, RealT FalsePos) + : useMagSort(false), + cWidth(3), + maxGap(6), + minLength(8), + dynthresh(0.001), + gradEstNeigh(6), + p(600), // Just an estimate.... + falsep(1.0-FalsePos), + edgelAngRange(AngRange), + maxTime(-1), // For ever ! + doSHT(false), + feedBack(false), + cachv(-2), + cachr(-2), + useSobol(UseSobol), + fullDir(Directed), + radsPerBin(AngleRes), + firstTime(true) + { RecomputeParams(); } + - PPHoughTransformBodyC::PPHoughTransformBodyC(Point2dC nRes,RealT fp,RealT angRange,RealT maxPTime,bool xUseSobol,RealT nsFract,bool nfullDir) + + // Deprecated constructor + + PPHoughTransformBodyC::PPHoughTransformBodyC(Point2dC Res,RealT fp,RealT AngRange,RealT MaxPTime,bool UseSobol,RealT dummy,bool FullDir) : useMagSort(false), cWidth(3), maxGap(6), @@ -58,78 +122,31 @@ gradEstNeigh(6), p(600), // Just an estimate.... falsep(fp), // 0.9999999 - maxTime(maxPTime), // For ever ! + maxTime(MaxPTime), // For ever ! doSHT(false), - res(nRes), feedBack(false), cachv(-2), cachr(-2), - useSobol(xUseSobol), - sFract(nsFract), - fullDir(nfullDir) + useSobol(UseSobol), + fullDir(FullDir), + firstTime(true) { - IntT arrSize; - if(!fullDir) { - arrSize = (IntT) ((RavlConstN::pi/2)/ res[0]); - radsPerBin = (RavlConstN::pi/2) / ((RealT) arrSize); // Allow for rounding. - ONDEBUG(cerr << "Using half dir. Bins:" << arrSize << " \n"); - } else { - arrSize = (IntT) ((RavlConstN::pi)/ res[0]); - radsPerBin = RavlConstN::pi / ((RealT) arrSize); // Allow for rounding. - ONDEBUG(cerr << "Using full dir. Bins:" << arrSize << " \n"); - } - accumArrSize = arrSize; - accum = Array2dC<IntT>(IndexRangeC(-arrSize,arrSize), - IndexRangeC(-512,512)); - + RealT factor = fullDir ? pi : pi/2.0; + arrSize = (IntT) (factor / Res[0]); + radsPerBin = factor / ((RealT) arrSize); // Allow for rounding. angleCount = Array1dC<IntT>(IndexRangeC(-arrSize,arrSize)); + angRange = ((AngRange / 360) * pi ) / radsPerBin; - AngRange = ((angRange / 360) * RavlConstN::pi ) / radsPerBin; - - Precompute(); + ONDEBUG(cerr << "Using " << (fullDir ? "full" : "half") << " dir. Bins:" << arrSize << " \n"); } - // Copy constructor. - PPHoughTransformBodyC::PPHoughTransformBodyC(const PPHoughTransformBodyC &oth) - : useMagSort(oth.useMagSort), - cWidth(oth.cWidth), - maxGap(oth.maxGap), - minLength(oth.minLength), - dynthresh(oth.dynthresh), - gradEstNeigh(oth.gradEstNeigh), - p(oth.p), - falsep(oth.falsep), - AngRange(oth.AngRange), - maxTime(oth.maxTime), - doSHT(oth.doSHT), - res(oth.res), - accum(oth.accum.Rectangle()), - angleCount(oth.angleCount.Range()), - tCos(oth.tCos), - tSin(oth.tSin), - usedMap(oth.usedMap.Rectangle()), - pixMap(oth.pixMap.Rectangle()), - sobelImg(oth.sobelImg), - cachv(-2), - cachr(-2), - accumArrSize(oth.accumArrSize), - useSobol(oth.useSobol), - sFract(1), - fullDir(oth.fullDir), - radsPerBin(oth.radsPerBin), - threshTab(oth.threshTab) - { - //cerr << "PPHoughTransformBodyC::PPHoughTransformBodyC() Copied. \n"; - Precompute(); - } - ////////////////////////////// // Vote for a pixel. inline bool PPHoughTransformBodyC::Vote(Index2dC pix,Point2dC &peak,IntT &thresh) - { return Vote(pix,peak,gradimg[pix],AngRange,thresh); } + { return Vote(pix,peak,gradimg[pix],angRange,thresh); } //////////////////////////////////////// @@ -137,7 +154,7 @@ inline bool PPHoughTransformBodyC::UnVote(Index2dC pix) - { return UnVote(pix,gradimg[pix],AngRange); } + { return UnVote(pix,gradimg[pix],angRange); } //: Calculate threshold for accumulator. @@ -318,7 +335,7 @@ AngleC within(lineAngle,dim_the); for(It.First();It.IsElm();It.Next()) { if(inimg[It.Data()] == 0 || - (fabs(within.Diff(AngleC(gradimg[It.Data()],dim_the))) > AngRange) + (fabs(within.Diff(AngleC(gradimg[It.Data()],dim_the))) > angRange) ) { //cout << (int) gradimg[It.Data()] << " " << lineAngle << " Diff:" << within.Diff(AngleC(gradimg[It.Data()]-1,254)) << " Lim:" << AngRange << endl; if(pnts == It) { @@ -550,7 +567,7 @@ RealT n = votes; #else RealT nbins = 500 * accum.Range1().Size(); - RealT n = votes * AngRange; + RealT n = votes * angRange; #endif RealT prob = 1/ (RealT) nbins; //cerr << "Prob:" << prob << " Nbins:" << nbins << "\n"; @@ -580,10 +597,7 @@ #if 0 void PPHoughTransformBodyC::SaveAccum(StringC filename) { - ImageRectangleC ir(accum.Range1().Min(), - accum.Range1().Max(), - accum.Range2().Min(), - accum.Range2().Max()); + ImageRectangleC ir(accum.Rectangle()); ImageC<ByteT> out(ir); IndexC at1,at2; for(at1 = accum.Range1().Min();at1 < accum.Range1().Max();at1++) { @@ -602,13 +616,11 @@ //: Pre compute sin and cos tables. void PPHoughTransformBodyC::Precompute() { - const IntT mina = MinAccAngle(); - const IntT maxa = MaxAccAngle(); - //cerr << "Min: " << mina << " Max:" << maxa <"\n"; - tCos = Array1dC<RealT>(IndexRangeC(mina,maxa)); - tSin = Array1dC<RealT>(IndexRangeC(mina,maxa)); + if (!firstTime) return; + tCos = Array1dC<RealT>(accum.Range1()); + tSin = Array1dC<RealT>(accum.Range1()); - for (IntT k=mina; k < maxa; k++) { + for (IndexC k=tCos.IMin(); k <= tCos.IMax(); k++) { RealT theta = (RealT) k * radsPerBin; tCos[k] = cos(theta); tSin[k] = sin(theta); @@ -621,6 +633,7 @@ threshTab[i] = CalcThresh((i+1) << 3); //cerr << ((i+1) << 3) << " " << threshTab[i] << "\n"; } + firstTime = false; } #define ARRSOBEL 0 @@ -673,9 +686,8 @@ // Sort out accumulator. IntT maxVal = ((IntT) Sqrt(Sqr(rect.Rows()) + Sqr(rect.Cols()))) + 1; - accum = Array2dC<IntT>(IndexRangeC(-accumArrSize,accumArrSize), - IndexRangeC(-maxVal,maxVal)); - // cerr << "Accumulator size: " << maxVal << "\n"; + accum = Array2dC<IntT>(-arrSize, arrSize, -maxVal, maxVal); + // cerr << "Accumulator size: " << arrSize << " " << maxVal << "\n"; } if(useSobol) { @@ -698,13 +710,13 @@ // Calculates gradients, shift and scale so's to be 0 to dim_the. RealT ev = it.Data().Direction(); ev *= -1; - //ev += RavlConstN::pi_2; + //ev += pi_2; // Normalise the angle. if(!fullDir) { - while(ev > (RavlConstN::pi_2)) - ev -= (RavlConstN::pi); - while(ev < (-RavlConstN::pi_2)) - ev += (RavlConstN::pi); + while(ev > pi_2) + ev -= (pi); + while(ev < -pi_2) + ev += pi; } gradimg[at] = ev / radsPerBin; pixMap[at] = 1; @@ -724,9 +736,11 @@ PCPixMappingC<Curve2dLineSegmentC> PPHoughTransformBodyC::Apply(const DListC<EdgelC > &dat) { //cerr << "PPHoughTransformBodyC::Apply(), called " << ((void *) this) << "\n"; DeadLineTimerC dlt(maxTime,false); // Virtual timer. - + CollectionC<Index2dC> bag = SetupApply(dat); - + Precompute(); + //cout << radsPerBin<<" "<<arrSize<<" "<<angleCount<<" "<<angRange<<endl; + if(doSHT) return SHT(dat); @@ -754,7 +768,7 @@ DListC<EdgelC > sortIt(dat); //cerr << "Using sorted edgles \n"; for(DLIterC<EdgelC> it(sortIt);s < stopat && it.IsElm() && !dlt.IsTimeUp();it.Next(),s++) { - //cerr << "Using sorted edgles " << it.Data().Magnitude() << " \n"; + //cerr << "Using sorted edgels " << it.Data().Magnitude() << " \n"; PPHTStep(it.Data().At()); } } else { Modified: main/Ravl/Image/Processing/Lines/PPHT.hh =================================================================== --- main/Ravl/Image/Processing/Lines/PPHT.hh 2011-04-20 12:44:42 UTC (rev 8031) +++ main/Ravl/Image/Processing/Lines/PPHT.hh 2011-04-20 15:25:12 UTC (rev 8032) @@ -38,13 +38,60 @@ : public RCBodyVC { public: - PPHoughTransformBodyC(Point2dC nRes = Point2dC(0.01,1),RealT fp = 0.999999,RealT angRange = 90, - RealT maxPTime = -1,bool useSobol = false,RealT nsFract = 1, - bool fullDir = false); - // Construct new do-da. + + //:---- + //: Constructors + + PPHoughTransformBodyC(); + //: Default constructor + // Parameters have default values as denoted in <code>Setxxx()</code> methods below + + PPHoughTransformBodyC(bool Directed, RealT AngleRes, RealT AngRange, + bool UseSobol, RealT MaxPTime, RealT FalsePos); + //: Constructor + + PPHoughTransformBodyC(Point2dC nRes, RealT fp, RealT angRange, + RealT maxPTime, bool useSobol, RealT dummy, + bool fullDir); + //: Deprecated constructor + //!deprecated: some arguments make no sense + + //:---- + //: Resetting default parameters + + void SetDirectedLines(bool Directed) + { fullDir = Directed; RecomputeParams(); } + //: Set range of orientations for lines + // true: range is 360° (i.e. lines have a notional head and tail)<br> + // false: range is 180° (the default) + + void SetAngleResolution(RealT AngleRes) + { radsPerBin = AngleRes; RecomputeParams(); } + //: Set angular bin size of Hough transform (in radians) + // Default: 0.01 rads + + void SetEdgelAngleRange(RealT AngRange) + { edgelAngRange = AngRange; RecomputeParams(); } + //: Set range of orientations relative to line that edgels can have + // Default: π/2 + + void UseSobol(bool Use) + { useSobol = Use; } + //: Use Sobol sampling + // Default: false + + void SetMaxTime(RealT Secs) + { maxTime = Secs; } + //: Set maximum processing time (in seconds) + // -ve values denote no limit (the default) + + void SetFalsePostiveTrheshold(RealT Threshold) + { falsep = 1.0-Threshold; } + //: Set threshold for false +ves + // Default: 10<sup>-6</sup> - PPHoughTransformBodyC(const PPHoughTransformBodyC &oth); - //: Copy constructor. + + //:---- bool PPHTStep(Index2dC pix); //: Do a single PPHT cycle starting from a pixel. @@ -78,7 +125,7 @@ void SetFalseP(RealT fpth) { falsep = fpth; } //: Set false positive thres. - void SetAngleRange(IntT range) { AngRange = range; } + void SetAngleRange(IntT range) { angRange = range; } //: 0-255. 0-90 degrees. IntT CalcThresh(IntT votes); @@ -117,12 +164,6 @@ virtual RCBodyVC &Copy() const; //: Creat a copy of this object. - void SetMaxTime(RealT atime) { maxTime = atime; } - //: Set maxium time to run. -1 = Infinite. - - void SetSFract(RealT fract) { sFract = fract; } - //: Set maxium time to run. -1 = Infinite. - void SetEarlyOut(const DPOPortC<Curve2dLineSegmentC> &to) { earlyOut = to; } //: Set early output of lines. @@ -139,8 +180,11 @@ protected: + void RecomputeParams(); + // Recompute initial parameters + CollectionC<Index2dC> SetupApply(const DListC<EdgelC > &dat); - //: Setup everthing ready for procesing. + //: Setup everthing ready for processing. IntT FilterPoints( ImageC<ByteT> &inimg,PCPixelListC &pnts); // Filter out points that are already used. @@ -189,6 +233,7 @@ //: Pre compute sin and cos tables. //: and thresholds. + private: bool useMagSort; RealT cWidth; // Corridor width. IntT maxGap; @@ -199,11 +244,11 @@ IntT gradEstNeigh; // Gradient estimation neighberhood size. IntT p; RealT falsep; - RealT AngRange; // Range of angles to consider. + RealT edgelAngRange; // Range of edgel angles to consider. + RealT angRange; // derived from edgelAngRange RealT maxTime; // Maximum time to take in line extraction. bool doSHT; - private: - Point2dC res; + IntT arrSize; Array2dC<IntT> accum; // Accumulator. Array1dC<IntT> angleCount; // Number of votes in each column. Array1dC<RealT> tCos; // Cos. @@ -220,12 +265,11 @@ int total; // Total pixels in current input. IntT cachv; IntT cachr; - IntT accumArrSize; bool useSobol; // Use sobol sampling. - RealT sFract; bool fullDir; // Use full direction, not gradient. DPOPortC<Curve2dLineSegmentC> earlyOut; // Anyone want line segments early ? RealT radsPerBin; // Radians per bin. r/nb + bool firstTime; // flag for precomputing trig funcs etc. only once SArray1dC<IntT> threshTab; }; @@ -241,40 +285,89 @@ //! userlevel=Normal //: Progressive Probablistic Hough Transform. - // This algorithm extracts line segments from a set of edges. + + // <p>This algorithm extracts line segments from a set of edges, using the + // algorithm described in <a href= + // "http://www.sciencedirect.com/science/journal/10773142"> "Robust Detection + // of Lines Using the Progressive Probabilistic Hough Transform", CVIU v.78-1, April 2000, + // 119-137, J. Matas, C. Galambos, J. Kittler</a>.</p> + + // <p><b>N.B.:</b> In this algorithm, the accuracy of the line parameters is not limited by the resolution parameters (unlike a conventional Hough transform); instead these parameters determine how similar two lines can be and still be resolved.</p> class PPHoughTransformC : public RCHandleC<PPHoughTransformBodyC> { public: + + //:---- + //: Constructors + PPHoughTransformC() + : RCHandleC<PPHoughTransformBodyC>(*new PPHoughTransformBodyC()) {} //: Default constructor. + // Generates non-directed lines; otherwise default parameter values are as listed in the following constructor - PPHoughTransformC(Point2dC nRes,RealT fp = 0.999999,RealT angRange = 90,RealT maxPTime = -1,bool useSobol = false,RealT sFract = 1,bool fullDir = false) - : RCHandleC<PPHoughTransformBodyC>(*new PPHoughTransformBodyC(nRes,fp,angRange,maxPTime,useSobol,sFract,fullDir)) + PPHoughTransformC(bool Directed, RealT AngleRes=0.01,RealT AngRange=RavlConstN::pi/2.0, + bool UseSobol=false, RealT MaxPTime=-1, RealT FalsePos=1.0e-6) + : RCHandleC<PPHoughTransformBodyC>(*new PPHoughTransformBodyC(Directed,AngleRes,AngRange,UseSobol,MaxPTime,FalsePos)) {} - //: Constructor. + //: Constructor + //!param: Directed - true: Directed lines are created (i.e. lines have a notional head and tail, and orientation can be in full is 360° range).<br> false: Undirected lines are created (i.e. orientation is ambiguous modulo 180°). + //!param: AngleRes - Hough resolution in angular direction (in radians) + //!param: AngRange - Range of orientations relative to line that edgels can have (in radians). + //!param: UseSobol - Use Sobol sampling. + //!param: MaxPTime - Stop processing after maxPTime seconds (-1 denotes no bound on time) + //!param: Fp - False +ve threshold. + + //:---- + //: Resetting default and/or constructor parameters + + void SetDirectedLines(bool Directed) + { Body().SetDirectedLines(Directed); } + //: Set range of orientations for lines + // true: Directed lines are created (i.e. lines have a notional head and tail, and orientation can be in full is 360° range).<br> + // false (the default): Undirected lines are created (i.e. orientation is ambiguous modulo 180°) + + void SetAngleResolution(RealT AngleRes) + { Body().SetAngleResolution(AngleRes); } + //: Set Hough resolution in angular direction (in radians) + // Default: 0.01 rads + + void SetEdgelAngleRange(RealT AngRange) + { Body().SetEdgelAngleRange(AngRange); } + //: Set range of orientations relative to line that edgels can have (in radians) + // Default: π/2 + + void UseSobol(bool Use) + { Body().UseSobol(Use); } + //: Use Sobol sampling + // Default: false + + void SetMaxTime(RealT Secs) + { Body().SetMaxTime(Secs); } + //: Set maximum processing time (in seconds) + // -ve values denote no limit (the default) + + void SetFalsePostiveTrheshold(RealT Threshold) + { Body().SetFalsePostiveTrheshold(Threshold); } + //: Set threshold for false +ves + // Default: 10<sup>-6</sup> - protected: - - PPHoughTransformBodyC &Body() - { return RCHandleC<PPHoughTransformBodyC>::Body(); } - //: Access body. - - const PPHoughTransformBodyC &Body() const - { return RCHandleC<PPHoughTransformBodyC>::Body(); } - //: Access body. - - public: + //:---- + //: Applying the transform + PCPixMappingC<Curve2dLineSegmentC> Apply(const DListC<EdgelC > &dat) { return Body().Apply(dat); } - //: Do a hough transform. + //: Perform a probabilistic Hough transform. PCPixMappingC<Curve2dLineSegmentC> SHT(const DListC<EdgelC > &dat) { return Body().SHT(dat); } - //: Perform a Standard Hough Transform. + //: Perform a standard Hough Transform. + + //:---- + //: Other parameter setting void SetCorridor(RealT width) { Body().SetCorridor(width); } @@ -296,6 +389,25 @@ { Body().SetDoSHT(sht); } //: Do sht instread + protected: + + PPHoughTransformBodyC &Body() + { return RCHandleC<PPHoughTransformBodyC>::Body(); } + //: Access body. + + const PPHoughTransformBodyC &Body() const + { return RCHandleC<PPHoughTransformBodyC>::Body(); } + //: Access body. + + public: + + PPHoughTransformC(Point2dC Res,RealT Fp = 0.999999,RealT AngRange = 90,RealT MaxPTime = -1,bool UseSobol = false,RealT dummy = 1,bool FullDir = false) + : RCHandleC<PPHoughTransformBodyC>(*new PPHoughTransformBodyC(Res,Fp,AngRange,MaxPTime,UseSobol,dummy,FullDir)) + {} + //: Constructor. + //!deprecated: some arguments make no sense + + }; } Modified: main/Ravl/Image/Processing/Lines/testLineDet.cc =================================================================== --- main/Ravl/Image/Processing/Lines/testLineDet.cc 2011-04-20 12:44:42 UTC (rev 8031) +++ main/Ravl/Image/Processing/Lines/testLineDet.cc 2011-04-20 15:25:12 UTC (rev 8032) @@ -9,11 +9,20 @@ //! file="Ravl/Image/Processing/Lines/testLineDet.cc" #include "Ravl/Image/PPHT.hh" +#include "Ravl/Polygon2d.hh" +#include "Ravl/Image/DrawPolygon.hh" +#include "Ravl/Image/EdgeDetector.hh" +#include "Ravl/IO.hh" +#include "Ravl/CDLIter.hh" +#include "Ravl/Angle.hh" using namespace RavlImageN; +using namespace RavlConstN; int testLineSegment(); +int testPPHT(); + int main(int nargs,char **argv) { int ln; if((ln = testLineSegment()) != 0) { @@ -21,6 +30,11 @@ return 1; } + if((ln = testPPHT()) != 0) { + cerr << "test failed on line " << ln << "\n"; + return 1; + } + return 0; } @@ -39,3 +53,73 @@ if(aline.EndPnt().SqrEuclidDistance(points[points.Size()-1]) > 0.0001) return __LINE__; return 0; } + + +#define ANGDIFF(x,y,j) Abs(AngleC(x.Angle(), (j?2.0:1.0)*pi).Diff(AngleC(y.Angle(), (j?2.0:1.0)*pi))) + +int testPPHT() { + + // create image containing solid irregular polygon + ImageC<RealT> img(100,100); + img.Fill(0.0); + DListC<Point2dC> pts; + ((((((pts += Point2dC(20,20)) += Point2dC(30,30)) += Point2dC(20,50)) + += Point2dC(40,60)) += Point2dC(70,40)) += Point2dC(55,15)); + Polygon2dC poly(pts); + DrawPolygon(img, 255.0, poly, true); + Save("tmp.ppm", img); + // create set of line segments for polygon + SArray1dC<LinePP2dC> polyLines(pts.Size()); + IntT i=0; + for (ConstDLIterC<Point2dC> p(pts); p; ++p) { + polyLines[i++] = LinePP2dC(*p, p.NextCrcData()); + } + //cerr << polyLines; + + // find edges using PPHT + EdgeDetectorC edgeDet(true); + DListC<EdgelC> inList = edgeDet.LApply(img); + for (RealT a=0.001; a<0.5; a*=10) for (IntT j=0; j<=1; ++j) { + PPHoughTransformC pphtProc; + pphtProc.SetDirectedLines((bool)j); + pphtProc.SetAngleResolution(a); + PCPixMappingC<Curve2dLineSegmentC> ht = pphtProc.Apply(inList); + if (ht.Size() != pts.Size()) return __LINE__; + + // find match between PPHT lines and polylines + DListC<LinePP2dC> lines; + for (DLIterC<PCPixMapC<Curve2dLineSegmentC> > it(ht);it;it++) { + LinePP2dC line(it->Curve().StartPnt(),it->Curve().EndPnt()); + //cerr << line << endl; + bool found(false); + for (IntT i=0; i<polyLines.Size(); ++i) { + if ((ANGDIFF(polyLines[i],line,j) < 0.04) && + (polyLines[i].Distance(line.MidPoint()) < 1.0) && + (Abs(polyLines[i].Length() - line.Length()) < 4.0)) { + found = true; + /* + cerr << "Found match for hough line " << line << " with polygon line\n" + << "a = " << a << "; j = " << j + << "\n "<<ANGDIFF(polyLines[i],line,j) <<", " + << polyLines[i].Distance(line.MidPoint()) <<", " + << polyLines[i].Length() <<" " << line.Length() << endl; + */ + break; + } + } + if (!found) { + cerr << "Could not match hough line " << line << " with polygon lines\n" + << "a = " << a << "; j = " << j << endl; + for (IntT i=0; i<polyLines.Size(); ++i) { + cout << " "<<ANGDIFF(polyLines[i],line,j) <<", " + << polyLines[i].Distance(line.MidPoint()) <<", " + << polyLines[i].Length() <<" " << line.Length() << endl; + } + return __LINE__; + } + } + } + + return 0; +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-20 12:44:49
|
Revision: 8031 http://ravl.svn.sourceforge.net/ravl/?rev=8031&view=rev Author: ees1wc Date: 2011-04-20 12:44:42 +0000 (Wed, 20 Apr 2011) Log Message: ----------- Doc update Modified Paths: -------------- main/Ravl/QMake/Ravl.QMake.Defs.html Modified: main/Ravl/QMake/Ravl.QMake.Defs.html =================================================================== --- main/Ravl/QMake/Ravl.QMake.Defs.html 2011-04-13 16:13:49 UTC (rev 8030) +++ main/Ravl/QMake/Ravl.QMake.Defs.html 2011-04-20 12:44:42 UTC (rev 8031) @@ -428,7 +428,7 @@ </P> <UL> -<LI><DT><A NAME="EXAMPLES"></A><B>EXAMPLES</B></DT> <DD>Contains the names of +<LI><DT><A NAME="EXAMPLES"></A><B>EXAMPLES</B></DT> <DD> Contains the names of source files demonstrating the use of the software in the directory. They are copied into the documentation area. The example sources must be compilable; to check compilation, include them temporarily in the "MAINS" list, e.g.: @@ -438,7 +438,7 @@ </DD><P> <LI><DT><A NAME="TESTEXES"></A><B>TESTEXES</B></DT> -<DD>The list of executables testing runtime consistency of the software. They +<DD> The list of executables testing runtime consistency of the software. They are compiled and run to test if they produce expected results. The executables should return 0 on success, non-zero on failure. If the program doesn't exit normally it will be treated as a failure. Both stdout and stderr of the program are @@ -457,29 +457,28 @@ <UL> <LI><DT><A NAME="AUXFILES"></A><B>AUXFILES, AUXDIR</B></DT> -<DD>Use these for data files that need to end up somewhere where your program +<DD> Use these for data files that need to end up somewhere where your program will always find them. All files listed in AUXFILES are installed in $PROJECT_OUT/$AUXDIR. If AUXDIR is not used, the files are installed in $PROJECT_OUT. Thus:<PRE> AUXFILES = mask.png -AUXDIR = share/data +AUXDIR = share/myproject </PRE> will install the file mask.png in the directory $PROJECT_OUT/share/data. Any necessary subdirectories are automatically created. The file <code>mask.png</code> can then be accessed e.g.: -<pre>#include <cstdlib> -..... -StringC maskName = StringC(getenv("PROJECT_OUT"))+"/share/data/mask.png";</pre> +<pre>StringC maskName = PROJECT_OUT "/share/myproject/mask.png";</pre> +The <code>PROJECT_OUT</code> symbol is a macro defined by QMake that is resolved into a quoted string denoting the relevant $PROJECT_OUT environment value. If the code is subsequently built into the RAVL installation, the <code>PROJECT_OUT</code> macro is automatically redefined accordingly. </DD> </UL> <UL> <LI><DT><A NAME="PREBUILDSTEP"></A><B>PREBUILDSTEP</B></DT> -<DD> Command to execute before compiling libraries or executables. This should in bourn shell script. Make macro's like $(PROJECT_OUT) for the output directory may be used. +<DD> Command to execute before compiling libraries or executables. This should be in Bourne shell script. QMake macros like $(PROJECT_OUT) for the output directory may be used. </DD> </UL> <UL> <LI><DT><A NAME="POSTBUILDSTEP"></A><B>POSTBUILDSTEP</B></DT> -<DD> Command to execute before compiling libraries and executables. This should in bourn shell script. Make macro's like $(PROJECT_OUT) for the output directory may be used. +<DD> Command to execute before compiling libraries and executables. This should be in Bourne shell script. QMake macros like $(PROJECT_OUT) for the output directory may be used. </DD> </UL> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-13 16:14:00
|
Revision: 8030 http://ravl.svn.sourceforge.net/ravl/?rev=8030&view=rev Author: craftit Date: 2011-04-13 16:13:49 +0000 (Wed, 13 Apr 2011) Log Message: ----------- Fixes/hacks to improve xml handling. Modified Paths: -------------- main/Ravl/Core/System/XMLStream.cc main/Ravl/Core/System/XMLTree.cc Modified: main/Ravl/Core/System/XMLStream.cc =================================================================== --- main/Ravl/Core/System/XMLStream.cc 2011-04-11 14:04:09 UTC (rev 8029) +++ main/Ravl/Core/System/XMLStream.cc 2011-04-13 16:13:49 UTC (rev 8030) @@ -72,6 +72,7 @@ StringC XMLBaseC::EncodeLitteral(const StringC &str) { StringC ret(str.Copy()); + // FIXME:- Encode efficiently. ret.gsub("&","&"); // Has to go first!! ret.gsub("\"","""); // Needed for quoted text //ret.gsub("#","#"); @@ -89,6 +90,7 @@ StringC XMLBaseC::DecodeLitteral(const StringC &str) { StringC ret(str.Copy()); + // FIXME:- Decode efficently ret.gsub("&","&"); // Has to go first!! ret.gsub(""","\""); // Needed for quoted text ret.gsub("%","%"); // Needed for quoted text @@ -96,6 +98,8 @@ ret.gsub("!","!"); ret.gsub("<","<"); // Needed. ret.gsub(">",">"); + ret.gsub(" ","\n"); + ret.gsub(" ","\r"); return ret; } Modified: main/Ravl/Core/System/XMLTree.cc =================================================================== --- main/Ravl/Core/System/XMLTree.cc 2011-04-11 14:04:09 UTC (rev 8029) +++ main/Ravl/Core/System/XMLTree.cc 2011-04-13 16:13:49 UTC (rev 8030) @@ -234,9 +234,11 @@ StringC content; in >> content; - content = content.TopAndTail(); + // FIXME:- Horrible hack! + // Only store non-whitespace content. + StringC actualContent = content.TopAndTail(); - if(!content.IsEmpty()) { + if(!actualContent.IsEmpty()) { XMLTreeC cn(xmlContentKey); cn.Data()[xmlContentAttrib] = content; Add(xmlContentKey,cn); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-11 14:04:15
|
Revision: 8029 http://ravl.svn.sourceforge.net/ravl/?rev=8029&view=rev Author: ees1wc Date: 2011-04-11 14:04:09 +0000 (Mon, 11 Apr 2011) Log Message: ----------- doc typo Modified Paths: -------------- main/Ravl/OS/Time/DeadLineTimer.hh Modified: main/Ravl/OS/Time/DeadLineTimer.hh =================================================================== --- main/Ravl/OS/Time/DeadLineTimer.hh 2011-04-07 15:11:26 UTC (rev 8028) +++ main/Ravl/OS/Time/DeadLineTimer.hh 2011-04-11 14:04:09 UTC (rev 8029) @@ -57,7 +57,7 @@ id(-1) { Reset(timetoGo); } //: Constructor for a relative (to now) time. - // Dead line will expire in 'timetoGo' seonds. + // Deadline will expire in 'timetoGo' seconds. // void Stop(); //: Stop timer. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-07 15:11:33
|
Revision: 8028 http://ravl.svn.sourceforge.net/ravl/?rev=8028&view=rev Author: craftit Date: 2011-04-07 15:11:26 +0000 (Thu, 07 Apr 2011) Log Message: ----------- Turn off debug. Modified Paths: -------------- main/Ravl/Core/System/XMLTree.cc Modified: main/Ravl/Core/System/XMLTree.cc =================================================================== --- main/Ravl/Core/System/XMLTree.cc 2011-04-07 13:53:05 UTC (rev 8027) +++ main/Ravl/Core/System/XMLTree.cc 2011-04-07 15:11:26 UTC (rev 8028) @@ -15,7 +15,7 @@ #include "Ravl/Resource.hh" #include <stdlib.h> -#define DODEBUG 1 +#define DODEBUG 0 #if DODEBUG #define ONDEBUG(x) x This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-07 13:53:11
|
Revision: 8027 http://ravl.svn.sourceforge.net/ravl/?rev=8027&view=rev Author: craftit Date: 2011-04-07 13:53:05 +0000 (Thu, 07 Apr 2011) Log Message: ----------- Fix false positive on recursive include detection. Modified Paths: -------------- main/Ravl/Core/System/XMLTree.cc Modified: main/Ravl/Core/System/XMLTree.cc =================================================================== --- main/Ravl/Core/System/XMLTree.cc 2011-04-05 16:07:53 UTC (rev 8026) +++ main/Ravl/Core/System/XMLTree.cc 2011-04-07 13:53:05 UTC (rev 8027) @@ -15,7 +15,7 @@ #include "Ravl/Resource.hh" #include <stdlib.h> -#define DODEBUG 0 +#define DODEBUG 1 #if DODEBUG #define ONDEBUG(x) x @@ -367,10 +367,14 @@ // Look in the directory of the current file first, Unless we've been given an absolute path. IStreamC newIStream; if(!loader->OpenFile(xi_href,parentFilename,newIStream)) { + ONDEBUG(std::cerr << "Load of include file failed, falling back. "); + if(!ProcessIncludeFallback(subtree,doneFiles,parentFilename,loader)) { RavlIssueWarning(StringC("Failed to open file='" + xi_href +"' from '" + parentFilename + "' ")); + doneFiles -= xi_href; return false; } + doneFiles -= xi_href; return true; } XMLIStreamC newStream(newIStream); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-05 16:08:05
|
Revision: 8026 http://ravl.svn.sourceforge.net/ravl/?rev=8026&view=rev Author: ees1wc Date: 2011-04-05 16:07:53 +0000 (Tue, 05 Apr 2011) Log Message: ----------- Added missing arg to constructor Modified Paths: -------------- main/Ravl/Core/Container/SArray/exSArr1.cc Modified: main/Ravl/Core/Container/SArray/exSArr1.cc =================================================================== --- main/Ravl/Core/Container/SArray/exSArr1.cc 2011-04-05 15:55:11 UTC (rev 8025) +++ main/Ravl/Core/Container/SArray/exSArr1.cc 2011-04-05 16:07:53 UTC (rev 8026) @@ -23,7 +23,7 @@ << "==================================\n"; char oString[] = "Hello world "; // 12 characters - SArray1dC<char> stringA(oString,12); //create the 1. array + SArray1dC<char> stringA(oString, 12, false); //create the 1. array SArray1dC<char> stringB(stringA); //another access to the 1. array stringA[3] = '3'; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-05 15:55:18
|
Revision: 8025 http://ravl.svn.sourceforge.net/ravl/?rev=8025&view=rev Author: ees1wc Date: 2011-04-05 15:55:11 +0000 (Tue, 05 Apr 2011) Log Message: ----------- Updated defs.mk because I forgot to when I moved container things Modified Paths: -------------- main/Ravl/Core/Container/Misc/defs.mk main/Ravl/Core/System/defs.mk Modified: main/Ravl/Core/Container/Misc/defs.mk =================================================================== --- main/Ravl/Core/Container/Misc/defs.mk 2011-04-05 15:44:45 UTC (rev 8024) +++ main/Ravl/Core/Container/Misc/defs.mk 2011-04-05 15:55:11 UTC (rev 8025) @@ -12,7 +12,8 @@ HEADERS=Stack.hh StackIter.hh Tuple2.hh Tuple3.hh Tuple4.hh \ BlkStack.hh BlkStackIter.hh \ - BinTable.hh BinIter.hh BinList.hh + BinTable.hh BinIter.hh BinList.hh \ + Collection.hh CollectionIter.hh SOURCES=Stack.cc Modified: main/Ravl/Core/System/defs.mk =================================================================== --- main/Ravl/Core/System/defs.mk 2011-04-05 15:44:45 UTC (rev 8024) +++ main/Ravl/Core/System/defs.mk 2011-04-05 15:55:11 UTC (rev 8025) @@ -11,7 +11,7 @@ HEADERS=StringList.hh Option.hh TypeName.hh BufStream.hh \ SubStringList.hh XMLStream.hh XMLTree.hh \ - Collection.hh CollectionIter.hh IO.hh BufferSTLVector.hh \ + IO.hh BufferSTLVector.hh \ DArray1d.hh DArray1dIter.hh DArray1dIter2.hh DArray1dIter3.hh DArray1dIter4.hh DArray1dIter5.hh \ VirtualConstructor.hh FunctionRegister.hh IndexNd.hh Cache.hh \ DListExtra.hh VariableLengthCode.hh IndexRange2dSet.hh Base64.hh \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-05 15:44:53
|
Revision: 8024 http://ravl.svn.sourceforge.net/ravl/?rev=8024&view=rev Author: ees1wc Date: 2011-04-05 15:44:45 +0000 (Tue, 05 Apr 2011) Log Message: ----------- Moved CollectionC & iterator into Containers Added Paths: ----------- main/Ravl/Core/Container/Misc/Collection.hh main/Ravl/Core/Container/Misc/CollectionIter.hh Removed Paths: ------------- main/Ravl/Core/System/Collection.hh main/Ravl/Core/System/CollectionIter.hh Copied: main/Ravl/Core/Container/Misc/Collection.hh (from rev 8023, main/Ravl/Core/System/Collection.hh) =================================================================== --- main/Ravl/Core/Container/Misc/Collection.hh (rev 0) +++ main/Ravl/Core/Container/Misc/Collection.hh 2011-04-05 15:44:45 UTC (rev 8024) @@ -0,0 +1,684 @@ +// This file is part of RAVL, Recognition And Vision Library +// Copyright (C) 2001, University of Surrey +// This code may be redistributed under the terms of the GNU Lesser +// General Public License (LGPL). See the lgpl.licence file for details or +// see http://www.gnu.org/copyleft/lesser.html +// file-header-ends-here +#ifndef RAVL_COLLECTION_HEADER +#define RAVL_COLLECTION_HEADER 1 +////////////////////////////////////////////////////// +//! rcsid=$Id$ +//! docentry="Ravl.API.Core.Misc" +//! author="Charles Galambos" +//! lib=RavlCore +//! file="Ravl/Core/System/Collection.hh" + +#include "Ravl/SArray1d.hh" +#include "Ravl/Random.hh" +#include "Ravl/RefCounter.hh" +#include "Ravl/BinStream.hh" + +namespace RavlN { + + template<class DataT> class CollectionC; + template<class DataT> class CollectionIterC; + template<class DataT> class DListC; + template<class DataT> class DLIterC; + + //! userlevel=Develop + //: Collection of data. + + template<class DataT> + class CollectionBodyC + : public RCBodyC + { + public: + CollectionBodyC(SizeT maxSize = 10,SizeT used = 0) + : data(maxSize+1), + n(used) + {} + //: Create an empty collection. + // maxSize should be set to maximum number of + // elements the collection will contain. 'used' is the number + // of elements to be in the collection at the time of creation. + + CollectionBodyC(const DListC<DataT> &list); + //: Construct collection from a list. + + CollectionBodyC(const SArray1dC<DataT> &dat) + : data(dat), + n(dat.Size()) + {} + //: Create a collection from an array of data. + + CollectionBodyC(const SArray1dC<DataT> &dat,UIntT used) + : data(dat), + n(used) + { RavlAssert(used <= data.Size()); } + //: Create a collection from an array of data, including 'used' elements. + + CollectionC<DataT> Copy() const; + //: Create a copy of this collection. + + inline + UIntT Insert(const DataT &dat); + //: Add a data item to the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The index at which the item was placed is returned. + + UIntT Insert(const Array1dC<DataT> &dat); + //: Add an array of data items to the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The first index at which the items were placed is returned. + + inline + UIntT Append(const DataT &dat) + { return Insert(dat); } + //: Add a data item to the end of the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The index at which the item was placed is returned. + + inline UIntT Append(const Array1dC<DataT> &dat) + { return Insert(dat); } + //: Add an array of data items to the end of the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The first index at which the items were placed is returned. + + inline + UIntT InsertRandom(const DataT &dat); + //: Add a data item to the collection in a random place. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The index at which the item was placed is returned. + + inline void Delete(IndexC ind) + { data[ind] = data[--n]; } + //: Remove item at 'ind' from the collection. + // Note the last item in the collection will be moved + // to replace element at 'ind' + + inline void Remove(IndexC ind) + { data[ind] = data[--n]; } + //: Remove item at 'ind' from the collection. + // Note the last item in the collection will be moved + // to replace element at 'ind'. + // Same as Delete, added for consistancy with DArray1dC. + + DataT Pick(); + //: Pick a random item from the collection. + // the element will be removed from the set. + // It is the users responsiblity to ensure the + // set is not empty when this method is called. + // See 'IsEmpty()' + + CollectionC<DataT> Shuffle() const; + //: Create a shuffled version of this collection. + + void ShuffleIP(); + //: Shuffle collection in place. + + void Merge(const CollectionC<DataT> &x); + //: Merge collection 'x' into this one. + + void Merge(const SArray1dC<DataT> &x); + //: Merge of array 'x' into this collection. + + inline bool IsEmpty() const + { return n == 0; } + //: Test if collection is empty. + + void Empty() + { n = 0; } + //: Empty the collection of all its contents. + + SizeT Size() const + { return n; } + //: Returns the number of data elements in the collection. + + SArray1dC<DataT> Array() + { return SArray1dC<DataT>(data,n); } + //: Access data as array. + // Obsolete, use SArray1d() instread. <br> + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + + const SArray1dC<DataT> Array() const + { return SArray1dC<DataT>(data,n); } + //: Access data as array. + // Obsolete, use SArray1d() instread. <br> + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + SArray1dC<DataT> SArray1d() + { return SArray1dC<DataT>(data,n); } + //: Access data as array. + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + const SArray1dC<DataT> SArray1d() const + { return SArray1dC<DataT>(data,n); } + //: Access data as array. + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + CollectionC<DataT> Split(SizeT ne); + //: Split the collection in two + // return a random set of 'ne' elements from this one. + + CollectionC<DataT> Sample(SizeT ne) const; + //: Take a random sample from the collection. + // This collection is not modified. NOTE: Items + // may be taken more than once. + + DataT &KthHighest(UIntT k); + //: k'th highest element of a collection + // k should be between 0 and Size()-1. For the median use k = Size()/2. + // The DataT type class must have the < and > operators defined on them. <p> + // Note: This method re-orders the contents of the collection. + + DataT &operator[](IndexC ind) { + RavlAssertMsg(ind < n,"Index out of range."); + return data[ind]; + } + //: Array style access. + + const DataT &operator[](IndexC ind) const { + RavlAssertMsg(ind < n,"Index out of range."); + return data[ind]; + } + //: Array style access. + + DataT &Last() + { return data[Size()-1]; } + //: Access last element in the collection. + + const DataT &Last() const + { return data[Size()-1]; } + //: Access last element in the collection. + + DataT &First() + { return data[0]; } + //: Access first element in the collection. + + const DataT &First() const + { return data[0]; } + //: Access first element in the collection. + + protected: + SArray1dC<DataT> data; + SizeT n; + }; + + //! userlevel=Normal + //: Collection of data + // Simple extensible container, with properties similar to std::vector + + template<class DataT> + class CollectionC + : public RCHandleC<CollectionBodyC<DataT> > + { + public: + CollectionC() + {} + //: Default constructor. + // creates an invalid handle. + + CollectionC(SizeT maxSize,SizeT used = 0) + : RCHandleC<CollectionBodyC<DataT> >(*new CollectionBodyC<DataT>(maxSize,used)) + {} + //: Creat an empty collection. + // maxSize should be set to maximum number of elements the collection + // will contain. 'used' is the number of elements to be in the collection + // at the time of creation. + + CollectionC(const SArray1dC<DataT> &dat) + : RCHandleC<CollectionBodyC<DataT> >(*new CollectionBodyC<DataT>(dat)) + {} + //: Create a collection from an array of data. + + CollectionC(const DListC<DataT> &list) + : RCHandleC<CollectionBodyC<DataT> >(*new CollectionBodyC<DataT>(list)) + {} + //: Construct collection from a list. + + CollectionC<DataT> Copy() const + { return Body().Copy(); } + //: Create a copy of this collection. + + inline + UIntT Insert(const DataT &dat) + { return Body().Insert(dat); } + //: Add a data item to the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <br> + // The index at which the item was placed is returned. + + UIntT Insert(const Array1dC<DataT> &dat) + { return Body().Insert(dat); } + //: Add an array of data items to the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The first index at which the items were placed is returned. + + inline + UIntT Append(const DataT &dat) + { return Body().Append(dat); } + //: Add a data item to the end of the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The index at which the item was placed is returned. + + inline UIntT Append(const Array1dC<DataT> &dat) + { return Body().Append(dat); } + //: Add an array of data items to the end of the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. <p> + // The first index at which the items were placed is returned. + + inline + UIntT InsertRandom(const DataT &dat) + { return Body().InsertRandom(dat); } + //: Add a data item to the collection in a random place. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. + + void Delete(IndexC ind) + { Body().Delete(ind); } + //: Remove item at 'ind' from the collection. + + void operator+=(const DataT &dat) + { Body().Insert(dat); } + //: Add data item to the collection. + // NB. This may cause the storage array to + // be reallocated which will invalidate any iterators + // held on the collection. + + DataT Pick() + { return Body().Pick(); } + //: Pick a random item from the collection. + // the element will be removed from the set. + // It is the users responsiblity to ensure the + // set is not empty when this method is called. + // See 'IsEmpty()' + + CollectionC<DataT> Shuffle() const + { return Body().Shuffle(); } + //: Create a shuffled version of this collection. + + void ShuffleIP() + { Body().ShuffleIP(); } + //: Shuffle collection in place. + + void Merge(const CollectionC<DataT> &x) + { Body().Merge(x); } + //: Merge collection 'x' into this one. + + void Merge(const SArray1dC<DataT> &x) + { Body().Merge(x); } + //: Merge of array 'x' into this collection. + + inline bool IsEmpty() const + { return Body().IsEmpty(); } + //: Test if collection is empty. + + void Empty() + { Body().Empty(); } + //: Empty the collection of all its contents. + + SizeT Size() const + { return Body().Size(); } + //: Returns the number of data elements in the collection. + + SArray1dC<DataT> Array() + { return Body().Array(); } + //: Access data as array. + // Obsolete, use SArray1d() instread. <br> + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + const SArray1dC<DataT> Array() const + { return Body().Array(); } + //: Access data as array. + // Obsolete, use SArray1d() instread. <br> + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + SArray1dC<DataT> SArray1d() + { return Body().SArray1d(); } + //: Access data as array. + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + const SArray1dC<DataT> SArray1d() const + { return Body().SArray1d(); } + //: Access data as array. + // Note: The returned array is a direct access + // to the internal data structure, no operations + // that modify the collection should be performed + // while its in use. + + CollectionC<DataT> Split(SizeT ne) + { return Body().Split(ne); } + //: Split the collection in two + // return a random set of 'ne' elements from this one. + // ne must be smaller than the size of the collection. + + CollectionC<DataT> Sample(SizeT ne) const + { return Body().Sample(ne); } + //: Take a random sample from the collection. + // This collection is not modified. There is no + // garantee that an element will be picked only once. + // 'ne' may be bigger than the size of this collection. + + DataT &KthHighest(UIntT k) + { return Body().KthHighest(k); } + //: k'th highest element of a collection + // k should be between 0 and Size()-1. For the median use k = Size()/2. + // The DataT type class must have the < and > operators defined on them. + // This function will reorder the collection so that elements 0...k-1 + // are <= element k and elements k+1...Size()-1 are >= element k. + // Based on algorithm in Numerical Recipes in C, second edition. + // <p> + // Note: This method re-orders the contents of the collection. + + DataT &operator[](IndexC ind) + { return Body().operator[](ind); } + //: Array style access. + + const DataT &operator[](IndexC ind) const + { return Body().operator[](ind); } + //: Array style access. + + DataT &Last() + { return Body().Last(); } + //: Access last element in the collection. + + const DataT &Last() const + { return Body().Last(); } + //: Access last element in the collection. + + DataT &First() + { return Body().First(); } + //: Access first element in the collection. + + const DataT &First() const + { return Body().First(); } + //: Access first element in the collection. + + typedef CollectionIterC<DataT> IteratorT; + //: Type of iterator. + + protected: + CollectionBodyC<DataT> &Body() + { return RCHandleC<CollectionBodyC<DataT> >::Body(); } + //: Access body + + const CollectionBodyC<DataT> &Body() const + { return RCHandleC<CollectionBodyC<DataT> >::Body(); } + //: Access body + + }; + + + template <class DataT> + BinOStreamC & operator<<(BinOStreamC & s, const CollectionC<DataT> &col) + { + s << col.Array(); + return s; + } + + template <class DataT> + BinIStreamC & operator>>(BinIStreamC& s, CollectionC<DataT> &col) + { + SArray1dC<DataT> arr; + s >> arr; + col = CollectionC<DataT>(arr); + return s; + } + + template<class DataT> + ostream &operator<<(ostream &s,const CollectionC<DataT> &d) { + s << d.Array(); + return s; + } + + template<class DataT> + istream &operator>>(istream &s,CollectionC<DataT> &d) { + SArray1dC<DataT> ad; + s >> ad; + d = CollectionC<DataT>(ad); + return s; + } + + template<class DataT> + CollectionBodyC<DataT>::CollectionBodyC(const DListC<DataT> &list) + : data(list.Size()), + n(0) + { + DataT *at = &(data[0]); + for(DLIterC<DataT> it(list);it;it++,at++) + *at = *it; + n = data.Size(); + } + + template<class DataT> + CollectionC<DataT> CollectionBodyC<DataT>::Copy() const { + return CollectionC<DataT>(Array().Copy()); + } + + template<class DataT> + inline + UIntT CollectionBodyC<DataT>::Insert(const DataT &dat) { + if(n >= data.Size()) + data = data.Copy((UIntT) data.Size() * 2); // Double the size of the collection. + int i = n; + data[n++] = dat; + return i; + } + + template<class DataT> + UIntT CollectionBodyC<DataT>::Insert(const Array1dC<DataT> &dat) { + if( (n + dat.Size()) > data.Size() ) { + UIntT ns = (UIntT) data.Size() * 2; + while(ns < (n + dat.Size())) + ns *= 2; + data = data.Copy(ns); // Double the size of the collection. + } + int i = n; + // Copy in elements. + for(BufferAccessIter2C<DataT,DataT> it(dat,data,0,n);it;it++) + it.Data2() = it.Data1(); + n += dat.Size(); + return i; + } + + + template<class DataT> + inline + UIntT CollectionBodyC<DataT>::InsertRandom(const DataT &dat) { + if(n >= data.Size()) + data = data.Copy(data.Size() * 2); // Double the size of the collection. + SizeT p = (SizeT)((RealT) Random1() * n); + if(p > n-1) + p = n-1; // Incase of rounding errors. + data[n++] = data[p]; + data[p] = dat; + return p; + } + + template<class DataT> + DataT CollectionBodyC<DataT>::Pick() { + RavlAssert(n != 0); + SizeT i = (SizeT)((RealT) Random1() * n); + if(i >= n-1) + i = n-1; // Incase of rounding errors. + DataT ret = data[i]; + Delete(i); + return ret; + } + + template<class DataT> + void CollectionBodyC<DataT>::Merge(const CollectionC<DataT> &x) { + Merge(x.Array()); + } + + template<class DataT> + void CollectionBodyC<DataT>::Merge(const SArray1dC<DataT> &x) { + SizeT spair = data.Size() - n; + if(spair >= x.Size()) { // Is there space in existing array ? + // Copy in data. + SArray1dC<DataT> rest(data,spair,n); + for(BufferAccessIter2C<DataT,DataT> it(x,rest);it;it++) + it.Data2() = it.Data1(); + n+= x.Size(); + return ; + } + data = Array().Join(x); + n += x.Size(); + } + + template<class DataT> + CollectionC<DataT> CollectionBodyC<DataT>::Split(SizeT ne) { + RavlAssert(ne <= Size()); + CollectionC<DataT> ret(ne); + for(SizeT i = 0;i < ne;i++) + ret.Insert(Pick()); + return ret; + } + + template<class DataT> + CollectionC<DataT> CollectionBodyC<DataT>::Shuffle() const { + CollectionC<DataT> ret(n); + for(BufferAccessIterC<DataT> it(data);it;it++) + ret.InsertRandom(*it); + return ret; + } + + template<class DataT> + void CollectionBodyC<DataT>::ShuffleIP() { + for(BufferAccessIterC<DataT> it(data);it;it++) { + SizeT p = (SizeT)((RealT) Random1() * n); + if(p > n-1) + p = n-1; // Incase of rounding errors. + DataT tmp = *it; + *it = data[p]; + data[p] = tmp; + } + } + + template<class DataT> + CollectionC<DataT> CollectionBodyC<DataT>::Sample(SizeT ne) const { + CollectionC<DataT> ret(ne); + for(SizeT i = 0;i < ne;i++) { + SizeT p = (SizeT)((RealT) Random1() * n); + if(p > n-1) + p = n-1; // Incase of rounding errors. + ret.Insert(data[p]); + } + return ret; + } + + template<class DataT> + DataT& CollectionBodyC<DataT>::KthHighest(UIntT ik) { + DataT *k = &data[ik]; + DataT *low = &data[0]; + DataT *high = &data[Size()-1]; + + for(;;) { + // if low and high element are the same, we're done + if ( low == high ) { + RavlAssert(low == k); + return *k; + } + + // if low and high are consecutive, choose one of them + if ( low == high-1 ) { + if ( *low > *high ) + Swap(*low,*high); + RavlAssert(low == k || high == k); + return *k; + } + + // choose a comparison element as median of low, high and middle + // element of current sub-array + DataT *middle = low + ((high - low) / 2); + + // move median element to position low+1, and swap around low and high + // elements if necessary to maintain their order + if ( *low < *high ) { + if ( *high < *middle ) + // high is the median of the three; swap with middle element + Swap(*high,*middle); + else if ( *low > *middle ) + // low is the median of the three + Swap(*low,*middle); + } + else { + // first swap low and high to put them in order + Swap(*low,*high); + if ( *high < *middle ) + // high is the median of the three; swap with middle element + Swap(*high,*middle); + else if ( *low > *middle ) + /* low is the median of the three */ + Swap(*low,*middle); + } + + // move median element into position low+1 + if ( middle != low+1 ) { + Swap(*(low+1),*middle); + middle = low+1; + } + + // initialise indices of lower and upper elements + DataT *x = middle; + DataT *y = high; + for(;;) { + do x++; while (*x < *middle); + do y--; while (*y > *middle); + if (x>y) break; // terminate when indices cross + Swap(*x,*y); + } + + if (y != middle) + Swap(*middle,*y); // place partitioning element into position + + if (y == k) return *k; + if (y > k) high=y-1; + if (y < k) low = (x==y+2) ? x-1 : x; + RavlAssert(low <= k && high >= k); + } + } + +} + +#endif Copied: main/Ravl/Core/Container/Misc/CollectionIter.hh (from rev 7998, main/Ravl/Core/System/CollectionIter.hh) =================================================================== --- main/Ravl/Core/Container/Misc/CollectionIter.hh (rev 0) +++ main/Ravl/Core/Container/Misc/CollectionIter.hh 2011-04-05 15:44:45 UTC (rev 8024) @@ -0,0 +1,58 @@ +// This file is part of RAVL, Recognition And Vision Library +// Copyright (C) 2001, University of Surrey +// This code may be redistributed under the terms of the GNU Lesser +// General Public License (LGPL). See the lgpl.licence file for details or +// see http://www.gnu.org/copyleft/lesser.html +// file-header-ends-here +#ifndef RAVL_COLLECTIONITER_HEADER +#define RAVL_COLLECTIONITER_HEADER 1 +////////////////////////////////////////////////////////////// +//! rcsid="$Id$" +//! docentry="Ravl.API.Core.Misc" +//! author="Charles Galambos" +//! lib=RavlCore +//! file="Ravl/Core/System/CollectionIter.hh" + +#include "Ravl/Collection.hh" +#include "Ravl/SArray1dIter.hh" + +namespace RavlN { + + //! userlevel=Normal + //: Collection iterator. + // Iterates through the contents of a collection. + + template<class DataT> + class CollectionIterC + : public SArray1dIterC<DataT> + { + public: + CollectionIterC(const CollectionC<DataT> &c) + : SArray1dIterC<DataT>(c.Array()) + {} + //: Constructor. + + }; + + //! userlevel=Obsolete + //: Collection iterator. + // Iterates through the contents of a collection. + // Deprecated to be consistant with other iterators use + // CollectionIterC instead. + + template<class DataT> + class CollectionConstIterC + : public SArray1dIterC<DataT> + { + public: + CollectionConstIterC(const CollectionC<DataT> &c) + : SArray1dIterC<DataT>(c.Array()) + {} + //: Constructor. + + }; + +} + + +#endif Deleted: main/Ravl/Core/System/Collection.hh =================================================================== --- main/Ravl/Core/System/Collection.hh 2011-04-05 15:21:07 UTC (rev 8023) +++ main/Ravl/Core/System/Collection.hh 2011-04-05 15:44:45 UTC (rev 8024) @@ -1,684 +0,0 @@ -// This file is part of RAVL, Recognition And Vision Library -// Copyright (C) 2001, University of Surrey -// This code may be redistributed under the terms of the GNU Lesser -// General Public License (LGPL). See the lgpl.licence file for details or -// see http://www.gnu.org/copyleft/lesser.html -// file-header-ends-here -#ifndef RAVL_COLLECTION_HEADER -#define RAVL_COLLECTION_HEADER 1 -////////////////////////////////////////////////////// -//! rcsid=$Id$ -//! docentry="Ravl.API.Core.Misc" -//! author="Charles Galambos" -//! lib=RavlCore -//! file="Ravl/Core/System/Collection.hh" - -#include "Ravl/SArray1d.hh" -#include "Ravl/Random.hh" -#include "Ravl/RefCounter.hh" -#include "Ravl/BinStream.hh" - -namespace RavlN { - - template<class DataT> class CollectionC; - template<class DataT> class CollectionIterC; - template<class DataT> class DListC; - template<class DataT> class DLIterC; - - //! userlevel=Develop - //: Collection of data. - - template<class DataT> - class CollectionBodyC - : public RCBodyC - { - public: - CollectionBodyC(SizeT maxSize = 10,SizeT used = 0) - : data(maxSize+1), - n(used) - {} - //: Create an empty collection. - // maxSize should be set to maximum number of - // elements the collection will contain. 'used' is the number - // of elements to be in the collection at the time of creation. - - CollectionBodyC(const DListC<DataT> &list); - //: Construct collection from a list. - - CollectionBodyC(const SArray1dC<DataT> &dat) - : data(dat), - n(dat.Size()) - {} - //: Create a collection from an array of data. - - CollectionBodyC(const SArray1dC<DataT> &dat,UIntT used) - : data(dat), - n(used) - { RavlAssert(used <= data.Size()); } - //: Create a collection from an array of data, including 'used' elements. - - CollectionC<DataT> Copy() const; - //: Create a copy of this collection. - - inline - UIntT Insert(const DataT &dat); - //: Add a data item to the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The index at which the item was placed is returned. - - UIntT Insert(const Array1dC<DataT> &dat); - //: Add an array of data items to the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The first index at which the items were placed is returned. - - inline - UIntT Append(const DataT &dat) - { return Insert(dat); } - //: Add a data item to the end of the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The index at which the item was placed is returned. - - inline UIntT Append(const Array1dC<DataT> &dat) - { return Insert(dat); } - //: Add an array of data items to the end of the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The first index at which the items were placed is returned. - - inline - UIntT InsertRandom(const DataT &dat); - //: Add a data item to the collection in a random place. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The index at which the item was placed is returned. - - inline void Delete(IndexC ind) - { data[ind] = data[--n]; } - //: Remove item at 'ind' from the collection. - // Note the last item in the collection will be moved - // to replace element at 'ind' - - inline void Remove(IndexC ind) - { data[ind] = data[--n]; } - //: Remove item at 'ind' from the collection. - // Note the last item in the collection will be moved - // to replace element at 'ind'. - // Same as Delete, added for consistancy with DArray1dC. - - DataT Pick(); - //: Pick a random item from the collection. - // the element will be removed from the set. - // It is the users responsiblity to ensure the - // set is not empty when this method is called. - // See 'IsEmpty()' - - CollectionC<DataT> Shuffle() const; - //: Create a shuffled version of this collection. - - void ShuffleIP(); - //: Shuffle collection in place. - - void Merge(const CollectionC<DataT> &x); - //: Merge collection 'x' into this one. - - void Merge(const SArray1dC<DataT> &x); - //: Merge of array 'x' into this collection. - - inline bool IsEmpty() const - { return n == 0; } - //: Test if collection is empty. - - void Empty() - { n = 0; } - //: Empty the collection of all its contents. - - SizeT Size() const - { return n; } - //: Returns the number of data elements in the collection. - - SArray1dC<DataT> Array() - { return SArray1dC<DataT>(data,n); } - //: Access data as array. - // Obsolete, use SArray1d() instread. <br> - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - - const SArray1dC<DataT> Array() const - { return SArray1dC<DataT>(data,n); } - //: Access data as array. - // Obsolete, use SArray1d() instread. <br> - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - SArray1dC<DataT> SArray1d() - { return SArray1dC<DataT>(data,n); } - //: Access data as array. - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - const SArray1dC<DataT> SArray1d() const - { return SArray1dC<DataT>(data,n); } - //: Access data as array. - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - CollectionC<DataT> Split(SizeT ne); - //: Split the collection in two - // return a random set of 'ne' elements from this one. - - CollectionC<DataT> Sample(SizeT ne) const; - //: Take a random sample from the collection. - // This collection is not modified. NOTE: Items - // may be taken more than once. - - DataT &KthHighest(UIntT k); - //: k'th highest element of a collection - // k should be between 0 and Size()-1. For the median use k = Size()/2. - // The DataT type class must have the < and > operators defined on them. <p> - // Note: This method re-orders the contents of the collection. - - DataT &operator[](IndexC ind) { - RavlAssertMsg(ind < n,"Index out of range."); - return data[ind]; - } - //: Array style access. - - const DataT &operator[](IndexC ind) const { - RavlAssertMsg(ind < n,"Index out of range."); - return data[ind]; - } - //: Array style access. - - DataT &Last() - { return data[Size()-1]; } - //: Access last element in the collection. - - const DataT &Last() const - { return data[Size()-1]; } - //: Access last element in the collection. - - DataT &First() - { return data[0]; } - //: Access first element in the collection. - - const DataT &First() const - { return data[0]; } - //: Access first element in the collection. - - protected: - SArray1dC<DataT> data; - SizeT n; - }; - - //! userlevel=Normal - //: Collection of data - // Simple extensible container, with properties similar to std::vector - - template<class DataT> - class CollectionC - : public RCHandleC<CollectionBodyC<DataT> > - { - public: - CollectionC() - {} - //: Default constructor. - // creates an invalid handle. - - CollectionC(SizeT maxSize,SizeT used = 0) - : RCHandleC<CollectionBodyC<DataT> >(*new CollectionBodyC<DataT>(maxSize,used)) - {} - //: Creat an empty collection. - // maxSize should be set to maximum number of elements the collection - // will contain. 'used' is the number of elements to be in the collection - // at the time of creation. - - CollectionC(const SArray1dC<DataT> &dat) - : RCHandleC<CollectionBodyC<DataT> >(*new CollectionBodyC<DataT>(dat)) - {} - //: Create a collection from an array of data. - - CollectionC(const DListC<DataT> &list) - : RCHandleC<CollectionBodyC<DataT> >(*new CollectionBodyC<DataT>(list)) - {} - //: Construct collection from a list. - - CollectionC<DataT> Copy() const - { return Body().Copy(); } - //: Create a copy of this collection. - - inline - UIntT Insert(const DataT &dat) - { return Body().Insert(dat); } - //: Add a data item to the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <br> - // The index at which the item was placed is returned. - - UIntT Insert(const Array1dC<DataT> &dat) - { return Body().Insert(dat); } - //: Add an array of data items to the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The first index at which the items were placed is returned. - - inline - UIntT Append(const DataT &dat) - { return Body().Append(dat); } - //: Add a data item to the end of the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The index at which the item was placed is returned. - - inline UIntT Append(const Array1dC<DataT> &dat) - { return Body().Append(dat); } - //: Add an array of data items to the end of the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. <p> - // The first index at which the items were placed is returned. - - inline - UIntT InsertRandom(const DataT &dat) - { return Body().InsertRandom(dat); } - //: Add a data item to the collection in a random place. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. - - void Delete(IndexC ind) - { Body().Delete(ind); } - //: Remove item at 'ind' from the collection. - - void operator+=(const DataT &dat) - { Body().Insert(dat); } - //: Add data item to the collection. - // NB. This may cause the storage array to - // be reallocated which will invalidate any iterators - // held on the collection. - - DataT Pick() - { return Body().Pick(); } - //: Pick a random item from the collection. - // the element will be removed from the set. - // It is the users responsiblity to ensure the - // set is not empty when this method is called. - // See 'IsEmpty()' - - CollectionC<DataT> Shuffle() const - { return Body().Shuffle(); } - //: Create a shuffled version of this collection. - - void ShuffleIP() - { Body().ShuffleIP(); } - //: Shuffle collection in place. - - void Merge(const CollectionC<DataT> &x) - { Body().Merge(x); } - //: Merge collection 'x' into this one. - - void Merge(const SArray1dC<DataT> &x) - { Body().Merge(x); } - //: Merge of array 'x' into this collection. - - inline bool IsEmpty() const - { return Body().IsEmpty(); } - //: Test if collection is empty. - - void Empty() - { Body().Empty(); } - //: Empty the collection of all its contents. - - SizeT Size() const - { return Body().Size(); } - //: Returns the number of data elements in the collection. - - SArray1dC<DataT> Array() - { return Body().Array(); } - //: Access data as array. - // Obsolete, use SArray1d() instread. <br> - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - const SArray1dC<DataT> Array() const - { return Body().Array(); } - //: Access data as array. - // Obsolete, use SArray1d() instread. <br> - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - SArray1dC<DataT> SArray1d() - { return Body().SArray1d(); } - //: Access data as array. - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - const SArray1dC<DataT> SArray1d() const - { return Body().SArray1d(); } - //: Access data as array. - // Note: The returned array is a direct access - // to the internal data structure, no operations - // that modify the collection should be performed - // while its in use. - - CollectionC<DataT> Split(SizeT ne) - { return Body().Split(ne); } - //: Split the collection in two - // return a random set of 'ne' elements from this one. - // ne must be smaller than the size of the collection. - - CollectionC<DataT> Sample(SizeT ne) const - { return Body().Sample(ne); } - //: Take a random sample from the collection. - // This collection is not modified. There is no - // garantee that an element will be picked only once. - // 'ne' may be bigger than the size of this collection. - - DataT &KthHighest(UIntT k) - { return Body().KthHighest(k); } - //: k'th highest element of a collection - // k should be between 0 and Size()-1. For the median use k = Size()/2. - // The DataT type class must have the < and > operators defined on them. - // This function will reorder the collection so that elements 0...k-1 - // are <= element k and elements k+1...Size()-1 are >= element k. - // Based on algorithm in Numerical Recipes in C, second edition. - // <p> - // Note: This method re-orders the contents of the collection. - - DataT &operator[](IndexC ind) - { return Body().operator[](ind); } - //: Array style access. - - const DataT &operator[](IndexC ind) const - { return Body().operator[](ind); } - //: Array style access. - - DataT &Last() - { return Body().Last(); } - //: Access last element in the collection. - - const DataT &Last() const - { return Body().Last(); } - //: Access last element in the collection. - - DataT &First() - { return Body().First(); } - //: Access first element in the collection. - - const DataT &First() const - { return Body().First(); } - //: Access first element in the collection. - - typedef CollectionIterC<DataT> IteratorT; - //: Type of iterator. - - protected: - CollectionBodyC<DataT> &Body() - { return RCHandleC<CollectionBodyC<DataT> >::Body(); } - //: Access body - - const CollectionBodyC<DataT> &Body() const - { return RCHandleC<CollectionBodyC<DataT> >::Body(); } - //: Access body - - }; - - - template <class DataT> - BinOStreamC & operator<<(BinOStreamC & s, const CollectionC<DataT> &col) - { - s << col.Array(); - return s; - } - - template <class DataT> - BinIStreamC & operator>>(BinIStreamC& s, CollectionC<DataT> &col) - { - SArray1dC<DataT> arr; - s >> arr; - col = CollectionC<DataT>(arr); - return s; - } - - template<class DataT> - ostream &operator<<(ostream &s,const CollectionC<DataT> &d) { - s << d.Array(); - return s; - } - - template<class DataT> - istream &operator>>(istream &s,CollectionC<DataT> &d) { - SArray1dC<DataT> ad; - s >> ad; - d = CollectionC<DataT>(ad); - return s; - } - - template<class DataT> - CollectionBodyC<DataT>::CollectionBodyC(const DListC<DataT> &list) - : data(list.Size()), - n(0) - { - DataT *at = &(data[0]); - for(DLIterC<DataT> it(list);it;it++,at++) - *at = *it; - n = data.Size(); - } - - template<class DataT> - CollectionC<DataT> CollectionBodyC<DataT>::Copy() const { - return CollectionC<DataT>(Array().Copy()); - } - - template<class DataT> - inline - UIntT CollectionBodyC<DataT>::Insert(const DataT &dat) { - if(n >= data.Size()) - data = data.Copy((UIntT) data.Size() * 2); // Double the size of the collection. - int i = n; - data[n++] = dat; - return i; - } - - template<class DataT> - UIntT CollectionBodyC<DataT>::Insert(const Array1dC<DataT> &dat) { - if( (n + dat.Size()) > data.Size() ) { - UIntT ns = (UIntT) data.Size() * 2; - while(ns < (n + dat.Size())) - ns *= 2; - data = data.Copy(ns); // Double the size of the collection. - } - int i = n; - // Copy in elements. - for(BufferAccessIter2C<DataT,DataT> it(dat,data,0,n);it;it++) - it.Data2() = it.Data1(); - n += dat.Size(); - return i; - } - - - template<class DataT> - inline - UIntT CollectionBodyC<DataT>::InsertRandom(const DataT &dat) { - if(n >= data.Size()) - data = data.Copy(data.Size() * 2); // Double the size of the collection. - SizeT p = (SizeT)((RealT) Random1() * n); - if(p > n-1) - p = n-1; // Incase of rounding errors. - data[n++] = data[p]; - data[p] = dat; - return p; - } - - template<class DataT> - DataT CollectionBodyC<DataT>::Pick() { - RavlAssert(n != 0); - SizeT i = (SizeT)((RealT) Random1() * n); - if(i >= n-1) - i = n-1; // Incase of rounding errors. - DataT ret = data[i]; - Delete(i); - return ret; - } - - template<class DataT> - void CollectionBodyC<DataT>::Merge(const CollectionC<DataT> &x) { - Merge(x.Array()); - } - - template<class DataT> - void CollectionBodyC<DataT>::Merge(const SArray1dC<DataT> &x) { - SizeT spair = data.Size() - n; - if(spair >= x.Size()) { // Is there space in existing array ? - // Copy in data. - SArray1dC<DataT> rest(data,spair,n); - for(BufferAccessIter2C<DataT,DataT> it(x,rest);it;it++) - it.Data2() = it.Data1(); - n+= x.Size(); - return ; - } - data = Array().Join(x); - n += x.Size(); - } - - template<class DataT> - CollectionC<DataT> CollectionBodyC<DataT>::Split(SizeT ne) { - RavlAssert(ne <= Size()); - CollectionC<DataT> ret(ne); - for(SizeT i = 0;i < ne;i++) - ret.Insert(Pick()); - return ret; - } - - template<class DataT> - CollectionC<DataT> CollectionBodyC<DataT>::Shuffle() const { - CollectionC<DataT> ret(n); - for(BufferAccessIterC<DataT> it(data);it;it++) - ret.InsertRandom(*it); - return ret; - } - - template<class DataT> - void CollectionBodyC<DataT>::ShuffleIP() { - for(BufferAccessIterC<DataT> it(data);it;it++) { - SizeT p = (SizeT)((RealT) Random1() * n); - if(p > n-1) - p = n-1; // Incase of rounding errors. - DataT tmp = *it; - *it = data[p]; - data[p] = tmp; - } - } - - template<class DataT> - CollectionC<DataT> CollectionBodyC<DataT>::Sample(SizeT ne) const { - CollectionC<DataT> ret(ne); - for(SizeT i = 0;i < ne;i++) { - SizeT p = (SizeT)((RealT) Random1() * n); - if(p > n-1) - p = n-1; // Incase of rounding errors. - ret.Insert(data[p]); - } - return ret; - } - - template<class DataT> - DataT& CollectionBodyC<DataT>::KthHighest(UIntT ik) { - DataT *k = &data[ik]; - DataT *low = &data[0]; - DataT *high = &data[Size()-1]; - - for(;;) { - // if low and high element are the same, we're done - if ( low == high ) { - RavlAssert(low == k); - return *k; - } - - // if low and high are consecutive, choose one of them - if ( low == high-1 ) { - if ( *low > *high ) - Swap(*low,*high); - RavlAssert(low == k || high == k); - return *k; - } - - // choose a comparison element as median of low, high and middle - // element of current sub-array - DataT *middle = low + ((high - low) / 2); - - // move median element to position low+1, and swap around low and high - // elements if necessary to maintain their order - if ( *low < *high ) { - if ( *high < *middle ) - // high is the median of the three; swap with middle element - Swap(*high,*middle); - else if ( *low > *middle ) - // low is the median of the three - Swap(*low,*middle); - } - else { - // first swap low and high to put them in order - Swap(*low,*high); - if ( *high < *middle ) - // high is the median of the three; swap with middle element - Swap(*high,*middle); - else if ( *low > *middle ) - /* low is the median of the three */ - Swap(*low,*middle); - } - - // move median element into position low+1 - if ( middle != low+1 ) { - Swap(*(low+1),*middle); - middle = low+1; - } - - // initialise indices of lower and upper elements - DataT *x = middle; - DataT *y = high; - for(;;) { - do x++; while (*x < *middle); - do y--; while (*y > *middle); - if (x>y) break; // terminate when indices cross - Swap(*x,*y); - } - - if (y != middle) - Swap(*middle,*y); // place partitioning element into position - - if (y == k) return *k; - if (y > k) high=y-1; - if (y < k) low = (x==y+2) ? x-1 : x; - RavlAssert(low <= k && high >= k); - } - } - -} - -#endif Deleted: main/Ravl/Core/System/CollectionIter.hh =================================================================== --- main/Ravl/Core/System/CollectionIter.hh 2011-04-05 15:21:07 UTC (rev 8023) +++ main/Ravl/Core/System/CollectionIter.hh 2011-04-05 15:44:45 UTC (rev 8024) @@ -1,58 +0,0 @@ -// This file is part of RAVL, Recognition And Vision Library -// Copyright (C) 2001, University of Surrey -// This code may be redistributed under the terms of the GNU Lesser -// General Public License (LGPL). See the lgpl.licence file for details or -// see http://www.gnu.org/copyleft/lesser.html -// file-header-ends-here -#ifndef RAVL_COLLECTIONITER_HEADER -#define RAVL_COLLECTIONITER_HEADER 1 -////////////////////////////////////////////////////////////// -//! rcsid="$Id$" -//! docentry="Ravl.API.Core.Misc" -//! author="Charles Galambos" -//! lib=RavlCore -//! file="Ravl/Core/System/CollectionIter.hh" - -#include "Ravl/Collection.hh" -#include "Ravl/SArray1dIter.hh" - -namespace RavlN { - - //! userlevel=Normal - //: Collection iterator. - // Iterates through the contents of a collection. - - template<class DataT> - class CollectionIterC - : public SArray1dIterC<DataT> - { - public: - CollectionIterC(const CollectionC<DataT> &c) - : SArray1dIterC<DataT>(c.Array()) - {} - //: Constructor. - - }; - - //! userlevel=Obsolete - //: Collection iterator. - // Iterates through the contents of a collection. - // Deprecated to be consistant with other iterators use - // CollectionIterC instead. - - template<class DataT> - class CollectionConstIterC - : public SArray1dIterC<DataT> - { - public: - CollectionConstIterC(const CollectionC<DataT> &c) - : SArray1dIterC<DataT>(c.Array()) - {} - //: Constructor. - - }; - -} - - -#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-05 15:21:13
|
Revision: 8023 http://ravl.svn.sourceforge.net/ravl/?rev=8023&view=rev Author: ees1wc Date: 2011-04-05 15:21:07 +0000 (Tue, 05 Apr 2011) Log Message: ----------- Fixed bug in First() Modified Paths: -------------- main/Ravl/Core/System/Collection.hh Modified: main/Ravl/Core/System/Collection.hh =================================================================== --- main/Ravl/Core/System/Collection.hh 2011-04-05 14:17:20 UTC (rev 8022) +++ main/Ravl/Core/System/Collection.hh 2011-04-05 15:21:07 UTC (rev 8023) @@ -215,11 +215,11 @@ //: Access last element in the collection. DataT &First() - { return data[Size()-1]; } + { return data[0]; } //: Access first element in the collection. const DataT &First() const - { return data[Size()-1]; } + { return data[0]; } //: Access first element in the collection. protected: @@ -229,7 +229,7 @@ //! userlevel=Normal //: Collection of data - // A collection of data. + // Simple extensible container, with properties similar to std::vector template<class DataT> class CollectionC This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-04-05 14:17:34
|
Revision: 8022 http://ravl.svn.sourceforge.net/ravl/?rev=8022&view=rev Author: ees1wc Date: 2011-04-05 14:17:20 +0000 (Tue, 05 Apr 2011) Log Message: ----------- Added example Modified Paths: -------------- main/Ravl/Image/Processing/Filters/Misc/ImagePyramid.hh main/Ravl/Image/Processing/Filters/Misc/defs.mk Added Paths: ----------- main/Ravl/Image/Processing/Filters/Misc/exImagePyramid.cc Modified: main/Ravl/Image/Processing/Filters/Misc/ImagePyramid.hh =================================================================== --- main/Ravl/Image/Processing/Filters/Misc/ImagePyramid.hh 2011-04-05 08:46:35 UTC (rev 8021) +++ main/Ravl/Image/Processing/Filters/Misc/ImagePyramid.hh 2011-04-05 14:17:20 UTC (rev 8022) @@ -11,7 +11,8 @@ //! lib=RavlImageProc //! rcsid="$Id$" //! userlevel=Normal -//! file="Ravl/Image/Processing/Filters/Misc/ImageExtend.hh" +//! file="Ravl/Image/Processing/Filters/Misc/ImagePyramid.hh" +//! example=exImagePyramid.cc" #include "Ravl/Image/Image.hh" #include "Ravl/Image/ImageExtend.hh" @@ -24,9 +25,10 @@ namespace RavlImageN { //! userlevel=Normal - //: Image pyramid. - // This class creates a set of images each filtered such that - // that its effective resolution is reduced by a power of 2. + //: Image pyramid + // This class creates a set of images each filtered such that the + // effective resolution of each one is reduced by a constant factor from + // the previous one. template<typename PixelT,typename SumTypeT = PixelT> class ImagePyramidC { @@ -37,15 +39,17 @@ ImagePyramidC(const ImageC<PixelT> &img,IntT nScales = 2,bool subSample = false,bool recursive = false) { ComputeImages(img,nScales,subSample,recursive); } - //: Constructor. + //: Constructor that creates a diadic pyramid + // The scale factor between each neighbouring image pair = 2. //!param: img - Image to filter. //!param: nScales - Number of scales to generate. -1 = Generate a complete pyramid. //!param: subSample - If true sub-sample the pixels as well as filtering. + //!param: recursive - If true when subsampling, then use the results of previous filtering operations as input for the next. ImagePyramidC(const ImageC<PixelT> &img,RealT scaleFactor,IntT nScales = 2,bool subSample = false) { ComputeImages(img,scaleFactor,nScales,subSample); } //: Constructor for non-diadic pyramid - //!param: img - Image to filer + //!param: img - Image to filter //!param: scaleFactor - the scale factor to apply between levels (2.0 == double size) //!param: nScales - Number of scales to generate. -1 = Generate a complete pyramid. //!param: subSample - If true sub-sample the picels as well as filtering. @@ -59,7 +63,7 @@ void ComputeImages(const ImageC<PixelT> &img,RealT scaleFactor,IntT nScales,bool subSample); //: Compute images over given scales for non-diadic pyramids. - //!param: img - Image to filer + //!param: img - Image to filter //!param: scaleFactor - the scale factor to apply between levels (2.0 == double size) //!param: nScales - Number of scales to generate. -1 = Generate a complete pyramid. //!param: subSample - If true sub-sample the picels as well as filtering. @@ -90,10 +94,18 @@ CollectionC<Tuple3C<RealT,RealT,ImageC<PixelT> > > &Images() { return images; } //: Access available images. + // The objects in the returned collection are tuples consiting of:<ul> + // <li> the filter scale - i.e. the amount of filtering applied, <i>relative to the original image</i>,</li> + // <li> the pixel scale relative to the original image,</li> + // <li> the image itself const CollectionC<Tuple3C<RealT,RealT,ImageC<PixelT> > > &Images() const { return images; } //: Access available images. + // The objects in the returned collection are tuples consiting of:<ul> + // <li> the filter scale - i.e. the amount of filtering applied, <i>relative to the original image</i>,</li> + // <li> the pixel scale relative to the original image,</li> + // <li> the image itself protected: CollectionC<Tuple3C<RealT,RealT,ImageC<PixelT> > > images; @@ -161,7 +173,7 @@ return filteredImage; } // FIXME:- This isn't the most efficient way of getting a subsampled image, we could - // compute filered values for the points we want in the final image. + // compute filtered values for the points we want in the final image. //cerr << " Scale=" << scale << "\n"; IndexRange2dC alignedFrame = filteredImage.Frame().AlignWithin(scale); IndexRange2dC subFrame = alignedFrame / scale; @@ -206,7 +218,7 @@ it.Data1() = static_cast<SumTypeT>(it.Data2()); } // FIXME:- This isn't the most efficient way of getting a subsampled image, we could - // compute filered values for the points we want in the final image. + // compute filtered values for the points we want in the final image. //cerr << " Scale=" << scale << "\n"; IndexRange2dC alignedFrame; if (((kernelSize-1) >> 1) > 0) Modified: main/Ravl/Image/Processing/Filters/Misc/defs.mk =================================================================== --- main/Ravl/Image/Processing/Filters/Misc/defs.mk 2011-04-05 08:46:35 UTC (rev 8021) +++ main/Ravl/Image/Processing/Filters/Misc/defs.mk 2011-04-05 14:17:20 UTC (rev 8022) @@ -18,6 +18,7 @@ SOURCES= HomomorphicFilter.cc DCT2d.cc DeinterlaceStream.cc \ MedianFilter.cc +EXAMPLES = exImagePyramid.cc LIBDEPS=RavlImageMisc.def Added: main/Ravl/Image/Processing/Filters/Misc/exImagePyramid.cc =================================================================== --- main/Ravl/Image/Processing/Filters/Misc/exImagePyramid.cc (rev 0) +++ main/Ravl/Image/Processing/Filters/Misc/exImagePyramid.cc 2011-04-05 14:17:20 UTC (rev 8022) @@ -0,0 +1,42 @@ +#include "Ravl/Image/ImagePyramid.hh" + +using namespace RavlN; +using namespace RavlImageN; + +int main() +{ + ImageC<ByteT> img(100,100); + for (Array2dIterC<ByteT> i(img); i; ++i) + *i = i.Index()[0] + i.Index()[1]; + + cout << "\nPyramid without image subsampling:\n"; + ImagePyramidC<ByteT> pyramid(img, Sqrt(2), 4, false); + for (CollectionIterC<Tuple3C<RealT,RealT,ImageC<ByteT> > > l(pyramid.Images()); l; ++l) + cout << "Frame: " << l->Data3().Frame() << endl + << "Pixel scale: " << l->Data2() << endl + << "Filter scale: " << l->Data1() << endl; + + cout << "\nPyramid including image subsampling:\n"; + // Also different indexing style + pyramid = ImagePyramidC<ByteT>(img, Sqrt(2), 4, true); + for (IntT l=0; l<pyramid.Images().Size(); ++l) { + Tuple3C<RealT,RealT,ImageC<ByteT> > img(pyramid.Images()[l]); + cout << "Frame: " << img.Data3().Frame() << endl + << "Pixel scale: " << img.Data2() << endl + << "Filter scale: " << img.Data1() << endl; + } + cout << "\nMulti-octave pyramid (SIFT-style):\n"; + // create the octaves using subsampling: + pyramid = ImagePyramidC<ByteT>(img, 3, true); + for (IntT level=0; level<pyramid.Images().Size(); ++level) { + // create the images in between (without subsampling) + ImageC<ByteT> octaveImg = pyramid.Images()[level].Data3(); + ImagePyramidC<ByteT> subPyramid(octaveImg, Pow(2.0,1.0/8.0), 8, false); + for (CollectionIterC<Tuple3C<RealT,RealT,ImageC<ByteT> > > l(subPyramid.Images()); l; ++l) + cout << "Frame: " << l->Data3().Frame() << endl + << "Pixel scale: " << l->Data2() * Pow(2.0, level) << endl + << "Filter scale: " << l->Data1() * Pow(2.0, level) << endl; + } + + return 0; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-05 08:46:42
|
Revision: 8021 http://ravl.svn.sourceforge.net/ravl/?rev=8021&view=rev Author: craftit Date: 2011-04-05 08:46:35 +0000 (Tue, 05 Apr 2011) Log Message: ----------- Make WaitForRead and WaitForWrite public. Modified Paths: -------------- main/Ravl/OS/Misc/UnixStreamIO.hh main/Ravl/OS/Network/Socket.hh Modified: main/Ravl/OS/Misc/UnixStreamIO.hh =================================================================== --- main/Ravl/OS/Misc/UnixStreamIO.hh 2011-04-04 16:38:45 UTC (rev 8020) +++ main/Ravl/OS/Misc/UnixStreamIO.hh 2011-04-05 08:46:35 UTC (rev 8021) @@ -105,14 +105,14 @@ // Note this will only actually close the socket if // m_dontClose is false. - protected: bool WaitForRead(); //: Wait for read to be ready. // Returns false on error. - + bool WaitForWrite(); //: Wait for write to be ready. // Returns false on error. + protected: bool CheckErrors(const char *opName); //: Check for recoverable errors. Modified: main/Ravl/OS/Network/Socket.hh =================================================================== --- main/Ravl/OS/Network/Socket.hh 2011-04-04 16:38:45 UTC (rev 8020) +++ main/Ravl/OS/Network/Socket.hh 2011-04-05 08:46:35 UTC (rev 8021) @@ -252,6 +252,16 @@ // If false, the socket will be checked its // open and valid, if it is the write will be retried. + bool WaitForRead() + { return Body().WaitForRead(); } + //: Wait for read to be ready. + // Returns false on error. + + bool WaitForWrite() + { return Body().WaitForWrite(); } + //: Wait for write to be ready. + // Returns false on error. + friend class SocketBodyC; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-04 16:38:51
|
Revision: 8020 http://ravl.svn.sourceforge.net/ravl/?rev=8020&view=rev Author: craftit Date: 2011-04-04 16:38:45 +0000 (Mon, 04 Apr 2011) Log Message: ----------- Add message to help with debug. Modified Paths: -------------- main/Ravl/OS/Text/TemplateComplex.cc Modified: main/Ravl/OS/Text/TemplateComplex.cc =================================================================== --- main/Ravl/OS/Text/TemplateComplex.cc 2011-04-04 16:37:33 UTC (rev 8019) +++ main/Ravl/OS/Text/TemplateComplex.cc 2011-04-04 16:38:45 UTC (rev 8020) @@ -160,14 +160,21 @@ //: Interpret string 'str' and return the result. StringC TemplateComplexBodyC::Interpret(const StringC &str) { - StrOStreamC outStr; - output.Push(outStr); - TextFileC subTextBuff(str,true,true); - if(!BuildSub(subTextBuff)) - cerr << "WARNING: BuildSub of '" << str << "' in template '" << templFile.Filename() << "' failed.\n"; - StringC ret = outStr.String(); - ONDEBUG(cerr << "TemplateComplexBodyC::Interpret(), '" << str << "' -> '" << ret << "'\n"); - output.DelTop(); + StringC ret; + try { + StrOStreamC outStr; + output.Push(outStr); + TextFileC subTextBuff(str,true,true); + if(!BuildSub(subTextBuff)) + std::cerr << "WARNING: BuildSub of '" << str << "' in template '" << templFile.Filename() << "' failed.\n"; + ret = outStr.String(); + ONDEBUG(std::cerr << "TemplateComplexBodyC::Interpret(), '" << str << "' -> '" << ret << "'\n"); + output.DelTop(); + } catch(...) { + // Help a bit with debugging... + std::cerr << "Failed to interpret '" << str << "' \n"; + throw ; + } return ret; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-04 16:37:39
|
Revision: 8019 http://ravl.svn.sourceforge.net/ravl/?rev=8019&view=rev Author: craftit Date: 2011-04-04 16:37:33 +0000 (Mon, 04 Apr 2011) Log Message: ----------- Turn off debug. Modified Paths: -------------- main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc Modified: main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc 2011-04-04 10:24:56 UTC (rev 8018) +++ main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc 2011-04-04 16:37:33 UTC (rev 8019) @@ -3,7 +3,7 @@ #include <osg/BoundsChecking> #include <iostream> -#define DODEBUG 1 +#define DODEBUG 0 #if DODEBUG #define ONDEBUG(x) x #else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-04 10:25:02
|
Revision: 8018 http://ravl.svn.sourceforge.net/ravl/?rev=8018&view=rev Author: craftit Date: 2011-04-04 10:24:56 +0000 (Mon, 04 Apr 2011) Log Message: ----------- Make new methods inline. Modified Paths: -------------- main/Ravl/OS/XMLFactory/XMLFactory.hh Modified: main/Ravl/OS/XMLFactory/XMLFactory.hh =================================================================== --- main/Ravl/OS/XMLFactory/XMLFactory.hh 2011-04-04 09:47:59 UTC (rev 8017) +++ main/Ravl/OS/XMLFactory/XMLFactory.hh 2011-04-04 10:24:56 UTC (rev 8018) @@ -695,7 +695,7 @@ template<class DataT> - bool XMLFactoryContextC::UseComponent(const StringC &name, + inline bool XMLFactoryContextC::UseComponent(const StringC &name, DataT &data, bool suppressErrorMessages, const std::type_info &defaultType) const @@ -703,14 +703,14 @@ //: Get named component, or create it if not found. template<class DataT> - bool XMLFactoryContextC::UseChildComponent(const StringC &name, + inline bool XMLFactoryContextC::UseChildComponent(const StringC &name, DataT &data, bool suppressErrorMessages, const std::type_info &defaultType) const { return Factory().UseComponent(*this,name,data,suppressErrorMessages,defaultType,XMLFACTORY_SEARCH_LOCAL_ONLY); } //: Get named component, or create it if not found. - bool XMLFactoryContextC::UseComponent(const StringC &name, + inline bool XMLFactoryContextC::UseComponent(const StringC &name, RCWrapAbstractC &data, bool suppressErrorMessages, const std::type_info &defaultType) const @@ -719,7 +719,7 @@ // This will search parent context's succesively up the tree until a // component with a matching name is found. - bool XMLFactoryContextC::UseChildComponent(const StringC &name, + inline bool XMLFactoryContextC::UseChildComponent(const StringC &name, RCWrapAbstractC &data, bool suppressErrorMessages, const std::type_info &defaultType) const This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-04 09:48:10
|
Revision: 8017 http://ravl.svn.sourceforge.net/ravl/?rev=8017&view=rev Author: craftit Date: 2011-04-04 09:47:59 +0000 (Mon, 04 Apr 2011) Log Message: ----------- Allow use of components without knowing their type. Modified Paths: -------------- main/Ravl/OS/XMLFactory/XMLFactory.cc main/Ravl/OS/XMLFactory/XMLFactory.hh Modified: main/Ravl/OS/XMLFactory/XMLFactory.cc =================================================================== --- main/Ravl/OS/XMLFactory/XMLFactory.cc 2011-04-01 13:42:04 UTC (rev 8016) +++ main/Ravl/OS/XMLFactory/XMLFactory.cc 2011-04-04 09:47:59 UTC (rev 8017) @@ -258,7 +258,7 @@ } const std::type_info &from = child->Component().DataType(); - if(from == to) { + if(from == to || to == typeid(void)) { ONDEBUG(SysLog(SYSLOG_DEBUG,"UseComponentInternal, no conversion needed at '%s' for type '%s'",name.chars(),RavlN::TypeName(from))); handle = child->Component(); RavlAssert(handle.IsValid()); Modified: main/Ravl/OS/XMLFactory/XMLFactory.hh =================================================================== --- main/Ravl/OS/XMLFactory/XMLFactory.hh 2011-04-01 13:42:04 UTC (rev 8016) +++ main/Ravl/OS/XMLFactory/XMLFactory.hh 2011-04-04 09:47:59 UTC (rev 8017) @@ -326,7 +326,23 @@ //: Get named component, or create it if not found. // This will only check the local context for the component, creating // a new instance if its not found. - + + bool UseComponent(const StringC &name, + RCWrapAbstractC &data, + bool suppressErrorMessages = false, + const std::type_info &defaultType=typeid(void)) const; + //: Get named component, or create it if not found. + // This will search parent context's succesively up the tree until a + // component with a matching name is found. + + bool UseChildComponent(const StringC &name, + RCWrapAbstractC &data, + bool suppressErrorMessages = false, + const std::type_info &defaultType=typeid(void)) const; + //: Get named component, or create it if not found. + // This will only check the local context for the component, creating + // a new instance if its not found. + template<class DataT> bool CreateComponent(const StringC &name,DataT &data,bool suppressErrorMessages = false) const; //: Create a new instance of the named component. @@ -446,9 +462,29 @@ return true; } //: Get named component, or create it if not found. - + + bool UseComponent(const XMLFactoryContextC& currentContext, + const StringC &name, + RCWrapAbstractC &data, + bool suppressErrorMessages = false, + const type_info &defaultType = typeid(void), + XMLFactorySearchScopeT searchScope = XMLFACTORY_SEARCH_PARENT_NODES + ) const + { + return const_cast<XMLFactoryNodeC &>(currentContext.INode()).UseComponentInternal(const_cast<XMLFactoryC &>(*this), + name, + typeid(void), + data, + suppressErrorMessages, + defaultType, + searchScope + ); + } + //: Get named component, or create it if not found. + template<class DataT> - bool CreateComponent(const XMLFactoryContextC &node,DataT &data) { + bool CreateComponent(const XMLFactoryContextC &node,DataT &data) + { RCWrapC<DataT> handle; if(!CreateComponentInternal(node,typeid(DataT),handle)) return false; @@ -462,7 +498,8 @@ const StringC &name, DataT &data, bool suppressErrorMessages = false - ) { + ) + { RCWrapC<DataT> handle; XMLFactoryContextC newNode; @@ -673,6 +710,25 @@ { return Factory().UseComponent(*this,name,data,suppressErrorMessages,defaultType,XMLFACTORY_SEARCH_LOCAL_ONLY); } //: Get named component, or create it if not found. + bool XMLFactoryContextC::UseComponent(const StringC &name, + RCWrapAbstractC &data, + bool suppressErrorMessages, + const std::type_info &defaultType) const + { return Factory().UseComponent(*this,name,data,suppressErrorMessages,defaultType,XMLFACTORY_SEARCH_PARENT_NODES); } + //: Get named component, or create it if not found. + // This will search parent context's succesively up the tree until a + // component with a matching name is found. + + bool XMLFactoryContextC::UseChildComponent(const StringC &name, + RCWrapAbstractC &data, + bool suppressErrorMessages, + const std::type_info &defaultType) const + { return Factory().UseComponent(*this,name,data,suppressErrorMessages,defaultType,XMLFACTORY_SEARCH_LOCAL_ONLY); } + //: Get named component, or create it if not found. + // This will only check the local context for the component, creating + // a new instance if its not found. + + template<class DataT> bool XMLFactoryContextC::CreateComponent(const StringC &name,DataT &data,bool suppressErrorMessages) const { return Factory().CreateComponent(*this,name,data,suppressErrorMessages); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-04-01 13:42:12
|
Revision: 8016 http://ravl.svn.sourceforge.net/ravl/?rev=8016&view=rev Author: craftit Date: 2011-04-01 13:42:04 +0000 (Fri, 01 Apr 2011) Log Message: ----------- Add canvas manipulator which doesn't rotate. Modified Paths: -------------- main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.hh main/Ravl/Contrib/OpenSceneGraph/defs.mk main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidget.cc Added Paths: ----------- main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh Added: main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.cc 2011-04-01 13:42:04 UTC (rev 8016) @@ -0,0 +1,440 @@ + +#include "Ravl/OpenSceneGraph/CanvasManipulator.hh" +#include <osg/BoundsChecking> +#include <iostream> + +#define DODEBUG 1 +#if DODEBUG +#define ONDEBUG(x) x +#else +#define ONDEBUG(x) +#endif + +namespace RavlOSGN { + using namespace osg; + + CanvasManipulatorC::CanvasManipulatorC() + { + _modelScale = 0.01f; + _minimumZoomScale = 0.05f; + _thrown = false; + _distance = 1.0f; + _trackballSize = 0.8f; + std::cerr << "CanvasManipulatorC::CanvasManipulatorC Called.\n"; + } + + CanvasManipulatorC::~CanvasManipulatorC() + { + } + + void CanvasManipulatorC::setNode(osg::Node* node) + { + _node = node; + if(_node.get()) { + const osg::BoundingSphere& boundingSphere = _node->getBound(); + _modelScale = boundingSphere._radius; + } + std::cerr << "CanvasManipulatorC::setNode modelScale= " << _modelScale << "\n"; + if(getAutoComputeHomePosition()) computeHomePosition(); + } + + const osg::Node* CanvasManipulatorC::getNode() const + { + return _node.get(); + } + + osg::Node* CanvasManipulatorC::getNode() + { + return _node.get(); + } + + void CanvasManipulatorC::home(double /*currentTime*/) + { + if(getAutoComputeHomePosition()) computeHomePosition(); + computePosition(_homeEye, _homeCenter, _homeUp); + _thrown = false; + } + + void CanvasManipulatorC::home(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) + { + home(ea.getTime()); + us.requestRedraw(); + us.requestContinuousUpdate(false); + } + + void CanvasManipulatorC::init(const osgGA::GUIEventAdapter&, osgGA::GUIActionAdapter&) + { + flushMouseEventStack(); + } + + void CanvasManipulatorC::getUsage(osg::ApplicationUsage& usage) const + { +#if 0 + usage.addKeyboardMouseBinding("Trackball: Space", "Reset the viewing position to home"); + usage.addKeyboardMouseBinding("Trackball: +", "When in stereo, increase the fusion distance"); + usage.addKeyboardMouseBinding("Trackball: -", "When in stereo, reduce the fusion distance"); +#endif + } + + bool CanvasManipulatorC::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) + { + switch(ea.getEventType()) + { + case(osgGA::GUIEventAdapter::FRAME): + if(_thrown) { + if(calcMovement()) us.requestRedraw(); + } + return false; + default: + break; + } + + if(ea.getHandled()) return false; + + //ONDEBUG(std::cerr << "Got event " << (int) ea.getEventType()<< " \n"); + + switch(ea.getEventType()) + { + case(osgGA::GUIEventAdapter::SCROLL): + { + ONDEBUG(std::cerr << "Scroll Motion: " << (int) ea.getScrollingMotion() << "\n"); + ONDEBUG(std::cerr << " Delta:" <<ea.getScrollingDeltaX()<<" "<<ea.getScrollingDeltaY() << "\n"); + ONDEBUG(std::cerr << " Position:" <<ea.getX()<<" "<<ea.getY() << "\n"); + ONDEBUG(std::cerr << " Key:" <<ea.getKey() << "\n"); + ONDEBUG(std::cerr << " Button:" <<ea.getButton() << "\n"); + return true; + } + case(osgGA::GUIEventAdapter::PUSH): + { + ONDEBUG(std::cerr << "Got PUSH. \n"); + flushMouseEventStack(); + addMouseEvent(ea); + if(calcMovement()) us.requestRedraw(); + us.requestContinuousUpdate(false); + _thrown = false; + return true; + } + + case(osgGA::GUIEventAdapter::RELEASE): + { + ONDEBUG(std::cerr << "Got RELEASE. \n"); + if(ea.getButtonMask() == 0) { + + double timeSinceLastRecordEvent = _ga_t0.valid() ? (ea.getTime() - _ga_t0->getTime()) : DBL_MAX; + if(timeSinceLastRecordEvent > 0.02) flushMouseEventStack(); + +#if 0 + // We don't want to support throwing. + if(isMouseMoving()) { + if(calcMovement()) { + us.requestRedraw(); + us.requestContinuousUpdate(true); + _thrown = true; + } + } else +#endif + { + flushMouseEventStack(); + addMouseEvent(ea); + if(calcMovement()) us.requestRedraw(); + us.requestContinuousUpdate(false); + _thrown = false; + } + + } else { + flushMouseEventStack(); + addMouseEvent(ea); + if(calcMovement()) us.requestRedraw(); + us.requestContinuousUpdate(false); + _thrown = false; + } + return true; + } + + case(osgGA::GUIEventAdapter::DRAG): + { + ONDEBUG(std::cerr << "Got DRAG. \n"); + addMouseEvent(ea); + if(calcMovement()) us.requestRedraw(); + us.requestContinuousUpdate(false); + _thrown = false; + return true; + } + + case(osgGA::GUIEventAdapter::MOVE): + { + // Called when the mouse just moves in the canvas. + //ONDEBUG(std::cerr << "Got MOVE. \n"); + return false; + } + + case(osgGA::GUIEventAdapter::KEYDOWN): + ONDEBUG(std::cerr << "Got key down. \n"); + if(ea.getKey() == osgGA::GUIEventAdapter::KEY_Space) { + flushMouseEventStack(); + _thrown = false; + home(ea, us); + return true; + } + return false; + case(osgGA::GUIEventAdapter::FRAME): + ONDEBUG(std::cerr << "Got frame \n"); + if(_thrown) { + if(calcMovement()) us.requestRedraw(); + } + return false; + default: + return false; + } + } + + bool CanvasManipulatorC::isMouseMoving() + { + if(_ga_t0.get() == NULL || _ga_t1.get() == NULL) return false; + + static const float velocity = 0.1f; + + float dx = _ga_t0->getXnormalized() - _ga_t1->getXnormalized(); + float dy = _ga_t0->getYnormalized() - _ga_t1->getYnormalized(); + float len = sqrtf(dx * dx + dy * dy); + float dt = _ga_t0->getTime() - _ga_t1->getTime(); + + return(len > dt * velocity); + } + + void CanvasManipulatorC::flushMouseEventStack() + { + _ga_t1 = NULL; + _ga_t0 = NULL; + } + + void CanvasManipulatorC::addMouseEvent(const osgGA::GUIEventAdapter& ea) + { + _ga_t1 = _ga_t0; + _ga_t0 = &ea; + } + + void CanvasManipulatorC::setByMatrix(const osg::Matrixd& matrix) + { + _center = osg::Vec3(0.0f, 0.0f, -_distance) * matrix; + _rotation = matrix.getRotate(); + } + + osg::Matrixd CanvasManipulatorC::getMatrix() const + { + return osg::Matrixd::translate(0.0, 0.0, _distance) * osg::Matrixd::rotate(_rotation) * osg::Matrixd::translate(_center); + } + + osg::Matrixd CanvasManipulatorC::getInverseMatrix() const + { + return osg::Matrixd::translate(-_center) * osg::Matrixd::rotate(_rotation.inverse()) * osg::Matrixd::translate(0.0, 0.0, -_distance); + } + + void CanvasManipulatorC::computePosition(const osg::Vec3& eye, const osg::Vec3& center, const osg::Vec3& up) + { + + osg::Vec3 lv(center - eye); + + osg::Vec3 f(lv); + f.normalize(); + osg::Vec3 s(f^up); + s.normalize(); + osg::Vec3 u(s^f); + u.normalize(); + + osg::Matrix rotation_matrix(s[0], u[0], -f[0], 0.0f, + s[1], u[1], -f[1], 0.0f, + s[2], u[2], -f[2], 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f); + + _center = center; + _distance = lv.length(); + _rotation = rotation_matrix.getRotate().inverse(); + } + + bool CanvasManipulatorC::calcMovement() + { + // return if less then two events have been added. + if(_ga_t0.get() == NULL || _ga_t1.get() == NULL) return false; + + float dx = _ga_t0->getXnormalized() - _ga_t1->getXnormalized(); + float dy = _ga_t0->getYnormalized() - _ga_t1->getYnormalized(); + + float distance = sqrtf(dx * dx + dy * dy); + // return if movement is too fast, indicating an error in event values or change in screen. + if(distance > 0.5) { + return false; + } + + // return if there is no movement. + if(distance == 0.0f) { + return false; + } + + unsigned int buttonMask = _ga_t1->getButtonMask(); +#if 0 + // Don't to rotation + if(buttonMask == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) { + + // rotate camera. + + osg::Vec3 axis; + float angle; + + float px0 = _ga_t0->getXnormalized(); + float py0 = _ga_t0->getYnormalized(); + + float px1 = _ga_t1->getXnormalized(); + float py1 = _ga_t1->getYnormalized(); + + + trackball(axis, angle, px1, py1, px0, py0); + + osg::Quat new_rotate; + new_rotate.makeRotate(angle, axis); + + _rotation = _rotation*new_rotate; + + return true; + + } +#endif + if(buttonMask == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON || + buttonMask == (osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON | osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON)) { + + // pan model. + + float scale = -0.3f * _distance; + + osg::Matrix rotation_matrix; + rotation_matrix.makeRotate(_rotation); + + osg::Vec3 dv(dx*scale, dy*scale, 0.0f); + + _center += dv*rotation_matrix; + + return true; + + } + + if(buttonMask == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) { + + // zoom model. + + float fd = _distance; + float scale = 1.0f + dy; + if(fd * scale > _modelScale * _minimumZoomScale) { + + _distance *= scale; + + } else { + + // notify(DEBUG_INFO) << "Pushing forward"<<std::endl; + // push the camera forward. + float scale = -fd; + + osg::Matrix rotation_matrix(_rotation); + + osg::Vec3 dv = (osg::Vec3(0.0f, 0.0f, -1.0f) * rotation_matrix)*(dy * scale); + + _center += dv; + + } + + return true; + + } + + return false; + } + + /* + * This size should really be based on the distance from the center of + * rotation to the point on the object underneath the mouse. That + * point would then track the mouse as closely as possible. This is a + * simple example, though, so that is left as an Exercise for the + * Programmer. + */ + void CanvasManipulatorC::setTrackballSize(float size) + { + _trackballSize = size; + osg::clampBetweenRange(_trackballSize, 0.1f, 1.0f, "CanvasManipulatorC::setTrackballSize(float)"); + } + + /* + * Ok, simulate a track-ball. Project the points onto the virtual + * trackball, then figure out the axis of rotation, which is the cross + * product of P1 P2 and O P1 (O is the center of the ball, 0,0,0) + * Note: This is a deformed trackball-- is a trackball in the center, + * but is deformed into a hyperbolic sheet of rotation away from the + * center. This particular function was chosen after trying out + * several variations. + * + * It is assumed that the arguments to this routine are in the range + * (-1.0 ... 1.0) + */ + void CanvasManipulatorC::trackball(osg::Vec3& axis, float& angle, float p1x, float p1y, float p2x, float p2y) + { + /* + * First, figure out z-coordinates for projection of P1 and P2 to + * deformed sphere + */ + + osg::Matrix rotation_matrix(_rotation); + + + osg::Vec3 uv = osg::Vec3(0.0f, 1.0f, 0.0f) * rotation_matrix; + osg::Vec3 sv = osg::Vec3(1.0f, 0.0f, 0.0f) * rotation_matrix; + osg::Vec3 lv = osg::Vec3(0.0f, 0.0f, -1.0f) * rotation_matrix; + + osg::Vec3 p1 = sv * p1x + uv * p1y - lv * tb_project_to_sphere(_trackballSize, p1x, p1y); + osg::Vec3 p2 = sv * p2x + uv * p2y - lv * tb_project_to_sphere(_trackballSize, p2x, p2y); + + /* + * Now, we want the cross product of P1 and P2 + */ + + // Robert, + // + // This was the quick 'n' dirty fix to get the trackball doing the right + // thing after fixing the Quat rotations to be right-handed. You may want + // to do something more elegant. + // axis = p1^p2; + axis = p2^p1; + axis.normalize(); + + /* + * Figure out how much to rotate around that axis. + */ + float t = (p2 - p1).length() / (2.0 * _trackballSize); + + /* + * Avoid problems with out-of-control values... + */ + if(t > 1.0) t = 1.0; + if(t < -1.0) t = -1.0; + angle = inRadians(asin(t)); + + } + + /* + * Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet + * if we are away from the center of the sphere. + */ + float CanvasManipulatorC::tb_project_to_sphere(float r, float x, float y) + { + float d, t, z; + + d = sqrt(x * x + y * y); + /* Inside sphere */ + if(d < r * 0.70710678118654752440) { + z = sqrt(r * r - d * d); + }/* On hyperbola */ + else { + t = r / 1.41421356237309504880; + z = t * t / d; + } + return z; + } + +} Added: main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh (rev 0) +++ main/Ravl/Contrib/OpenSceneGraph/CanvasManipulator.hh 2011-04-01 13:42:04 UTC (rev 8016) @@ -0,0 +1,156 @@ +/* + * File: CanvasManipulator.hh + * Author: charles + * + * Created on 31 March 2011, 14:11 + */ + +#ifndef RAVLOSGN_CANVASMANIPULATOR_HH +#define RAVLOSGN_CANVASMANIPULATOR_HH + +#include <osgGA/MatrixManipulator> + +namespace RavlOSGN { + + class CanvasManipulatorC + : public osgGA::MatrixManipulator + { + public: + + CanvasManipulatorC(); + + virtual const char* className() const + { return "CanvasManipulator"; } + + /** set the position of the matrix manipulator using a 4x4 Matrix.*/ + virtual void setByMatrix(const osg::Matrixd& matrix); + + /** set the position of the matrix manipulator using a 4x4 Matrix.*/ + virtual void setByInverseMatrix(const osg::Matrixd& matrix) + { setByMatrix(osg::Matrixd::inverse(matrix)); } + + /** get the position of the manipulator as 4x4 Matrix.*/ + virtual osg::Matrixd getMatrix() const; + + /** get the position of the manipulator as a inverse matrix of the manipulator, typically used as a model view matrix.*/ + virtual osg::Matrixd getInverseMatrix() const; + + /** Get the FusionDistanceMode. Used by SceneView for setting up stereo convergence.*/ + virtual osgUtil::SceneView::FusionDistanceMode getFusionDistanceMode() const + { return osgUtil::SceneView::USE_FUSION_DISTANCE_VALUE; } + + /** Get the FusionDistanceValue. Used by SceneView for setting up stereo convergence.*/ + virtual float getFusionDistanceValue() const + { return _distance; } + + /** Attach a node to the manipulator. + Automatically detaches previously attached node. + setNode(NULL) detaches previously nodes. + Is ignored by manipulators which do not require a reference model.*/ + virtual void setNode(osg::Node*); + + /** Return node if attached.*/ + virtual const osg::Node* getNode() const; + + /** Return node if attached.*/ + virtual osg::Node* getNode(); + + /** Move the camera to the default position. + May be ignored by manipulators if home functionality is not appropriate.*/ + virtual void home(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us); + virtual void home(double); + + /** Start/restart the manipulator.*/ + virtual void init(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us); + + /** handle events, return true if handled, false otherwise.*/ + virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us); + + /** Get the keyboard and mouse usage of this manipulator.*/ + virtual void getUsage(osg::ApplicationUsage& usage) const; + + /** set the minimum distance (as ratio) the eye point can be zoomed in towards the + center before the center is pushed forward.*/ + void setMinimumZoomScale(double minimumZoomScale) + { _minimumZoomScale = minimumZoomScale; } + + /** get the minimum distance (as ratio) the eye point can be zoomed in */ + double getMinimumZoomScale() const + { return _minimumZoomScale; } + + /** Set the center of the trackball. */ + void setCenter(const osg::Vec3d& center) + { _center = center; } + + /** Get the center of the trackball. */ + const osg::Vec3d& getCenter() const + { return _center; } + + /** Set the rotation of the trackball. */ + void setRotation(const osg::Quat& rotation) + { _rotation = rotation; } + + /** Get the rotation of the trackball. */ + const osg::Quat& getRotation() const + { return _rotation; } + + /** Set the distance of the trackball. */ + void setDistance(double distance) + { _distance = distance; } + + /** Get the distance of the trackball. */ + double getDistance() const + { return _distance; } + + /** Set the size of the trackball. */ + void setTrackballSize(float size); + + /** Get the size of the trackball. */ + float getTrackballSize() const + { return _trackballSize; } + protected: + + virtual ~CanvasManipulatorC(); + + /** Reset the internal GUIEvent stack.*/ + void flushMouseEventStack(); + /** Add the current mouse GUIEvent to internal stack.*/ + void addMouseEvent(const osgGA::GUIEventAdapter& ea); + + void computePosition(const osg::Vec3& eye, const osg::Vec3& lv, const osg::Vec3& up); + + /** For the give mouse movement calculate the movement of the camera. + Return true is camera has moved and a redraw is required.*/ + bool calcMovement(); + + void trackball(osg::Vec3& axis, float& angle, float p1x, float p1y, float p2x, float p2y); + float tb_project_to_sphere(float r, float x, float y); + + + /** Check the speed at which the mouse is moving. + If speed is below a threshold then return false, otherwise return true.*/ + bool isMouseMoving(); + + // Internal event stack comprising last two mouse events. + osg::ref_ptr<const osgGA::GUIEventAdapter> _ga_t1; + osg::ref_ptr<const osgGA::GUIEventAdapter> _ga_t0; + + osg::ref_ptr<osg::Node> _node; + + double _modelScale; + double _minimumZoomScale; + + bool _thrown; + + osg::Vec3d _center; + osg::Quat _rotation; + double _distance; + float _trackballSize; + + }; +} + + + +#endif /* CANVASMANIPULATOR_HH */ + Modified: main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc 2011-03-31 09:10:35 UTC (rev 8015) +++ main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.cc 2011-04-01 13:42:04 UTC (rev 8016) @@ -10,6 +10,8 @@ //! author = "Warren Moore" #include "Ravl/OpenSceneGraph/OpenSceneGraphWidget.hh" +#include "Ravl/OpenSceneGraph/CanvasManipulator.hh" + #include <gtk/gtkgl.h> #include <gtk/gtkcontainer.h> #include "Ravl/GUI/Manager.hh" @@ -33,15 +35,6 @@ { using namespace osg; - // Constructor - PickEntryC::PickEntryC(const NodeC &node,const Point3dC &localIntersection,const Point3dC &worldIntersection) - : m_node(&node), - m_localIntersection(localIntersection), - m_worldIntersection(worldIntersection) - {} - - // -------------------------------------------------------------- - void FuncGtkGlExtInit(int *argc, char **argv[]) { gtk_gl_init(argc, argv); @@ -108,6 +101,8 @@ manipulator = new osgGA::FlightManipulator; } else if(m_defaultManipulator == "KeySwitch") { manipulator = new osgGA::KeySwitchMatrixManipulator; + } else if(m_defaultManipulator == "Canvas") { + manipulator = new CanvasManipulatorC; } else { // Fall back to default. std::cerr << "Unknown manipulator:" << m_defaultManipulator << "\n"; @@ -183,65 +178,26 @@ return true; } - - //! Pick a point from the view. - - bool OpenSceneGraphWidgetBodyC::Pick(const Point2dC &position, CollectionC<PickEntryC> &nodes) + //! Pick a position in the window + bool OpenSceneGraphWidgetBodyC::PickPosition(float row,float col,osgUtil::LineSegmentIntersector::Intersections &intersections) { - osgUtil::LineSegmentIntersector::Intersections intersections; - + if(!m_osgViewer.valid()) + return false; + // Convert coordinate systems. RavlN::Index2dC size = Size(); - if(!nodes.IsValid()) - nodes = CollectionC<PickEntryC>(32); - - // Coordinate system!? - float x = position.Col(); - float y = size.Row() - position.Row(); - -#if 1 + float x = col; + float y = size.Row().V() - row; + osg::ref_ptr< osgUtil::LineSegmentIntersector > picker = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, x, y); osgUtil::IntersectionVisitor iv(picker.get()); m_osgViewer->getCamera()->accept(iv); - if (picker->containsIntersections()) - { - intersections = picker->getIntersections(); -#else - // This doesn't seem to work correctly after the canvas has been scaled. - if(m_osgViewer->computeIntersections(x, y, intersections)) { -#endif - for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin(); - hitr != intersections.end(); - ++hitr) { - NodeC::RefT ravlNode; - if(!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty())) { - // the geodes are identified by name. - NodeC::GetNode(hitr->nodePath.back(),ravlNode); -#if 1 - std::cout << "Object Geode \"" << hitr->nodePath.back()->getName() << "\"" << std::endl; -#endif - } else if(hitr->drawable.valid()) { - //NodeC::GetNode(hitr->drawable.get(),ravlNode); -#if 1 - std::cout << "Object Drawable \"" << hitr->drawable->className() << "\"" << std::endl; -#endif - } - Point3dC lp(hitr->getLocalIntersectPoint()[0],hitr->getLocalIntersectPoint()[1],hitr->getLocalIntersectPoint()[2]); - Point3dC wp(hitr->getWorldIntersectPoint()[0],hitr->getWorldIntersectPoint()[1],hitr->getWorldIntersectPoint()[2]); - nodes.Append(PickEntryC(*ravlNode,lp,wp)); -#if 0 - using namespace osg; - os << " local coords vertex(" << hitr->getLocalIntersectPoint() << ")" << " normal(" << hitr->getLocalIntersectNormal() << ")" << std::endl; - os << " world coords vertex(" << hitr->getWorldIntersectPoint() << ")" << " normal(" << hitr->getWorldIntersectNormal() << ")" << std::endl; - const osgUtil::LineSegmentIntersector::Intersection::IndexList& vil = hitr->indexList; - for(unsigned int i = 0; i < vil.size(); ++i) { - os << " vertex indices [" << i << "] = " << vil[i] << std::endl; - } -#endif - } - } + if (!picker->containsIntersections()) + return false; + intersections = picker->getIntersections(); return true; } + bool OpenSceneGraphWidgetBodyC::OnConfigure() { if (!widget || !m_osgViewer) Modified: main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.hh =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.hh 2011-03-31 09:10:35 UTC (rev 8015) +++ main/Ravl/Contrib/OpenSceneGraph/OpenSceneGraphWidget.hh 2011-04-01 13:42:04 UTC (rev 8016) @@ -30,34 +30,6 @@ using RavlN::Point3dC; using RavlN::CollectionC; - //! Pick entry - class PickEntryC { - public: - // Default constructor - PickEntryC() - {} - - // Constructor - PickEntryC(const NodeC &node,const Point3dC &localIntersection,const Point3dC &worldIntersection); - - //! Access node. - const NodeC::RefT &Node() const - { return m_node; } - - //! Access intersection in the nodes coordinate system - const Point3dC &LocalIntersection() const - { return m_localIntersection; } - - //! Access intersection in the world coordinate system - const Point3dC &WorldIntersection() const - { return m_localIntersection; } - - protected: - NodeC::RefT m_node; - Point3dC m_localIntersection; - Point3dC m_worldIntersection; - }; - //! userlevel=Normal //: GTK widget containing an OpenSceneGraph viewer. @@ -89,12 +61,12 @@ bool SetColour(const RavlImageN::RealRGBAValueC &colour); //: Set the viewer background colour. - //! Pick a point from the view. - bool Pick(const Point2dC &position,CollectionC<PickEntryC> &nodes); + bool PickPosition(float row,float col,osgUtil::LineSegmentIntersector::Intersections &intersections); + //: Get a list of intersections from a pick position. - //! Get pointer to viewer. osgViewer::Viewer *Viewer() { return m_osgViewer.get(); } + //: Get pointer to viewer. protected: bool CommonCreate(GtkWidget *newWidget = NULL); @@ -152,14 +124,14 @@ bool SetColour(const RavlImageN::RealRGBAValueC &colour) { return Body().SetColour(colour); } //: Set the viewer background colour. - - //! Pick a point from the view. - bool Pick(const Point2dC &position,CollectionC<PickEntryC> &nodes) - { return Body().Pick(position,nodes); } - //! Get pointer to viewer. + bool PickPosition(float row,float col,osgUtil::LineSegmentIntersector::Intersections &intersections) + { return Body().PickPosition(row,col,intersections); } + //: Get a list of intersections from a pick position. + osgViewer::Viewer *Viewer() { return Body().Viewer(); } + //: Get pointer to viewer. protected: OpenSceneGraphWidgetBodyC &Body() Modified: main/Ravl/Contrib/OpenSceneGraph/defs.mk =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-03-31 09:10:35 UTC (rev 8015) +++ main/Ravl/Contrib/OpenSceneGraph/defs.mk 2011-04-01 13:42:04 UTC (rev 8016) @@ -15,11 +15,11 @@ HEADERS=Drawable.hh Sphere.hh Image.hh ImageByteRGBA.hh ImageByteRGB.hh Text.hh TriMesh.hh TexTriMesh.hh \ Node.hh Geode.hh Group.hh Transform.hh ModelFile.hh HUD.hh \ - OpenSceneGraphWidget.hh Box.hh + OpenSceneGraphWidget.hh Box.hh CanvasManipulator.hh SOURCES=Drawable.cc Sphere.cc Image.cc ImageByteRGBA.cc ImageByteRGB.cc Text.cc TriMesh.cc TexTriMesh.cc \ Node.cc Geode.cc Group.cc Transform.cc ModelFile.cc HUD.cc \ - OpenSceneGraphWidget.cc Box.cc + OpenSceneGraphWidget.cc Box.cc CanvasManipulator.cc PLIB=RavlGUIOpenSceneGraph Modified: main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidget.cc =================================================================== --- main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidget.cc 2011-03-31 09:10:35 UTC (rev 8015) +++ main/Ravl/Contrib/OpenSceneGraph/exOpenSceneGraphWidget.cc 2011-04-01 13:42:04 UTC (rev 8016) @@ -100,8 +100,6 @@ bool pressFunc(MouseEventC &me,OpenSceneGraphWidgetC &osgWidget) { cerr << "Press " << me.Row() << " " << me.Col() << "\n"; - RavlN::CollectionC<RavlOSGN::PickEntryC> nodes; - osgWidget.Pick(Point2dC(me.Row(),me.Col()),nodes); return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ee...@us...> - 2011-03-31 09:10:42
|
Revision: 8015 http://ravl.svn.sourceforge.net/ravl/?rev=8015&view=rev Author: ees1wc Date: 2011-03-31 09:10:35 +0000 (Thu, 31 Mar 2011) Log Message: ----------- Doc update Modified Paths: -------------- main/Ravl/PatternRec/SVM/CommonKernels.hh main/Ravl/PatternRec/SVM/KernelFunc.hh main/Ravl/PatternRec/SVM/Ravl.API.Pattern_Recognition.Classifier.SVM.eht Modified: main/Ravl/PatternRec/SVM/CommonKernels.hh =================================================================== --- main/Ravl/PatternRec/SVM/CommonKernels.hh 2011-03-30 09:43:13 UTC (rev 8014) +++ main/Ravl/PatternRec/SVM/CommonKernels.hh 2011-03-31 09:10:35 UTC (rev 8015) @@ -15,7 +15,7 @@ //! lib = RavlSVM //! date = "3/07/03" //! rcsid = "$Id: CommonKernels.hh 12208 2008-02-07 12:54:07Z alex $" -//! docentry = "Ravl.API.Pattern_Recognition.Classifier.SVM" +//! docentry = "Ravl.API.Pattern_Recognition.Classifier.SVM.Kernel functions" ////////////////////////////////////////////////////////////////////////////// #include "Ravl/PatternRec/KernelFunc.hh" Modified: main/Ravl/PatternRec/SVM/KernelFunc.hh =================================================================== --- main/Ravl/PatternRec/SVM/KernelFunc.hh 2011-03-30 09:43:13 UTC (rev 8014) +++ main/Ravl/PatternRec/SVM/KernelFunc.hh 2011-03-31 09:10:35 UTC (rev 8015) @@ -15,7 +15,7 @@ //! lib = RavlSVM //! date = "3/07/03" //! rcsid = "$Id: KernelFunc.hh 7752 2006-01-31 14:46:56Z alex $" -//! docentry = "Ravl.API.Pattern_Recognition.Classifier.SVM" +//! docentry = "Ravl.API.Pattern_Recognition.Classifier.SVM.Kernel functions" ////////////////////////////////////////////////////////////////////////////// #include "Ravl/SArray1d.hh" Modified: main/Ravl/PatternRec/SVM/Ravl.API.Pattern_Recognition.Classifier.SVM.eht =================================================================== --- main/Ravl/PatternRec/SVM/Ravl.API.Pattern_Recognition.Classifier.SVM.eht 2011-03-30 09:43:13 UTC (rev 8014) +++ main/Ravl/PatternRec/SVM/Ravl.API.Pattern_Recognition.Classifier.SVM.eht 2011-03-31 09:10:35 UTC (rev 8015) @@ -1,78 +1,87 @@ -! author="Alexey Kostin" -: Support vector machines package +<html> + <head><title>! author="Alexey Kostin" +: Support vector machines package</title></head> -<p>The package includes classes for dealing with the <i>Support vector -machines</i> (SVM) classifier. The original two classes classifier proposed -by Vapnik [<a HREF=#ref_Vapnik>1</a>] is implemented. <i>Sequential Minimal -Optimisation</i> (SMO) method proposed by Platt {<a HREF=#ref_Platt>2</a>] -is utilised for solving the quadratic optimisation problem. + <body><p>The package includes classes for dealing with the <i>Support vector + machines</i> (SVM) classifier. The original two classes classifier proposed + by Vapnik [<a>#ref_Vapnik>1</a>] is implemented. <i>Sequential Minimal + Optimisation</i> (SMO) method proposed by Platt {<a>#ref_Platt>2</a>] is + utilised for solving the quadratic optimisation problem. The package + consists of three parts, namely,</p> -The package consists of three parts, namely, -<ul> -<li> Class which designs SVM classifier -<a HREF="../Class/RavlN.DesignSvmSmoC.html">DesignSvmSmoC</a>; -<li> SVM classifier itself -<a HREF="../Class/RavlN.SvmClassifierC.html">SvmClassifierC</a>; -<li> Set of classes for kernel functions -<a HREF="../Class/RavlN.KernelFunctionC.html">KernelFunctionC</a>, -<a HREF="../Class/RavlN.LinearKernelC.html">LinearKernelC</a>, -<a HREF="../Class/RavlN.PolynomialKernelC.html">PolynomialKernelC</a>, -<a HREF="../Class/RavlN.RBFKernelC.html">RBFKernelC</a>. -</ul> + <ul> + <li> Class which designs SVM classifier + <a href="../Class/RavlN.DesignSvmSmoC.html">DesignSvmSmoC</a>;</li> + <li> SVM classifier itself + <a href="../Class/RavlN.SvmClassifierC.html">SvmClassifierC</a>;</li> + <li> Set of <a href= + "Ravl.API.Pattern_Recognition.Classifier.SVM.Kernel_functions.html"> + classes for kernel functions</a>.</li> + </ul> -The <a HREF="../Class/RavlN.DesignSvmSmoC.html">DesignSvmSmoC</a> class -basically contains implementation of SMO algorithm for calculation of Lagrangian -multipliers in dual quadratic optimisation problem. Constructor of the -class accepts -<ul> -<li>KernelFunction parameter, which defines kernel function -<li>penalty parameters Penalty1 and Penalty2 for shifting objects of -training set in case of non-separable classes -<li>parameters of SMO algorithm Tolerance and Eps -<li>LambdaThreshold parameter defining smallest value of lagrangian multiplier, -which is not rounddown to zero. -</ul> -The Apply function of the class runs SMO algorithm on training set. For convenience -Apply function can accept different set of parameters. Basically there are two -main deffeneces, namely, in object labeling: '-1' for first class (as it is -commonly adopted for SVM classifier) or '0' (Ravl style) and some functions -accept ObjectsToUse parameter that is array of object indices from whole -training set, which should be used for training. -<p>The <a HREF="../Class/RavlN.SvmClassifierC.html">SvmClassifierC</a> class -is very simple class which is just calculates the value of descriminant -function. The class has two functions Classify and ClassifySvm, the only difference -between them is in return value. Classify function supposed to be virtual -and comply with the Ravl style of labeling classes, i.e. it returns '0' for the -objects of the first class. The ClassifySvm function just returns the value of -descriminant function. -<p>Both <a HREF="../Class/RavlN.DesignSvmSmoC.html">DesignSvmSmoC</a> and -<a HREF="../Class/RavlN.SvmClassifierC.html">SvmClassifierC</a> classes use -the abstraction of Kernel Function. Three most commonly used kernel functions, -namely Linear <a HREF="../Class/RavlN.LinearKernelC.html">LinearKernelC</a>, -Polynomial <a HREF="../Class/RavlN.PolynomialKernelC.html">PolynomialKernelC</a>, -and Radial Basis Function <a HREF="../Class/RavlN.RBFKernelC.html">RBFKernelC</a> -are already included in the package. But there is possibility to use any of -your own kernels by creating new classes, which are based on -<a HREF="../Class/RavlN.KernelFunctionC.html">KernelFunctionC</a>. In case -when there is no explicit features (featureless case) there is a trick, which -still allows to use the package. Each object should have unique number or -set of numbers assocoated with it. The number should be treated as feature -or features then it is passes to the classes from the package. But the -featuresless kernel function should use the number as identificator of -the data associated with the object. + <p>The <a href="../Class/RavlN.DesignSvmSmoC.html">DesignSvmSmoC</a> class + basically contains implementation of SMO algorithm for calculation of + Lagrangian multipliers in dual quadratic optimisation problem. Constructor + of the class accepts:</p> + <ul> + <li>KernelFunction parameter, which defines kernel function</li> + <li>penalty parameters Penalty1 and Penalty2 for shifting objects of + training set in case of non-separable classes</li> + <li>parameters of SMO algorithm Tolerance and Eps</li> + <li>LambdaThreshold parameter defining smallest value of lagrangian + multiplier, which is not rounded down to zero.</li> + </ul> + <p>The <code>Apply()</code> function of the class runs the SMO algorithm + on a training set. For convenience the <code>Apply()</code> function can + accept a different set of parameters. Basically there are two main + differences, namely in object labelling: '-1' for the first class (as it is + commonly adopted for SVM classifier) or '0' (Ravl style) and some + functions accept an ObjectsToUse parameter that is an array of object + indices from the whole training set, which should be used for + training.</p> -<p> References. -<p><a NAME=ref_Vapnik></a> -1. <a HREF=http://citeseer.nj.nec.com/boser92training.html> -Bernhard E. Boser and Isabelle Guyon and Vladimir Vapnik. -A Training Algorithm for Optimal Margin Classifiers. -<i>Computational Learing Theory</i>. pp. 144-152. 1992. </a> -<p><a NAME=ref_Platt></a> -2. <a HREF=http://citeseer.nj.nec.com/platt98sequential.html> -J. Platt. Sequential minimal optimization: A fast algorithm for training -support vector machines. <i>Technical Report 98-14</i>, Microsoft Research, Redmond, -Washington, April 1998. http://www.research.microsoft.com/~jplatt/smo.html. -</a> + <p>The <a href="../Class/RavlN.SvmClassifierC.html">SvmClassifierC</a> + class is a very simple class which just calculates the value of the + discriminant function. The class has two functions: + <code>Classify()</code> and <code>ClassifySvm()</code>, the only + difference between them being in the return value. The + <code>Classify()</code> function should be virtual and comply with the + Ravl style of labelling classes, i.e. it returns '0' for the objects of + the first class. The <code>ClassifySvm()</code> function just returns the + value of discriminant function.</p> + <p>Both <a href="../Class/RavlN.DesignSvmSmoC.html">DesignSvmSmoC</a> and + <a href="../Class/RavlN.SvmClassifierC.html">SvmClassifierC</a> classes + use the abstraction of Kernel Function. Some of the most commonly used + kernel functions are already <a href= + "Ravl.API.Pattern_Recognition.Classifier.SVM.Kernel_functions.html"> + included in the package</a>. But there is possibility to use any of your + own kernels by creating new classes, based on the <a + href="../Class/RavlN.KernelFunctionC.html">KernelFunctionC</a> base + class. In the case when there is no explicit features (featureless case) + there is a trick, which still allows the use of the package. Each object + should have unique number or set of numbers associated with it. The number + should be treated as a feature or features, then it is passed to the classes + from the package. But the featureless kernel function should use the + number as identifier of the data associated with the object.</p> + + <h3> References:</h3> + + <p><a name="ref_Vapnik"></a> 1. <a + href="http://portal.acm.org/citation.cfm?id=130401"> Bernhard E. Boser + and Isabelle Guyon and Vladimir Vapnik. A Training Algorithm for Optimal + Margin Classifiers. <i>Computational Learning + Theory</i>. pp. 144-152. 1992. </a></p> + + <p><a name="ref_Platt"></a> 2. <a + href="http://research.microsoft.com/en-us/um/people/jplatt/smoTR.pdf"> + J. Platt. Sequential minimal optimization: A fast algorithm for training + support vector machines. <i>Technical Report 98-14</i>, Microsoft + Research, Redmond, Washington, April 1998. + </a></p> + + </body> +</html> + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-03-30 09:43:20
|
Revision: 8014 http://ravl.svn.sourceforge.net/ravl/?rev=8014&view=rev Author: craftit Date: 2011-03-30 09:43:13 +0000 (Wed, 30 Mar 2011) Log Message: ----------- Remove debug message. Modified Paths: -------------- main/Ravl/Core/System/XMLStream.cc Modified: main/Ravl/Core/System/XMLStream.cc =================================================================== --- main/Ravl/Core/System/XMLStream.cc 2011-03-29 15:20:54 UTC (rev 8013) +++ main/Ravl/Core/System/XMLStream.cc 2011-03-30 09:43:13 UTC (rev 8014) @@ -210,7 +210,6 @@ break; case '!': // Comment CDATA or DTD { - std::cerr << "Found <! \n"; // CDATA ? if(this->SkipWord("[CDATA[")) { ONDEBUG(std::cerr << "XMLIStreamC::ReadTag(), Found CDATA \n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2011-03-29 15:21:00
|
Revision: 8013 http://ravl.svn.sourceforge.net/ravl/?rev=8013&view=rev Author: craftit Date: 2011-03-29 15:20:54 +0000 (Tue, 29 Mar 2011) Log Message: ----------- Add support for CDATA. Modified Paths: -------------- main/Ravl/Core/Base/Stream.hh main/Ravl/Core/System/StreamParse.cc main/Ravl/Core/System/XMLStream.cc main/Ravl/Core/System/XMLTree.cc main/Ravl/Core/System/test.xml Modified: main/Ravl/Core/Base/Stream.hh =================================================================== --- main/Ravl/Core/Base/Stream.hh 2011-03-29 14:50:55 UTC (rev 8012) +++ main/Ravl/Core/Base/Stream.hh 2011-03-29 15:20:54 UTC (rev 8013) @@ -512,6 +512,10 @@ // listed in 'delim'. If end of stream is found before // returns false. + bool SkipWord(const char *word); + //: Skip to after word if it matches the characters in the stream. + //: otherwise return false and leave stream where it is. + bool SkipTo(const StringC &endStr); //: Skip through stream until endStr is found. // this leaves the stream positioned at the Modified: main/Ravl/Core/System/StreamParse.cc =================================================================== --- main/Ravl/Core/System/StreamParse.cc 2011-03-29 14:50:55 UTC (rev 8012) +++ main/Ravl/Core/System/StreamParse.cc 2011-03-29 15:20:54 UTC (rev 8013) @@ -58,7 +58,26 @@ Unget(&c,1); return true; } - + + //: Skip to after word if it matches the characters in the stream. + //: otherwise return false and leave stream where it is. + + bool IStreamC::SkipWord(const char *word) { + RavlAssert(word != 0); + const char *at = word; + StringC buff; + while(*at != 0) { + char c = GetChar(); + buff += c; // Build up buffer of whats been read. + if(*at != c) { + Unget(buff,buff.size()); + return false; + } + at++; + } + return true; + } + //: Skip through stream until endStr is found. bool IStreamC::SkipTo(const StringC &endStr) { Modified: main/Ravl/Core/System/XMLStream.cc =================================================================== --- main/Ravl/Core/System/XMLStream.cc 2011-03-29 14:50:55 UTC (rev 8012) +++ main/Ravl/Core/System/XMLStream.cc 2011-03-29 15:20:54 UTC (rev 8013) @@ -208,19 +208,22 @@ emptyTag = true; ONDEBUG(cerr << "XMLIStreamC::ReadTag(), Found processing instruction. \n"); break; - case '!': // Comment or DTD + case '!': // Comment CDATA or DTD { - char nc = GetChar(); - if(nc == '-') { - char anc = GetChar(); - if(anc == '-') { // Comment... - ONDEBUG(cerr << "XMLIStreamC::ReadTag(), Found comment. \n"); - SkipTo("-->"); - continue; // Start searching for a tag again. - } + std::cerr << "Found <! \n"; + // CDATA ? + if(this->SkipWord("[CDATA[")) { + ONDEBUG(std::cerr << "XMLIStreamC::ReadTag(), Found CDATA \n"); + Content() += this->ClipTo("]]>"); + continue; + } + if(this->SkipWord("--")) { + ONDEBUG(std::cerr << "XMLIStreamC::ReadTag(), Found comment. \n"); + SkipTo("-->"); + continue; // Start searching for a tag again. } // This may have to be more clever. - ONDEBUG(cerr << "XMLIStreamC::ReadTag(), Found DTD info. \n"); + ONDEBUG(std::cerr << "XMLIStreamC::ReadTag(), Found DTD info. \n"); SkipTo('>'); // Start searching for a tag again. continue; Modified: main/Ravl/Core/System/XMLTree.cc =================================================================== --- main/Ravl/Core/System/XMLTree.cc 2011-03-29 14:50:55 UTC (rev 8012) +++ main/Ravl/Core/System/XMLTree.cc 2011-03-29 15:20:54 UTC (rev 8013) @@ -56,6 +56,7 @@ const StringC &parentFilename, IStreamC &newIStream) { + ONDEBUG(std::cerr << "XMLTreeLoadC::OpenFile '" << theFilename << "' from '" << parentFilename << "'\n"); if(theFilename.IsEmpty()) return false; StringC filename(theFilename); @@ -67,8 +68,10 @@ StringC newFn = homeDir + filename.after('~'); ONDEBUG(std::cerr << "Trying '" << newFn << "' from '" << homeDir << "'\n"); newIStream = IStreamC(newFn); - if(newIStream.good()) + if(newIStream.good()) { + ONDEBUG(std::cerr << "Found! \n"); return true; + } } } @@ -79,8 +82,10 @@ StringC newFn = parentDir + '/' + filename; ONDEBUG(std::cerr << "Trying '" << newFn << "' from '" << parentDir << "'\n"); newIStream = IStreamC(newFn); - if(newIStream.good()) + if(newIStream.good()) { + ONDEBUG(std::cerr << "Found! \n"); return true; + } } // Try from the resource root. @@ -90,8 +95,10 @@ StringC newFn = resourceDir + '/' + filename; ONDEBUG(std::cerr << "Trying '" << newFn << "' from '" << resourceDir << "'\n"); newIStream = IStreamC(newFn); - if(newIStream.good()) + if(newIStream.good()) { + ONDEBUG(std::cerr << "Found! \n"); return true; + } } } @@ -99,7 +106,12 @@ ONDEBUG(std::cerr << "Trying '" << filename << "'\n"); newIStream = IStreamC(filename); - return newIStream.good(); + if(newIStream.good()) { + ONDEBUG(std::cerr << "Found! \n"); + return true; + } + ONDEBUG(std::cerr << "Not found! \n"); + return false; } // -------------------------------------------------------------------- Modified: main/Ravl/Core/System/test.xml =================================================================== --- main/Ravl/Core/System/test.xml 2011-03-29 14:50:55 UTC (rev 8012) +++ main/Ravl/Core/System/test.xml 2011-03-29 15:20:54 UTC (rev 8013) @@ -3,11 +3,11 @@ <!-- a comment --> <?xml fred="1" ?> <test Fred="1">test data -<xi:include href="test2.xml" xpointer="/test_file_2/nested1/*" > +<xi:include href="test2.xml" xpointer="/test_file_2/nested1/*" /> <bean> -in been +<![CDATA[in bean fred ]]>and gone </bean> before endtest </test> -<xi:include href="test2.xml" xpointer="/test_file_2/nested1" > +<xi:include href="test2.xml" xpointer="/test_file_2/nested1" /> </Contents> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |