00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _SO_DATA_SET_ELEMENT_
00027 #define _SO_DATA_SET_ELEMENT_
00028
00029 #include <Inventor/nodes/SoShaderParameter.h>
00030 #include <Inventor/elements/SoReplacedElement.h>
00031 #include <Inventor/SbBox.h>
00032 #include <Inventor/SbLinear.h>
00033 #include <Inventor/STL/vector>
00034 #include <Inventor/STL/set>
00035 #include <Inventor/STL/map>
00036
00037 #include <LDM/SoLDM.h>
00038
00039 #ifdef _MSC_VER
00040 #pragma warning( push )
00041 #pragma warning(disable:4251)
00042 #endif
00043
00044 class SoDataSet;
00045 class SoNode;
00046 class SoLDMTileManager;
00047 class SoState;
00048 class SoDataSetId;
00049 class SoGLRenderAction;
00050 class SoLDMMediator;
00051
00052
00053 class SoDataSetElement : public SoReplacedElement {
00054
00055 SO_ELEMENT_HEADER( SoDataSetElement );
00056
00057 public:
00058
00060 virtual void push(SoState *state);
00061
00062
00063 static void set(SoState* state, SoNode *node, SoDataSet *datasetNode);
00064 static void set(SoState *state, SoNode *node,
00065 SoDataSet *datasetNode, const SbMatrix &matrix );
00066
00067
00068 static void get(SoState* state, std::vector<SoDataSet*>&);
00069
00070 static void get(SoState* state, SoDataSet*& ds);
00071
00072 static void get(SoState* state, SoLDM::DataSetIdPairList& dataSetIdPairList);
00073
00074
00075
00076 static const SbMatrix &get(SoState *state, SoDataSet*&, SbBool &isIdent );
00077
00078
00079 static void getDefault(SoLDM::DataSetIdPair&);
00080
00081 private:
00082
00084 virtual void init(SoState* state);
00085
00089 virtual SbBool matches(const SoElement* elt) const;
00090
00092 virtual SoElement* copyMatchInfo() const;
00093
00094 private:
00095 typedef std::pair<SoDataSet*, const SoDataSetId*> DataSetPtrIdPair;
00096
00097
00098 static void initClass();
00099 static void exitClass();
00100
00101 static void reset(SoState*);
00102
00104 static bool isDoingMultiData(SoState* state);
00105
00107 static bool isDoingCpuComposition(SoState* state);
00108
00110 template<typename T>
00111 static std::pair<T*, int> getLastOfType(SoState* state, bool derived)
00112 {
00113 SoLDM::DataSetIdPair p = getLastOfType(state, T::getClassTypeId(), derived);
00114 return std::make_pair(static_cast<T*>(p.first), p.second);
00115 }
00116
00117
00118
00119 static void get( SoState* state, SoLDMTileManager*& );
00120
00122 static void getGroupedDataSets(SoState* state, std::vector<SoLDM::DataSetIdPairList>& dataSets);
00123
00125 static void getDataSetGroup(SoState* state, SoLDM::DataSetIdPairList& pairList, SoLDMMediator* mediator);
00126
00128 static const SbMatrix& getDataSetModelMatrix(SoState* state, const SoLDM::DataSetIdPair& idPair, SbBool& isIdent);
00129
00131 static void setMasterId(SoState* state, int dataSetId);
00132
00134 static void setMasterIdPair(SoState* state, const SoLDM::DataSetIdPair& idPair);
00135
00137 static const SoLDM::DataSetIdPair& getMasterIdPair(SoState* state);
00138
00140 static const SoLDM::DataSetIdPair& getInternalMasterIdPair(SoState* state);
00141
00143 static int getFirstDataSetId(const SoLDM::DataSetIdPairList& idPairList, int dataSetId);
00144
00146 static const SoLDM::DataSetIdPair getLastDataSetWithId(SoState* state, int id);
00147
00148 private:
00149 typedef std::set<const SoDataSetId*> DataSetIdSet;
00150 typedef std::map<SoDataSet*, DataSetIdSet> DataSetIdMap;
00151 typedef std::vector<DataSetPtrIdPair> DataSetPtrIdPairVec;
00152 typedef std::map<SoLDM::DataSetIdPair, SbMatrix> ModelMatrixMap;
00153
00154 virtual void setElt( SoState* state, SoDataSet* ds );
00155 virtual void setElt( SoState* state, SoDataSet* ds, const SbMatrix &matrix );
00156
00157 virtual ~SoDataSetElement() ;
00158
00159 private:
00164 static SoLDM::DataSetIdPair getLastOfType(SoState* state, SoType type, bool derived);
00165
00166
00167 DataSetPtrIdPairVec m_dataSetIdPairList;
00168 ModelMatrixMap m_modelMatrices;
00169
00170 SbMatrix m_modelMatrix;
00171 SbBool m_isModelIdentity;
00172 SoLDM::DataSetIdPair m_datasetNode;
00173 SoLDM::DataSetIdPair m_masterPair;
00174 static bool s_forceOIV6Behavior;
00175 std::vector<uint64_t> m_nodeIds;
00176 };
00177
00178 #ifdef _MSC_VER
00179 #pragma warning( pop )
00180 #endif
00181
00182 #endif // _SO_DATA_SET_ELEMENT_
00183
00184
00185