UpdateType.hh 8.19 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
*                                                                            *
\*===========================================================================*/

Jan Möbius's avatar
Jan Möbius committed
42
#pragma once
Dirk Wilden's avatar
Dirk Wilden committed
43

Jan Möbius's avatar
Jan Möbius committed
44
#include <OpenFlipper/common/GlobalDefines.hh>
Jan Möbius's avatar
Jan Möbius committed
45
#include <bitset>
46
#include <QString>
Dirk Wilden's avatar
Dirk Wilden committed
47

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

50 51 52 53 54 55 56 57 58 59
/** \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
60
class DLLEXPORT UpdateType {
Jan Möbius's avatar
Jan Möbius committed
61
  public:
62 63
    UpdateType();

Jan Möbius's avatar
Jan Möbius committed
64 65
    UpdateType(const UpdateType& _type);
    
Jan Möbius's avatar
Jan Möbius committed
66
    UpdateType(const UpdateTypeSet& _set);
Jan Möbius's avatar
Jan Möbius committed
67 68 69
    
    /// Exact compare operator
    bool operator==(const UpdateType& _type) const;
70 71 72 73

    UpdateType operator|(const UpdateType& _type) const;

    UpdateType& operator|=(const UpdateType& _type);
Jan Möbius's avatar
Jan Möbius committed
74 75 76 77 78 79
    
    UpdateType& operator++();
    
    bool operator<( const UpdateType& _i ) const;
    
    /// Check if this update contains the given UpdateType
80
    bool contains( const UpdateType& _type ) const;
Jan Möbius's avatar
Jan Möbius committed
81
    
82 83 84 85 86
    friend std::ostream &operator<< (
            std::ostream &os, const UpdateType &type) {
        return os << type.type_;
    }

Jan Möbius's avatar
Jan Möbius committed
87 88 89
  protected:
    UpdateTypeSet type_;
};
Dirk Wilden's avatar
Dirk Wilden committed
90

91 92 93 94 95 96
/** \defgroup DefaultUpdateTypes Default update types
 * The following update types are predefined for the general use cases
 * @{
 *
 */

97 98 99
/// Empty update for empty initialization of update type
const UpdateType UPDATE_NONE( UpdateTypeSet(0)  );

Dirk Wilden's avatar
Dirk Wilden committed
100
/// Identifier for all updates
Jan Möbius's avatar
Jan Möbius committed
101 102
const UpdateType UPDATE_ALL(              UpdateTypeSet(1)       );

103
/// This is the update identifier for global Object visibility ( show/hide )
Jan Möbius's avatar
Jan Möbius committed
104
const UpdateType UPDATE_VISIBILITY(       UpdateTypeSet(1) << 1  );
Jan Möbius's avatar
Jan Möbius committed
105 106 107 108 109 110 111


/** \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
112
const UpdateType UPDATE_GEOMETRY( UpdateTypeSet(1) << 2 );
Jan Möbius's avatar
Jan Möbius committed
113 114 115 116 117 118

/** \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
119
const UpdateType UPDATE_TOPOLOGY( UpdateTypeSet(1) << 3 );
Jan Möbius's avatar
Jan Möbius committed
120 121 122 123 124 125 126


/** \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
127
const UpdateType UPDATE_SELECTION( UpdateTypeSet(1) << 4 );
Jan Möbius's avatar
Jan Möbius committed
128 129 130 131 132

/** \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
133
const UpdateType UPDATE_SELECTION_VERTICES( UpdateTypeSet(1) << 5 );
Jan Möbius's avatar
Jan Möbius committed
134 135 136 137 138 139


/** \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
140
const UpdateType UPDATE_SELECTION_EDGES( UpdateTypeSet(1) << 6 );
Jan Möbius's avatar
Jan Möbius committed
141

142

143
/** \brief Halfedge selection has changed
144 145 146 147 148
*
* 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
149 150 151 152
/** \brief Face selection has changed
*
* This is a more fine grained selection update. UPDATE_SELECTION will also match this update type.
*/
153
const UpdateType UPDATE_SELECTION_FACES( UpdateTypeSet(1) << 8 );
Dirk Wilden's avatar
Dirk Wilden committed
154

155 156 157 158
/** \brief Knot selection has changed
*
* This is a more fine grained selection update. UPDATE_SELECTION will also match this update type.
*/
159
const UpdateType UPDATE_SELECTION_KNOTS( UpdateTypeSet(1) << 9 );
160

161 162 163 164
/** \brief Colors have changed
*
* Update the colors. This does not have to be called when topology is also updated
*/
165
const UpdateType UPDATE_COLOR( UpdateTypeSet(1) << 10 );
166

167 168 169 170 171 172
/** \brief Textures have changed
*
* Update the Textures.
*/
const UpdateType UPDATE_TEXTURE( UpdateTypeSet(1) << 11 );

173 174 175 176 177 178
/** \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
179
/// marks the last used ID
180
const UpdateType UPDATE_UNUSED ( UpdateTypeSet(1) << 13 );
Dirk Wilden's avatar
Dirk Wilden committed
181

182 183
/**@}*/

Jan Möbius's avatar
Jan Möbius committed
184
//=====================================================================================
Dirk Wilden's avatar
Dirk Wilden committed
185
// FUNCTIONS
Jan Möbius's avatar
Jan Möbius committed
186
//=====================================================================================
Dirk Wilden's avatar
Dirk Wilden committed
187

188 189 190 191 192 193 194

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

195
/** Adds a UpdateType and returns the id for the new type
Dirk Wilden's avatar
Dirk Wilden committed
196
*
197 198
* @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
199 200
*/
DLLEXPORT
201
UpdateType addUpdateType(QString _name, bool _resetNeeded = true);
Dirk Wilden's avatar
Dirk Wilden committed
202

203
/// Given an UpdateType Identifier string this function will return the id of the UpdateType
Dirk Wilden's avatar
Dirk Wilden committed
204 205 206 207 208
DLLEXPORT
UpdateType updateType(QString _name);

/** \brief Get the name of a type with given id
*
209 210
* 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
211 212 213 214 215 216 217 218 219 220
*/
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 
221
size_t updateTypeCount();
Dirk Wilden's avatar
Dirk Wilden committed
222

223
/**@}*/
Dirk Wilden's avatar
Dirk Wilden committed
224

Jan Möbius's avatar
Jan Möbius committed
225