Jean-Yves Didier

Maj osg

<!-- ALX File skeleton generated by ARCSLibMaker -->
<library>
<!-- Headers section -->
<!-- Put here all the needed headers of your components/families/types -->
<headers>
<header name="osgfamily.h"/>
<header name="osgtypes.h"/>
<header name="osgviewer.h"/>
</headers>
<!-- Components section -->
<!-- Put here all the native components your library should export -->
<components>
<component name="OSGViewer"/>
</components>
<!-- Families section -->
<!-- Put here all the exogeneous component families your library should export -->
<families>
<family name="OSGFamily"/>
</families>
<!-- Types section -->
<!-- Put here all the new types your library should export -->
<types>
<type name="osg::Vec2f" wrapper="ARCSTypeFactoryTemplate_osgVec2f"/>
<type name="osg::Vec2d" wrapper="ARCSTypeFactoryTemplate_osgVec2d"/>
<type name="osg::Vec3f" wrapper="ARCSTypeFactoryTemplate_osgVec3f"/>
<type name="osg::Vec3d" wrapper="ARCSTypeFactoryTemplate_osgVec3d"/>
<type name="osg::Vec4f" wrapper="ARCSTypeFactoryTemplate_osgVec4f"/>
<type name="osg::Vec4d" wrapper="ARCSTypeFactoryTemplate_osgVec4d"/>
<type name="osg::Quat" wrapper="ARCSTypeFactoryTemplate_osgQuat"/>
<type name="osg::Plane" wrapper="ARCSTypeFactoryTemplate_osgPlane"/>
<type name="osg::Matrixd" wrapper="ARCSTypeFactoryTemplate_osgMatrixd"/>
<type name="osg::Matrixf" wrapper="ARCSTypeFactoryTemplate_osgMatrixf"/>
</types>
</library>
win32-msvc* {
TEMPLATE = vclib
} else {
TEMPLATE = lib
}
INCLUDEPATH += $$(ARCSDIR)/include
LIBS += -L$$(ARCSDIR)/lib -larcs
CONFIG += dll link_pkgconfig
QT = core gui
PKGCONFIG += openscenegraph-osg openscenegraph-osgDB openscenegraph-osgShadow \
openscenegraph-osgViewer openscenegraph-osgManipulator \
openscenegraph-osgText openscenegraph-osgTerrain openscenegraph-osgVolume \
openscenegraph-osgAnimation openscenegraph-osgSim openscenegraph-osgFX \
openscenegraph-osgGA openscenegraph-osgQt
HEADERS += osgcomponent.h \
BinaryStreamOperator.h \
AsciiStreamOperator.h \
osgtypes.h \
osgslotwrapper.h \
osgstringserializer.h \
osgviewer.h \
osgnamedobjectvisitor.h
HEADERS += osgfamily.h
SOURCES += osgcomponent.cpp \
osgstringserializer.cpp \
osgviewer.cpp \
osgnamedobjectvisitor.cpp
SOURCES += osgfamily.cpp
DESTDIR=../../libs
DLLDESTDIR=../../libs
ALXFILE = libosg.alx
OTHER_FILES += libosg.alx
arcslibrary.output = alm_${QMAKE_FILE_BASE}.cpp
arcslibrary.input = ALXFILE
arcslibrary.commands = arcslibmaker ${QMAKE_FILE_NAME}
arcslibrary.variable_out = SOURCES
QMAKE_EXTRA_COMPILERS += arcslibrary
#include "osgcomponent.h"
#include <iostream>
#include "osgstringserializer.h"
#include "osgnamedobjectvisitor.h"
#include "osgfamily.h"
#include <osg/Group>
#include <osg/Geode>
#include <osg/Node>
#include <QStringList>
Q_DECLARE_METATYPE(osg::Object*)
QHash<int,QString> OSGComponent::typeNames;
OSGComponent::OSGComponent(osgDB::ObjectWrapper *wrapper)
{
this->wrapper = wrapper;
if (wrapper)
{
instance = wrapper->getProto()->cloneType();
processNode(instance.get(),true);
}
else
instance = 0;
if (typeNames.isEmpty())
initializeTypeNames();
wrapperFather = new QObject();
}
OSGComponent::~OSGComponent()
{
delete wrapperFather;
}
QString OSGComponent::toString()
{
return OSGStringSerializer::getInstance()->toString(instance);
}
bool OSGComponent::parseString(QString s)
{
osg::ref_ptr<osg::Object> object = OSGStringSerializer::getInstance()->parseString(s);
if (object.valid())
{
instance.swap(object);
processNode(instance.get(),true);
return true;
}
return false;
}
QStringList OSGComponent::getSignals()
{
return QStringList();
}
void OSGComponent::processNode(osg::Object *object,bool root)
{
QString prefix;
osgDB::StringList propertyNames;
std::vector<int> propertyTypes;
osgDB::ObjectWrapper* wrapper;
if (root)
{
prefix = "";
wrapper = this->wrapper;
}
else
{
prefix = QString(object->getName().data()) + ".";
QString typeName = QString(object->libraryName())+"::"+object->className();
wrapper = OSGFamily::getWrapper(typeName);
}
if (!wrapper)
return ;
wrapper->writeSchema(propertyNames,propertyTypes);
for (unsigned int i=0; i<propertyNames.size(); i++)
{
QString sltName(propertyNames[i].data());
sltName += "(";
if (typeNames.contains(propertyTypes[i]))
sltName += typeNames[propertyTypes[i]];
sltName += ")";
wrapperMap[prefix + sltName] = OSGSlotWrapperData(object,wrapper,prefix + sltName);
}
if (dynamic_cast<osg::Group*>(object))
{
QString sltName = prefix+"addChild(osg::Object*)";
wrapperMap[sltName] = OSGSlotWrapperData(object,wrapper,sltName);
sltName = prefix+"removeChildren()";
wrapperMap[sltName] = OSGSlotWrapperData(object,wrapper,sltName);
}
if (dynamic_cast<osg::Geode*>(object))
{
QString sltName = prefix+"addDrawable(osg::Object*)";
wrapperMap[sltName] = OSGSlotWrapperData(object,wrapper,sltName);
sltName = prefix+"removeDrawables()";
wrapperMap[sltName] = OSGSlotWrapperData(object,wrapper,sltName);
}
if (root)
{
osg::Node* node = dynamic_cast<osg::Node*>(object);
if (node)
{
OSGNamedObjectVisitor visitor;
node->accept(visitor);
std::vector<osg::Object*> objects = visitor.getNodeList();
for (unsigned int i=0; i< objects.size(); i++)
{
processNode(objects[i],false);
}
}
}
}
QStringList OSGComponent::getSlots()
{
QStringList sl = wrapperMap.keys();
return sl;
}
void OSGComponent::getProxySlot(QString slot, ObjectList &obj, QStringList &proxySlot)
{
OSGSlotWrapper* slotWrapper;
if (slotWrappers.contains(slot))
slotWrapper = slotWrappers[slot];
else
{
if (!wrapperMap.contains(slot))
std::cout << "wrapper map does not contain " << qPrintable(slot) << std::endl;
slotWrapper = new OSGSlotWrapper(wrapperMap[slot],wrapperFather);
slotWrappers[slot] = slotWrapper;
}
obj << slotWrapper;
QString suffix = slot.section('.',-1);
if (suffix == "addChild(osg::Object*)" || suffix == "removeChildren()"
|| suffix=="addDrawable(osg::Object*)" || suffix=="removeDrawables()")
proxySlot << slot.section('.',0,-2);
else
{
QString type = slot.section('(',-1).section(')',-1);
proxySlot << (QString("call(") + type + ")");
}
}
void OSGComponent::getProxySignal(QString /*signal*/, ObjectList &/*obj*/, QStringList &/*proxySignal*/)
{
}
bool OSGComponent::genuineInstanciate()
{
return instance != 0;
}
void OSGComponent::genuineDestroy() { }
QVariant OSGComponent::getGenuineComponentInstance()
{
QVariant var;
var.setValue(instance.get());
return var;
}
void OSGComponent::initializeTypeNames()
{
typeNames[osgDB::BaseSerializer::RW_UNDEFINED] = "Undefined"; /** */
typeNames[osgDB::BaseSerializer::RW_USER] = "UserDefined"; /** */
typeNames[osgDB::BaseSerializer::RW_OBJECT] = "osg::Object";
typeNames[osgDB::BaseSerializer::RW_IMAGE] = "osg::Image";
typeNames[osgDB::BaseSerializer::RW_LIST] = "List"; /** */
typeNames[osgDB::BaseSerializer::RW_BOOL] = "bool";
typeNames[osgDB::BaseSerializer::RW_CHAR] = "char";
typeNames[osgDB::BaseSerializer::RW_UCHAR] = "unsigned char";
typeNames[osgDB::BaseSerializer::RW_CHAR] = "char";
typeNames[osgDB::BaseSerializer::RW_UCHAR] = "unsigned char";
typeNames[osgDB::BaseSerializer::RW_SHORT] = "short";
typeNames[osgDB::BaseSerializer::RW_USHORT] = "unsigned short";
typeNames[osgDB::BaseSerializer::RW_INT] = "int";
typeNames[osgDB::BaseSerializer::RW_UINT] = "unsigned int";
typeNames[osgDB::BaseSerializer::RW_FLOAT] = "float";
typeNames[osgDB::BaseSerializer::RW_DOUBLE] = "double";
typeNames[osgDB::BaseSerializer::RW_VEC2F] = "osg::Vec2f";
typeNames[osgDB::BaseSerializer::RW_VEC2D] = "osg::Vec2d";
typeNames[osgDB::BaseSerializer::RW_VEC3F] = "osg::Vec3f";
typeNames[osgDB::BaseSerializer::RW_VEC3D] = "osg::Vec3d";
typeNames[osgDB::BaseSerializer::RW_VEC4F] = "osg::Vec4f";
typeNames[osgDB::BaseSerializer::RW_VEC4D] = "osg::Vec4d";
typeNames[osgDB::BaseSerializer::RW_QUAT] = "osg::Quat";
typeNames[osgDB::BaseSerializer::RW_PLANE] = "osg::Plane";
typeNames[osgDB::BaseSerializer::RW_MATRIXF] = "osg::Matrixf";
typeNames[osgDB::BaseSerializer::RW_MATRIXD] = "osg::Matrixd";
typeNames[osgDB::BaseSerializer::RW_MATRIX] = "osg::Matrix";
typeNames[osgDB::BaseSerializer::RW_GLENUM] = "GLenum";
typeNames[osgDB::BaseSerializer::RW_STRING] = "std::string";
typeNames[osgDB::BaseSerializer::RW_ENUM] = "Enum"; /** */
/* shortest list than documentation on the site !
Type {
RW_VEC2B, RW_VEC2UB, RW_VEC2S, RW_VEC2US,
RW_VEC2I, RW_VEC2UI, RW_VEC3B, RW_VEC3UB,
RW_VEC3S, RW_VEC3US, RW_VEC3I, RW_VEC3UI,
RW_VEC4B, RW_VEC4UB, RW_VEC4S, RW_VEC4US,
RW_VEC4I, RE_VEC4UI
}*/
}
#ifndef __OSGCOMPONENT_H__
#define __OSGCOMPONENT_H__
#include <arcs/arcsabstractcomponent.h>
#include <osg/ref_ptr>
#include <osg/Object>
#include <osgDB/ObjectWrapper>
#include "osgslotwrapper.h"
class OSGComponent : public ARCSAbstractComponent
{
public:
OSGComponent(osgDB::ObjectWrapper* wrapper=0);
~OSGComponent();
virtual QString toString();
virtual bool parseString(QString s);
virtual QStringList getSignals();
virtual QStringList getSlots();
//virtual bool loadFile(QString fn);
protected:
virtual void getProxySlot(QString slot, ObjectList &obj, QStringList &proxySlot);
virtual void getProxySignal(QString signal, ObjectList &obj, QStringList &proxySignal);
virtual bool genuineInstanciate();
virtual void genuineDestroy();
virtual QVariant getGenuineComponentInstance();
private:
void processNode(osg::Object* object , bool root=false);
static void initializeTypeNames();
osg::ref_ptr<osg::Object> instance;
osgDB::ObjectWrapper* wrapper;
QHash<QString,OSGSlotWrapperData> wrapperMap;
QHash<QString,OSGSlotWrapper*> slotWrappers;
QObject* wrapperFather;
static QHash<int,QString> typeNames;
};
#endif //__OSGCOMPONENT_H__