From: <spo...@us...> - 2007-04-01 18:01:19
|
Revision: 346 http://svn.sourceforge.net/opengate/?rev=346&view=rev Author: spom_spom Date: 2007-04-01 11:01:19 -0700 (Sun, 01 Apr 2007) Log Message: ----------- add interpolation/extrapolation for movement over net. Clearyfy the code a bit. For further infos see Redme. Modified Paths: -------------- branches/ogsector/Readme branches/ogsector/ToDo branches/ogsector/externals/ois-1.0RC1/Makefile.in branches/ogsector/runClient.sh branches/ogsector/src/InputManager.h branches/ogsector/src/Makefile.am branches/ogsector/src/Makefile.in branches/ogsector/src/Sector.cpp branches/ogsector/src/Sector.h branches/ogsector/src/SectorClient.cpp branches/ogsector/src/SectorClient.h branches/ogsector/src/SectorClientFrameListener.cpp branches/ogsector/src/SectorClientFrameListener.h branches/ogsector/src/SectorObjects.cpp branches/ogsector/src/SectorObjects.h branches/ogsector/src/common.h branches/ogsector/src/networkClient.cpp branches/ogsector/src/networkClient.h branches/ogsector/src/networkServer.cpp branches/ogsector/src/networkServer.h branches/ogsector/src/ogsectorclient.cpp Added Paths: ----------- branches/ogsector/src/common.cpp branches/ogsector/src/networkProtocol.h Removed Paths: ------------- branches/ogsector/src/network.cpp branches/ogsector/src/network.h branches/ogsector/src/network_protocol.h Modified: branches/ogsector/Readme =================================================================== --- branches/ogsector/Readme 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/Readme 2007-04-01 18:01:19 UTC (rev 346) @@ -1,8 +1,19 @@ -Do not fly online!! -At test Nr.1 my router died 2 times. -Lost packets lead to crasy behaviour of the vessels. +-- 0.0.2 -- +Not yet testet with other players +need test Nr.2 ;) +- changed netprotocol to TCP (my router hangs with udp, I dont know why), port: 1234 +- add simple interpolation and extrapolation for smooth movement at higher pings or packetloss +(spawned ships still jiggle a bit) +- clear register/deregister of spawns and playerships +- add network protocol for: registering ships, ship status changed, ship hit by ammo +-- 0.0.1 -- +do not fly online +At test Nr.1 my router died 2 times. +Lost packets lead to crazy behaviour of the vessels. + +----------------------------------------------------------------------- For installation: you will need: @@ -15,29 +26,6 @@ sh genExternals.sh all cd .. -You have to take care that your LD_LIBRARY_PATH knows the external libs -There are several ways to achive this: - ---create a personal lib path and link the libraries - - mkdir $(HOME)/lib - cd ~/lib - ln -s ../src/ogsector/externals/lib/libOIS-1.0.0.so - ln -s ../src/ogsector/externals/lib/libgrapple-1.0.so.0 - ln -s ../src/ogsector/externals/lib/libOpcode.so - ln -s ../src/ogsector/externals/lib/libOgreOpcode.so - - export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH: - ---or you can set the LD_LIBRARY_PATH to the external libs - - export LD_LIBRARY_PATH=$HOME/src/ogsector/externals/lib:$LD_LIBRARY_PATH - ---or you can link the libs to common know libpaths - -or ... - - For building ogsector simple run: ./bootstrap ./configure @@ -49,10 +37,14 @@ ogre.cfg runClient.sh +then ./runClient.sh +# start a server (optional) +./runServer.sh -You can test the openALsoundManager +If you want to test the openALsoundManager you have to take care that your LD_LIBRARY_PATH knows the external libs + src/testopenalmanager Enjoy this first technical proof of concept. Modified: branches/ogsector/ToDo =================================================================== --- branches/ogsector/ToDo 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/ToDo 2007-04-01 18:01:19 UTC (rev 346) @@ -130,7 +130,6 @@ - proper background sound - sounds: ammo (fired/hit), explosion (sound in space!! "funny"), thruster - BUGS: # - (linux)changing mousefocus by < Alt-TAB > lost key-repeat # OIS disables autorepeat, fire `xset r on` to enable Modified: branches/ogsector/externals/ois-1.0RC1/Makefile.in =================================================================== --- branches/ogsector/externals/ois-1.0RC1/Makefile.in 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/externals/ois-1.0RC1/Makefile.in 2007-04-01 18:01:19 UTC (rev 346) @@ -160,8 +160,7 @@ check-recursive installcheck-recursive DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/configure Makefile.am \ OIS.pc.in acinclude.m4 aclocal.m4 config.guess config.sub \ - configure configure.ac depcomp install-sh ltmain.sh missing \ - mkinstalldirs + configure.ac depcomp install-sh ltmain.sh missing mkinstalldirs DIST_SUBDIRS = $(SUBDIRS) all: all-recursive Modified: branches/ogsector/runClient.sh =================================================================== --- branches/ogsector/runClient.sh 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/runClient.sh 2007-04-01 18:01:19 UTC (rev 346) @@ -4,6 +4,11 @@ HOSTNAME='localhost' +[ $# -gt 0 ] && USERNAME=$1 + +[ $# -gt 1 ] && HOSTNAME=$2 + export LD_LIBRARY_PATH=./externals/lib:$LD_LIBRARY_PATH +echo "starting client for user: $USERNAME and looking for host: $HOSTNAME" ./src/ogsectorclient $USERNAME $HOSTNAME Modified: branches/ogsector/src/InputManager.h =================================================================== --- branches/ogsector/src/InputManager.h 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/InputManager.h 2007-04-01 18:01:19 UTC (rev 346) @@ -9,50 +9,50 @@ #include <OgreRenderWindow.h> #if defined OIS_WIN32_PLATFORM -# define WIN32_LEAN_AND_MEAN -# include "windows.h" -# include "resource.h" - LRESULT DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +#define WIN32_LEAN_AND_MEAN +#include "windows.h" +#include "resource.h" +LRESULT DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); #elif defined OIS_LINUX_PLATFORM -# include <X11/Xlib.h> - void checkX11Events(); +#include <X11/Xlib.h> +void checkX11Events(); #endif class InputManager : public OIS::KeyListener, public OIS::MouseListener, public OIS::JoyStickListener { public: - virtual ~InputManager( void ); + virtual ~InputManager( void ); - void initialise( Ogre::RenderWindow *renderWindow ); - void capture( void ); - - void addKeyListener( OIS::KeyListener *keyListener, const std::string& instanceName ); - void addMouseListener( OIS::MouseListener *mouseListener, const std::string& instanceName ); - void addJoystickListener( OIS::JoyStickListener *joystickListener, const std::string& instanceName ); - - void removeKeyListener( const std::string & instanceName ); - void removeMouseListener( const std::string & instanceName ); - void removeJoystickListener( const std::string & instanceName ); - + void initialise( Ogre::RenderWindow *renderWindow ); + void capture( void ); + + void addKeyListener( OIS::KeyListener *keyListener, const std::string& instanceName ); + void addMouseListener( OIS::MouseListener *mouseListener, const std::string& instanceName ); + void addJoystickListener( OIS::JoyStickListener *joystickListener, const std::string& instanceName ); + + void removeKeyListener( const std::string & instanceName ); + void removeMouseListener( const std::string & instanceName ); + void removeJoystickListener( const std::string & instanceName ); + void removeKeyListener( OIS::KeyListener * keyListener ); - void removeMouseListener( OIS::MouseListener * mouseListener ); - void removeJoystickListener( OIS::JoyStickListener * joystickListener ); - - void removeAllListeners( void ); - void removeAllKeyListeners( void ); - void removeAllMouseListeners( void ); - void removeAllJoystickListeners( void ); - - void setWindowExtents( int width, int height ); - - OIS::Mouse* getMouse( void ); - OIS::Keyboard* getKeyboard( void ); - OIS::JoyStick* getJoystick( unsigned int index ); - - int getNumOfJoysticks( void ); - - static InputManager* getSingletonPtr( void ); - + void removeMouseListener( OIS::MouseListener * mouseListener ); + void removeJoystickListener( OIS::JoyStickListener * joystickListener ); + + void removeAllListeners( void ); + void removeAllKeyListeners( void ); + void removeAllMouseListeners( void ); + void removeAllJoystickListeners( void ); + + void setWindowExtents( int width, int height ); + + OIS::Mouse* getMouse( void ); + OIS::Keyboard* getKeyboard( void ); + OIS::JoyStick* getJoystick( unsigned int index ); + + int getNumOfJoysticks( void ); + + static InputManager* getSingletonPtr( void ); + private: InputManager( void ); InputManager( const InputManager & input ) { } Modified: branches/ogsector/src/Makefile.am =================================================================== --- branches/ogsector/src/Makefile.am 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/Makefile.am 2007-04-01 18:01:19 UTC (rev 346) @@ -6,6 +6,7 @@ ogsectorclient_SOURCES = \ ogsectorclient.cpp \ common.h \ + common.cpp \ network_protocol.h \ Sector.h \ Sector.cpp \ @@ -23,6 +24,7 @@ ogsectorserver_SOURCES = \ ogsectorserver.cpp \ common.h \ + common.cpp \ network_protocol.h \ networkServer.h \ networkServer.cpp Modified: branches/ogsector/src/Makefile.in =================================================================== --- branches/ogsector/src/Makefile.in 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/Makefile.in 2007-04-01 18:01:19 UTC (rev 346) @@ -48,13 +48,13 @@ am__installdirs = "$(DESTDIR)$(bindir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) -am_ogsectorclient_OBJECTS = ogsectorclient.$(OBJEXT) Sector.$(OBJEXT) \ - SectorClient.$(OBJEXT) SectorClientFrameListener.$(OBJEXT) \ - InputManager.$(OBJEXT) networkClient.$(OBJEXT) \ - SectorObjects.$(OBJEXT) +am_ogsectorclient_OBJECTS = ogsectorclient.$(OBJEXT) common.$(OBJEXT) \ + Sector.$(OBJEXT) SectorClient.$(OBJEXT) \ + SectorClientFrameListener.$(OBJEXT) InputManager.$(OBJEXT) \ + networkClient.$(OBJEXT) SectorObjects.$(OBJEXT) ogsectorclient_OBJECTS = $(am_ogsectorclient_OBJECTS) ogsectorclient_LDADD = $(LDADD) -am_ogsectorserver_OBJECTS = ogsectorserver.$(OBJEXT) \ +am_ogsectorserver_OBJECTS = ogsectorserver.$(OBJEXT) common.$(OBJEXT) \ networkServer.$(OBJEXT) ogsectorserver_OBJECTS = $(am_ogsectorserver_OBJECTS) ogsectorserver_LDADD = $(LDADD) @@ -171,6 +171,7 @@ ogsectorclient_SOURCES = \ ogsectorclient.cpp \ common.h \ + common.cpp \ network_protocol.h \ Sector.h \ Sector.cpp \ @@ -188,6 +189,7 @@ ogsectorserver_SOURCES = \ ogsectorserver.cpp \ common.h \ + common.cpp \ network_protocol.h \ networkServer.h \ networkServer.cpp @@ -274,6 +276,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectorClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectorClientFrameListener.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectorObjects.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/networkClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/networkServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogsectorclient.Po@am__quote@ Modified: branches/ogsector/src/Sector.cpp =================================================================== --- branches/ogsector/src/Sector.cpp 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/Sector.cpp 2007-04-01 18:01:19 UTC (rev 346) @@ -2,15 +2,16 @@ namespace OpenGate{ -Sector::Sector( Ogre::SceneManager * sceneMgr ) : sceneMgr_( sceneMgr ){ +Sector::Sector( Ogre::SceneManager * sceneMgr, Network * network ) : sceneMgr_( sceneMgr ), network_( network ){ sectorname_ = "Testsector"; + avatarDeathSequenceTime_ = 0.0; sceneMgr_->setAmbientLight( Ogre::ColourValue(0.5, 0.5, 0.5) ); - //** Create a skybox + //** Create a skybox; sceneMgr_->setSkyBox( true, "OpenGate/SimpleSkyBox1", 100 ); - //** Create a light + //** Create a light; Ogre::Light * l = sceneMgr_->createLight("MainLight"); // Accept default settings: point light, white diffuse, just set position @@ -18,7 +19,6 @@ // other objects, but I don't l->setPosition( 20, 80, 50 ); - new OgreOpcode::CollisionManager( sceneMgr_ ); OgreOpcode::CollisionManager::getSingletonPtr()->addCollClass( "SectorObject" ); OgreOpcode::CollisionManager::getSingletonPtr()->addCollClass( "Bullet" ); @@ -37,27 +37,14 @@ Ogre::Real( 9.6 ), Ogre::Degree( -90 ) ); -// for ( int i = 0; i < max ; i ++ ){ -// for ( int j = 0; j < max ; j ++ ){ -// for ( int k = 0; k < max ; k ++ ){ -// createStaticObject( Ogre::String("ogrehead.mesh"), -// "ogrehead" + Ogre::StringConverter::toString( i * max * max + j * max + k ), -// Ogre::Vector3( -1000 + (max/2)*10 - i*10.0, -// (max/2)*10 - j*10.0, -// (max/2)*10 - k*10.0 ), -// Ogre::Real( 5.0 ), -// Ogre::Degree( 0.0 ) ); -// } -// } -// } createStaticObject( Ogre::String("ogrehead.mesh"), - "ogreheadStation", - Ogre::Vector3( 5000, 0, 0 ), - Ogre::Real( 500.0 ), - Ogre::Degree( 0.0 ) ); + "ogreheadStation", + Ogre::Vector3( 5000, 0, 0 ), + Ogre::Real( 500.0 ), + Ogre::Degree( 0.0 ) ); - createCircle(); +// createCircle(); createStaticObject( Ogre::String("ogrehead.mesh"), @@ -76,9 +63,11 @@ } Sector::~Sector( ){ - // delete OgreOpcode::CollisionManager::getSingletonPtr(); - //** delete movableObjects_; - //** delete fixedObjects_; + delete OgreOpcode::CollisionManager::getSingletonPtr(); + + for ( std::set< SectorObject * >::iterator it = sectorObjects_.begin(); it != sectorObjects_.end(); ){ + sectorObjects_.erase( (*it++) ); + } } void Sector::update( Ogre::Real elapsedTime ){ @@ -102,41 +91,67 @@ static_cast< BaseObject * >( col2->getClientData() )->collide( static_cast< BaseObject * >( col1->getClientData() ) ); } - // std::cout << "CollisionContext attached objects: " + Ogre::StringConverter::toString(collideInSectorContext_->getAttachedObjectCount()) << std::endl; // std::cout << "CollisionContext owned objects: " + Ogre::StringConverter::toString(collideInSectorContext_->getOwnedObjectCount()) << std::endl; // std::cout << "CollisionManager shapes: " + Ogre::StringConverter::toString(OgreOpcode::CollisionManager::getSingletonPtr()->getShapeCount())<< std::endl; - + } - for ( std::set< SectorObjectMoveable * >::iterator it = movableObjects_.begin(); it != movableObjects_.end(); ){ - if ( !(*it)->update( elapsedTime ) ) { - destructMoveableObject( *it ); - movableObjects_.erase( it++ ); + // avatar_->update( elapsedTime); + + bool tmpsegfaultDebug = false; + for ( std::map< long, SectorObjectMoveable * >::iterator it = movableObjects_.begin(); it != movableObjects_.end();){ + if ( !it->second->update( elapsedTime ) ) { + tmpsegfaultDebug = true; + std::cout << "Destructing: " << it->second->name() << std::endl; + destructMoveableObject( it->second ); + it++; + std::cout << " done." << std::endl; } else ++it; } + + if ( tmpsegfaultDebug) { + std::cout << "tmpsegfaultDebug done." << std::endl; + tmpsegfaultDebug = false; + } + + if ( avatarDeathSequenceTime_ > 0 ){ + avatarDeathSequenceTime_ -= elapsedTime; + } else if ( avatarDeathSequenceTime_ > -1 ) { + spawnAvatar(); + } + } +SectorObjectMoveable * Sector::createMoveableObject( const Ogre::String & name, int userID, int childID ){ + SectorObjectMoveable * obj = new SectorObjectMoveable( name, this, userID, childID ); + sectorObjects_.insert( obj ); + movableObjects_[ obj->globalID() ] = obj; + + return obj; +} + void Sector::destructMoveableObject( SectorObjectMoveable * obj ){ sectorObjects_.erase( obj ); if ( listener_->target() == obj ) listener_->setTarget( nextTarget() ); switch ( obj->getTypeID() ){ case SECTOROBJECTMOVABLE_RTTI: - delete obj; break; - case SECTOROBJECTMOVABLE_AI_RTTI: - aiObjects_.erase( dynamic_cast< SectorObjectMoveableAi * >(obj) ); - delete obj; break; + movableObjects_.erase( obj->globalID() ); + delete obj; + break; + case SECTOROBJECTMOVABLE_AI_RTTI: { + localAiObjects_.erase( dynamic_cast< SectorObjectMoveableAi *>(obj)->childID() ); + movableObjects_.erase( obj->globalID() ); + delete obj; + } break; default: std::cerr << "object type unknown. this should not happen." << obj->getTypeID() << std::endl; } } -void Sector::createStaticObject( const Ogre::String & meshname, - const Ogre::String & objectname, - const Ogre::Vector3 & pos, - Ogre::Real targetSize, - Ogre::Degree yaw ){ +void Sector::createStaticObject( const Ogre::String & meshname, const Ogre::String & objectname, + const Ogre::Vector3 & pos, Ogre::Real targetSize, Ogre::Degree yaw ){ SectorObject * obj = new SectorObject( objectname, this ); @@ -151,40 +166,22 @@ // insertCollisionSectorObject( obj ); } -SectorObjectMoveable * Sector::createExternalMoveableObject( const Ogre::String & name ){ - SectorObjectMoveable * obj = new SectorObjectMoveable( name, this ); +SectorObjectMoveableAi * Sector::createAiMoveableObject( const Ogre::String & name, int childID ){ + SectorObjectMoveableAi * obj = new SectorObjectMoveableAi( name, this, network_->userID(), childID ); sectorObjects_.insert( obj ); - movableObjects_.insert( obj ); + movableObjects_[ obj->globalID() ] = obj ; + localAiObjects_[ obj->childID() ] = obj; return obj; } -SectorObjectMoveableAi * Sector::createAiMoveableObject( const Ogre::String & name ){ - SectorObjectMoveableAi * obj = new SectorObjectMoveableAi( name, this ); - sectorObjects_.insert( obj ); - movableObjects_.insert( obj ); - aiObjects_.insert( obj ); +void Sector::spawnAiObject( ){ + + int childID = 1; + while ( localAiObjects_.find( childID ) != localAiObjects_.end() ){ childID ++; } - return obj; -} + SectorObjectMoveableAi *obj = createAiMoveableObject( avatar_->name() + "_Spawn" + Ogre::StringConverter::toString( childID ), childID ); -SectorObjectAvatar * Sector::createAvatar( const Ogre::String & playername ){ - SectorObjectAvatar * obj = new SectorObjectAvatar( playername, this ); - sectorObjects_.insert( obj ); - movableObjects_.insert( obj ); - avatar_ = obj; - - return obj; -} - -void Sector::destructAvatar( ){ - sectorObjects_.erase( avatar_ ); - movableObjects_.erase( avatar_ ); - delete avatar_; -} - -void Sector::spawnAiObject( ){ - SectorObjectMoveableAi *obj = createAiMoveableObject( avatar_->name() + "_Spawn" + Ogre::StringConverter::toString( aiObjects_.size() ) ); obj->setTarget( avatar_ ); Ogre::Real xmin = -1000.0, xmax = -500.0; @@ -194,26 +191,73 @@ obj->mainNode()->setPosition( Ogre::Math::RangeRandom( xmin, xmax ), Ogre::Math::RangeRandom( ymin, ymax ), Ogre::Math::RangeRandom( zmin, zmax ) ); - - // obj->mainNode()->setPosition( 0.0f, 0.0f, -200.0f); - + + //obj->mainNode()->setPosition( 0.0f, 0.0f, -200.0f); + obj->setThrustPercent( 70 ); + + MessageShipRegister msg( 0, obj->childID(), obj->name(), obj->mainNode()->getPosition(), true ); + network_->send( msg ); + + } +void Sector::createAvatar( const Ogre::String & playername ){ + avatar_ = new SectorObjectAvatar( playername, this, network_->userID() ); + //sectorObjects_.insert( obj ); + movableObjects_[ avatar_->globalID() ] = avatar_; +} + +void Sector::destructAvatar( ){ + // sectorObjects_.erase( avatar_ ); + movableObjects_.erase( avatar_->globalID() ); + delete avatar_; + avatar_ = NULL; +} + +void Sector::avatarDied( ){ + avatarDeathSequenceTime_ = 5.0; + avatar_->setVisible( true ); + MessageShipRegister msg( 0, 0, avatar_->name(), avatar_->mainNode()->getPosition(), false ); + network_->send( msg ); + listener_->avatarDeathSequence( true ); +} + +void Sector::spawnAvatar( ){ + avatarDeathSequenceTime_ = -1.0; + + avatar_->mainNode()->setPosition( 0.0, 0.0, 0.0 ); + avatar_->mainNode()->setOrientation( Ogre::Quaternion( 1.0, 0.0, 0.0, 0.0 ) ); + avatar_->setVelocity( Ogre::Vector3( 0.0, 0.0, -20.0 ) ); + avatar_->reset(); + + MessageShipRegister msg( 0, 0, avatar_->name(), avatar_->mainNode()->getPosition(), true ); + network_->send( msg ); + + avatar_->setVisible( false ); + listener_->avatarDeathSequence( false ); +} + SectorObject * Sector::nextTarget( ){ - itTarget_ ++; - if ( (*itTarget_) == avatar_ ) return nextTarget(); - - if ( itTarget_ == sectorObjects_.end() ) itTarget_ = sectorObjects_.begin(); - return (*itTarget_); + if ( sectorObjects_.size() != 0 ){ + itTarget_ ++; + if ( (*itTarget_) == avatar_ ) return nextTarget(); + + if ( itTarget_ == sectorObjects_.end() ) itTarget_ = sectorObjects_.begin(); + return (*itTarget_); + } + return NULL; } SectorObject * Sector::prevTarget( ){ - if ( itTarget_ == sectorObjects_.begin() ) itTarget_ = sectorObjects_.end(); - itTarget_ --; - - if ( (*itTarget_) == avatar_ ) return prevTarget(); - return (*itTarget_); + if ( sectorObjects_.size() != 0 ){ + if ( itTarget_ == sectorObjects_.begin() ) itTarget_ = sectorObjects_.end(); + itTarget_ --; + + if ( (*itTarget_) == avatar_ ) return prevTarget(); + return (*itTarget_); + } + return NULL; } void Sector::createCircle(){ @@ -252,37 +296,153 @@ object->attachObject( circle ); } -SectorObjectMoveable * Sector::findMoveableObject( const Ogre::String & playername ) { - for ( std::set< SectorObjectMoveable * >::iterator it = movableObjects_.begin(); it != movableObjects_.end(); it ++ ){ - if ( (*it)->name( ) == playername ){ - return ( *it ); +void Sector::receiveVesselRegister( const MessageShipRegister & msg ){ + + if ( msg.senderID() != network_->userID() ){ + std::map< long , SectorObjectMoveable * >::iterator it; + + if ( ( it = movableObjects_.find( createGlobalID( msg.senderID(), msg.childID() ) ) ) != movableObjects_.end() ){ + if ( msg.status() == false ){ + std::cout << "Deregistering " << msg.name() << " " << std::endl; + destructMoveableObject( it->second ); + } else { + std::cout << "Object " << msg.name() << " allready registered." << std::endl; + } + } else { + if ( msg.status() == true ){ + std::cout << "Create object " << msg.name() + << " " << msg.senderID() << " " << (int)msg.childID() + << " " << msg.position() << std::endl; + + SectorObjectMoveable * obj = createMoveableObject( msg.name(), msg.senderID(), msg.childID() ); + obj->mainNode()->setPosition( msg.position() ); + sendAllVesselStatus( ); + } } } - return NULL; -} +} -void Sector::sendAllMovements( Network * network ){ - MessageShipMovement msg( avatar_->name(), +void Sector::sendAllVesselMovements( ){ + MessageShipMovement msg( 0, + avatar_->mainNode()->getPosition(), + avatar_->velDirection(), + avatar_->mainNode()->getOrientation(), avatar_->thrustPercent(), - avatar_->velDirection(), - avatar_->mainNode()->getPosition(), - avatar_->mainNode()->getOrientation(), - avatar_->firePressed(), - avatar_->afterburnerPressed(), - avatar_->breakPressed() ); - network->send( msg ); + avatar_->scaledYaw(), + avatar_->scaledPitch(), + avatar_->scaledRoll(), + avatar_->incNetSequence() ); - for ( std::set< SectorObjectMoveableAi * >::iterator it = aiObjects_.begin(); it != aiObjects_.end(); it ++ ){ - MessageShipMovement msgObj( (*it)->name(), - (*it)->thrustPercent(), - (*it)->velDirection(), - (*it)->mainNode()->getPosition(), - (*it)->mainNode()->getOrientation(), - (*it)->firePressed(), - (*it)->afterburnerPressed(), - (*it)->breakPressed() ); - network->send( msgObj ); + network_->send( msg, false ); + + for ( std::map< int, SectorObjectMoveableAi * >::iterator it = localAiObjects_.begin(); it != localAiObjects_.end(); it ++ ){ + MessageShipMovement msgObj( it->second->childID(), + it->second->mainNode()->getPosition(), + it->second->velDirection(), + it->second->mainNode()->getOrientation(), + it->second->thrustPercent(), + it->second->scaledYaw(), + it->second->scaledPitch(), + it->second->scaledRoll(), + it->second->incNetSequence() ); + + network_->send( msgObj, false ); } } +void Sector::receiveVesselMovement( const std::vector < MessageShipMovement * > & movements ){ + + std::map < long, const MessageShipMovement * > singleMsg; + + //** we sort the movement messaged + for ( int i = 0; i < movements.size(); i ++ ){ + if ( movements[ i ]->senderID() != network_->userID() ){ + //** apply only foreign movements, and take just the actual movement + singleMsg[ createGlobalID( movements[ i ]->senderID(), movements[ i ]->childID() ) ] = movements[ i ]; + } + } + + std::map< long, SectorObjectMoveable * >::iterator it; + + for ( std::map < long, const MessageShipMovement * >::iterator i = singleMsg.begin(); i != singleMsg.end(); i++ ){ + if ( ( it = movableObjects_.find( i->first ) ) != movableObjects_.end() ){ + it->second->setFlightProperties( (*i->second) ); + } else { + std::cerr << "Requested non existant object for shipmovement: " + << network_->username( i->second->senderID() ) << " this should not happen." << std::endl; + } + } +} + +void Sector::sendAllVesselStatus( ){ + sendVesselStatus( *avatar_ ); +// for ( std::map< int, SectorObjectMoveableAi * >::iterator it = localAiObjects_.begin(); it != localAiObjects_.end(); it ++ ){ +// sendVesselStatus( *(it->second) ); +// } +} + +void Sector::sendVesselStatus( const SectorObjectMoveable & obj ){ + MessageShipStatus msg( obj.childID(), + obj.shieldPercent(), + obj.armorPercent(), + obj.firePressed(), + obj.afterburnerPressed(), + obj.breakPressed() ); + network_->send( msg ); +} + +void Sector::receiveVesselStatus( const MessageShipStatus & msg ){ + if ( msg.senderID() != network_->userID() ){ + + std::map< long, SectorObjectMoveable * >::iterator it; + + SectorObjectMoveable *obj; + if ( ( it = movableObjects_.find( createGlobalID( msg.senderID(), msg.childID() ) ) ) != movableObjects_.end() ){ + std::cout << "ReceiveVesselStatus for " << it->second->name( ) << std::endl; + it->second->setStatus( msg ); + } else { + std::cerr << "Requested non existant object for shipstatus: " + << network_->username( msg.senderID() ) << " this should not happen." << std::endl; + } + } +} + +void Sector::sendVesselAmmoHit( const Projectile & projectile, BaseObject * victim ){ + + if ( projectile.parent().userID() == network_->userID() ){ + std::cout << "Send: Projectile from " << projectile.name() << " collide with: " << victim->name() + << " " << victim->userID() << " " << victim->childID() << std::endl; + + if ( network_->online() ){ + MessageShipAmmoHit msg( projectile.parent().childID(), victim->userID(), victim->childID(), projectile.damage() ); + network_->send( msg ); + } + } + victim->hitByAmmo( projectile.damage() ); +} + +void Sector::receiveVesselAmmoHit( const MessageShipAmmoHit & msg ){ + if ( msg.senderID() != network_->userID() ){ + + std::map< long, SectorObjectMoveable * >::iterator it; + + if ( ( it = movableObjects_.find( createGlobalID( msg.targetID(), msg.targetChildID() ) ) ) != movableObjects_.end() ){ + std::cout << "ReceiveVesselAmmoHit for " << network_->username( msg.targetID() ) << std::endl; + it->second->hitByAmmo( msg.damage() ); + } else { + std::cerr << "Requested non existant object for VesselAmmoHit " + << "shooter: " << network_->username( msg.senderID() ) + << " victim: " << network_->username( msg.targetID() ) + << " child: " << msg.targetChildID() + << " damage: " << msg.damage() << " this should not happen." << std::endl; + + std::cerr << "Available objects: " << std::endl; + for ( std::map< long, SectorObjectMoveable * >::iterator i = movableObjects_.begin(); i != movableObjects_.end(); i++){ + std::cerr << "\t" << i->first << " " << i->second->name() << " " << std::endl; + } + + } + } +} + } // namespace OpenGate Modified: branches/ogsector/src/Sector.h =================================================================== --- branches/ogsector/src/Sector.h 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/Sector.h 2007-04-01 18:01:19 UTC (rev 346) @@ -13,48 +13,68 @@ public: - Sector( Ogre::SceneManager * sceneMgr ); + Sector( Ogre::SceneManager * sceneMgr, Network * network ); ~Sector( ); Ogre::SceneManager * sceneManager() { return sceneMgr_; } void setListener( SectorClientFrameListener * listener ){ listener_ = listener; } + SectorClientFrameListener * listener( ){ return listener_; } + void setNetwork( Network * network ){ network_ = network; } + + void update( Ogre::Real elapsedTime ); void createStaticObject( const Ogre::String & meshname, const Ogre::String & objectname, const Ogre::Vector3 & pos, Ogre::Real targetSize, Ogre::Degree yaw ); - SectorObjectMoveable * createExternalMoveableObject( const Ogre::String & name ); + SectorObjectMoveable * createMoveableObject( const Ogre::String & name, int userId, int childId ); - SectorObjectMoveableAi * createAiMoveableObject( const Ogre::String & name ); + SectorObjectMoveableAi * createAiMoveableObject( const Ogre::String & name, int childId ); - SectorObjectAvatar * createAvatar( const Ogre::String & playername ); + void destructMoveableObject( SectorObjectMoveable * obj ); - // void insertCollisionSectorObject( SectorObject * obj ); + void createAvatar( const Ogre::String & playername ); - OgreOpcode::CollisionContext * collisionContext() { return collideInSectorContext_; } + SectorObjectAvatar * avatar() { return avatar_; } - void destructMoveableObject( SectorObjectMoveable * obj ); + void destructAvatar( ); + void avatarDied( ); + + void spawnAvatar( ); + void spawnAiObject( ); - - void destructAvatar( ); - SectorObjectAvatar * avatar() { return avatar_; } + OgreOpcode::CollisionContext * collisionContext() { return collideInSectorContext_; } void createCircle( ); - SectorObjectMoveable * findMoveableObject( const Ogre::String & name ); - SectorObject * nextTarget( ); SectorObject * prevTarget( ); - void sendAllMovements( Network * network ); + void receiveVesselRegister( const MessageShipRegister & msg ); + + void sendAllVesselStatus( ); + + void sendAllVesselMovements( ); + + void receiveVesselMovement( const std::vector < MessageShipMovement * > & movements ); + + void sendVesselStatus( const SectorObjectMoveable & obj ); + + void receiveVesselStatus( const MessageShipStatus & msg ); + + void sendVesselAmmoHit( const Projectile & projectile, BaseObject * victim ); + + void receiveVesselAmmoHit( const MessageShipAmmoHit & msg ); + + protected: SectorClientFrameListener * listener_; Ogre::SceneManager * sceneMgr_; @@ -65,12 +85,15 @@ OgreOpcode::CollisionContext * collideInSectorContext_; - std::set< SectorObject * > sectorObjects_; - std::set< SectorObjectMoveable * > movableObjects_; - std::set< SectorObjectMoveableAi * > aiObjects_; + std::set< SectorObject * >::iterator itTarget_; - std::set< SectorObject * >::iterator itTarget_; + std::map< long, SectorObjectMoveable * > movableObjects_; + std::map< int, SectorObjectMoveableAi * > localAiObjects_; + + float avatarDeathSequenceTime_; + + Network * network_; }; } // namespace OpenGate Modified: branches/ogsector/src/SectorClient.cpp =================================================================== --- branches/ogsector/src/SectorClient.cpp 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/SectorClient.cpp 2007-04-01 18:01:19 UTC (rev 346) @@ -3,41 +3,84 @@ namespace OpenGate{ void SectorClient::createScene( ){ - sector_ = new Sector( sceneMgr_ ); + sector_ = new Sector( sceneMgr_, network_ ); + sector_->createAvatar( network_->usernameMe() ); +} - SectorObjectAvatar *pS = sector_->createAvatar( network_->usernameMe() ); - pS->mainNode()->setPosition( 0.0, 0.0, 0.0 ); - pS->setVelocity( Ogre::Vector3( 0.0, 0.0, -20.0 ) ); +void SectorClient::destroyScene( ){ + if ( sector_ != NULL ) delete sector_; } -bool SectorClient::setup( void ){ - root_ = new Ogre::Root(); - setupResources(); - - bool carryOn = configure(); - if (!carryOn) return false; - - sceneMgr_ = root_->createSceneManager( Ogre::ST_GENERIC, "BaseSMInstance"); - createCameras(); +bool SectorClient::setup( ){ + root_ = new Ogre::Root(); - createViewports(); + setupResources(); + + if ( !configure() ) return false; + + sceneMgr_ = root_->createSceneManager( Ogre::ST_GENERIC, "BaseSMInstance"); - // Set default mipmap level (NB some APIs ignore this) - Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5); - - // Create any resource listeners (for loading screens) - // createResourceListener(); - -// // Load resources - loadResources(); - - // Create the scene - createScene(); - - createFrameListener(); - + createCameras(); + + createViewports(); + + // Set default mipmap level (NB some APIs ignore this) + Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5); + + // Create any resource listeners (for loading screens) + // createResourceListener(); + + // Load resources + loadResources(); + + // Create the scene + createScene(); + + createFrameListener(); + + sector_->spawnAvatar(); + + return true; +} + +void SectorClient::setupResources( ) { + // Load resource paths from config file + Ogre::ConfigFile cf; cf.load( "resources.cfg" ); + + // Go through all sections & settings in the file + Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); + + Ogre::String secName, typeName, archName; + while ( seci.hasMoreElements() ) { + + secName = seci.peekNextKey(); + Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); + + for ( Ogre::ConfigFile::SettingsMultiMap::iterator i = settings->begin(); i != settings->end(); ++i ){ + typeName = i->first; + archName = i->second; + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName ); + } + } +} + +bool SectorClient::configure( void ){ + root_->restoreConfig(); + window_ = root_->initialise( true ); + return true; + + // Show the configuration dialog and initialise the system + // You can skip this and use root.restoreConfig() to load configuration + // settings if you were sure there are valid ones saved in ogre.cfg + if ( root_->showConfigDialog() ) { + // If returned true, user clicked OK so initialise + // Here we choose to let the system create a default rendering window by passing 'true' + window_ = root_->initialise( true ); return true; + } else { + return false; } +} void SectorClient::createCameras( ) { camera_ = sceneMgr_->createCamera("CameraMain"); @@ -75,6 +118,11 @@ window_->removeViewport( 2 ); } +void SectorClient::createFrameListener( ) { + frameListener_ = new SectorClientFrameListener( window_, camera_, sector_, network_ ); + root_->addFrameListener( frameListener_ ); +} + } // namespace OpenGate{ Modified: branches/ogsector/src/SectorClient.h =================================================================== --- branches/ogsector/src/SectorClient.h 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/SectorClient.h 2007-04-01 18:01:19 UTC (rev 346) @@ -16,15 +16,14 @@ class SectorClient { public: SectorClient( Network * nw ) : network_( nw ) { - frameListener_ = NULL; root_ = NULL; + frameListener_ = NULL; sector_ = NULL; } virtual ~SectorClient(){ if ( frameListener_ != NULL ) delete frameListener_; if ( root_ != NULL ) delete root_; - if ( sector_ != NULL ) delete sector_; } virtual void go( void ){ @@ -32,75 +31,36 @@ root_->startRendering(); - // clean up destroyScene(); } protected: - virtual bool setup( void ); + virtual bool setup( ); - virtual bool configure( void ){ - root_->restoreConfig(); - window_ = root_->initialise( true ); - return true; + //! Method which will define the source of resources (other than current folder) + virtual void setupResources( ); - // Show the configuration dialog and initialise the system - // You can skip this and use root.restoreConfig() to load configuration - // settings if you were sure there are valid ones saved in ogre.cfg - if( root_->showConfigDialog() ) { - // If returned true, user clicked OK so initialise - // Here we choose to let the system create a default rendering window by passing 'true' - window_ = root_->initialise( true ); - return true; - } else { - return false; - } - } + virtual bool configure( ); - virtual void chooseSceneManager( void ){ } + // virtual void chooseSceneManager( ){ } - virtual void createCameras( void ); + virtual void createCameras( ); - //! Create our viewports - virtual void createViewports( void ); + virtual void createViewports( ); - virtual void createFrameListener( void ) { - frameListener_ = new SectorClientFrameListener( window_, camera_, sector_, network_ ); - root_->addFrameListener( frameListener_ ); - } + virtual void createFrameListener( ); - virtual void createScene( void ); + virtual void createScene( ); - virtual void destroyScene(void){ } + virtual void destroyScene( ); - //! Method which will define the source of resources (other than current folder) - virtual void setupResources(void) { - // Load resource paths from config file - Ogre::ConfigFile cf; cf.load( "resources.cfg" ); - - // Go through all sections & settings in the file - Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); - - Ogre::String secName, typeName, archName; - while ( seci.hasMoreElements() ) { - secName = seci.peekNextKey(); - Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); - Ogre::ConfigFile::SettingsMultiMap::iterator i; - for ( i = settings->begin(); i != settings->end(); ++i ){ - typeName = i->first; - archName = i->second; - Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName ); - } - } - } - - virtual void loadResources(void) { + virtual void loadResources( ) { Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); } - Ogre::Root * root_; + Ogre::Camera * camera_; Ogre::SceneManager * sceneMgr_; Modified: branches/ogsector/src/SectorClientFrameListener.cpp =================================================================== --- branches/ogsector/src/SectorClientFrameListener.cpp 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/SectorClientFrameListener.cpp 2007-04-01 18:01:19 UTC (rev 346) @@ -1,6 +1,6 @@ #include "SectorClientFrameListener.h" #include "SectorClient.h" -#include "network_protocol.h" +#include "networkProtocol.h" #include <iostream> #include <OgreTextAreaOverlayElement.h> @@ -31,7 +31,7 @@ timeSinceLastSectorUpdate_ = 0.0; timeSinceLastNetworkUpdate_ = 0.0; - deathSequence_ = 0.0; + deathSequence_ = false; inputInitialState_ = true; lastInputWheelState_ = 0; windowsWidth_ = window_->getWidth( ); @@ -60,7 +60,7 @@ setTarget( sector_->nextTarget() ); -// targetPointer_ = camera_->getSceneManager()->getRootSceneNode()->createChildSceneNode( "TargetPointer" ); + // targetPointer_ = camera_->getSceneManager()->getRootSceneNode()->createChildSceneNode( "TargetPointer" ); // BillboardSet* mySet = camera_->getSceneManager()->createBillboardSet("mySet"); // targetPointerBB_ = mySet->createBillboard( Vector3(0, 0, 0) ); // mySet->setMaterialName( "TargetPointer" ); @@ -80,7 +80,7 @@ Ogre::SceneNode * spaceDustNode = sector_->avatar()->mainNode()->createChildSceneNode( "DustParticles", camera_->getRealPosition() ); // spaceDustNode_->attachObject( spaceDustParticleSystem_ ); - //camera_->getParentSceneNode() + //camera_->getParentSceneNode() // listener for the space dust @@ -111,71 +111,66 @@ bool SectorClientFrameListener::frameStarted( const Ogre::FrameEvent & evt ) { if ( window_->isClosed() ) return false; + timeSinceLastSectorUpdate_ += evt.timeSinceLastFrame; timeSinceLastNetworkUpdate_ += evt.timeSinceLastFrame; - if ( timeSinceLastSectorUpdate_ > 0.005 ){ // max 200 sector-updates/second - - if ( deathSequence_ > 0 ){ + if ( deathSequence_ ){ + + } else { + //** capture my input + inputManager_->capture(); + } + + //** start capture network; + std::vector < std::vector < Uint8 > > msgs; + std::vector < MessageShipMovement * > movements; + network_->pull( msgs ); + + for ( int i = 0; i < msgs.size(); i ++ ){ + switch ( msgs[ i ][ 0 ] ){ + case PROTO_CHAT:{ + network_->ping(); + + MessageChat msg( &msgs[ i ][ 0 ] ); + std::cout << network_->username( msg.senderID() ) + ": " + msg.message() << std::endl; - deathSequence_ -= timeSinceLastSectorUpdate_; - - if ( deathSequence_ <= 0 ){ - avatarSpawn( ); - } - } else { + Ogre::OverlayElement* hudChatIn = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextChatIn"); + hudChatIn->setCaption( network_->username( msg.senderID() ) + ": " + msg.message() ); + } break; + case PROTO_SHIPREGISTER: + sector_->receiveVesselRegister( &msgs[ i ][ 0 ] ); break; + case PROTO_SHIPSTATUS: + sector_->receiveVesselStatus( &msgs[ i ][ 0 ] ); break; + case PROTO_SHIPMOVEMENT:{ + //** we handle that in sum, so we can ignore dups because of packet loss + MessageShipMovement msg( &msgs[ i ][ 0 ] ); + movements.push_back( &msg ); + } break; + case PROTO_SHIPAMMOHIT: + sector_->receiveVesselAmmoHit( &msgs[ i ][ 0 ] ); break; + default: + std::cerr << "PROTO type unknown: " << msgs[ i ][ 0 ] << " " << msgs[ i ].size() << std::endl; + break; + } + } + if ( movements.size() > 0 ) sector_->receiveVesselMovement( movements ); - //** capture my input - inputManager_->capture(); - - if ( timeSinceLastNetworkUpdate_ > 0.02 ){// max 100 net-updates/second - - std::vector < std::vector < Uint8 > > msgs; - network_->pull( msgs ); - - for ( int i = 0; i < msgs.size(); i ++ ){ - switch ( msgs[ i ][ 0 ] ){ - case PROTO_CHAT:{ - MessageChat msg( &msgs[ i ][ 0 ] ); - std::cout << network_->username( msg.senderId() ) + ": " + msg.message() << std::endl; - - Ogre::OverlayElement* hudChatIn = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextChatIn"); - hudChatIn->setCaption( network_->username( msg.senderId() ) + ": " + msg.message() ); - } break; - case PROTO_SHIPMOVEMENT:{ - MessageShipMovement msg( &msgs[ i ][ 0 ] ); - - if ( msg.senderId() != network_->userId() ){ - - SectorObjectMoveable *obj; - if ( (obj = sector_->findMoveableObject( msg.name() ) ) == NULL ){ - obj = sector_->createExternalMoveableObject( msg.name() ); - } -// if ( (obj = sector_->findMoveableObject( network_->username( msg.senderId() ) )) == NULL ){ -// obj = sector_->createExternalMoveableObject( network_->username( msg.senderId() ) ); -// } - obj->setFlightProperties( msg ); - - } - } break; - default: - std::cerr << "PROTO type unknown: " << msgs[ i ][ 0 ] << " " << msgs[ i ].size() << std::endl; - break; - } - } - - sector_->sendAllMovements( network_ ); - - - timeSinceLastNetworkUpdate_ = 0.0; - } //** network update - } //** else if no deathsequence - + //** end capture network; + + // max 1000 sector-updates/second + if ( timeSinceLastSectorUpdate_ > 0.001 ){ sector_->update( timeSinceLastSectorUpdate_ ); timeSinceLastSectorUpdate_ = 0.0; updateHUD_(); - } //** sector update + } + //** send movement data, max 10 net-updates/second + if ( timeSinceLastNetworkUpdate_ > 0.1 ){ + sector_->sendAllVesselMovements( ); + timeSinceLastNetworkUpdate_ = 0.0; + } + //** update my camera; updateCamera_(); @@ -199,10 +194,10 @@ if ( e.key == OIS::KC_ESCAPE) { shutDownRequest_ = true; } //** Avatar yaw LEFT; - if ( e.key == OIS::KC_A || e.key == OIS::KC_NUMPAD6 ) { sector_->avatar()->setScaledYaw( 1.0 ); } + if ( e.key == OIS::KC_A || e.key == OIS::KC_NUMPAD4 ) { sector_->avatar()->setScaledYaw( 1.0 ); } //** Avatar yaw RIGHT; - if ( e.key == OIS::KC_D || e.key == OIS::KC_NUMPAD4 ) { sector_->avatar()->setScaledYaw( -1.0 ); } + if ( e.key == OIS::KC_D || e.key == OIS::KC_NUMPAD6 ) { sector_->avatar()->setScaledYaw( -1.0 ); } //** Avatar pitch DOWN; if ( e.key == OIS::KC_W || e.key == OIS::KC_NUMPAD8 ) { sector_->avatar()->setScaledPitch( -1.0 ); } @@ -242,7 +237,7 @@ if ( e.key == OIS::KC_P ) { setTarget( sector_->prevTarget() ); } //** selfdestruct and eject; - if ( e.key == OIS::KC_F11 ) { avatarDied(); } + if ( e.key == OIS::KC_F11 ) { sector_->avatarDied(); } //** spawn; if ( e.key == OIS::KC_F12 ) { sector_->spawnAiObject(); } @@ -449,7 +444,7 @@ } bool SectorClientFrameListener::buttonPressed( const OIS::JoyStickEvent & e , int button){ - window_->setDebugText( "Joy: " + toStr( button ) ); + // window_->setDebugText( "Joy: " + toStr( button ) ); if ( button == 0){ sector_->avatar()->setFirePressed( true ); @@ -457,7 +452,7 @@ } bool SectorClientFrameListener::buttonReleased( const OIS::JoyStickEvent & e , int button){ - window_->setDebugText( "Joy: " + toStr( button ) ); + // window_->setDebugText( "Joy: " + toStr( button ) ); if ( button == 0){ sector_->avatar()->setFirePressed( false ); @@ -474,7 +469,6 @@ switch ( cameraMode_ ){ case 0: //** free camera at orign camera_->setPosition( Ogre::Vector3( 0, 0, 500 ) ); - camera_->lookAt( Ogre::Vector3( 0, 0, -300 ) ); camera_->setAutoTracking( false, sector_->avatar()->mainNode() ); sector_->avatar()->setVisible( true ); break; @@ -496,7 +490,12 @@ void SectorClientFrameListener::updateCamera_(){ Ogre::Vector3 avatarPos( sector_->avatar()->mainNode()->getPosition() ); - Ogre::Vector3 targetPos( target_->mainNode()->getPosition() ); + + Ogre::Vector3 targetPos; + if ( target_ != NULL ){ + targetPos = target_->mainNode()->getPosition() ; + } + Ogre::Vector3 dist( targetPos - avatarPos ); Ogre::Vector3 distNorm( dist.normalisedCopy() ); Ogre::Quaternion avatarOrient( sector_->avatar()->mainNode()->getOrientation() ); @@ -508,14 +507,15 @@ // if ( ( 1.0f + cam1->getDirection( ).normalisedCopy().dotProduct( distNorm ) ) < 0.0001f ) { // cam1->yaw( Degree( 180 ) ); // } else { - Ogre::Quaternion rot( cam1->getDirection( ).normalisedCopy().getRotationTo( distNorm ) ); - cam1->rotate( rot ); - // } - - cam1->setPosition( avatarPos + distNorm * ( dist.length() - 2.0 * target_->baseSize() ) ); - + Ogre::Quaternion rot( cam1->getDirection( ).normalisedCopy().getRotationTo( distNorm ) ); + cam1->rotate( rot ); + // } + + if ( target_ != NULL ) cam1->setPosition( avatarPos + distNorm * ( dist.length() - 2.0 * target_->baseSize() ) ); + switch ( cameraMode_ ){ case 0: //** free camera at orign + camera_->lookAt( sector_->avatar()->mainNode()->getPosition( ) ); break; case 1: //** first person avatar camera camera_->setPosition( avatarPos ); @@ -625,54 +625,98 @@ void SectorClientFrameListener::setTarget( SectorObject * target ) { target_ = target; - Ogre::OverlayElement* targetName = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetName"); - targetName->setCaption( target_->name() ); - if ( hudTarget_->numChildren() > 0 ){ - hudTarget_->removeAllChildren( );// hudTarget_->getChild( "TargetTrans" ) ); - camera_->getSceneManager()->destroyEntity( "TargetShape" ); - } - Ogre::SceneNode * hudTargetTrans = new Ogre::SceneNode( NULL, "TargetTrans" ); - - - Ogre::Entity *targetShape = target_->shape()->clone( "TargetShape" ); - - hudTargetTrans->attachObject( targetShape ); - Ogre::Real scale = 0.5 / ( targetShape->getBoundingBox().getMaximum()[ 0 ] - - targetShape->getBoundingBox().getMinimum()[ 0 ] ); - hudTargetTrans->yaw( Ogre::Degree( -90 ) ); - hudTargetTrans->scale( scale, scale, scale ); - - hudTarget_->addChild( hudTargetTrans ); + if ( target_ != NULL ){ + Ogre::OverlayElement* targetName = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetName"); + targetName->setCaption( target_->name() ); + + if ( hudTarget_->numChildren() > 0 ){ + hudTarget_->removeAllChildren( );// hudTarget_->getChild( "TargetTrans" ) ); + camera_->getSceneManager()->destroyEntity( "TargetShape" ); + } + Ogre::SceneNode * hudTargetTrans = new Ogre::SceneNode( NULL, "TargetTrans" ); + + + Ogre::Entity *targetShape = target_->shape()->clone( "TargetShape" ); + + hudTargetTrans->attachObject( targetShape ); + Ogre::Real scale = 0.5 / ( targetShape->getBoundingBox().getMaximum()[ 0 ] + - targetShape->getBoundingBox().getMinimum()[ 0 ] ); + hudTargetTrans->yaw( Ogre::Degree( -90 ) ); + hudTargetTrans->scale( scale, scale, scale ); + + hudTarget_->addChild( hudTargetTrans ); + } } void SectorClientFrameListener::updateHUD_( void ) { - hudTarget_->setOrientation( target_->mainNode()->getOrientation() ); - - if ( sector_->avatar()->velocity() > 0 ){ + if ( fabs( sector_->avatar()->velocity() ) > 1e-1 ){ sector_->avatar()->flightArrow()->setVisible( true ); - sector_->avatar()->flightArrow()->setOrientation( target_->mainNode()->getOrientation() ); - sector_->avatar()->flightArrow()->setDirection( sector_->avatar()->flightDirection().normalisedCopy(), Ogre::Node::TS_WORLD ); + sector_->avatar()->flightArrow()->setOrientation( sector_->avatar()->mainNode()->getOrientation() ); + sector_->avatar()->flightArrow()->setDirection( sector_->avatar()->flightDirection().normalisedCopy(), + Ogre::Node::TS_WORLD ); } else { sector_->avatar()->flightArrow()->setVisible( false ); } + + if ( target_ != NULL ) { + sector_->avatar()->targetArrow()->setVisible( true ); + Ogre::Vector3 distToTarget = target_->mainNode()->getPosition() - sector_->avatar()->mainNode()->getPosition(); - Ogre::Vector3 distToTarget = target_->mainNode()->getPosition() - sector_->avatar()->mainNode()->getPosition(); - sector_->avatar()->targetArrow()->setOrientation( target_->mainNode()->getOrientation() ); - sector_->avatar()->targetArrow()->setDirection( distToTarget.normalisedCopy(), Ogre::Node::TS_WORLD ); + sector_->avatar()->targetArrow()->setOrientation( sector_->avatar()->mainNode()->getOrientation() ); + sector_->avatar()->targetArrow()->setDirection( distToTarget.normalisedCopy(), + Ogre::Node::TS_WORLD ); + hudTarget_->setOrientation( target_->mainNode()->getOrientation() ); - Ogre::Vector3 poss = camera_->getProjectionMatrix() * (camera_->getViewMatrix() * target_->mainNode()->getPosition() ); - poss.x = max( -1.0f, poss.x ); poss.x = min( 1.0f, poss.x ); - poss.y = max( -1.0f, poss.y ); poss.y = min( 1.0f, poss.y ); +// Ogre::Vector3 targetPos; +// Ogre::Quaternion targetOrient; targetOri = target_->mainNode().getOrientation(); +// targetPos = target_->mainNode().getPosition(); - Ogre::OverlayElement* hudTargetPointer = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/TargetPointer"); - if ( poss.z < 1 ){ - hudTargetPointer->setPosition( windowsHalfWidth_ + (windowsHalfWidth_ * poss.x)-16, - windowsHalfHeight_ + (windowsHalfHeight_ * -poss.y)-16 ); + //** targeting pointer + Ogre::Vector3 poss = camera_->getProjectionMatrix() * (camera_->getViewMatrix() * target_->mainNode()->getPosition() ); + poss.x = max( -1.0f, poss.x ); poss.x = min( 1.0f, poss.x ); + poss.y = max( -1.0f, poss.y ); poss.y = min( 1.0f, poss.y ); + + Ogre::OverlayElement* hudTargetPointer = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/TargetPointer"); + hudTargetPointer->show(); + + Ogre::OverlayElement* hudTargetDist = + Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetDistance"); + + Ogre::OverlayElement* hudTargetShield = + Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetShield"); + + Ogre::OverlayElement* hudTargetArmor = + Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetArmor"); + + Ogre::OverlayElement* hudTargetVel = + Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetVelocity"); + + hudTargetDist->setCaption( "D " + Ogre::StringConverter::toString( round( distToTarget.length(), 0 ) ) ); + + if ( poss.z < 1 ){ + hudTargetPointer->setPosition( windowsHalfWidth_ + (windowsHalfWidth_ * poss.x)-16, + windowsHalfHeight_ + (windowsHalfHeight_ * -poss.y)-16 ); + } + + if ( target_->getTypeID() == SECTOROBJECTMOVABLE_RTTI || + target_->getTypeID() == SECTOROBJECTMOVABLE_AI_RTTI ){ + hudTargetVel->setCaption( "V " + Ogre::StringConverter::toString( dynamic_cast< SectorObjectMoveable *>( target_ )->velocity(), 6 ) ); + hudTargetShield->setCaption( "S " + Ogre::StringConverter::toString( dynamic_cast< SectorObjectMoveable *>( target_ )->shieldPercent(), 4 ) ); + hudTargetArmor->setCaption( "A " + Ogre::StringConverter::toString( dynamic_cast< SectorObjectMoveable *>( target_ )->armorPercent(), 4 ) ); + } else{ + hudTargetVel->setCaption( "" ); + hudTargetShield->setCaption( "" ); + hudTargetArmor->setCaption( "" ); + } + + } else { + sector_->avatar()->targetArrow()->setVisible( false ); + Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/TargetPointer")->hide( ); } - + Ogre::OverlayElement* hudStat = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextStats"); @@ -697,18 +741,6 @@ Ogre::OverlayElement* hudArmor = Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextArmor"); - Ogre::OverlayElement* hudTargetDist = - Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetDistance"); - - Ogre::OverlayElement* hudTargetShield = - Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetShield"); - - Ogre::OverlayElement* hudTargetArmor = - Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetArmor"); - - Ogre::OverlayElement* hudTargetVel = - Ogre::OverlayManager::getSingleton().getOverlayElement("OpenGate/SimpleHUDTextTargetVelocity"); - const Ogre::RenderTarget::FrameStats & stats = window_->getStatistics(); hudStat->setCaption( "fps: " + toStr( stats.lastFPS ) + " ping: " + toStr( network_->pingTime() ) + " ms" ); hudVel->setCaption( "Vel: " + Ogre::StringConverter::toString( round( sector_->avatar()->velocity(), 2 ), 6 ) ); @@ -718,19 +750,7 @@ hudShield->setCaption( "S " + Ogre::StringConverter::toString( sector_->avatar()->shieldPercent(), 4 ) ); hudArmor->setCaption( "A " + Ogre::StringConverter::toString( sector_->avatar()->armorPercent(), 4 ) ); - hudTargetDist->setCaption( "D " + Ogre::StringConverter::toString( round( distToTarget.length(), 0 ) ) ); - - if ( target_->getTypeID() == SECTOROBJECTMOVABLE_RTTI || - target_->getTypeID() == SECTOROBJECTMOVABLE_AI_RTTI ){ - hudTargetVel->setCaption( "V " + Ogre::StringConverter::toString( dynamic_cast< SectorObjectMoveable *>( target_ )->velocity(), 6 ) ); - hudTargetShield->setCaption( "S " + Ogre::StringConverter::toString( dynamic_cast< SectorObjectMoveable *>( target_ )->shieldPercent(), 4 ) ); - hudTargetArmor->setCaption( "A " + Ogre::StringConverter::toString( dynamic_cast< SectorObjectMoveable *>( target_ )->armorPercent(), 4 ) ); - } else{ - hudTargetVel->setCaption( "" ); - hudTargetShield->setCaption( "" ); - hudTargetArmor->setCaption( "" ); - } - + Ogre::Vector3 pos( sector_->avatar()->mainNode()->getPosition() ); hudPos->setCaption( "Pos: " + Ogre::StringConverter::toString( Ogre::Real( rint( pos[ 0 ] ) ), 5, 5 ) + " " + @@ -758,30 +778,49 @@ // } } -void SectorClientFrameListener::avatarSpawn( ){ - // SectorObjectAvatar *obj = sector_->createAvatar( network_->usernameMe() ); - sector_->avatar()->mainNode()->setPosition( 0.0, 0.0, 0.0 ); - sector_->avatar()->mainNode()->setOrientation( Ogre::Quaternion( 1.0, 0.0, 0.0, 0.0 ) ); - sector_->avatar()->setVelocity( Ogre::Vector3( 0.0, 0.0, -20.0 ) ); - sector_->avatar()->reset(); - cameraMode_ = 1; - sector_->avatar()->setVisible( false ); - deathSequence_ = 0.0; - hudOverlay_->show(); +void SectorClientFrameListener::avatarDeathSequence( bool on ){ + if ( on ){ + deathSequence_ = true; + cameraMode_ = 0; + camera_->setOrientation( sector_->avatar()->mainNode()->getOrientation() ); + camera_->setPosition( sector_->avatar()->mainNode()->getOrientation().zAxis() * 100.0 ); + hudOverlay_->hide(); + } else { + deathSequence_ = false; + cameraMode_ = 1; + hudOverlay_->show(); + } } -void SectorClientFrameListener::avatarDied( ){ - deathSequence_ = 3.0; - cameraMode_ = 0; - sector_->avatar()->setVisible( true ); - camera_->setPosition( sector_->avatar()->mainNode()->getPosition() + - sector_->avatar()->mainNode()->getOrientation().zAxis() * 200 ); +// void SectorClientFrameListener::avatarSpawn( ){ +// // SectorObjectAvatar *obj = sector_->createAvatar( network_->usernameMe() ); +// sector_->avatar()->mainNode()->setPosition( 0.0, 0.0, 0.0 ); +// sector_->avatar()->mainNode()->setOrientation( Ogre::Quaternion( 1.0, 0.0, 0.0, 0.0 ) ); +// sector_->avatar()->setVelocity( Ogre::Vector3( 0.0, 0.0, -20.0 ) ); +// sector_->avatar()->reset(); +// cameraMode_ = 1; +// sector_->avatar()->setVisible( false ); +// deathSequence_ = 0.0; +// hudOverlay_->show(); +// MessageShipRegister msg( 0, 0, sector_->avatar()->name(), sector_->avatar()->mainNode()->getPosition(), true ); +// network_->send( msg ); +// } + +// void SectorClientFrameListener::avatarDied( ){ +// deathSequence_ = 3.0; +// cameraMode_ = 0; +// sector_->avatar()->setVisible( true ); +// camera_->setPosition( sector_->avatar()->mainNode()->getPosition() + +// sector_->avatar()->mainNode()->getOrientation().zAxis() * 200 ); - camera_->setOrientation( sector_->avatar()->mainNode()->getOrientation() ); - hudOverlay_->hide(); - // sector_->destroyAvatar( ); -} +// camera_->setOrientation( sector_->avatar()->mainNode()->getOrientation() ); +// hudOverlay_->hide(); +// MessageShipRegister msg( 0, 0, sector_->avatar()->name(), sector_->avatar()->mainNode()->getPosition(), false ); +// network_->send( msg ); +// // sector_->destroyAvatar( ); +// } + bool SectorClientFrameListener::renderSpaceDust(){ const Ogre::Real maxDist = 250.0; Modified: branches/ogsector/src/SectorClientFrameListener.h =================================================================== --- branches/ogsector/src/SectorClientFrameListener.h 2007-03-28 21:50:26 UTC (rev 345) +++ branches/ogsector/src/SectorClientFrameListener.h 2007-04-01 18:01:19 UTC (rev 346) @@ -2,10 +2,10 @@ #define SECTORCLIENTFRAMELISTENER__H #include <Ogre.h> -#include <OgreKeyEvent.h> -#include <OgreEventListeners.h> -#include <OgreStringConverter.h> -#include <OgreException.h> +// #include <OgreKeyEvent.h> +// #include <OgreEventListeners.h> +// #include <OgreStringConverter.h> +// #include <OgreException.h> #include "InputManager.h"... [truncated message content] |