Esempio n. 1
0
    public FigureRenderer(IGraphicsService graphicsService, int bufferSize)
    {
      if (graphicsService == null)
        throw new ArgumentNullException("graphicsService");
      if (bufferSize <= 0 || bufferSize > MaxBufferSize)
        throw new ArgumentOutOfRangeException("bufferSize", "The buffer size must be in the range [1, " + MaxBufferSize + "].");
      if (graphicsService.GraphicsDevice.GraphicsProfile == GraphicsProfile.Reach)
        throw new NotSupportedException("The FigureRenderer does not support the Reach profile.");

      _graphicsService = graphicsService;

      Order = 5;
      BufferSize = bufferSize;
      Options = FigureRenderOptions.RenderFillAndStroke;

      // Start with a reasonably large capacity to avoid frequent re-allocations.
      _jobs = new ArrayList<Job>(32);

      // ReSharper disable DoNotCallOverridableMethodsInConstructor
      _strokeEffect = OnLoadEffect(graphicsService);
      // ReSharper restore DoNotCallOverridableMethodsInConstructor

      _parameterViewport = _strokeEffect.Parameters["ViewportSize"];
      _parameterView = _strokeEffect.Parameters["View"];
      _parameterViewInverse = _strokeEffect.Parameters["ViewInverse"];
      _parameterProjection = _strokeEffect.Parameters["Projection"];
      _parameterCameraNear = _strokeEffect.Parameters["CameraNear"];

      var graphicsDevice = graphicsService.GraphicsDevice;

      // Create stroke indices. (The content of the index buffer does not change.)
      var indices = new ushort[bufferSize * 6];
      for (int i = 0; i < bufferSize; i++)
      {
        // Create index buffer for quad (= two triangles, clockwise).
        //   1--2
        //   | /|
        //   |/ |
        //   0--3
        indices[i * 6 + 0] = (ushort)(i * 4 + 0);
        indices[i * 6 + 1] = (ushort)(i * 4 + 1);
        indices[i * 6 + 2] = (ushort)(i * 4 + 2);
        indices[i * 6 + 3] = (ushort)(i * 4 + 0);
        indices[i * 6 + 4] = (ushort)(i * 4 + 2);
        indices[i * 6 + 5] = (ushort)(i * 4 + 3);
      }

      _strokeBatch = new RenderBatch<StrokeVertex, ushort>(
        graphicsDevice,
        StrokeVertex.VertexDeclaration,
        new StrokeVertex[bufferSize * 4],
        true,
        indices,
        false);

      _fillEffect = new BasicEffect(graphicsDevice)
      {
        Alpha = 1,
        DiffuseColor = new Vector3(1, 1, 1),
        FogEnabled = false,
        PreferPerPixelLighting = false,
        World = Matrix.Identity,
        LightingEnabled = false,
        TextureEnabled = false,
        VertexColorEnabled = true,
      };

      _fillBatch = new RenderBatch<VertexPositionColor, ushort>(
        graphicsDevice,
        VertexPositionColor.VertexDeclaration,
        new VertexPositionColor[bufferSize * 3],
        true,
        new ushort[bufferSize * 3],
        true);
    }