Normalized docstrings

This commit is contained in:
Michaël Lemaire 2016-01-03 19:21:23 +01:00
parent 4347d7f454
commit 0e6dca30fc
34 changed files with 126 additions and 120 deletions

View file

@ -8,8 +8,8 @@
namespace paysages { namespace paysages {
namespace basics { namespace basics {
/*! /**
* \brief Fractal noise generator, based on a sum of simple noise functions. * Fractal noise generator, based on a sum of simple noise functions.
*/ */
class BASICSSHARED_EXPORT FractalNoise { class BASICSSHARED_EXPORT FractalNoise {
public: public:
@ -39,6 +39,11 @@ class BASICSSHARED_EXPORT FractalNoise {
virtual double getBase1d(double x) const; virtual double getBase1d(double x) const;
virtual double getBase2d(double x, double y) const; virtual double getBase2d(double x, double y) const;
/**
* Base 3d noise function, returning (as much as possible) a value in the [0.5, 0.5] range.
*
* Other dimension noise (1d and 2d) can be provided, or this one will be used to simulate them.
*/
virtual double getBase3d(double x, double y, double z) const = 0; virtual double getBase3d(double x, double y, double z) const = 0;
private: private:

View file

@ -8,7 +8,7 @@
namespace paysages { namespace paysages {
namespace basics { namespace basics {
/*! /**
* Fractal noise state, that can be saved to a file. * Fractal noise state, that can be saved to a file.
* *
* This state contains the noise offsets for noise layers. * This state contains the noise offsets for noise layers.

View file

@ -11,7 +11,7 @@ namespace definition {
typedef DefinitionNode *(*LayerConstructor)(Layers *parent, const string &name); typedef DefinitionNode *(*LayerConstructor)(Layers *parent, const string &name);
/** /**
* @brief Layers of definitions, ideally all of the same type. * Layers of definitions, ideally all of the same type.
*/ */
class DEFINITIONSHARED_EXPORT Layers : public DefinitionNode { class DEFINITIONSHARED_EXPORT Layers : public DefinitionNode {
public: public:

View file

@ -9,7 +9,7 @@ namespace paysages {
namespace definition { namespace definition {
/** /**
* @brief Global scenery management * Global scenery management
* *
* This class contains the whole scenery definition. * This class contains the whole scenery definition.
*/ */

View file

@ -10,8 +10,8 @@ class QImage;
namespace paysages { namespace paysages {
namespace opengl { namespace opengl {
/*! /**
* \brief OpenGL variable that can be bound to a uniform for shaders. * OpenGL variable that can be bound to a uniform for shaders.
*/ */
class OpenGLVariable final { class OpenGLVariable final {
public: public:

View file

@ -10,7 +10,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Graphics area to draw and do compositing. * Graphics area to draw and do compositing.
* *
* Software rendering is done in portions of Canvas (in CanvasPortion class). * Software rendering is done in portions of Canvas (in CanvasPortion class).
* This splitting in portions allows to keep memory consumption low. * This splitting in portions allows to keep memory consumption low.

View file

@ -10,7 +10,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Representation of world coordinates projected in a canvas pixel. * Representation of world coordinates projected in a canvas pixel.
*/ */
class SOFTWARESHARED_EXPORT CanvasFragment { class SOFTWARESHARED_EXPORT CanvasFragment {
public: public:

View file

@ -7,7 +7,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Abstract class to receive live modifications from canvas preview. * Abstract class to receive live modifications from canvas preview.
*/ */
class SOFTWARESHARED_EXPORT CanvasLiveClient { class SOFTWARESHARED_EXPORT CanvasLiveClient {
public: public:

View file

@ -11,7 +11,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief One pixel of a Canvas. * One pixel of a Canvas.
* *
* A pixel stores superimposed fragments (CanvasFragment), sorted by their distance to camera. * A pixel stores superimposed fragments (CanvasFragment), sorted by their distance to camera.
*/ */

View file

@ -9,7 +9,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Parallel worker that can work on canvas portion to resolve pixel colors. * Parallel worker that can work on canvas portion to resolve pixel colors.
* *
* This is used after the rasterization phase to compute pixel colors from the fragments stored in them. * This is used after the rasterization phase to compute pixel colors from the fragments stored in them.
* *

View file

@ -7,7 +7,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Smaller preview of a Canvas rendering, that can be watched live. * Smaller preview of a Canvas rendering, that can be watched live.
*/ */
class SOFTWARESHARED_EXPORT CanvasPreview { class SOFTWARESHARED_EXPORT CanvasPreview {
public: public:

View file

@ -30,18 +30,19 @@ static inline double _getDistanceToBorder(BaseCloudsModel *model, const Vector3
/** /**
* Go through the cloud layer to find segments (parts of the lookup that are inside the cloud). * Go through the cloud layer to find segments (parts of the lookup that are inside the cloud).
* *
* @param definition The cloud layer * definition - The cloud layer
* @param renderer The renderer environment * renderer - The renderer environment
* @param start Start position of the lookup (already optimized) * start - Start position of the lookup (already optimized)
* @param direction Normalized direction of the lookup * direction - Normalized direction of the lookup
* @param detail Level of noise detail required * detail - Level of noise detail required
* @param max_segments Maximum number of segments to collect * max_segments - Maximum number of segments to collect
* @param max_inside_length Maximum length to spend inside the cloud * max_inside_length - Maximum length to spend inside the cloud
* @param max_total_length Maximum lookup length * max_total_length - Maximum lookup length
* @param inside_length Resulting length inside cloud (sum of all segments length) * inside_length - Resulting length inside cloud (sum of all segments length)
* @param total_length Resulting lookup length * total_length - Resulting lookup length
* @param out_segments Allocated space to fill found segments * out_segments - Allocated space to fill found segments
* @return Number of segments found *
* Returns the number of segments found.
*/ */
int CloudBasicLayerRenderer::findSegments(BaseCloudsModel *model, const Vector3 &start, const Vector3 &direction, int CloudBasicLayerRenderer::findSegments(BaseCloudsModel *model, const Vector3 &start, const Vector3 &direction,
int max_segments, double max_inside_length, double max_total_length, int max_segments, double max_inside_length, double max_total_length,

View file

@ -10,8 +10,8 @@ typedef struct CloudSegment CloudSegment;
namespace paysages { namespace paysages {
namespace software { namespace software {
/*! /**
* \brief Basic cloud layer renderer. * Basic cloud layer renderer.
* *
* This renderer simply iters through the cloud layer, collecting cloud segments. * This renderer simply iters through the cloud layer, collecting cloud segments.
* It does not account for local density variations. * It does not account for local density variations.

View file

@ -10,8 +10,8 @@
namespace paysages { namespace paysages {
namespace software { namespace software {
/*! /**
* \brief Software renderer of a group of cloud layers. * Software renderer of a group of cloud layers.
*/ */
class SOFTWARESHARED_EXPORT CloudsRenderer : public LightFilter { class SOFTWARESHARED_EXPORT CloudsRenderer : public LightFilter {
public: public:
@ -28,42 +28,42 @@ class SOFTWARESHARED_EXPORT CloudsRenderer : public LightFilter {
*/ */
void setEnabled(bool enabled); void setEnabled(bool enabled);
/*! /**
* \brief Update the renderer with the bound scenery. * Update the renderer with the bound scenery.
* *
* Don't call this if another thread is currently using this renderer. * Don't call this if another thread is currently using this renderer.
*/ */
virtual void update(); virtual void update();
/*! /**
* \brief Get the layer renderer for a given layer. * Get the layer renderer for a given layer.
* *
* The returned renderer is managed by this object and should not be deleted. * The returned renderer is managed by this object and should not be deleted.
*/ */
virtual BaseCloudLayerRenderer *getLayerRenderer(unsigned int layer); virtual BaseCloudLayerRenderer *getLayerRenderer(unsigned int layer);
/*! /**
* \brief Get the cloud model for a given layer. * Get the cloud model for a given layer.
* *
* The returned model is managed by this object and should not be deleted. * The returned model is managed by this object and should not be deleted.
*/ */
virtual BaseCloudsModel *getLayerModel(unsigned int layer); virtual BaseCloudsModel *getLayerModel(unsigned int layer);
/*! /**
* \brief Override de default density model for a given layer. * Override de default density model for a given layer.
* *
* This must be called after each update(). * This must be called after each update().
* Ownership of the model is taken. * Ownership of the model is taken.
*/ */
virtual void setLayerModel(unsigned int layer, BaseCloudsModel *model, bool delete_old = true); virtual void setLayerModel(unsigned int layer, BaseCloudsModel *model, bool delete_old = true);
/*! /**
* \brief Get the composited color, as applied on a base color and location. * Get the composited color, as applied on a base color and location.
*/ */
virtual Color getColor(const Vector3 &eye, const Vector3 &location, const Color &base); virtual Color getColor(const Vector3 &eye, const Vector3 &location, const Color &base);
/*! /**
* \brief Alter a light, as if passed through all layers. * Alter a light, as if passed through all layers.
* *
* Return true if the light was altered. * Return true if the light was altered.
*/ */

View file

@ -6,12 +6,12 @@
namespace paysages { namespace paysages {
namespace software { namespace software {
/*! /**
* \brief Interface to a fluid medium compatible class. * Interface to a fluid medium compatible class.
*/ */
class SOFTWARESHARED_EXPORT FluidMediumInterface { class SOFTWARESHARED_EXPORT FluidMediumInterface {
public: public:
/*! /**
* Return true if the object may change the fluid medium on the given segment. * Return true if the object may change the fluid medium on the given segment.
* When returning true, the object may alter 'segment' to limit its influence. * When returning true, the object may alter 'segment' to limit its influence.
*/ */

View file

@ -15,8 +15,8 @@ typedef struct {
SpaceSegment segment; SpaceSegment segment;
} FluidMediumSegment; } FluidMediumSegment;
/*! /**
* \brief Global object to interact with fluid medium (air, water, clouds...) * Global object to interact with fluid medium (air, water, clouds...)
* *
* This object handles the traversal of fluid medium and the collecting of * This object handles the traversal of fluid medium and the collecting of
* medium density and properties. * medium density and properties.
@ -27,27 +27,25 @@ class SOFTWARESHARED_EXPORT FluidMediumManager {
FluidMediumManager(SoftwareRenderer *renderer); FluidMediumManager(SoftwareRenderer *renderer);
virtual ~FluidMediumManager(); virtual ~FluidMediumManager();
/*! /**
* \brief Remove all registered medium. * Remove all registered medium.
*/ */
void clearMedia(); void clearMedia();
/*! /**
* \brief Register a new medium in the manager. * Register a new medium in the manager.
*/ */
void registerMedium(FluidMediumInterface *medium); void registerMedium(FluidMediumInterface *medium);
/*! /**
* \brief Apply complete medium traversal * Apply complete medium traversal between *location* and *eye*, to the base *color*.
* \param eye Position of the camera *
* \param location Point we look at * Returns the light received by eye, transformed by medium traversal.
* \param color Light initially received from 'location'
* \return Light received by 'eye', transformed by medium traversal
*/ */
virtual Color applyTraversal(const Vector3 &eye, const Vector3 &location, const Color &color) const; virtual Color applyTraversal(const Vector3 &eye, const Vector3 &location, const Color &color) const;
/*! /**
* \brief Get the potential media traversed by a ray, unsorted * Get the potential media traversed by a ray, unsorted
*/ */
virtual int getTraversedMedia(FluidMediumSegment segments[], const SpaceSegment &ray, int max_segments) const; virtual int getTraversedMedia(FluidMediumSegment segments[], const SpaceSegment &ray, int max_segments) const;

View file

@ -10,7 +10,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief One component of a LightStatus. * One component of a LightStatus.
* *
* A light component represents the amount of light received at a point from a given direction. * A light component represents the amount of light received at a point from a given direction.
*/ */

View file

@ -7,12 +7,12 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Interface for rendering parts that can alter light. * Interface for rendering parts that can alter light.
*/ */
class SOFTWARESHARED_EXPORT LightFilter { class SOFTWARESHARED_EXPORT LightFilter {
public: public:
/** /**
* @brief Apply filtering on a light component. * Apply filtering on a light component.
* *
* This will alter the component and return if the component is still * This will alter the component and return if the component is still
* useful. * useful.

View file

@ -11,7 +11,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Light status at a given point. * Light status at a given point.
* *
* The light status is the combination of all LightComponent received at a given location. * The light status is the combination of all LightComponent received at a given location.
*/ */

View file

@ -11,7 +11,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Global lighting manager. * Global lighting manager.
* *
* This manager handles the lights, light filters and final light rendering. * This manager handles the lights, light filters and final light rendering.
* *

View file

@ -8,22 +8,23 @@
namespace paysages { namespace paysages {
namespace software { namespace software {
/*! /**
* \brief Night sky renderer. * Night sky renderer.
*/ */
class SOFTWARESHARED_EXPORT NightSky : public LightSource { class SOFTWARESHARED_EXPORT NightSky : public LightSource {
public: public:
NightSky(SoftwareRenderer *renderer); NightSky(SoftwareRenderer *renderer);
virtual ~NightSky(); virtual ~NightSky();
/*! /**
* \brief Update the night sky renderer, when the scenery or parent renderer changed. * Update the night sky renderer, when the scenery or parent renderer changed.
*/ */
void update(); void update();
/*! /**
* \brief Get the color of the night sky at a given direction. * Get the color of the night sky at a given direction.
* \param altitude Altitude above water level, in coordinate units (not kilometers). *
* *altitude* is above water level, in coordinate units (not kilometers).
*/ */
virtual const Color getColor(double altitude, const Vector3 &direction); virtual const Color getColor(double altitude, const Vector3 &direction);

View file

@ -15,7 +15,7 @@ typedef struct ScanPoint ScanPoint;
typedef struct RenderScanlines RenderScanlines; typedef struct RenderScanlines RenderScanlines;
/** /**
* @brief Base abstract class for scenery pieces that can be rasterized to polygons. * Base abstract class for scenery pieces that can be rasterized to polygons.
*/ */
class SOFTWARESHARED_EXPORT Rasterizer { class SOFTWARESHARED_EXPORT Rasterizer {
public: public:

View file

@ -12,7 +12,7 @@ namespace paysages {
namespace software { namespace software {
/** /**
* @brief Software rendering inside a Canvas surface. * Software rendering inside a Canvas surface.
* *
* This class launches the rasterization process into canvas portions and * This class launches the rasterization process into canvas portions and
* redirects post processing to the software renderer. * redirects post processing to the software renderer.
@ -70,19 +70,19 @@ class SOFTWARESHARED_EXPORT SoftwareCanvasRenderer : public SoftwareRenderer {
void enablePostprocess(bool enabled); void enablePostprocess(bool enabled);
/** /**
* @brief Set the rendering size in pixels. * Set the rendering size in pixels.
* *
* Set 'samples' to something bigger than 1 to allow for the multi-sampling of pixels. * Set 'samples' to something bigger than 1 to allow for the multi-sampling of pixels.
*/ */
void setSize(int width, int height, int samples = 1); void setSize(int width, int height, int samples = 1);
/** /**
* @brief Start the two-pass render process. * Start the two-pass render process.
*/ */
void render(); void render();
/** /**
* @brief Interrupt the render process. * Interrupt the render process.
*/ */
void interrupt(); void interrupt();
@ -100,12 +100,12 @@ class SOFTWARESHARED_EXPORT SoftwareCanvasRenderer : public SoftwareRenderer {
protected: protected:
/** /**
* @brief Rasterize the scenery into a canvas portion. * Rasterize the scenery into a canvas portion.
*/ */
void rasterize(CanvasPortion *portion); void rasterize(CanvasPortion *portion);
/** /**
* @brief Apply pixel shader to fragments stored in the CanvasPortion. * Apply pixel shader to fragments stored in the CanvasPortion.
*/ */
void applyPixelShader(CanvasPortion *portion); void applyPixelShader(CanvasPortion *portion);

View file

@ -6,8 +6,8 @@
namespace paysages { namespace paysages {
namespace software { namespace software {
/*! /**
* \brief This class renders a defined scenery in sotware mode (using only standard CPU computations). * This class renders a defined scenery in sotware mode (using only standard CPU computations).
*/ */
class SOFTWARESHARED_EXPORT SoftwareRenderer { class SOFTWARESHARED_EXPORT SoftwareRenderer {
@ -25,15 +25,15 @@ class SOFTWARESHARED_EXPORT SoftwareRenderer {
virtual Vector3 projectPoint(const Vector3 &point); virtual Vector3 projectPoint(const Vector3 &point);
virtual Vector3 unprojectPoint(const Vector3 &point); virtual Vector3 unprojectPoint(const Vector3 &point);
/*! /**
* \brief Prepare the renderer sub-systems. * Prepare the renderer sub-systems.
* *
* This will clear the caches and connect elements together. * This will clear the caches and connect elements together.
* After this call, don't update the scenery when renderer is in use. * After this call, don't update the scenery when renderer is in use.
*/ */
virtual void prepare(); virtual void prepare();
/*! /**
* Set the global quality control factor. * Set the global quality control factor.
* *
* Values between 0.0 and 1.0 are standard quality (1.0 is considered a "very good" production quality value). * Values between 0.0 and 1.0 are standard quality (1.0 is considered a "very good" production quality value).

View file

@ -25,9 +25,9 @@ class SOFTWARESHARED_EXPORT TerrainRasterizer : public Rasterizer {
/** /**
* Set the rasterization quality. * Set the rasterization quality.
* *
* @param base_chunk_size Size of chunks near the camera * base_chunk_size - Size of chunks near the camera
* @param detail_factor Precision factor of a chunk's tessellation, depending on screen coverage * detail_factor - Precision factor of a chunk's tessellation, depending on screen coverage
* @param max_chunk_detail Maximal tessellation of chunks * max_chunk_detail - Maximal tessellation of chunks
*/ */
void setQuality(double base_chunk_size, double detail_factor, int max_chunk_detail); void setQuality(double base_chunk_size, double detail_factor, int max_chunk_detail);
virtual void setQuality(double factor) override; virtual void setQuality(double factor) override;

View file

@ -8,8 +8,8 @@
namespace paysages { namespace paysages {
namespace software { namespace software {
/*! /**
* \brief Ray walker to find intersections with terrain. * Ray walker to find intersections with terrain.
* *
* This walker can be used to find a hard intersection between * This walker can be used to find a hard intersection between
* a ray and the terrain (e.g. for raytracing), or a soft intersection * a ray and the terrain (e.g. for raytracing), or a soft intersection
@ -28,30 +28,31 @@ class SOFTWARESHARED_EXPORT TerrainRayWalker {
/** /**
* Set the walker quality. * Set the walker quality.
* *
* @param displacement_safety Safety factor (around 1.0) to detect when displacement textures need to be applied * displacement_safety - Safety factor (around 1.0) to detect when displacement textures need to be applied
* @param minimal_step Minimal length of a walking step * minimal_step - Minimal length of a walking step
* @param maximal_step Maximal length of a walking step * maximal_step - Maximal length of a walking step
* @param step_factor Precision factor of steps, depending on terrain proximity * step_factor - Precision factor of steps, depending on terrain proximity
* @param max_distance Maximal distance allowed to travel before considering an escape * max_distance - Maximal distance allowed to travel before considering an escape
* @param escape_step Angle step when allowing an escape angle * escape_step - Angle step when allowing an escape angle
*/ */
void setQuality(double displacement_safety, double minimal_step, double maximal_step, double step_factor, void setQuality(double displacement_safety, double minimal_step, double maximal_step, double step_factor,
double max_distance, double escape_step); double max_distance, double escape_step);
void setQuality(double factor); void setQuality(double factor);
/*! /**
* \brief Update the walker internal data, from the renderer and scenery. * Update the walker internal data, from the renderer and scenery.
*/ */
void update(); void update();
/*! /**
* \brief Start the walking process to find intersection * Start the walking process to find intersection
* *
* \param start Point of origin of the ray * start - Point of origin of the ray
* \param direction Ray direction (normalized vector) * direction - Ray direction (normalized vector)
* \param escape_angle Maximal angle allowed to escape the terrain on hit (mainly for shadows computing) * escape_angle - Maximal angle allowed to escape the terrain on hit (mainly for shadows computing)
* \param result Object to store the results info * result - Object to store the results info
* \return true if there was a hit *
* Returns true if there was a hit.
*/ */
bool startWalking(const Vector3 &start, Vector3 direction, double escape_angle, TerrainHitResult &result); bool startWalking(const Vector3 &start, Vector3 direction, double escape_angle, TerrainHitResult &result);

View file

@ -8,8 +8,8 @@
namespace paysages { namespace paysages {
namespace software { namespace software {
/*! /**
* \brief Abstract class for all cloud models (cirrus, cumulus...). * Abstract class for all cloud models (cirrus, cumulus...).
*/ */
class SOFTWARESHARED_EXPORT BaseCloudsModel { class SOFTWARESHARED_EXPORT BaseCloudsModel {
public: public:

View file

@ -8,13 +8,13 @@
namespace paysages { namespace paysages {
namespace system { namespace system {
/*! /**
* \brief System mutex * System mutex
*/ */
class SYSTEMSHARED_EXPORT Mutex : private mutex { class SYSTEMSHARED_EXPORT Mutex : private mutex {
public: public:
/*! /**
* \brief Create a new mutex * Create a new mutex
*/ */
Mutex(); Mutex();

View file

@ -8,8 +8,8 @@
namespace paysages { namespace paysages {
namespace system { namespace system {
/*! /**
* \brief Data (de)serialization in files or streams. * Data (de)serialization in files or streams.
*/ */
class SYSTEMSHARED_EXPORT PackStream { class SYSTEMSHARED_EXPORT PackStream {
public: public:

View file

@ -8,7 +8,7 @@
namespace paysages { namespace paysages {
namespace system { namespace system {
/*! /**
* Pool to handle a group of threads doing the same task. * Pool to handle a group of threads doing the same task.
*/ */
class SYSTEMSHARED_EXPORT ParallelPool { class SYSTEMSHARED_EXPORT ParallelPool {
@ -16,17 +16,17 @@ class SYSTEMSHARED_EXPORT ParallelPool {
ParallelPool(); ParallelPool();
virtual ~ParallelPool(); virtual ~ParallelPool();
/*! /**
* Start the effective work. * Start the effective work.
*/ */
void start(int thread_count = -1); void start(int thread_count = -1);
/*! /**
* Method called from each thread to do actual work. * Method called from each thread to do actual work.
*/ */
virtual void work() = 0; virtual void work() = 0;
/*! /**
* Method called once to interrupt all threads. * Method called once to interrupt all threads.
*/ */
virtual void interrupt(); virtual void interrupt();

View file

@ -43,7 +43,7 @@ class SYSTEMSHARED_EXPORT ParallelWork {
/** /**
* Start working on the units. * Start working on the units.
* *
* @param threads Number of threads to spaws, -1 for an optimal number. * threads - Number of threads to spaws, -1 for an optimal number.
*/ */
int perform(int thread_count = -1); int perform(int thread_count = -1);

View file

@ -7,7 +7,7 @@ namespace paysages {
namespace system { namespace system {
/** /**
* @brief Worker that can be used by the ParallelWork object to perform tasks in several threads. * Worker that can be used by the ParallelWork object to perform tasks in several threads.
*/ */
class SYSTEMSHARED_EXPORT ParallelWorker { class SYSTEMSHARED_EXPORT ParallelWorker {
public: public:

View file

@ -14,13 +14,13 @@ class SYSTEMSHARED_EXPORT PictureWriter {
virtual ~PictureWriter(); virtual ~PictureWriter();
/** /**
* @brief Start saving the picture in a file. * Start saving the picture in a file.
*/ */
bool save(const string &filepath, int width, int height); bool save(const string &filepath, int width, int height);
protected: protected:
/** /**
* @brief Get the (x, y) pixel, in BGRA format * Get the (x, y) pixel, in BGRA format
*/ */
virtual unsigned int getPixel(int x, int y) = 0; virtual unsigned int getPixel(int x, int y) = 0;
}; };

View file

@ -6,8 +6,8 @@
namespace paysages { namespace paysages {
namespace system { namespace system {
/*! /**
* \brief Access to system info * Access to system info
*/ */
class SYSTEMSHARED_EXPORT System { class SYSTEMSHARED_EXPORT System {
public: public: