From 86b906e84e54e286321e46a2e8c1ea51bd341a4d Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 14 Nov 2010 22:55:55 +0000 Subject: [PATCH 1/7] Expose SimGear and OSG versions via properties too. --- src/Main/options.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Main/options.cxx b/src/Main/options.cxx index 06b2b7f89..b46dc6e4a 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -56,7 +56,9 @@ #include "util.hxx" #include "viewmgr.hxx" #include
+ #include +#include using std::string; using std::sort; @@ -237,7 +239,8 @@ fgSetDefaults () fgSetInt("/sim/multiplay/txport", 0); fgSetString("/sim/version/flightgear", FLIGHTGEAR_VERSION); - //fgSetString("/sim/version/simgear", FLIGHTGEAR_VERSION); + fgSetString("/sim/version/simgear", SG_STRINGIZE(SIMGEAR_VERSION)); + fgSetString("/sim/version/openscenegraph", osgGetVersion()); fgSetString("/sim/version/revision", REVISION); fgSetInt("/sim/version/build-number", HUDSON_BUILD_NUMBER); fgSetString("/sim/version/build-id", HUDSON_BUILD_ID); From 4d2ce8bcdf5e4459b4ec5bfb9cac821d092cd445 Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 14 Nov 2010 22:58:21 +0000 Subject: [PATCH 2/7] Include version number in DMG name --- package/mac/build-mac-nightly-dmg.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package/mac/build-mac-nightly-dmg.rb b/package/mac/build-mac-nightly-dmg.rb index 43667a44c..2930ab305 100755 --- a/package/mac/build-mac-nightly-dmg.rb +++ b/package/mac/build-mac-nightly-dmg.rb @@ -40,7 +40,7 @@ end prefixDir=Dir.pwd + "/dist" dmgDir=Dir.pwd + "/image" srcDir=Dir.pwd + "/flightgear" -dmgPath = Dir.pwd + "/fg_mac_nightly.dmg" + puts "Erasing previous image dir" `rm -rf #{dmgDir}` @@ -55,6 +55,8 @@ volName="\"FlightGear Nightly Build\"" VERSION = File.read("#{srcDir}/version").strip +dmgPath = Dir.pwd + "/fg_mac_nightly_#{VERSION}.dmg" + puts "Creating directory structure" `mkdir -p #{macosDir}` `mkdir -p #{frameworksDir}` From 38e1600bed2982cd6074c0bd56347c4323aba785 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Sun, 14 Nov 2010 15:12:58 +0100 Subject: [PATCH 3/7] add a command to print information about visible objects in the scene --- src/GUI/gui.h | 1 + src/GUI/gui_funcs.cxx | 17 ++++ src/Main/fg_commands.cxx | 8 ++ src/Main/renderer.cxx | 209 +++++++++++++++++++++++++++++++++++++++ src/Main/renderer.hxx | 5 + 5 files changed, 240 insertions(+) diff --git a/src/GUI/gui.h b/src/GUI/gui.h index 4ea7b588d..d6570c7e4 100644 --- a/src/GUI/gui.h +++ b/src/GUI/gui.h @@ -49,6 +49,7 @@ extern void guiErrorMessage(const char *txt, const sg_throwable &throwable); extern bool fgDumpSnapShot(); extern void fgDumpSceneGraph(); extern void fgDumpTerrainBranch(); +extern void fgPrintVisibleSceneInfoCommand(); extern puFont guiFnt; extern fntTexFont *guiFntHandle; diff --git a/src/GUI/gui_funcs.cxx b/src/GUI/gui_funcs.cxx index ff6971549..ccbd0a550 100644 --- a/src/GUI/gui_funcs.cxx +++ b/src/GUI/gui_funcs.cxx @@ -555,5 +555,22 @@ void fgDumpTerrainBranch() } } +void fgPrintVisibleSceneInfoCommand() +{ + static const SGPropertyNode *master_freeze + = fgGetNode("/sim/freeze/master"); + + bool freeze = master_freeze->getBoolValue(); + if ( !freeze ) { + fgSetBool("/sim/freeze/master", true); + } + + flightgear::printVisibleSceneInfo(globals->get_renderer()); + + if ( !freeze ) { + fgSetBool("/sim/freeze/master", false); + } +} + diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx index e3b6be0c0..c3c60fbec 100644 --- a/src/Main/fg_commands.cxx +++ b/src/Main/fg_commands.cxx @@ -518,6 +518,13 @@ do_dump_terrain_branch (const SGPropertyNode*) return true; } +static bool +do_print_visible_scene_info(const SGPropertyNode*) +{ + fgPrintVisibleSceneInfoCommand(); + return true; +} + /** * Built-in command: hires capture screen. */ @@ -1488,6 +1495,7 @@ static struct { { "release-cockpit-button", do_release_cockpit_button }, { "dump-scenegraph", do_dump_scene_graph }, { "dump-terrainbranch", do_dump_terrain_branch }, + { "print-visible-scene", do_print_visible_scene_info }, { "reload-shaders", do_reload_shaders }, { 0, 0 } // zero-terminated }; diff --git a/src/Main/renderer.cxx b/src/Main/renderer.cxx index e16fb3d55..6eb3d3f68 100644 --- a/src/Main/renderer.cxx +++ b/src/Main/renderer.cxx @@ -29,11 +29,18 @@ #include +#include +#include +#include +#include +#include + #include #include #include #include #include +#include #include #include #include @@ -823,5 +830,207 @@ fgDumpNodeToFile(osg::Node* node, const char* filename) { return osgDB::writeNodeFile(*node, filename); } + +namespace flightgear +{ +using namespace osg; + +class VisibleSceneInfoVistor : public NodeVisitor, CullStack +{ +public: + VisibleSceneInfoVistor() + : NodeVisitor(CULL_VISITOR, TRAVERSE_ACTIVE_CHILDREN) + { + setCullingMode(CullSettings::SMALL_FEATURE_CULLING + | CullSettings::VIEW_FRUSTUM_CULLING); + setComputeNearFarMode(CullSettings::DO_NOT_COMPUTE_NEAR_FAR); + } + + VisibleSceneInfoVistor(const VisibleSceneInfoVistor& rhs) + { + } + + META_NodeVisitor("flightgear","VisibleSceneInfoVistor") + + typedef std::map InfoMap; + + void getNodeInfo(Node* node) + { + const char* typeName = typeid(*node).name(); + classInfo[typeName]++; + const std::string& nodeName = node->getName(); + if (!nodeName.empty()) + nodeInfo[nodeName]++; + } + + void dumpInfo() + { + using namespace std; + typedef vector FreqVector; + cout << "class info:\n"; + FreqVector classes; + for (InfoMap::iterator itr = classInfo.begin(), end = classInfo.end(); + itr != end; + ++itr) + classes.push_back(itr); + sort(classes.begin(), classes.end(), freqComp); + for (FreqVector::iterator itr = classes.begin(), end = classes.end(); + itr != end; + ++itr) { + cout << (*itr)->first << " " << (*itr)->second << "\n"; + } + cout << "\nnode info:\n"; + FreqVector nodes; + for (InfoMap::iterator itr = nodeInfo.begin(), end = nodeInfo.end(); + itr != end; + ++itr) + nodes.push_back(itr); + + sort (nodes.begin(), nodes.end(), freqComp); + for (FreqVector::iterator itr = nodes.begin(), end = nodes.end(); + itr != end; + ++itr) { + cout << (*itr)->first << " " << (*itr)->second << "\n"; + } + cout << endl; + } + + void doTraversal(Camera* camera, Node* root, Viewport* viewport) + { + ref_ptr projection + = createOrReuseMatrix(camera->getProjectionMatrix()); + ref_ptr mv = createOrReuseMatrix(camera->getViewMatrix()); + if (!viewport) + viewport = camera->getViewport(); + if (viewport) + pushViewport(viewport); + pushProjectionMatrix(projection.get()); + pushModelViewMatrix(mv.get(), Transform::ABSOLUTE_RF); + root->accept(*this); + popModelViewMatrix(); + popProjectionMatrix(); + if (viewport) + popViewport(); + dumpInfo(); + } + + void apply(Node& node) + { + if (isCulled(node)) + return; + pushCurrentMask(); + getNodeInfo(&node); + traverse(node); + popCurrentMask(); + } + void apply(Group& node) + { + if (isCulled(node)) + return; + pushCurrentMask(); + getNodeInfo(&node); + traverse(node); + popCurrentMask(); + } + + void apply(Transform& node) + { + if (isCulled(node)) + return; + pushCurrentMask(); + ref_ptr matrix = createOrReuseMatrix(*getModelViewMatrix()); + node.computeLocalToWorldMatrix(*matrix,this); + pushModelViewMatrix(matrix.get(), node.getReferenceFrame()); + getNodeInfo(&node); + traverse(node); + popModelViewMatrix(); + popCurrentMask(); + } + + void apply(Camera& camera) + { + // Save current cull settings + CullSettings saved_cull_settings(*this); + + // set cull settings from this Camera + setCullSettings(camera); + // inherit the settings from above + inheritCullSettings(saved_cull_settings, camera.getInheritanceMask()); + + // set the cull mask. + unsigned int savedTraversalMask = getTraversalMask(); + bool mustSetCullMask = (camera.getInheritanceMask() + & osg::CullSettings::CULL_MASK) == 0; + if (mustSetCullMask) + setTraversalMask(camera.getCullMask()); + + osg::RefMatrix* projection = 0; + osg::RefMatrix* modelview = 0; + + if (camera.getReferenceFrame()==osg::Transform::RELATIVE_RF) { + if (camera.getTransformOrder()==osg::Camera::POST_MULTIPLY) { + projection = createOrReuseMatrix(*getProjectionMatrix() + *camera.getProjectionMatrix()); + modelview = createOrReuseMatrix(*getModelViewMatrix() + * camera.getViewMatrix()); + } + else { // pre multiply + projection = createOrReuseMatrix(camera.getProjectionMatrix() + * (*getProjectionMatrix())); + modelview = createOrReuseMatrix(camera.getViewMatrix() + * (*getModelViewMatrix())); + } + } else { + // an absolute reference frame + projection = createOrReuseMatrix(camera.getProjectionMatrix()); + modelview = createOrReuseMatrix(camera.getViewMatrix()); + } + if (camera.getViewport()) + pushViewport(camera.getViewport()); + + pushProjectionMatrix(projection); + pushModelViewMatrix(modelview, camera.getReferenceFrame()); + + traverse(camera); + + // restore the previous model view matrix. + popModelViewMatrix(); + + // restore the previous model view matrix. + popProjectionMatrix(); + + if (camera.getViewport()) popViewport(); + + // restore the previous traversal mask settings + if (mustSetCullMask) + setTraversalMask(savedTraversalMask); + + // restore the previous cull settings + setCullSettings(saved_cull_settings); + } + +protected: + // sort in reverse + static bool freqComp(const InfoMap::iterator& lhs, const InfoMap::iterator& rhs) + { + return lhs->second > rhs->second; + } + InfoMap classInfo; + InfoMap nodeInfo; +}; + +bool printVisibleSceneInfo(FGRenderer* renderer) +{ + osgViewer::Viewer* viewer = renderer->getViewer(); + VisibleSceneInfoVistor vsv; + Viewport* vp = 0; + if (!viewer->getCamera()->getViewport() && viewer->getNumSlaves() > 0) { + const View::Slave& slave = viewer->getSlave(0); + vp = slave._camera->getViewport(); + } + vsv.doTraversal(viewer->getCamera(), viewer->getSceneData(), vp); + return true; +} +} // end of renderer.cxx diff --git a/src/Main/renderer.hxx b/src/Main/renderer.hxx index 5fd8e9b36..2ed51be1a 100644 --- a/src/Main/renderer.hxx +++ b/src/Main/renderer.hxx @@ -81,4 +81,9 @@ protected: bool fgDumpSceneGraphToFile(const char* filename); bool fgDumpTerrainBranchToFile(const char* filename); +namespace flightgear +{ +bool printVisibleSceneInfo(FGRenderer* renderer); +} + #endif From 9bf4c887d4f51d2d52e90667b9a6eda064fe5c62 Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 14 Nov 2010 23:25:06 +0000 Subject: [PATCH 4/7] Windows version.h generation script. --- scripts/tools/version.bat | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 scripts/tools/version.bat diff --git a/scripts/tools/version.bat b/scripts/tools/version.bat new file mode 100644 index 000000000..433192b90 --- /dev/null +++ b/scripts/tools/version.bat @@ -0,0 +1,25 @@ + +REM + +ECHO OFF + +SET /P FLIGHTGEAR_VERSION= %Header% + +ECHO #define FLIGHTGEAR_VERSION "%FLIGHTGEAR_VERSION%" >> %Header% +ECHO #define HUDSON_BUILD_ID "%HUDSON_BUILD_ID%" >> %Header% +ECHO #define HUDSON_BUILD_NUMBER %HUDSON_BUILD_NUMBER% >> %Header% +ECHO #define REVISION "%REVISION%" >> %Header% + + + From 5bb247d40a162930e47eb6f54cc0bd3a77201cbc Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 14 Nov 2010 23:32:37 +0000 Subject: [PATCH 5/7] Fix syntax for IF DEFINED conditionals --- scripts/tools/version.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tools/version.bat b/scripts/tools/version.bat index 433192b90..153a6734d 100644 --- a/scripts/tools/version.bat +++ b/scripts/tools/version.bat @@ -9,8 +9,8 @@ SET HUDSON_BUILD_NUMBER=0 SET HUDSON_BUILD_ID=none SET REVISION=none -IF DEFINED %BUILD_ID% SET HUDSON_BUILD_ID=%BUILD_ID% -IF DEFINED %BUILD_NUMBER% SET HUDSON_BUILD_NUMBER=%BUILD_NUMBER% +IF DEFINED BUILD_ID SET HUDSON_BUILD_ID=%BUILD_ID% +IF DEFINED BUILD_NUMBER SET HUDSON_BUILD_NUMBER=%BUILD_NUMBER% SET Header=src\Include\version.h From da32e9332ca5cac4d0d11ea180df599795b58f13 Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Mon, 15 Nov 2010 23:28:51 +0100 Subject: [PATCH 6/7] Freeze MP position during replay. Now you can replay and watch your favourite landing 101 times without pi**ing off everyone else playing MP. :) --- src/MultiPlayer/multiplaymgr.cxx | 249 +++++++++++++++++-------------- 1 file changed, 133 insertions(+), 116 deletions(-) diff --git a/src/MultiPlayer/multiplaymgr.cxx b/src/MultiPlayer/multiplaymgr.cxx index 27c455c25..1d36ec257 100644 --- a/src/MultiPlayer/multiplaymgr.cxx +++ b/src/MultiPlayer/multiplaymgr.cxx @@ -536,127 +536,144 @@ FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo) return; } - MsgBuf msgBuf; + static MsgBuf msgBuf; + static unsigned msgLen = 0; T_PositionMsg* PosMsg = msgBuf.posMsg(); strncpy(PosMsg->Model, fgGetString("/sim/model/path"), MAX_MODEL_NAME_LEN); PosMsg->Model[MAX_MODEL_NAME_LEN - 1] = '\0'; - - PosMsg->time = XDR_encode_double (motionInfo.time); - PosMsg->lag = XDR_encode_double (motionInfo.lag); - for (unsigned i = 0 ; i < 3; ++i) - PosMsg->position[i] = XDR_encode_double (motionInfo.position(i)); - SGVec3f angleAxis; - motionInfo.orientation.getAngleAxis(angleAxis); - for (unsigned i = 0 ; i < 3; ++i) - PosMsg->orientation[i] = XDR_encode_float (angleAxis(i)); - for (unsigned i = 0 ; i < 3; ++i) - PosMsg->linearVel[i] = XDR_encode_float (motionInfo.linearVel(i)); - for (unsigned i = 0 ; i < 3; ++i) - PosMsg->angularVel[i] = XDR_encode_float (motionInfo.angularVel(i)); - for (unsigned i = 0 ; i < 3; ++i) - PosMsg->linearAccel[i] = XDR_encode_float (motionInfo.linearAccel(i)); - for (unsigned i = 0 ; i < 3; ++i) - PosMsg->angularAccel[i] = XDR_encode_float (motionInfo.angularAccel(i)); - - xdr_data_t* ptr = msgBuf.properties(); - std::vector::const_iterator it; - it = motionInfo.properties.begin(); - //cout << "OUTPUT PROPERTIES\n"; - xdr_data_t* msgEnd = msgBuf.propsEnd(); - while (it != motionInfo.properties.end() && ptr + 2 < msgEnd) { - - // First element is the ID. Write it out when we know we have room for - // the whole property. - xdr_data_t id = XDR_encode_uint32((*it)->id); - // The actual data representation depends on the type - switch ((*it)->type) { - case simgear::props::INT: - case simgear::props::BOOL: - case simgear::props::LONG: - *ptr++ = id; - *ptr++ = XDR_encode_uint32((*it)->int_value); - //cout << "Prop:" << (*it)->id << " " << (*it)->type << " "<< (*it)->int_value << "\n"; - break; - case simgear::props::FLOAT: - case simgear::props::DOUBLE: - *ptr++ = id; - *ptr++ = XDR_encode_float((*it)->float_value); - //cout << "Prop:" << (*it)->id << " " << (*it)->type << " "<< (*it)->float_value << "\n"; - break; - case simgear::props::STRING: - case simgear::props::UNSPECIFIED: - { - // String is complicated. It consists of - // The length of the string - // The string itself - // Padding to the nearest 4-bytes. - const char* lcharptr = (*it)->string_value; - - if (lcharptr != 0) - { - // Add the length - ////cout << "String length: " << strlen(lcharptr) << "\n"; - uint32_t len = strlen(lcharptr); - if (len > MAX_TEXT_SIZE) - len = MAX_TEXT_SIZE; - // XXX This should not be using 4 bytes per character! - // If there's not enough room for this property, drop it - // on the floor. - if (ptr + 2 + ((len + 3) & ~3) > msgEnd) - goto escape; - //cout << "String length unint32: " << len << "\n"; - *ptr++ = id; - *ptr++ = XDR_encode_uint32(len); - if (len != 0) - { - // Now the text itself - // XXX This should not be using 4 bytes per character! - int lcount = 0; - while ((*lcharptr != '\0') && (lcount < MAX_TEXT_SIZE)) - { - *ptr++ = XDR_encode_int8(*lcharptr); - lcharptr++; - lcount++; - } - - //cout << "Prop:" << (*it)->id << " " << (*it)->type << " " << len << " " << (*it)->string_value; - - // Now pad if required - while ((lcount % 4) != 0) - { - *ptr++ = XDR_encode_int8(0); - lcount++; - //cout << "0"; - } - - //cout << "\n"; - } - } - else - { - // Nothing to encode - *ptr++ = id; - *ptr++ = XDR_encode_uint32(0); - //cout << "Prop:" << (*it)->id << " " << (*it)->type << " 0\n"; - } - } - break; - - default: - //cout << " Unknown Type: " << (*it)->type << "\n"; - *ptr++ = id; - *ptr++ = XDR_encode_float((*it)->float_value);; - //cout << "Prop:" << (*it)->id << " " << (*it)->type << " "<< (*it)->float_value << "\n"; - break; - } - - ++it; + if (fgGetBool("/sim/freeze/replay-state", true)) + { + // do not send position updates during replay + for (unsigned i = 0 ; i < 3; ++i) + { + // no movement during replay + PosMsg->linearVel[i] = XDR_encode_float (0.0); + PosMsg->angularVel[i] = XDR_encode_float (0.0); + PosMsg->linearAccel[i] = XDR_encode_float (0.0); + PosMsg->angularAccel[i] = XDR_encode_float (0.0); + } + // all other data remains unchanged (resend last state) } -escape: - unsigned msgLen = reinterpret_cast(ptr) - msgBuf.Msg; - FillMsgHdr(msgBuf.msgHdr(), POS_DATA_ID, msgLen); - mSocket->sendto(msgBuf.Msg, msgLen, 0, &mServer); + else + { + PosMsg->time = XDR_encode_double (motionInfo.time); + PosMsg->lag = XDR_encode_double (motionInfo.lag); + for (unsigned i = 0 ; i < 3; ++i) + PosMsg->position[i] = XDR_encode_double (motionInfo.position(i)); + SGVec3f angleAxis; + motionInfo.orientation.getAngleAxis(angleAxis); + for (unsigned i = 0 ; i < 3; ++i) + PosMsg->orientation[i] = XDR_encode_float (angleAxis(i)); + for (unsigned i = 0 ; i < 3; ++i) + PosMsg->linearVel[i] = XDR_encode_float (motionInfo.linearVel(i)); + for (unsigned i = 0 ; i < 3; ++i) + PosMsg->angularVel[i] = XDR_encode_float (motionInfo.angularVel(i)); + for (unsigned i = 0 ; i < 3; ++i) + PosMsg->linearAccel[i] = XDR_encode_float (motionInfo.linearAccel(i)); + for (unsigned i = 0 ; i < 3; ++i) + PosMsg->angularAccel[i] = XDR_encode_float (motionInfo.angularAccel(i)); + + xdr_data_t* ptr = msgBuf.properties(); + std::vector::const_iterator it; + it = motionInfo.properties.begin(); + //cout << "OUTPUT PROPERTIES\n"; + xdr_data_t* msgEnd = msgBuf.propsEnd(); + while (it != motionInfo.properties.end() && ptr + 2 < msgEnd) { + + // First element is the ID. Write it out when we know we have room for + // the whole property. + xdr_data_t id = XDR_encode_uint32((*it)->id); + // The actual data representation depends on the type + switch ((*it)->type) { + case simgear::props::INT: + case simgear::props::BOOL: + case simgear::props::LONG: + *ptr++ = id; + *ptr++ = XDR_encode_uint32((*it)->int_value); + //cout << "Prop:" << (*it)->id << " " << (*it)->type << " "<< (*it)->int_value << "\n"; + break; + case simgear::props::FLOAT: + case simgear::props::DOUBLE: + *ptr++ = id; + *ptr++ = XDR_encode_float((*it)->float_value); + //cout << "Prop:" << (*it)->id << " " << (*it)->type << " "<< (*it)->float_value << "\n"; + break; + case simgear::props::STRING: + case simgear::props::UNSPECIFIED: + { + // String is complicated. It consists of + // The length of the string + // The string itself + // Padding to the nearest 4-bytes. + const char* lcharptr = (*it)->string_value; + + if (lcharptr != 0) + { + // Add the length + ////cout << "String length: " << strlen(lcharptr) << "\n"; + uint32_t len = strlen(lcharptr); + if (len > MAX_TEXT_SIZE) + len = MAX_TEXT_SIZE; + // XXX This should not be using 4 bytes per character! + // If there's not enough room for this property, drop it + // on the floor. + if (ptr + 2 + ((len + 3) & ~3) > msgEnd) + goto escape; + //cout << "String length unint32: " << len << "\n"; + *ptr++ = id; + *ptr++ = XDR_encode_uint32(len); + if (len != 0) + { + // Now the text itself + // XXX This should not be using 4 bytes per character! + int lcount = 0; + while ((*lcharptr != '\0') && (lcount < MAX_TEXT_SIZE)) + { + *ptr++ = XDR_encode_int8(*lcharptr); + lcharptr++; + lcount++; + } + + //cout << "Prop:" << (*it)->id << " " << (*it)->type << " " << len << " " << (*it)->string_value; + + // Now pad if required + while ((lcount % 4) != 0) + { + *ptr++ = XDR_encode_int8(0); + lcount++; + //cout << "0"; + } + + //cout << "\n"; + } + } + else + { + // Nothing to encode + *ptr++ = id; + *ptr++ = XDR_encode_uint32(0); + //cout << "Prop:" << (*it)->id << " " << (*it)->type << " 0\n"; + } + } + break; + + default: + //cout << " Unknown Type: " << (*it)->type << "\n"; + *ptr++ = id; + *ptr++ = XDR_encode_float((*it)->float_value);; + //cout << "Prop:" << (*it)->id << " " << (*it)->type << " "<< (*it)->float_value << "\n"; + break; + } + + ++it; + } + escape: + msgLen = reinterpret_cast(ptr) - msgBuf.Msg; + FillMsgHdr(msgBuf.msgHdr(), POS_DATA_ID, msgLen); + } + if (msgLen>0) + mSocket->sendto(msgBuf.Msg, msgLen, 0, &mServer); SG_LOG(SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::SendMyPosition"); } // FGMultiplayMgr::SendMyPosition() From f33882d299ea6642a2d22c4a557b13890732a290 Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Wed, 17 Nov 2010 20:07:00 +0100 Subject: [PATCH 7/7] Update README.MSVC for 64-bit build --- docs-mini/README.MSVC | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs-mini/README.MSVC b/docs-mini/README.MSVC index 4e3e835b6..83f208a46 100644 --- a/docs-mini/README.MSVC +++ b/docs-mini/README.MSVC @@ -106,6 +106,9 @@ it in a scheduled task. To do that : 64bit environment (Vista 64-bit or Windows7 64-bit) You should see : "Setting environment for using Microsoft Visual Studio 2008 x86 tools." printed in the console + ( To start 64-bit build, the right environment is set with : + "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" amd64 + ) 3. cd to the FlightGear project directory : D: cd \FGFSDevel\FlightGear\projects\VC90 (for example)