// 
public interface IGameObject : 
  Attributes:
    // 
    + Info : GameObjectInfo
    // 
    + World : World
  Methods:
    // 
    + Draw  (GameTime gameTime)
    // 
    + Update  (GameTime gameTime)
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3

// 
public class GameModel : IGameObject
  Attributes:
    // 
    # screen : GameScreen
    // 
    - IGameObject.Info : GameObjectInfo
    // 
    + Info : GameModelInfo
    // 
    - _world : World
    // 
    + World : World
    // 
    + Model : Model virtual
    // 
    + BaseColor : Color
    // 
    + HighlightColor : Color
    // 
    + HighlightIntensity : float
    // 
    + Alpha : float
    // 
    - _scale : Vector3
    // 
    - _rotation : Angles3
    // 
    - _position : Vector3
    // 
    - _worldMatrix : Matrix
    // 
    - _bounds : BoundingSphere[]
    // 
    - _inFrustum : bool
    // 
    + WorldMatrix : Matrix
    // 
    - Bounds : BoundingSphere[]
    // 
    # InCameraFrustum : bool
  Methods:
    // 
    + GameModel  (GameScreen screen, GameModelInfo info)
    // 
    + Update  (GameTime gameTime) virtual
    // 
    + Draw  (GameTime gameTime) virtual
    // 
    + Intersects (Ray ray) : GameObjectDistance virtual
    // 
    + Center () : Vector3
    // 
    - UpdatePrecomputed  ()
    // 
    - OnViewChanged  ()

// 
public class ArrowModel : GameModel
  Attributes:
    // 
    + Info : ArrowModelInfo new
    // 
    - Bounds : BoundingSphere[]
  Methods:
    // 
    + ArrowModel  (GameScreen screen, ArrowModelInfo info)
    // 
    + Draw  (GameTime gameTime) override
    // 
    + Intersects (Ray ray) : GameObjectDistance override

// 
public class NodeModel : GameModel
  Attributes:
    // 
    + Info : NodeModelInfo new
  Methods:
    // 
    + NodeModel  (GameScreen screen, NodeModelInfo info)
    // 
    + Draw  (GameTime gameTime) override

// 
public class PipeModel : GameModel
  Attributes:
    // 
    + Info : PipeModelInfo new
    // 
    - Bounds : BoundingSphere[]
    // 
    + OnDataChange : Action
  Methods:
    // 
    + PipeModel  (GameScreen screen, PipeModelInfo info)
    // 
    + Draw  (GameTime gameTime) override
    // 
    + Intersects (Ray ray) : GameObjectDistance override

// 
public class TestModel : GameModel
  Attributes:
  Methods:
    // 
    + TestModel  (GameScreen screen, GameModelInfo info)
    // 
    + Update  (GameTime gameTime) override

// 
public class ArrowModel : GameModel
  Attributes:
    // 
    - Bounds : BoundingSphere[]
    // 
    + Info : ArrowModelInfo
  Methods:
    // 
    + ArrowModel  (GameScreen screen, ArrowModelInfo info)
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Draw  (GameTime gameTime)

// 
public class NodeModel : GameModel
  Attributes:
    // 
    + Info : NodeModelInfo
  Methods:
    // 
    + NodeModel  (GameScreen screen, NodeModelInfo info)
    // 
    + Draw  (GameTime gameTime)

// 
public class PipeModel : GameModel
  Attributes:
    // 
    - Bounds : BoundingSphere[]
    // 
    + Info : PipeModelInfo
  Methods:
    // 
    + OnDataChange () : Action
    // 
    + PipeModel  (GameScreen screen, PipeModelInfo info)
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Draw  (GameTime gameTime)

// 
public class TestModel : GameModel
  Attributes:
  Methods:
    // 
    + Update  (GameTime gameTime)
    // 
    + TestModel  (GameScreen screen, GameModelInfo info)

// 
public abstract class KnotRenderer : IEdgeChangeListener, IGameObject
  Attributes:
    // 
    # screen : GameScreen
    // 
    + World : World abstract
    // 
    + Info : GameObjectInfo abstract
    // 
    # nodeMap : NodeMap new
  Methods:
    // 
    + KnotRenderer  (GameScreen screen)
    // 
    + OnEdgesChanged  (EdgeList edges) virtual
    // 
    + Update  (GameTime gameTime) abstract
    // 
    + Draw  (GameTime gameTime) abstract
    // 
    + Intersects (Ray ray) : GameObjectDistance abstract
    // 
    + Center () : Vector3 abstract

// 
public class LineRenderer : KnotRenderer
  Attributes:
    // 
    + Info : GameObjectInfo override
    // 
    + World : World override
    // 
    - basicEffect : BasicEffect
    // 
    - edges : EdgeList
  Methods:
    // 
    + LineRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + Update  (GameTime gameTime) override
    // 
    + OnEdgesChanged  (EdgeList edges) override
    // 
    + Draw  (GameTime gameTime) override
    // 
    - DrawRoundedLines  ()
    // 
    + Intersects (Ray ray) : GameObjectDistance override
    // 
    + Center () : Vector3 override

// 
public class ModelRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    // 
    + Info : GameObjectInfo override
    // 
    + World : World override
    // 
    - pipes : List<PipeModel>
    // 
    - nodes : List<NodeModel>
    // 
    - arrows : List<ArrowModel>
    // 
    - pipeFactory : ModelFactory
    // 
    - nodeFactory : ModelFactory
    // 
    - arrowFactory : ModelFactory
  Methods:
    // 
    + ModelRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + Update  (GameTime gameTime) override
    // 
    + OnEdgesChanged  (EdgeList edgeList) override
    // 
    + CreateArrows  (WrapList<Edge> selectedEdges)
    // 
    - CreateArrow  (Edge edge)
    // 
    + GetEnumerator () : IEnumerator<IGameObject>
    // 
    - IEnumerable.GetEnumerator () : IEnumerator
    // 
    + Draw  (GameTime gameTime) override
    // 
    + Intersects (Ray ray) : GameObjectDistance override
    // 
    + Center () : Vector3 override

public class PipeRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    + Info : GameObjectInfo override
    + World : World override
    - pipes : List<PipeModel>
    - nodes : List<NodeModel>
    - pipeFactory : ModelFactory
    - nodeFactory : ModelFactory
  Methods:
    + PipeRenderer  (GameScreen screen, GameObjectInfo info)
    + Update  (GameTime gameTime) override
    + OnEdgesChanged  (EdgeList edges) override
    + GetEnumerator () : IEnumerator<IGameObject>
    - IEnumerable.GetEnumerator () : IEnumerator
    + Draw  (GameTime gameTime) override
    + Intersects (Ray ray) : GameObjectDistance override
    + Center () : Vector3 override

// 
public class LineRenderer : KnotRenderer
  Attributes:
    // 
    - edges : EdgeList
    // 
    - basicEffect : BasicEffect
    // 
    + Info : GameObjectInfo
    // 
    + World : World
  Methods:
    // 
    + LineRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + OnEdgesChanged  (EdgeList edges)
    - DrawRoundedLines ()
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3
    // 
    + Draw  (GameTime gameTime)
    // 
    + Update  (GameTime gameTime)

// 
public class ModelRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    // 
    - arrows : List<ArrowModel>
    // 
    - nodes : List<NodeModel>
    // 
    - arrowFactory : ModelFactory
    // 
    - nodeFactory : ModelFactory
    // 
    - pipeFactory : ModelFactory
    // 
    - pipes : List<PipeModel>
    // 
    + Info : GameObjectInfo
    // 
    + World : World
  Methods:
    // 
    - IEnumerable.GetEnumerator () : IEnumerator
    // 
    - CreateArrow  (Edge edge)
    // 
    + ModelRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + Draw  (GameTime gameTime)
    // 
    + OnEdgesChanged  (EdgeList edgeList)
    // 
    + GetEnumerator () : IEnumerator<IGameObject>
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3
    // 
    + Update  (GameTime gameTime)
    // 
    + CreateArrows  (WrapList<Edge> selectedEdges)

public class PipeRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    - nodes : List<NodeModel>
    - nodeFactory : ModelFactory
    - pipeFactory : ModelFactory
    - pipes : List<PipeModel>
    + Info : GameObjectInfo
    + World : World
  Methods:
    - IEnumerable.GetEnumerator () : IEnumerator
    + PipeRenderer  (GameState state, GameObjectInfo info)
    + Draw  (GameTime gameTime)
    + OnEdgesChanged  (EdgeList edges)
    + GetEnumerator () : IEnumerator<IGameObject>
    + Intersects (Ray ray) : GameObjectDistance
    + Center () : Vector3
    + Update  (GameTime gameTime)

// 
public class MovableGameObject : IGameObject
  Attributes:
    // 
    - screen : GameScreen
    // 
    - Obj : IGameObject
    // 
    + World : World
    // 
    + Info : GameObjectInfo
  Methods:
    // 
    + MovableGameObject  (GameScreen screen, IGameObject obj)
    // 
    # CurrentGroundPlane () : Plane
    // 
    # CurrentMouseRay () : Ray
    // 
    # CurrentMousePosition (Ray ray, Plane groundPlane) : Vector3?
    // 
    + Update  (GameTime gameTime) virtual
    // 
    + Draw  (GameTime gameTime)
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3

// 
public class PipeMovement : IGameObject, IEnumerable<IGameObject>
  Attributes:
    // 
    - screen : GameScreen
    // 
    + World : World
    // 
    + Info : GameObjectInfo
    // 
    + Knot : Knot
    // 
    - previousMousePosition : Vector3
    // 
    - shadowObjects : List<ShadowGameObject>
    // 
    - knownEdgeLists : HashSet<EdgeList> new
  Methods:
    // 
    + PipeMovement  (GameScreen screen, World world, GameObjectInfo info)
    // 
    + Update  (GameTime gameTime)
    // 
    - TrySelectObject  (GameTime gameTime)
    // 
    - TryMovePipes  (GameTime gameTime)
    // 
    - CreateShadowPipes  ()
    // 
    - ComputeDirection  (Vector3 currentMousePosition, out Vector3 direction, out float count)
    // 
    - ComputeDirection  (Vector3 currentMousePosition, out Vector3 direction, out int countInt)
    // 
    - MoveShadowPipes  (Vector3 currentMousePosition, Vector3 direction3D)
    // 
    - MoveShadowPipes  (Vector3 currentMousePosition)
    // 
    - MovePipes  (Vector3 currentMousePosition)
    // 
    + Draw  (GameTime gameTime)
    // 
    + GetEnumerator () : IEnumerator<IGameObject>
    // 
    - IEnumerable.GetEnumerator () : IEnumerator
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3

// 
public class ShadowGameObject : IGameObject
  Attributes:
    // 
    # screen : GameScreen
    // 
    - Obj : IGameObject
    // 
    + World : World
    // 
    + Info : GameObjectInfo
    // 
    + ShadowPosition : Vector3
    // 
    + OriginalPosition : Vector3
  Methods:
    // 
    + ShadowGameObject  (GameScreen screen, IGameObject obj)
    // 
    + Update  (GameTime gameTime) virtual
    // 
    + Draw  (GameTime gameTime) virtual
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3

// 
public class ShadowGameModel : ShadowGameObject
  Attributes:
    // 
    - Model : GameModel
    // 
    + ShadowColor : Color
    // 
    + ShadowAlpha : float
  Methods:
    // 
    + ShadowGameModel  (GameScreen screen, GameModel model)
    // 
    + Draw  (GameTime gameTime) override

// 
public class ShadowGameModel : ShadowGameObject
  Attributes:
    // 
    + ShadowColor : Color
    // 
    - Model : GameModel
    // 
    + ShadowAlpha : float
  Methods:
    // 
    + ShadowGameModel  (GameScreen screen, GameModel model)
    // 
    + Draw  (GameTime gameTime)

// 
public class TexturedRectangle : IGameObject
  Attributes:
    // 
    # screen : GameScreen
    // 
    - IGameObject.Info : GameObjectInfo
    // 
    + Info : TexturedRectangleInfo
    // 
    + World : World
    // 
    - UpperLeft : Vector3
    // 
    - LowerLeft : Vector3
    // 
    - UpperRight : Vector3
    // 
    - LowerRight : Vector3
    // 
    - Normal : Vector3
    // 
    - Vertices : VertexPositionNormalTexture[]
    // 
    - Indexes : short[]
    // 
    - basicEffect : BasicEffect
    // 
    - texture : Texture2D
  Methods:
    // 
    + TexturedRectangle  (GameScreen screen, TexturedRectangleInfo info)
    // 
    + Update  (GameTime gameTime)
    // 
    + Draw  (GameTime gameTime)
    // 
    - FillVertices  ()
    // 
    # SetPosition  (Vector3 position)
    // 
    - Length () : Vector3
    // 
    + Bounds () : BoundingBox[]
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3

// 
public class GameModel : IGameObject
  Attributes:
    // 
    - IGameObject.Info : GameObjectInfo
    // 
    - _rotation : Angles3
    // 
    - Bounds : BoundingSphere[]
    // 
    - _bounds : BoundingSphere[]
    // 
    - _worldMatrix : Matrix
    // 
    - _position : Vector3
    // 
    - _inFrustum : bool
    // 
    # InCameraFrustum : bool
    // 
    + BaseColor : Color
    // 
    + HighlightColor : Color
    // 
    + Info : GameModelInfo
    // 
    + WorldMatrix : Matrix
    // 
    + World : World
    // 
    + Alpha : float
    // 
    + HighlightIntensity : float
    // 
    - _scale : Vector3
    // 
    - _world : World
    // 
    # screen : GameScreen
    // 
    + Model : Model virtual
  Methods:
    - OnViewChanged ()
    - UpdatePrecomputed ()
    // 
    + GameModel  (GameScreen screen, GameModelInfo info)
    // 
    + Draw  (GameTime gameTime) virtual
    // 
    + Center () : Vector3
    // 
    + Intersects (Ray ray) : GameObjectDistance virtual
    // 
    + Update  (GameTime gameTime) virtual

// 
public class ArrowModel : GameModel
  Attributes:
    // 
    + Info : ArrowModelInfo new
    // 
    - Bounds : BoundingSphere[]
  Methods:
    // 
    + ArrowModel  (GameScreen screen, ArrowModelInfo info)
    // 
    + Draw  (GameTime gameTime) override
    // 
    + Intersects (Ray ray) : GameObjectDistance override

// 
public class NodeModel : GameModel
  Attributes:
    // 
    + Info : NodeModelInfo new
  Methods:
    // 
    + NodeModel  (GameScreen screen, NodeModelInfo info)
    // 
    + Draw  (GameTime gameTime) override

// 
public class PipeModel : GameModel
  Attributes:
    // 
    + Info : PipeModelInfo new
    // 
    - Bounds : BoundingSphere[]
    // 
    + OnDataChange : Action
  Methods:
    // 
    + PipeModel  (GameScreen screen, PipeModelInfo info)
    // 
    + Draw  (GameTime gameTime) override
    // 
    + Intersects (Ray ray) : GameObjectDistance override

// 
public class TestModel : GameModel
  Attributes:
  Methods:
    // 
    + TestModel  (GameScreen screen, GameModelInfo info)
    // 
    + Update  (GameTime gameTime) override

// 
public class ArrowModel : GameModel
  Attributes:
    // 
    - Bounds : BoundingSphere[]
    // 
    + Info : ArrowModelInfo
  Methods:
    // 
    + ArrowModel  (GameScreen screen, ArrowModelInfo info)
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Draw  (GameTime gameTime)

// 
public class NodeModel : GameModel
  Attributes:
    // 
    + Info : NodeModelInfo
  Methods:
    // 
    + NodeModel  (GameScreen screen, NodeModelInfo info)
    // 
    + Draw  (GameTime gameTime)

// 
public class PipeModel : GameModel
  Attributes:
    // 
    - Bounds : BoundingSphere[]
    // 
    + Info : PipeModelInfo
  Methods:
    // 
    + OnDataChange () : Action
    // 
    + PipeModel  (GameScreen screen, PipeModelInfo info)
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Draw  (GameTime gameTime)

// 
public class TestModel : GameModel
  Attributes:
  Methods:
    // 
    + Update  (GameTime gameTime)
    // 
    + TestModel  (GameScreen screen, GameModelInfo info)

// 
public abstract class KnotRenderer : IEdgeChangeListener, IGameObject
  Attributes:
    // 
    + World : World abstract
    // 
    # screen : GameScreen
    // 
    + Info : GameObjectInfo abstract
  Methods:
    // 
    # nodeMap () : NodeMap
    // 
    + Intersects (Ray ray) : GameObjectDistance abstract
    // 
    + Center () : Vector3 abstract
    // 
    + Draw  (GameTime gameTime) abstract
    // 
    + KnotRenderer  (GameScreen screen)
    // 
    + Update  (GameTime gameTime) abstract
    // 
    + OnEdgesChanged  (EdgeList edges) virtual

// 
public class LineRenderer : KnotRenderer
  Attributes:
    // 
    + Info : GameObjectInfo override
    // 
    + World : World override
    // 
    - basicEffect : BasicEffect
    // 
    - edges : EdgeList
  Methods:
    // 
    + LineRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + Update  (GameTime gameTime) override
    // 
    + OnEdgesChanged  (EdgeList edges) override
    // 
    + Draw  (GameTime gameTime) override
    // 
    - DrawRoundedLines  ()
    // 
    + Intersects (Ray ray) : GameObjectDistance override
    // 
    + Center () : Vector3 override

// 
public class ModelRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    // 
    + Info : GameObjectInfo override
    // 
    + World : World override
    // 
    - pipes : List<PipeModel>
    // 
    - nodes : List<NodeModel>
    // 
    - arrows : List<ArrowModel>
    // 
    - pipeFactory : ModelFactory
    // 
    - nodeFactory : ModelFactory
    // 
    - arrowFactory : ModelFactory
  Methods:
    // 
    + ModelRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + Update  (GameTime gameTime) override
    // 
    + OnEdgesChanged  (EdgeList edgeList) override
    // 
    + CreateArrows  (WrapList<Edge> selectedEdges)
    // 
    - CreateArrow  (Edge edge)
    // 
    + GetEnumerator () : IEnumerator<IGameObject>
    // 
    - IEnumerable.GetEnumerator () : IEnumerator
    // 
    + Draw  (GameTime gameTime) override
    // 
    + Intersects (Ray ray) : GameObjectDistance override
    // 
    + Center () : Vector3 override

public class PipeRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    + Info : GameObjectInfo override
    + World : World override
    - pipes : List<PipeModel>
    - nodes : List<NodeModel>
    - pipeFactory : ModelFactory
    - nodeFactory : ModelFactory
  Methods:
    + PipeRenderer  (GameScreen screen, GameObjectInfo info)
    + Update  (GameTime gameTime) override
    + OnEdgesChanged  (EdgeList edges) override
    + GetEnumerator () : IEnumerator<IGameObject>
    - IEnumerable.GetEnumerator () : IEnumerator
    + Draw  (GameTime gameTime) override
    + Intersects (Ray ray) : GameObjectDistance override
    + Center () : Vector3 override

// 
public class LineRenderer : KnotRenderer
  Attributes:
    // 
    - edges : EdgeList
    // 
    - basicEffect : BasicEffect
    // 
    + Info : GameObjectInfo
    // 
    + World : World
  Methods:
    // 
    + LineRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + OnEdgesChanged  (EdgeList edges)
    - DrawRoundedLines ()
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3
    // 
    + Draw  (GameTime gameTime)
    // 
    + Update  (GameTime gameTime)

// 
public class ModelRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    // 
    - arrows : List<ArrowModel>
    // 
    - nodes : List<NodeModel>
    // 
    - arrowFactory : ModelFactory
    // 
    - nodeFactory : ModelFactory
    // 
    - pipeFactory : ModelFactory
    // 
    - pipes : List<PipeModel>
    // 
    + Info : GameObjectInfo
    // 
    + World : World
  Methods:
    // 
    - IEnumerable.GetEnumerator () : IEnumerator
    // 
    - CreateArrow  (Edge edge)
    // 
    + ModelRenderer  (GameScreen screen, GameObjectInfo info)
    // 
    + Draw  (GameTime gameTime)
    // 
    + OnEdgesChanged  (EdgeList edgeList)
    // 
    + GetEnumerator () : IEnumerator<IGameObject>
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3
    // 
    + Update  (GameTime gameTime)
    // 
    + CreateArrows  (WrapList<Edge> selectedEdges)

public class PipeRenderer : KnotRenderer, IEnumerable<IGameObject>
  Attributes:
    - nodes : List<NodeModel>
    - nodeFactory : ModelFactory
    - pipeFactory : ModelFactory
    - pipes : List<PipeModel>
    + Info : GameObjectInfo
    + World : World
  Methods:
    - IEnumerable.GetEnumerator () : IEnumerator
    + PipeRenderer  (GameState state, GameObjectInfo info)
    + Draw  (GameTime gameTime)
    + OnEdgesChanged  (EdgeList edges)
    + GetEnumerator () : IEnumerator<IGameObject>
    + Intersects (Ray ray) : GameObjectDistance
    + Center () : Vector3
    + Update  (GameTime gameTime)

// 
public class MovableGameObject : IGameObject
  Attributes:
    // 
    - Obj : IGameObject
    // 
    + World : World
    // 
    - screen : GameScreen
    // 
    + Info : GameObjectInfo
  Methods:
    // 
    # CurrentGroundPlane () : Plane
    // 
    + MovableGameObject  (GameScreen screen, IGameObject obj)
    // 
    + Update  (GameTime gameTime) virtual
    // 
    # CurrentMouseRay () : Ray
    // 
    # CurrentMousePosition (Ray ray, Plane groundPlane) : Vector3?
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + Center () : Vector3
    // 
    + Draw  (GameTime gameTime)

// 
public class ShadowGameObject : IGameObject
  Attributes:
    // 
    - Obj : IGameObject
    // 
    + Info : GameObjectInfo
    // 
    + OriginalPosition : Vector3
    // 
    + World : World
    // 
    # screen : GameScreen
    // 
    + ShadowPosition : Vector3
  Methods:
    // 
    + Update  (GameTime gameTime) virtual
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + ShadowGameObject  (GameScreen screen, IGameObject obj)
    // 
    + Center () : Vector3
    // 
    + Draw  (GameTime gameTime) virtual

// 
public class ShadowGameModel : ShadowGameObject
  Attributes:
    // 
    - Model : GameModel
    // 
    + ShadowColor : Color
    // 
    + ShadowAlpha : float
  Methods:
    // 
    + ShadowGameModel  (GameScreen screen, GameModel model)
    // 
    + Draw  (GameTime gameTime) override

// 
public class ShadowGameModel : ShadowGameObject
  Attributes:
    // 
    + ShadowColor : Color
    // 
    - Model : GameModel
    // 
    + ShadowAlpha : float
  Methods:
    // 
    + ShadowGameModel  (GameScreen screen, GameModel model)
    // 
    + Draw  (GameTime gameTime)

// 
public class PipeMovement : IGameObject, IEnumerable<IGameObject>
  Attributes:
    // 
    - shadowObjects : List<ShadowGameObject>
    // 
    + World : World
    // 
    - screen : GameScreen
    // 
    - previousMousePosition : Vector3
    // 
    + Info : GameObjectInfo
    // 
    + Knot : Knot
  Methods:
    // 
    - knownEdgeLists () : HashSet<EdgeList>
    // 
    - IEnumerable.GetEnumerator () : IEnumerator
    // 
    - MovePipes  (Vector3 currentMousePosition)
    // 
    - MoveShadowPipes  (Vector3 currentMousePosition)
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + GetEnumerator () : IEnumerator<IGameObject>
    // 
    + PipeMovement  (GameScreen screen, World world, GameObjectInfo info)
    // 
    + Draw  (GameTime gameTime)
    // 
    - ComputeDirection  (Vector3 currentMousePosition, out Vector3 direction, out float count)
    // 
    - ComputeDirection  (Vector3 currentMousePosition, out Vector3 direction, out int countInt)
    - CreateShadowPipes ()
    // 
    - MoveShadowPipes  (Vector3 currentMousePosition, Vector3 direction3D)
    // 
    - TryMovePipes  (GameTime gameTime)
    // 
    - TrySelectObject  (GameTime gameTime)
    // 
    + Center () : Vector3
    // 
    + Update  (GameTime gameTime)

// 
public class TexturedRectangle : IGameObject
  Attributes:
    // 
    - IGameObject.Info : GameObjectInfo
    // 
    - basicEffect : BasicEffect
    // 
    - texture : Texture2D
    // 
    - LowerLeft : Vector3
    // 
    - LowerRight : Vector3
    // 
    - Normal : Vector3
    // 
    - UpperRight : Vector3
    // 
    - Vertices : VertexPositionNormalTexture[]
    // 
    - Indexes : short[]
    // 
    + Info : TexturedRectangleInfo
    // 
    - UpperLeft : Vector3
    // 
    # screen : GameScreen
    // 
    + World : World
  Methods:
    // 
    - Length () : Vector3
    - FillVertices ()
    // 
    + Intersects (Ray ray) : GameObjectDistance
    // 
    + TexturedRectangle  (GameScreen screen, TexturedRectangleInfo info)
    // 
    + Draw  (GameTime gameTime)
    // 
    # SetPosition  (Vector3 position)
    // 
    + Bounds () : BoundingBox[]
    // 
    + Center () : Vector3
    // 
    + Update  (GameTime gameTime)

