]> git.mxchange.org Git - simgear.git/blobdiff - simgear/hla/HLAObjectInstance.hxx
hla: Make use of SGLocation.
[simgear.git] / simgear / hla / HLAObjectInstance.hxx
index d0f47b083e84ee2d041c1fb60f5fd65c945cfc3b..e5545207ff7f90131a8d2bd9cfaa9b82db638a71 100644 (file)
@@ -35,7 +35,7 @@ class HLAObjectClass;
 
 class HLAObjectInstance : public SGWeakReferenced {
 public:
-    HLAObjectInstance(HLAObjectClass* objectClass);
+    HLAObjectInstance(HLAObjectClass* objectClass = 0);
     virtual ~HLAObjectInstance();
 
     /// Return the name of this object instance
@@ -73,12 +73,47 @@ public:
 
     /// Sets the data element of the attribute with the given index to dataElement
     void setAttributeDataElement(unsigned index, const SGSharedPtr<HLADataElement>& dataElement);
-    /// Sets the data element of the attribute with the given index to the content of pathElementMap
-    void setAttribute(unsigned index, const HLAPathElementMap& pathElementMap);
-    void setAttributes(const HLAAttributePathElementMap& attributePathElementMap);
 
+    /// Retrieve the data element index for the given path.
+    bool getDataElementIndex(HLADataElementIndex& index, const std::string& path) const;
+    HLADataElementIndex getDataElementIndex(const std::string& path) const;
+
+    /// Return the data element of the attribute with the given index
+    HLADataElement* getAttributeDataElement(const HLADataElementIndex& index);
+    const HLADataElement* getAttributeDataElement(const HLADataElementIndex& index) const;
+    /// Set the data element of the attribute with the given index
+    void setAttributeDataElement(const HLADataElementIndex& index, const SGSharedPtr<HLADataElement>& dataElement);
+
+    /// Return the data element of the attribute with the given path.
+    /// The method is only for convenience as parsing the path is expensive.
+    /// Precompute the index and use the index instead if you use this method more often.
+    HLADataElement* getAttributeDataElement(const std::string& path);
+    const HLADataElement* getAttributeDataElement(const std::string& path) const;
+    /// Set the data element of the attribute with the given path
+    /// The method is only for convenience as parsing the path is expensive.
+    /// Precompute the index and use the index instead if you use this method more often.
+    void setAttributeDataElement(const std::string& path, const SGSharedPtr<HLADataElement>& dataElement);
+
+    /// Gets called on discovering this object instance.
+    virtual void discoverInstance(const RTIData& tag);
+    /// Gets called on remove this object instance.
+    virtual void removeInstance(const RTIData& tag);
+
+    /// Call this to register the object instance at the rti and assign the object class to it.
     void registerInstance();
-    void deleteInstance(const RTIData& tag);
+    virtual void registerInstance(HLAObjectClass* objectClass);
+    /// Call this to delete the object instance from the rti.
+    virtual void deleteInstance(const RTIData& tag);
+
+    /// Is called when the instance is either registered or discovered.
+    /// It creates data elements for each element that is not yet set and that has a data type attached.
+    /// the default calls back into the object class createAttributeDataElements method.
+    virtual void createAttributeDataElements();
+    /// Create and set the data element with index. Called somewhere in the above callchain.
+    void createAndSetAttributeDataElement(unsigned index);
+    /// Create an individual data element, the default calls back into the object class
+    /// createAttributeDataElement method.
+    virtual HLADataElement* createAttributeDataElement(unsigned index);
 
     // Push the current values into the RTI
     virtual void updateAttributeValues(const RTIData& tag);
@@ -126,25 +161,6 @@ public:
     const SGSharedPtr<ReflectCallback>& getReflectCallback() const
     { return _reflectCallback; }
 
-    // deprecated.
-    class AttributeCallback : public SGReferenced {
-    public:
-        virtual ~AttributeCallback() {}
-        virtual void updateAttributeValues(HLAObjectInstance& objectInstance, const RTIData& tag)
-        { }
-        virtual void reflectAttributeValues(HLAObjectInstance& objectInstance,
-                                            const RTIIndexDataPairList& dataPairList, const RTIData& tag)
-        { }
-        virtual void reflectAttributeValues(HLAObjectInstance& objectInstance, const RTIIndexDataPairList& dataPairList,
-                                            const SGTimeStamp& timeStamp, const RTIData& tag)
-        { reflectAttributeValues(objectInstance, dataPairList, tag); }
-    };
-
-    void setAttributeCallback(const SGSharedPtr<AttributeCallback>& attributeCallback)
-    { _attributeCallback = attributeCallback; }
-    const SGSharedPtr<AttributeCallback>& getAttributeCallback() const
-    { return _attributeCallback; }
-
 private:
     void _setRTIObjectInstance(RTIObjectInstance* rtiObjectInstance);
     void _clearRTIObjectInstance();
@@ -154,12 +170,9 @@ private:
     void _reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag);
     void _reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag);
 
-    class DataElementFactoryVisitor;
-
     struct Attribute {
         Attribute() : _enabledUpdate(false), _unconditionalUpdate(false) {}
         SGSharedPtr<HLADataElement> _dataElement;
-        // SGSharedPtr<HLADataElement::TimeStamp> _timeStamp;
         bool _enabledUpdate;
         bool _unconditionalUpdate;
         // HLAIndexList::iterator _unconditionalUpdateAttributeIndexListIterator;
@@ -192,7 +205,6 @@ private:
     // Callback classes
     SGSharedPtr<UpdateCallback> _updateCallback;
     SGSharedPtr<ReflectCallback> _reflectCallback;
-    SGSharedPtr<AttributeCallback> _attributeCallback;
 
     friend class HLAFederate;
     friend class HLAObjectClass;