OK, I found a way to solve this issue:
in src/osgPlugins/OpenFlight/Registry.h add the following lines before the
closing namespace bracket:
Code:
extern "C"
{
typedef void (* CRecordFunction) (void);
}
struct RecordFunctionProxy
{
RecordFunctionProxy(CRecordFunction function) { (function)(); }
};
#define USE_FLTRECORD(recname, opcode) \
extern "C" void osgfltrec_##recname_##opcode(void); \
static flt::RecordFunctionProxy
proxy_fltrecord_##recname_##opcode(osgfltrec_##recname_##opcode);
#define REGISTER_FLTRECORD(recname, opcode) \
extern "C" void osgfltrec_##recname_##opcode(void) {} \
static flt::RegisterRecordProxy<recname>
g_proxy_fltrecord_##recname_##opcode(opcode);
Then, in the OpenFlight plugin .cpp files, replace all "RegisterRecordProxy..."
declaration with the following lines:
Code:
//RegisterRecordProxy<PushAttribute> g_PushAttribute(PUSH_ATTRIBUTE_OP);
REGISTER_FLTRECORD(PushAttribute, PUSH_ATTRIBUTE_OP);
Finally, in your own project, include the OpenFlight plugin "record.h" file,
and after the "USE_PLUGIN" macros add the following ones (one per record type):
Code:
USE_FLTRECORD(Comment, COMMENT_OP);
USE_FLTRECORD(LongID, LONG_ID_OP);
USE_FLTRECORD(Matrix, MATRIX_OP);
USE_FLTRECORD(Multitexture, MULTITEXTURE_OP);
USE_FLTRECORD(UVList, UV_LIST_OP);
USE_FLTRECORD(Replicate, REPLICATE_OP);
USE_FLTRECORD(DummyRecord, OLD_TRANSLATE2_OP);
USE_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_POINT_OP);
USE_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_EDGE_OP);
USE_FLTRECORD(DummyRecord, OLD_SCALE_OP);
USE_FLTRECORD(DummyRecord, OLD_TRANSLATE_OP);
USE_FLTRECORD(DummyRecord, OLD_NONUNIFORM_SCALE_OP);
USE_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_POINT2_OP);
USE_FLTRECORD(DummyRecord, OLD_ROTATE_SCALE_TO_POINT_OP);
USE_FLTRECORD(DummyRecord, OLD_PUT_TRANSFORM_OP);
USE_FLTRECORD(DummyRecord, OLD_BOUNDING_BOX_OP);
USE_FLTRECORD(DummyRecord, INDEXED_STRING_OP);
USE_FLTRECORD(DummyRecord, ROAD_ZONE_OP);
USE_FLTRECORD(DummyRecord, ROTATE_ABOUT_EDGE_OP);
USE_FLTRECORD(DummyRecord, TRANSLATE_OP);
USE_FLTRECORD(DummyRecord, NONUNIFORM_SCALE_OP);
USE_FLTRECORD(DummyRecord, ROTATE_ABOUT_POINT_OP);
USE_FLTRECORD(DummyRecord, ROTATE_SCALE_TO_POINT_OP);
USE_FLTRECORD(DummyRecord, PUT_TRANSFORM_OP);
USE_FLTRECORD(DummyRecord, GENERAL_MATRIX_OP);
USE_FLTRECORD(DummyRecord, VECTOR_OP);
USE_FLTRECORD(DummyRecord, BOUNDING_BOX_OP);
USE_FLTRECORD(DummyRecord, BOUNDING_SPHERE_OP);
USE_FLTRECORD(DummyRecord, BOUNDING_CYLINDER_OP);
USE_FLTRECORD(DummyRecord, BOUNDING_CONVEX_HULL_OP);
USE_FLTRECORD(DummyRecord, BOUNDING_HISTOGRAM);
USE_FLTRECORD(DummyRecord, BOUNDING_VOLUME_CENTER_OP);
USE_FLTRECORD(DummyRecord, BOUNDING_VOLUME_ORIENTATION_OP);
USE_FLTRECORD(DummyRecord, HISTOGRAM_BOUNDING_VOLUME_OP);
USE_FLTRECORD(PushLevel, PUSH_LEVEL_OP);
USE_FLTRECORD(PopLevel, POP_LEVEL_OP);
USE_FLTRECORD(PushSubface, PUSH_SUBFACE_OP);
USE_FLTRECORD(PopSubface, POP_SUBFACE_OP);
USE_FLTRECORD(PushExtension, PUSH_EXTENSION_OP);
USE_FLTRECORD(PopExtension, POP_EXTENSION_OP);
USE_FLTRECORD(PushAttribute, PUSH_ATTRIBUTE_OP);
USE_FLTRECORD(PopAttribute, POP_ATTRIBUTE_OP);
USE_FLTRECORD(Face, FACE_OP);
USE_FLTRECORD(VertexListRecord, VERTEX_LIST_OP);
USE_FLTRECORD(MorphVertexList, MORPH_VERTEX_LIST_OP);
USE_FLTRECORD(Mesh, MESH_OP);
USE_FLTRECORD(LocalVertexPool, LOCAL_VERTEX_POOL_OP);
USE_FLTRECORD(MeshPrimitive, MESH_PRIMITIVE_OP);
USE_FLTRECORD(LightPoint, LIGHT_POINT_OP);
USE_FLTRECORD(IndexedLightPoint, INDEXED_LIGHT_POINT_OP);
USE_FLTRECORD(LightPointSystem, LIGHT_POINT_SYSTEM_OP);
USE_FLTRECORD(VertexPalette, VERTEX_PALETTE_OP);
USE_FLTRECORD(ColorPalette, COLOR_PALETTE_OP);
USE_FLTRECORD(NameTable, NAME_TABLE_OP);
USE_FLTRECORD(MaterialPalette, MATERIAL_PALETTE_OP);
USE_FLTRECORD(OldMaterialPalette, OLD_MATERIAL_PALETTE_OP);
USE_FLTRECORD(TexturePalette, TEXTURE_PALETTE_OP);
USE_FLTRECORD(EyepointAndTrackplanePalette, EYEPOINT_AND_TRACKPLANE_PALETTE_OP);
USE_FLTRECORD(LinkagePalette, LINKAGE_PALETTE_OP);
USE_FLTRECORD(SoundPalette, SOUND_PALETTE_OP);
USE_FLTRECORD(LightSourcePalette, LIGHT_SOURCE_PALETTE_OP);
USE_FLTRECORD(LightPointAppearancePalette, LIGHT_POINT_APPEARANCE_PALETTE_OP);
USE_FLTRECORD(LightPointAnimationPalette, LIGHT_POINT_ANIMATION_PALETTE_OP);
USE_FLTRECORD(LineStylePalette, LINE_STYLE_PALETTE_OP);
USE_FLTRECORD(TextureMappingPalette, TEXTURE_MAPPING_PALETTE_OP);
USE_FLTRECORD(ShaderPalette, SHADER_PALETTE_OP);
USE_FLTRECORD(Header, HEADER_OP);
USE_FLTRECORD(Group, GROUP_OP);
USE_FLTRECORD(DegreeOfFreedom, DOF_OP);
USE_FLTRECORD(LevelOfDetail, LOD_OP);
USE_FLTRECORD(OldLevelOfDetail, OLD_LOD_OP);
USE_FLTRECORD(Switch, SWITCH_OP);
USE_FLTRECORD(ExternalReference, EXTERNAL_REFERENCE_OP);
USE_FLTRECORD(InstanceDefinition, INSTANCE_DEFINITION_OP);
USE_FLTRECORD(InstanceReference, INSTANCE_REFERENCE_OP);
USE_FLTRECORD(Extension, EXTENSION_OP);
USE_FLTRECORD(Object, OBJECT_OP);
USE_FLTRECORD(LightSource, LIGHT_SOURCE_OP);
USE_FLTRECORD(DummyRecord, 103);
USE_FLTRECORD(DummyRecord, 104);
USE_FLTRECORD(DummyRecord, 117);
USE_FLTRECORD(DummyRecord, 118);
USE_FLTRECORD(DummyRecord, 120);
USE_FLTRECORD(DummyRecord, 121);
USE_FLTRECORD(DummyRecord, 124);
USE_FLTRECORD(DummyRecord, 125);
USE_FLTRECORD(RoadSegment, ROAD_SEGMENT_OP);
USE_FLTRECORD(RoadConstruction, ROAD_CONSTRUCTION_OP);
USE_FLTRECORD(RoadPath, ROAD_PATH_OP);
USE_FLTRECORD(VertexC, VERTEX_C_OP);
USE_FLTRECORD(VertexCN, VERTEX_CN_OP);
USE_FLTRECORD(VertexCT, VERTEX_CT_OP);
USE_FLTRECORD(VertexCNT, VERTEX_CNT_OP);
USE_FLTRECORD(AbsoluteVertex, OLD_ABSOLUTE_VERTEX_OP);
USE_FLTRECORD(ShadedVertex, OLD_SHADED_VERTEX_OP);
USE_FLTRECORD(NormalVertex, OLD_NORMAL_VERTEX_OP);
I am new to OSG, so I have no idea how to submit a patch. I guess it would be
useful to add this in the main trunk, as maintaining this record list at the
application level is quite painful (in the case new records are added in OSG).
Cheers,
Greg
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=12960#12960
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org