diff options
Diffstat (limited to 'kpovmodeler/pmviewstructure.h')
-rw-r--r-- | kpovmodeler/pmviewstructure.h | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/kpovmodeler/pmviewstructure.h b/kpovmodeler/pmviewstructure.h new file mode 100644 index 00000000..5356466b --- /dev/null +++ b/kpovmodeler/pmviewstructure.h @@ -0,0 +1,222 @@ +//-*-C++-*- +/* +************************************************************************** + description + -------------------- + copyright : (C) 2000-2001 by Andreas Zehender + email : [email protected] +************************************************************************** + +************************************************************************** +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +**************************************************************************/ + + +#ifndef PMVIEWSTRUCTURE_H +#define PMVIEWSTRUCTURE_H + +#include "pmface.h" +#include "pmpoint.h" +#include "pmline.h" +#include "pmmatrix.h" +#include "pmobject.h" +#include "pmvector.h" + +/** + * Represents the view structure (points, lines, faces) of an object + * + * Faces are not implemented yet but are needed later to calculate the view + * structure of csg objects + */ + +class PMViewStructure +{ + friend class PMObject; +public: + /** + * Creates an empty view structure + */ + PMViewStructure( ); + /** + * Creates a view structure with n points, l lines and f faces. + */ + PMViewStructure( unsigned int n, unsigned int l, unsigned int f = 0 ); + /** + * Creates a copy of the view structure. m_points, m_lines and m_faces are shared + */ + PMViewStructure( const PMViewStructure& vs ); + /** + * Creates a copy of the view structure. m_points, m_lines anf m_faces are shared + */ + PMViewStructure( const PMViewStructure* vs ); + + /** + * Returns a reference to the array of points + */ + PMPointArray& points( ) { return m_points; } + /** + * Returns a reference to the array of lines + */ + PMLineArray& lines( ) { return m_lines; } + /** + * Returns a refrence to the array of faces + */ + PMFaceArray& faces( ) { return m_faces; } + /** + * Returns the parameter key + */ + int parameterKey( ) const { return m_parameterKey; } + /** + * Sets the parameter key + */ + void setParameterKey( int k ) { m_parameterKey = k; } + + /** + * Assigns the view structure to this view structure. + * The points and lines are shared + */ + PMViewStructure& operator = ( const PMViewStructure& vs ); + /** + * Returns true if the view structures share the same points and lines + */ + bool operator == ( const PMViewStructure& vs ) const; + /** + * Returns false if the view structures share the same points and lines + */ + bool operator != ( const PMViewStructure& vs ) const; +protected: + /** + * Not transformed points, can be shared between PMObjects + * of the same type. m_points.data( ) can be used as vertex array. + * + * Optimized for fast rendering. + */ + PMPointArray m_points; + /** + * Lines to display. m_lines.data( ) can be used by glDrawElements. + * + * Optimized for fast rendering. + */ + PMLineArray m_lines; + /** + * Faces to display. + */ + PMFaceArray m_faces; + /** + * View structure parameter key. + * + * Each class can have parameters that modifies the number of lines and + * points of a view structure (detail level). + * + * The framework determines if the view structure is up to date by + * comparing the key with the parameter key of the corresponding class. + */ + int m_parameterKey; +}; + +/** + * Class for bounding boxes of PMObjects + */ +class PMBoundingBox +{ +public: + /** + * Creates a bounding box with min and max vectors + */ + PMBoundingBox( const PMVector& min, const PMVector& max ); + /** + * Creates an invalid bounding box. @ref PMObject::boundingBox() returns + * an invalid bounding box, if the object has none. + */ + PMBoundingBox( ); + + /** + * Returns the minimum coordinates + */ + PMVector min( ) const { return m_min; } + /** + * Returns the maximum coordinates + */ + PMVector max( ) const { return m_max; } + /** + * Returns the minumum x coordinate + */ + double minX( ) const { return m_min.x( ); } + /** + * Returns the minumum y coordinate + */ + double minY( ) const { return m_min.y( ); } + /** + * Returns the minumum z coordinate + */ + double minZ( ) const { return m_min.z( ); } + /** + * Returns the maximum x coordinate + */ + double maxX( ) const { return m_max.x( ); } + /** + * Returns the maximum y coordinate + */ + double maxY( ) const { return m_max.y( ); } + /** + * Returns the maximum z coordinate + */ + double maxZ( ) const { return m_max.z( ); } + /** + * Sets the minimum coordinates + */ + void setMin( const PMVector& min ) { m_min = min; } + /** + * Sets the maximum coordinates + */ + void setMax( const PMVector& max ) { m_max = max; } + /** + * Sets the minimum x coordinate + */ + void setMinX( const double c ) { m_min.setX( c ); } + /** + * Sets the minimum y coordinate + */ + void setMinY( const double c ) { m_min.setY( c ); } + /** + * Sets the minimum z coordinate + */ + void setMinZ( const double c ) { m_min.setZ( c ); } + /** + * Sets the maximum x coordinate + */ + void setMaxX( const double c ) { m_max.setX( c ); } + /** + * Sets the maximum y coordinate + */ + void setMaxY( const double c ) { m_max.setY( c ); } + /** + * Sets the maximum z coordinate + */ + void setMaxZ( const double c ) { m_max.setZ( c ); } + + /** + * Returns true, if the bounding box is valid + */ + bool isValid( ) const { return m_bValid; } + /** + * Sets the valid flag to v + */ + void setValid( bool v ) { m_bValid = v; } + + /** + * Merges the two bounding boxes + */ + void mergeWith( const PMBoundingBox& box ); + +private: + bool m_bValid; + PMVector m_min, m_max; +}; + +#endif |