VR-Forces 5.0.2 Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DtOsgCullVisitorParameters.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2022 MAK Technologies, Inc.
3  * All rights reserved.
4  *****************************************************************************/
5 
13 
14 #pragma once
15 
16 
17 #include <vrvOsg/DtModelScaler.h>
18 
21 
22 #include <osgUtil/CullVisitor>
23 
24 #include <osg/BoundingBox>
25 #include <osg/BoundingSphere>
26 #include <osg/Vec2>
27 
28 
29 #include <matrix/vlMath.h>
30 #include <algorithm>
31 #include <math.h>
32 
33 #ifdef min
34 #undef min
35 #endif
36 
37 namespace makVrv
38 {
42  class DT_DLL_VRVOSG DtOsgCullVisitorParameters : public osg::Referenced
43  {
44  public:
45 
48  : osg::Referenced()
49  , mySkyFlag(true)
50  , myDynamicLightsFlag(true)
51  , myDynamicOceanFlag(true)
52  , myCameraAboveWater(true)
53  , myOrthoFlag(false)
54  , myCameraResolution( 1.0 )
55  , myTerrainRadius( 1.0 )
56  , myScalingFlag( true )
57  , myClampedPixelSize( 1.0 )
58  , myLodScaleFactor( 1.0 )
59  , myCoordinateSystemChanged( false )
60  , myAltitude2D( 0. )
61  , myDynamicWaterVisibilityEnable(true)
62  , myDynamicWaterVisibilityMax(75.)
63  , myModelScaler( 0 )
64  , myTerrainMagnificationHighLodAngle(DtDeg2Rad(15))
65  , myTerrainMagnificationScaleFactor(1.)
66  , myCameraVelocity( 0, 0, 0 )
67  , myModelSet(0)
68  , myIncludeLightPoints(true)
69  , myCurrentScaleFactor(1.0)
70  , myIndirectDistScaleEnabled(false)
71  , myIndirectDistScale(1.0)
72  , myChannelLodScale(1.0f)
73  , myFocusPointEnabled(false)
74  , myFocusPoints()
75  {
76 
77  //Intentional nop
78  }
79 
82  inline void setLodScaleFactor( double sf )
83  {
84  myLodScaleFactor = sf;
85  }
86 
88  inline double lodScaleFactor() const
89  {
90  return myLodScaleFactor;
91  }
92 
94  void setCameraResolution(double factor)
95  {
96  myCameraResolution = factor;
97  }
98 
100  inline double cameraResolution() const
101  {
102  return myCameraResolution;
103  }
105  void setCameraVelocity(double x, double y, double z)
106  {
107  myCameraVelocity = osg::Vec3d(x,y,z);
108  }
109 
111  inline const osg::Vec3d& cameraVelocity() const
112  {
113  return myCameraVelocity;
114  }
115 
117  void setTerrainRadius(double rad)
118  {
119  myTerrainRadius = rad;
120  }
121 
123  void setAltitude2D( double altitude )
124  {
125  myAltitude2D = altitude;
126  }
127 
129  double altitude2D() const
130  {
131  return myAltitude2D;
132  }
133 
135  inline unsigned int modelSet() const
136  {
137  return myModelSet;
138  }
139 
141  void setModelSet(unsigned int modelSet)
142  {
143  myModelSet = modelSet;
144  }
145 
147  inline double terrainRadius() const
148  {
149  return myTerrainRadius;
150  }
151 
153  void setOrthoCulling(bool ortho)
154  {
155  myOrthoFlag = ortho;
156  }
157 
159  inline bool orthoCulling() const
160  {
161  return myOrthoFlag;
162  }
163 
165  inline void setSkyRendering(bool renderSky)
166  {
167  mySkyFlag = renderSky;
168 
169  }
170 
172  inline bool skyRendering() const
173  {
174  return mySkyFlag;
175  }
176 
178  inline void setDynamicLights(bool enabled)
179  {
180  myDynamicLightsFlag = enabled;
181  }
182 
184  inline bool dynamicLights() const
185  {
186  return myDynamicLightsFlag;
187  }
188 
190  inline void setDynamicOcean(bool enabled)
191  {
192  myDynamicOceanFlag = enabled;
193  }
194 
196  inline bool dynamicOcean() const
197  {
198  return myDynamicOceanFlag;
199  }
200 
202  inline void setCameraAboveWater(bool aboveWater)
203  {
204  myCameraAboveWater = aboveWater;
205  }
206 
208  inline bool cameraAboveWater() const
209  {
210  return myCameraAboveWater;
211  }
212 
214  void setScaling( bool scaling )
215  {
216  myScalingFlag = scaling;
217  }
218 
220  inline bool scaling() const
221  {
222  return myScalingFlag;
223  }
224 
226  void setCoordinateSystemChanged( bool changed )
227  {
228  myCoordinateSystemChanged = changed;
229  }
230 
232  inline bool coordinateSystemChanged() const
233  {
234  return myCoordinateSystemChanged;
235  }
236 
239  inline void setModelScaler( DtModelScaler* scaler )
240  {
241  myModelScaler = scaler;
242  }
243 
245  {
246  return myModelScaler;
247  }
248 
250  inline double calculateModelScale( const osg::Camera& camera,
251  const osg::Node& node ) const
252  {
253  if ( myModelScaler.valid() )
254  {
255  return myModelScaler->calculateScale( *this, camera, node );
256  }
257  else
258  {
259  return 1.;
260  }
261  }
262 
267  void setClampedPixelSize(double d)
268  {
269  myClampedPixelSize = d;
270  }
271 
273  double clampedPixelSize() const
274  {
275  return myClampedPixelSize;
276  }
277 
281  inline void setDynamicWaterVisibilityEnable( bool enable )
282  {
283  myDynamicWaterVisibilityEnable = enable;
284  }
285 
287  inline bool dynamicWaterVisibilityEnable() const
288  {
289  return myDynamicWaterVisibilityEnable;
290  }
291 
294  inline void setDynamicWaterVisibilityMax( double visMax )
295  {
296  myDynamicWaterVisibilityMax = visMax;
297  }
298 
301  inline double dynamicWaterVisibilityMax() const
302  {
303  return myDynamicWaterVisibilityMax;
304  }
305 
308  inline void setTerrainMagnificationScaleFactor(float factor)
309  {
310  myTerrainMagnificationScaleFactor = factor;
311  }
312 
315  inline float terrainMagnificationScaleFactor() const
316  {
317  return myTerrainMagnificationScaleFactor;
318  }
319 
326  inline void setTerrainMagnificationHighLodAngle(float radians)
327  {
328  myTerrainMagnificationHighLodAngle = radians;
329  }
330 
335  inline float terrainMagnificationHighLodAngle() const
336  {
337  return myTerrainMagnificationHighLodAngle;
338  }
339 
341  inline void setIncludeLightPoints(bool flag)
342  {
343  myIncludeLightPoints = flag;
344  }
345 
347  inline bool includeLightPoints() const
348  {
349  return myIncludeLightPoints;
350  }
351 
355  {
356  return myCurrentScaleFactor;
357  }
358 
361  inline void setCurrentTraversalScaleFactor(float currentScaleFactor)
362  {
363  myCurrentScaleFactor = currentScaleFactor;
364  }
365 
367  inline void setIndirectDistanceScaleEnabled(bool enabled)
368  {
369  myIndirectDistScaleEnabled = enabled;
370  }
371 
373  inline bool indirectDistanceScaleEnabled() const
374  {
375  return myIndirectDistScaleEnabled;
376  }
377 
379  inline void setIndirectDistanceScale(float scale)
380  {
381  myIndirectDistScale = scale;
382  }
383 
385  inline float indirectDistanceScale() const
386  {
387  return myIndirectDistScale;
388  }
389 
391  inline void setChannelLodScale(float scale)
392  {
393  myChannelLodScale = scale;
394  }
395 
397  inline float channelLodScale()
398  {
399  return myChannelLodScale;
400  }
401 
404  inline void setFocusPoints(std::vector<osg::Vec3d>& points)
405  {
406  myFocusPoints = points;
407  }
408 
411  inline std::vector<osg::Vec3d>& focusPoints()
412  {
413  return myFocusPoints;
414  }
415 
418  inline void setFocusPointEnabled(bool enable)
419  {
420  myFocusPointEnabled = enable;
421  }
422 
425  inline bool focusPointEnabled()
426  {
427  return myFocusPointEnabled;
428  }
429 
431  virtual DtIndirectModelScalingAlgorithm indirectModelScalingAlgorithm(void) const;
432 
433  protected:
434 
438  double myAltitude2D;
439  bool mySkyFlag;
452  osg::Vec3d myCameraVelocity;
453  unsigned int myModelSet;
458  std::vector<osg::Vec3d> myFocusPoints;
459 
462  };
463 
466  class DT_DLL_VRVOSG DtOsgFixedScaleParameters : public osg::Referenced
467  {
468  public:
470  : myFixedPixelSize( 1.0 )
471  , myLength( 0.0 )
472  , myWidth( 0.0 )
473  , myHeight( 0.0 )
474  , myScaleX(true)
475  , myScaleY(true)
476  , myScaleZ(true)
477  {
478 }
479 
481  {
482  }
483 
484  void setFixedPixelSize(double d)
485  {
486  myFixedPixelSize = d;
487  }
488 
489  double fixedPixelSize() const
490  {
491  return myFixedPixelSize;
492  }
493 
494  void setDimensions(double length, double width, double height)
495  {
496  myLength = length; myWidth = width; myHeight = height;
497  }
498 
499  inline double length() const
500  {
501  return myLength;
502  }
503 
504  inline double width() const
505  {
506  return myWidth;
507  }
508 
509  inline double height() const
510  {
511  return myHeight;
512  }
513 
514  inline void calculateScaleFactors(const osgUtil::CullVisitor& visitor,
515  const osg::BoundingSphere& sphere, DtOsgCullVisitorParameters* info,
516  double& scaleFactorX, double& scaleFactorY, double& scaleFactorZ) const
517  {
518  double clampedSize =
519  visitor.clampedPixelSize( sphere.center(), info->terrainRadius() );
520  info->setClampedPixelSize(clampedSize);
521 
522  calculateScaleFactors( sphere, *info, scaleFactorX,
523  scaleFactorY, scaleFactorZ );
524  }
525 
526  inline void calculateScaleFactors(const osg::BoundingSphere& sphere, const DtOsgCullVisitorParameters& info,
527  double& scaleFactorX, double& scaleFactorY, double& scaleFactorZ) const
528  {
529  scaleFactorX = scaleFactorY = scaleFactorZ = 1.0;
530 
531  double metersPerPixel = info.terrainRadius() / info.clampedPixelSize(); // Meters per pixel
532  double curPixels = myWidth / metersPerPixel; // Pixels needed to draw
533 
534  if (myScaleX)
535  {
536  scaleFactorX = myFixedPixelSize / curPixels;
537  }
538 
539  if (myScaleY)
540  {
541  scaleFactorY = scaleFactorX;
542  }
543 
544  if (myScaleX)
545  {
546  scaleFactorZ = 1.0;
547  }
548  }
549 
550  void setScaleX(bool b)
551  {
552  myScaleX = b;
553  }
554 
555  inline bool scaleX() const
556  {
557  return myScaleX;
558  }
559 
560  void setScaleXY(bool b)
561  {
562  myScaleY = b;
563  }
564 
565  inline bool scaleY() const
566  {
567  return myScaleY;
568  }
569 
570  void setScaleZ(bool b)
571  {
572  myScaleZ = b;
573  }
574 
575  inline bool scaleZ() const
576  {
577  return myScaleZ;
578  }
579 
580  protected:
582  double myLength, myWidth, myHeight;
583  bool myScaleX, myScaleY, myScaleZ;
584  };
585 
586 }
587 
588 
double myAltitude2D
Definition: DtOsgCullVisitorParameters.h:438
std::vector< osg::Vec3d > & focusPoints()
get the focus points. These are used to calculate the terrain intersections which are then used to li...
Definition: DtOsgCullVisitorParameters.h:411
void setDynamicWaterVisibilityMax(double visMax)
Set the maximum value to which water visibility will be set when dynamic water visibility is enabled...
Definition: DtOsgCullVisitorParameters.h:294
float myCurrentScaleFactor
Definition: DtOsgCullVisitorParameters.h:455
void setFocusPoints(std::vector< osg::Vec3d > &points)
set the focus points. These are used to calculate the terrain intersections which are then used to li...
Definition: DtOsgCullVisitorParameters.h:404
bool myScaleZ
Definition: DtOsgCullVisitorParameters.h:583
bool myFocusPointEnabled
Definition: DtOsgCullVisitorParameters.h:461
Object used to calculate fixed scale of object based on how many pixels on screen it should take up...
Definition: DtOsgCullVisitorParameters.h:466
double fixedPixelSize() const
Definition: DtOsgCullVisitorParameters.h:489
void setModelScaler(DtModelScaler *scaler)
Set the XR scaler to use. This will not typically be called by users to change the XR Node Scaler...
Definition: DtOsgCullVisitorParameters.h:239
double myLodScaleFactor
Definition: DtOsgCullVisitorParameters.h:435
bool myDynamicOceanFlag
Definition: DtOsgCullVisitorParameters.h:441
void setSkyRendering(bool renderSky)
Set whether the sky is being rendered.
Definition: DtOsgCullVisitorParameters.h:165
void setClampedPixelSize(double d)
Set the clamped pixel size calculated when using DtOsgFixedScaleParameters. This is ust used to pass ...
Definition: DtOsgCullVisitorParameters.h:267
double myTerrainRadius
Definition: DtOsgCullVisitorParameters.h:437
double altitude2D() const
Return the (implied) 2D altitude.
Definition: DtOsgCullVisitorParameters.h:129
double clampedPixelSize() const
Retrieve the clamped pixel size set in setClampedPixelSize.
Definition: DtOsgCullVisitorParameters.h:273
void setCameraResolution(double factor)
Set the zoom factor that effects LODing.
Definition: DtOsgCullVisitorParameters.h:94
bool myCameraAboveWater
Definition: DtOsgCullVisitorParameters.h:442
#define DT_DLL_VRVOSG
Definition: vrvOsg.h:23
The DtModelScaler prepares the data from the osg camera, osg node, and cull visitor parameters and th...
Definition: DtModelScaler.h:32
void setDynamicOcean(bool enabled)
Set whether a dynamic ocean rendering is enabled.
Definition: DtOsgCullVisitorParameters.h:190
Definition: featureContext.h:37
osg::ref_ptr< DtModelScaler > myModelScaler
Definition: DtOsgCullVisitorParameters.h:449
float myIndirectDistScale
Definition: DtOsgCullVisitorParameters.h:457
void setTerrainMagnificationScaleFactor(float factor)
Set the amount that any view magnification value is reduced by when determining the distance to a pag...
Definition: DtOsgCullVisitorParameters.h:308
void setIndirectDistanceScaleEnabled(bool enabled)
Set if the distance for culling instanced data is enabled.
Definition: DtOsgCullVisitorParameters.h:367
DtOsgCullVisitorParameters()
CTOR.
Definition: DtOsgCullVisitorParameters.h:47
void setCurrentTraversalScaleFactor(float currentScaleFactor)
set the scale factor for the current place in the cull visitor traversal. this is used by the light p...
Definition: DtOsgCullVisitorParameters.h:361
bool myIndirectDistScaleEnabled
Definition: DtOsgCullVisitorParameters.h:456
double length() const
Definition: DtOsgCullVisitorParameters.h:499
double terrainRadius() const
Get the terrain radius.
Definition: DtOsgCullVisitorParameters.h:147
double calculateModelScale(const osg::Camera &camera, const osg::Node &node) const
calculate the model scale using the registered XR scaler.
Definition: DtOsgCullVisitorParameters.h:250
Contains makVrv::DtIndirectModelScalingAlgorithm enumeration.
void setLodScaleFactor(double sf)
Set the LOD scale factor that affects LODing and paging; this is the product of the channels LOD scal...
Definition: DtOsgCullVisitorParameters.h:82
DtIndirectModelScalingAlgorithm
Definition: DtIndirectModelScalingAlgorithm.h:14
DtOsgFixedScaleParameters()
Definition: DtOsgCullVisitorParameters.h:469
bool scaleZ() const
Definition: DtOsgCullVisitorParameters.h:575
osg::Vec3d myCameraVelocity
Definition: DtOsgCullVisitorParameters.h:452
double myCameraResolution
Definition: DtOsgCullVisitorParameters.h:436
void setFocusPointEnabled(bool enable)
set the focust point enabled flag. If enabled the focus point distances and angles are used to calcul...
Definition: DtOsgCullVisitorParameters.h:418
bool cameraAboveWater() const
Get whether the camera is above water.
Definition: DtOsgCullVisitorParameters.h:208
void setScaleX(bool b)
Definition: DtOsgCullVisitorParameters.h:550
void setCameraVelocity(double x, double y, double z)
Set the camera velocity.
Definition: DtOsgCullVisitorParameters.h:105
float myTerrainMagnificationScaleFactor
Definition: DtOsgCullVisitorParameters.h:450
void setTerrainRadius(double rad)
Set the terrain radius.
Definition: DtOsgCullVisitorParameters.h:117
virtual ~DtOsgFixedScaleParameters()
Definition: DtOsgCullVisitorParameters.h:480
DtModelScaler * findModelScaler() const
Definition: DtOsgCullVisitorParameters.h:244
void setDynamicLights(bool enabled)
Set whether dynamic lights are enabled.
Definition: DtOsgCullVisitorParameters.h:178
bool scaleX() const
Definition: DtOsgCullVisitorParameters.h:555
const osg::Vec3d & cameraVelocity() const
Get the camera velocity.
Definition: DtOsgCullVisitorParameters.h:111
bool scaling() const
Get whether scalable groups should be scaled by distance.
Definition: DtOsgCullVisitorParameters.h:220
unsigned int myModelSet
Definition: DtOsgCullVisitorParameters.h:453
double lodScaleFactor() const
Return the current LOD scale factor.
Definition: DtOsgCullVisitorParameters.h:88
void setDimensions(double length, double width, double height)
Definition: DtOsgCullVisitorParameters.h:494
void setTerrainMagnificationHighLodAngle(float radians)
Set the angle used when paging in high LOD tiles, the angle (radians) represents the half angle...
Definition: DtOsgCullVisitorParameters.h:326
Contains makVrv::DtObserverObject class.
void setCoordinateSystemChanged(bool changed)
Set whether the coordinate system changed this frame.
Definition: DtOsgCullVisitorParameters.h:226
unsigned int modelSet() const
Get the model set currently being rendered.
Definition: DtOsgCullVisitorParameters.h:135
bool dynamicLights() const
Get whether dynamic lights rendering is enabled.
Definition: DtOsgCullVisitorParameters.h:184
The osg cull vistor parameters class provides additional culling and intersector parameters for choos...
Definition: DtOsgCullVisitorParameters.h:42
void setDynamicWaterVisibilityEnable(bool enable)
Set dynamic water visibility, based on altitude. Water visibility will be scaled from its specified v...
Definition: DtOsgCullVisitorParameters.h:281
float myChannelLodScale
Definition: DtOsgCullVisitorParameters.h:460
float indirectDistanceScale() const
Get the distance for culling instanced data.
Definition: DtOsgCullVisitorParameters.h:385
void setOrthoCulling(bool ortho)
Set whether the culling should be doing in orthographic mode.
Definition: DtOsgCullVisitorParameters.h:153
double cameraResolution() const
Get the zoom factor.
Definition: DtOsgCullVisitorParameters.h:100
bool myDynamicWaterVisibilityEnable
Definition: DtOsgCullVisitorParameters.h:447
Contains the declaration of the makVrv::DtModelScaler class.
bool myIncludeLightPoints
Definition: DtOsgCullVisitorParameters.h:454
double myClampedPixelSize
Definition: DtOsgCullVisitorParameters.h:445
bool includeLightPoints() const
get the flag for including light points in this cull visitor traversal. If false then light points wi...
Definition: DtOsgCullVisitorParameters.h:347
bool dynamicOcean() const
Get whether a dynamic ocean rendering is enabled.
Definition: DtOsgCullVisitorParameters.h:196
void setScaling(bool scaling)
Set whether scalable groups should be scaled by distance.
Definition: DtOsgCullVisitorParameters.h:214
bool mySkyFlag
Definition: DtOsgCullVisitorParameters.h:439
bool indirectDistanceScaleEnabled() const
True if the distance for culling instanced data is enabled.
Definition: DtOsgCullVisitorParameters.h:373
double myDynamicWaterVisibilityMax
Definition: DtOsgCullVisitorParameters.h:448
double height() const
Definition: DtOsgCullVisitorParameters.h:509
void calculateScaleFactors(const osg::BoundingSphere &sphere, const DtOsgCullVisitorParameters &info, double &scaleFactorX, double &scaleFactorY, double &scaleFactorZ) const
Definition: DtOsgCullVisitorParameters.h:526
bool coordinateSystemChanged() const
Get whether the coordinate system changed this frame.
Definition: DtOsgCullVisitorParameters.h:232
void setChannelLodScale(float scale)
set the channel lod scale. This is only the channel configuration value and not the view magnificatio...
Definition: DtOsgCullVisitorParameters.h:391
void calculateScaleFactors(const osgUtil::CullVisitor &visitor, const osg::BoundingSphere &sphere, DtOsgCullVisitorParameters *info, double &scaleFactorX, double &scaleFactorY, double &scaleFactorZ) const
Definition: DtOsgCullVisitorParameters.h:514
double myWidth
Definition: DtOsgCullVisitorParameters.h:582
bool scaleY() const
Definition: DtOsgCullVisitorParameters.h:565
bool orthoCulling() const
Get whether the culling is to be done in 2D orthographic mode.
Definition: DtOsgCullVisitorParameters.h:159
bool myCoordinateSystemChanged
Definition: DtOsgCullVisitorParameters.h:446
float terrainMagnificationHighLodAngle() const
Get the viewing angle within which high LOD tiles will be used ex. rad angle=0.26179 = 15 degrees...
Definition: DtOsgCullVisitorParameters.h:335
bool myScalingFlag
Definition: DtOsgCullVisitorParameters.h:444
double dynamicWaterVisibilityMax() const
Get the maximum value to which water visibility will be set when dynamic water visibility is enabled...
Definition: DtOsgCullVisitorParameters.h:301
bool skyRendering() const
Get whether the sky is being rendered.
Definition: DtOsgCullVisitorParameters.h:172
bool dynamicWaterVisibilityEnable() const
Get whether dynamic water is enabled.
Definition: DtOsgCullVisitorParameters.h:287
void setModelSet(unsigned int modelSet)
Set the model set currently being rendered.
Definition: DtOsgCullVisitorParameters.h:141
std::vector< osg::Vec3d > myFocusPoints
Definition: DtOsgCullVisitorParameters.h:458
void setIncludeLightPoints(bool flag)
set the flag for including light points in this cull visitor traversal. If false then light points wi...
Definition: DtOsgCullVisitorParameters.h:341
void setFixedPixelSize(double d)
Definition: DtOsgCullVisitorParameters.h:484
void setScaleZ(bool b)
Definition: DtOsgCullVisitorParameters.h:570
bool myDynamicLightsFlag
Definition: DtOsgCullVisitorParameters.h:440
float channelLodScale()
get the channel lod scale. This is only the channel configuration value and not the view magnificatio...
Definition: DtOsgCullVisitorParameters.h:397
float myTerrainMagnificationHighLodAngle
Definition: DtOsgCullVisitorParameters.h:451
float terrainMagnificationScaleFactor() const
Get the amount that any view magnification value is reduced by when determining the distance to a pag...
Definition: DtOsgCullVisitorParameters.h:315
void setIndirectDistanceScale(float scale)
Set the distance for culling instanced data.
Definition: DtOsgCullVisitorParameters.h:379
double width() const
Definition: DtOsgCullVisitorParameters.h:504
void setScaleXY(bool b)
Definition: DtOsgCullVisitorParameters.h:560
bool focusPointEnabled()
get the focust point enabled flag. If enabled the focus point distances and angles are used to calcul...
Definition: DtOsgCullVisitorParameters.h:425
void setAltitude2D(double altitude)
Set the (implied) altitude when orthoCulling.
Definition: DtOsgCullVisitorParameters.h:123
bool myOrthoFlag
Definition: DtOsgCullVisitorParameters.h:443
void setCameraAboveWater(bool aboveWater)
Set whether the camera is above water.
Definition: DtOsgCullVisitorParameters.h:202
float currentTraversalScaleFactor()
get the scale factor for the current place in the cull visitor traversal. this is used by the light p...
Definition: DtOsgCullVisitorParameters.h:354
double myFixedPixelSize
Definition: DtOsgCullVisitorParameters.h:581

Document ID: Generated on Sun Dec 4 20:22:03 EST 2022 from SVN revision 249613
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)