summaryrefslogtreecommitdiffstats
path: root/kpovmodeler/pmspheresweep.h
blob: 281db0c39a13c92010bb0b11c069f91a6982a9bc (plain)
1
2
3
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
//-*-C++-*-
/*
**************************************************************************
                                 description
                             --------------------
    copyright            : (C) 2003 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 PMSPHERESWEEP_H
#define PMSPHERESWEEP_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "pmsolidobject.h"
#include "pmvector.h"
#include <qptrlist.h>
#include <qvaluelist.h>
#include <math.h>

class PMViewStructure;

/**
 * Class for povray sphere sweep objects.
 */

class PMSphereSweep : public PMSolidObject
{
   typedef PMSolidObject Base;
public:
   /**
    * The spline type
    */
   enum SplineType { LinearSpline, BSpline, CubicSpline };
   /**
    * Creates an empty PMSphereSweep
    */
   PMSphereSweep( PMPart* part );
   /**
    * Copy constructor
    */
   PMSphereSweep( const PMSphereSweep& l );
   /**
    * deletes the PMSphereSweep
    */
   virtual ~PMSphereSweep( );

   /** */
   virtual PMObject* copy( ) const { return new PMSphereSweep( *this ); }
   /** */
   virtual QString description( ) const;

   /** */
   virtual PMMetaObject* metaObject( ) const;
   /** */
   virtual void cleanUp( ) const;

   /** */
   virtual void serialize( QDomElement& e, QDomDocument& doc ) const;
   /** */
   virtual void readAttributes( const PMXMLHelper& h );
   /**
    * Returns a new @ref PMSphereSweepEdit
    */
   virtual PMDialogEditBase* editWidget( QWidget* parent ) const;
   /**
    * Returns the name of the pixmap that is displayed in the tree view
    * and dialog view
    */
   virtual QString pixmap( ) const { return QString( "pmspheresweep" ); }

   /** */
   virtual void createMemento( );
   /** */
   virtual void restoreMemento( PMMemento* s );
   /** */
   virtual void controlPoints( PMControlPointList& list );
   /** */
   virtual void controlPointsChanged( PMControlPointList& list );
   /** */
   virtual bool hasDisplayDetail( ) const { return true; }
   /** */
   virtual void addObjectActions( const PMControlPointList&,
                                  QPtrList<PMObjectAction>& );
   /** */
   virtual void objectActionCalled( const PMObjectAction*,
                                    const PMControlPointList&,
                                    const QPtrList<PMVector>&,
                                    const PMVector& );

   /**
    * Returns the spline points
    */
   QValueList<PMVector> points( ) const { return m_points; }
   /**
    * Sets the spline points
    */
   void setPoints( const QValueList<PMVector>& points );
   /**
    * Returns the radii
    */
   QValueList<double> radii( ) const { return m_radii; }
   /**
    * Sets the radii
    */
   void setRadii( const QValueList<double>& radii );
   /**
    * Returns the number of spline points
    */
   int numberOfPoints( ) const { return m_points.size( ); }
   /**
    * Returns the spline type
    */
   SplineType splineType( ) const { return m_splineType; }
   /**
    * Sets the spline type
    */
   void setSplineType( SplineType t );
   /**
    * Returns the depth tolerance
    */
   double tolerance( ) const { return m_tolerance; }
   /**
    * Sets the depth tolerance
    */
   void setTolerance( double t );

   /**
    * Sets the number of steps around the y axis
    */
   static void setRSteps( int r );
   /**
    * Sets the number of subdivisions of one spline segment
    */
   static void setSSteps( int v );
   /**
    * Returns the number of steps around the y axis
    */
   static int rSteps( ) { return s_rSteps; }
   /**
    * Returns the number of subdivisions of one spline segment
    */
   static int sSteps( ) { return s_sSteps; }

protected:
   /** */
   virtual void createViewStructure( );
   /** */
   virtual int viewStructureParameterKey( ) const { return s_parameterKey + globalDetailKey( ); }

private:
   /**
    * Object action. Adds a spline point
    */
   void splitSegment( const PMControlPointList& cp,
                      const QPtrList<PMVector>& cpViewPosition,
                      const PMVector& clickPosition );
   /**
    * Object action. Removes a spline point
    */
   void joinSegments( const PMControlPointList& cp,
                      const QPtrList<PMVector>& cpViewPosition,
                      const PMVector& clickPosition );

   void stringToValues( const QString& str );
   QString valuesToString( ) const;

   /**
    * IDs for @ref PMMementoData
    */
   enum PMSphereSweepMementoID { PMSplineTypeID, PMToleranceID };
   /**
    * IDs for the object actions
    */
   enum PMSphereSweepActionID { PMSplitSegmentID, PMJoinSegmentsID };
   SplineType m_splineType;
   QValueList<PMVector> m_points;
   QValueList<double> m_radii;
   double m_tolerance;

   static int s_rSteps;
   static int s_sSteps;
   static int s_parameterKey;

   static PMMetaObject* s_pMetaObject;

   /**
    * Segment Structure for holding info for
    * creating view structure
    */
   struct Segment{
      QValueList<PMVector> points;
      QValueList<double> radii;
      QValueList<PMVector> direction;
   };

   QValueList<Segment> m_segments;
   int m_nextPoint;
   int m_nextLine;
   /**
    * Sets up the segments for linear spline
    * @param sSteps the number of subdivisions per segment
    */
   void setLinear( int sSteps );
   /**
    * Sets up segments for curved splines
    * @param cubic true for cubic_spline false for b_spline
    * @param sSteps the number of subdivisions per segment
    */
   void setCurved( bool cubic, int sSteps );
   /**
    * Returns a point on a Catmull rom spline
    * @param v Pointer to four control points
    * @param t position along spline ( 0.0 - 1.0 )
    */
   PMVector catmullRom( PMVector *v, double t );
   /**
    * Returns a point on a cubic b spline
    * @param v pointer to four control points
    * @param t position along spline ( 0.0 - 1.0 )
    */
   PMVector bSpline( PMVector *v, double t );
   /**
    * Creates a sphere
    * @param v poisition of sphere
    * @param r radius of sphere
    * @param rSteps the number of steps around the y axis
    */
   void createSphere( PMVector v, double r, int rSteps );

};

#endif