UpdateType.hh 8.73 KB
Newer Older
Jan Möbius's avatar
Jan Möbius committed
1 2 3
/*===========================================================================*\
*                                                                            *
*                              OpenFlipper                                   *
Martin Schultz's avatar
Martin Schultz committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
 *           Department of Computer Graphics and Multimedia                  *
 *                          All rights reserved.                             *
 *                            www.openflipper.org                            *
 *                                                                           *
 *---------------------------------------------------------------------------*
 * This file is part of OpenFlipper.                                         *
 *---------------------------------------------------------------------------*
 *                                                                           *
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. Redistributions in binary form must reproduce the above copyright      *
 *    notice, this list of conditions and the following disclaimer in the    *
 *    documentation and/or other materials provided with the distribution.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder nor the names of its          *
 *    contributors may be used to endorse or promote products derived from   *
 *    this software without specific prior written permission.               *
 *                                                                           *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       *
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A           *
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       *
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        *
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    *
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      *
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        *
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              *
Jan Möbius's avatar
Jan Möbius committed
39 40 41 42 43 44 45 46 47 48 49
*                                                                            *
\*===========================================================================*/

/*===========================================================================*\
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
\*===========================================================================*/

Dirk Wilden's avatar
Dirk Wilden committed
50 51 52 53

#ifndef UPDATETYPE_HH
#define UPDATETYPE_HH

Jan Möbius's avatar
Jan Möbius committed
54
#include <OpenFlipper/common/GlobalDefines.hh>
Jan Möbius's avatar
Jan Möbius committed
55
#include <bitset>
56
#include <QString>
Dirk Wilden's avatar
Dirk Wilden committed
57

Jan Möbius's avatar
Jan Möbius committed
58
typedef std::bitset<64> UpdateTypeSet;
Dirk Wilden's avatar
Dirk Wilden committed
59

60 61 62 63 64 65 66 67 68 69
/** \brief Update type class
 *
 *
 *  This class is used to specify the scope of updates. There are update types for
 *  selection,geometry,topology,colors,... specified here: \ref DefaultUpdateTypes
 *
 *  You can also find functions to add custom update types at runtime at
 *  \ref UpdateTypeFunctions
 *
 */
Jan Möbius's avatar
Jan Möbius committed
70
class DLLEXPORT UpdateType {
Jan Möbius's avatar
Jan Möbius committed
71
  public:
72 73
    UpdateType();

Jan Möbius's avatar
Jan Möbius committed
74 75
    UpdateType(const UpdateType& _type);
    
Jan Möbius's avatar
Jan Möbius committed
76
    UpdateType(const UpdateTypeSet& _set);
Jan Möbius's avatar
Jan Möbius committed
77 78 79
    
    /// Exact compare operator
    bool operator==(const UpdateType& _type) const;
80 81 82 83

    UpdateType operator|(const UpdateType& _type) const;

    UpdateType& operator|=(const UpdateType& _type);
Jan Möbius's avatar
Jan Möbius committed
84 85 86 87 88 89
    
    UpdateType& operator++();
    
    bool operator<( const UpdateType& _i ) const;
    
    /// Check if this update contains the given UpdateType
90
    bool contains( const UpdateType& _type ) const;
Jan Möbius's avatar
Jan Möbius committed
91
    
92 93 94 95 96
    friend std::ostream &operator<< (
            std::ostream &os, const UpdateType &type) {
        return os << type.type_;
    }

Jan Möbius's avatar
Jan Möbius committed
97 98 99
  protected:
    UpdateTypeSet type_;
};
Dirk Wilden's avatar
Dirk Wilden committed
100

101 102 103 104 105 106
/** \defgroup DefaultUpdateTypes Default update types
 * The following update types are predefined for the general use cases
 * @{
 *
 */

107 108 109
/// Empty update for empty initialization of update type
const UpdateType UPDATE_NONE( UpdateTypeSet(0)  );

Dirk Wilden's avatar
Dirk Wilden committed
110
/// Identifier for all updates
Jan Möbius's avatar
Jan Möbius committed
111 112
const UpdateType UPDATE_ALL(              UpdateTypeSet(1)       );

113
/// This is the update identifier for global Object visibility ( show/hide )
Jan Möbius's avatar
Jan Möbius committed
114
const UpdateType UPDATE_VISIBILITY(       UpdateTypeSet(1) << 1  );
Jan Möbius's avatar
Jan Möbius committed
115 116 117 118 119 120 121


/** \brief Geometry updated
*
* Updated Geometry ( This update type has to be used if you only modify vertex positions of 
* an object. Everything else has to stay as before the update.
*/
Jan Möbius's avatar
Jan Möbius committed
122
const UpdateType UPDATE_GEOMETRY( UpdateTypeSet(1) << 2 );
Jan Möbius's avatar
Jan Möbius committed
123 124 125 126 127 128

/** \brief Topology updated
*
* Updated Topology ( This update type has to be used if you modify the topology
* of an object. This includes adding vertices or removing them! )
*/
Jan Möbius's avatar
Jan Möbius committed
129
const UpdateType UPDATE_TOPOLOGY( UpdateTypeSet(1) << 3 );
Jan Möbius's avatar
Jan Möbius committed
130 131 132 133 134 135 136


/** \brief Selection updated
*
* Updated Selection ( This update type has to be used if you modify the internal
* selection of an object. Like selecting a single vertex or a set of faces. ). 
*/
Jan Möbius's avatar
Jan Möbius committed
137
const UpdateType UPDATE_SELECTION( UpdateTypeSet(1) << 4 );
Jan Möbius's avatar
Jan Möbius committed
138 139 140 141 142

/** \brief Vertex selection has changed
*
* This is a more fine grained selection update. UPDATE_SELECTION will also match this update type.
*/
Jan Möbius's avatar
Jan Möbius committed
143
const UpdateType UPDATE_SELECTION_VERTICES( UpdateTypeSet(1) << 5 );
Jan Möbius's avatar
Jan Möbius committed
144 145 146 147 148 149


/** \brief Edge selection has changed
*
* This is a more fine grained selection update. UPDATE_SELECTION will also match this update type.
*/
Jan Möbius's avatar
Jan Möbius committed
150
const UpdateType UPDATE_SELECTION_EDGES( UpdateTypeSet(1) << 6 );
Jan Möbius's avatar
Jan Möbius committed
151

152

153
/** \brief Halfedge selection has changed
154 155 156 157 158
*
* This is a more fine grained selection update. UPDATE_SELECTION will also match this update type.
*/
const UpdateType UPDATE_SELECTION_HALFEDGES( UpdateTypeSet(1) << 7 );

Jan Möbius's avatar
Jan Möbius committed
159 160 161 162
/** \brief Face selection has changed
*
* This is a more fine grained selection update. UPDATE_SELECTION will also match this update type.
*/
163
const UpdateType UPDATE_SELECTION_FACES( UpdateTypeSet(1) << 8 );
Dirk Wilden's avatar
Dirk Wilden committed
164

165 166 167 168
/** \brief Knot selection has changed
*
* This is a more fine grained selection update. UPDATE_SELECTION will also match this update type.
*/
169
const UpdateType UPDATE_SELECTION_KNOTS( UpdateTypeSet(1) << 9 );
170

171 172 173 174
/** \brief Colors have changed
*
* Update the colors. This does not have to be called when topology is also updated
*/
175
const UpdateType UPDATE_COLOR( UpdateTypeSet(1) << 10 );
176

177 178 179 180 181 182
/** \brief Textures have changed
*
* Update the Textures.
*/
const UpdateType UPDATE_TEXTURE( UpdateTypeSet(1) << 11 );

183 184 185 186 187 188
/** \brief State has changed
*
* The object's state (target, source) has changed
*/
const UpdateType UPDATE_STATE( UpdateTypeSet(1) << 12 );

Jan Möbius's avatar
Jan Möbius committed
189
/// marks the last used ID
190
const UpdateType UPDATE_UNUSED ( UpdateTypeSet(1) << 13 );
Dirk Wilden's avatar
Dirk Wilden committed
191

192 193
/**@}*/

Jan Möbius's avatar
Jan Möbius committed
194
//=====================================================================================
Dirk Wilden's avatar
Dirk Wilden committed
195
// FUNCTIONS
Jan Möbius's avatar
Jan Möbius committed
196
//=====================================================================================
Dirk Wilden's avatar
Dirk Wilden committed
197

198 199 200 201 202 203 204

/** \defgroup UpdateTypeFunctions Runtime Update Types
 * Use these functions to add custom update types at runtime.
 * @{
 *
 */

205
/** Adds a UpdateType and returns the id for the new type
Dirk Wilden's avatar
Dirk Wilden committed
206
*
207 208
* @param _name Internal name for the new UpdateType
* @param _resetNeeded If a sceneGraph reset is needed for this update
Dirk Wilden's avatar
Dirk Wilden committed
209 210
*/
DLLEXPORT
211
UpdateType addUpdateType(QString _name, bool _resetNeeded = true);
Dirk Wilden's avatar
Dirk Wilden committed
212

213
/// Given an UpdateType Identifier string this function will return the id of the UpdateType
Dirk Wilden's avatar
Dirk Wilden committed
214 215 216 217 218
DLLEXPORT
UpdateType updateType(QString _name);

/** \brief Get the name of a type with given id
*
219 220
* The ids are organized in a bit field. So use either the macro for getting the type id or
* use the id directly (they have to be power of 2! ... Bit field)
Dirk Wilden's avatar
Dirk Wilden committed
221 222 223 224 225 226 227 228 229 230
*/
DLLEXPORT
QString updateTypeName(UpdateType _id);

/** \brief Get the number of registered types
*
* This function will return the number of types registered to the core. You can use it to
* iterate over all types. 
*/
DLLEXPORT 
231
size_t updateTypeCount();
Dirk Wilden's avatar
Dirk Wilden committed
232

233
/**@}*/
Dirk Wilden's avatar
Dirk Wilden committed
234 235

#endif // UPDATETYPE_HH