/** * @RDE_HEADER@ * DDS IFC to BuildingViewer * $Id$ * $HeadURL$ * $Author$ * Created by Patric Karwat, SLSE, 2016-08-17 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace BuildingViewer { class CommunicationInterfaceInternal; class PluginProvider; class BuildingViewerDdsController : public QObject { Q_OBJECT public: explicit BuildingViewerDdsController(CommunicationInterfaceInternal *connection, VCtrl::ViewerInterface* viewerInterface); ~BuildingViewerDdsController(); bool init(QWidget *irreplacableWidget, const QString &modelPath, PluginProvider *session); void uninitialize(); void updatePlayerSymbols(const int sizeL, const int forParty = -1); void clearAssets(); PluginProvider *activeSession() const { return m_session; } signals: void signalDdsInitFinished(); private: void setCurrentTrainingAreaMap(const QString &modelPath); private slots: void onPartyChanged(const ParticipantManagement::Party &party, DataModification modType); void onBgViewerInitFinished(); void onFireEventFlashTimer(); void onSynchronizeSimulationTime(); void onBoobyTrapChanged(const AreaEffectSimulation::BoobyTrap &boobyTrap, DataModification modType); void onParticipantChanged(const ParticipantManagement::Participant &participant, DataModification modType); void onDynParticipantChanged(const ParticipantManagement::DynamicParticipantData &data, DataModification modType); void onPositionChanged(const ParticipantManagement::ParticipantPosition &position, DataModification modType); void onHitLineInfoChanged(const ParticipantManagement::HitLineInfo &hli, DataModification modType); void onParticipantGearEventChanged(const ParticipantManagement::ParticipantGearEvent &data, DataModification modType); void onPlayerPicked(int playerId); void onAssetPicked(int structureElementId); void onMountingPointChanged(const InfrastructureManagement::MountingPoint &data, DataModification modType); void onBuildingStateChanged(const Buildings::BuildingState &data, DataModification modType); void onCleanupBuildingHitlines(); void onBuildingHitLineInfoChanged(const Buildings::BuildingHitLineInfo &hli, DataModification modType); void onMainStructureElementChanged(const InfrastructureManagement::MainStructureElement &mse, DataModification modType); private: QPointF toRelativePosition(const Core::GeoPosition &geoPos) const; LtsUtils::QPoint3D toRelative3D(const Core::GeoPosition &geoPos) const; bool clear(); bool syncTeams(); bool setPaused(bool bPaused); bool isOutdatedPosition(qint64 sampleTime) const; inline bool isOutdatedPosition(const ParticipantManagement::ParticipantPosition &position) const { return position.participantId() <= 0 || isOutdatedPosition(position.sampleTime()); } bool calcBaseCoordinate(const QMap &mseMap); void sendAssets(); void handleMountingPoint(const InfrastructureManagement::MountingPoint &mp, DataModification modType); void onReplayChanged(const SituationReplay::SitReplay &srp, DataModification modType); void effectGenerationUnitPicked(int structureElementId); QHash m_mountingPointId2AssetType; QHash m_knownAssetsInBgViewer; void createBoobyTraps(); void createParticipants(); bool isValidParticipant(const ParticipantManagement::Participant &participant) const; void createParticipant(const ParticipantManagement::Participant &participant, const ParticipantManagement::ParticipantPosition &position, int sizeL); void createBoobyTrap(const AreaEffectSimulation::BoobyTrap &trap, int sizeL); void deleteParticipant(int participantId); void updateBuildingRoomNames(const InfrastructureManagement::MainStructureElement& building); bool writeBuildingDataToXML(const QString &modelPath); QString getBuildingConfigurationXml() const; static QString buildPlayerSymbolFilePath(int playerID, int postfix = 0); struct SymbolInfo { QString strPathToSymbolFile; QColor color; int participantId = -1; bool useThisSymbolNow = false; }; QHash m_participantGearEvents; // QHash m_lastPositionTime; // struct BuildingHit { int32_t id = 0; int64_t sampleTime = 0; int originatorParticipantId = 0; int chargeTypeId = 0; }; QHash> m_buildingHits; QVector m_knownBuildings; inline bool isBuildingKnown(int id) const { return std::find(m_knownBuildings.cbegin(), m_knownBuildings.cend(), id) != m_knownBuildings.cend(); } const int cColorSymbolId = 0; const QVector m_vecFlashColors = {QColor(), Qt::white, Qt::gray}; // First color is invalid -> actual party color will be used void createPlayerSymbols(const ParticipantManagement::Participant &participant, const int sizeL); void createSymbolResultWatcher(const ParticipantManagement::Participant &participant, const SymbolInfo &symbolInfo, const int sizeL); QHash m_mapActiveSymbolResultWatcher; // ResultWatcher address -> Player id to update symbol for void reCheckHitLine(); QString getSessionInfo() const; PluginProvider *m_session = nullptr; int m_exerciseId = -1; std::shared_ptr m_avmIfc; std::shared_ptr m_asbIfc; std::shared_ptr m_aesDtc; std::shared_ptr m_ppmDtc; std::shared_ptr m_pdmDtc; std::shared_ptr m_ppmGuiIfc; std::shared_ptr m_ismDtc; std::shared_ptr m_ismIfc; std::shared_ptr m_bldDtc; std::shared_ptr m_srpDtc; std::shared_ptr m_blgGuiIfc; void stopAndClearTimer(); QTimer *m_pSimTimeSyncTimer = nullptr; QTimer *m_pFireEventFlashTimer = nullptr; QTimer *m_pBuildingHitlineCleanupTimer = nullptr; bool m_ddsInitFinished = false; int m_dtc_timeout_ms = 10000; int m_hitlineDuration_ms = 10 * 1000; /* * Updating the simulation time causes the BgViewer to freeze for short moments from time to time. * E.g., 1000ms is a bad value. We stay with 10 seconds for now. */ int m_bgviewer_simSyncTimeInterval_ms = 3000; //10000; QHash> m_roomId2RoomNumber; // QHash> // roomNumber of xmlFile CommunicationInterfaceInternal *m_connection{nullptr}; VCtrl::ViewerInterface* m_viewerInterface{nullptr}; QTimer *m_reCheckTimer{nullptr}; LtsCoordTrans::UtmCoordinate m_baseCoordinate; QHash < int32_t, double > m_buildingHeight; // Key = BuildingId, Value z-value from geoPosition of the building QWidget *m_irreplacableWidget {nullptr}; NGL::INGLLogger &m_logger; }; } //namespace BuildingViewer