You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
5.9 KiB
222 lines
5.9 KiB
15 years ago
|
/*
|
||
|
**************************************************************************
|
||
|
description
|
||
|
--------------------
|
||
|
copyright : (C) 2000-2001 by Andreas Zehender
|
||
|
email : zehender@kde.org
|
||
|
**************************************************************************
|
||
|
|
||
|
**************************************************************************
|
||
|
* *
|
||
|
* 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
|