Exemplo n.º 1
0
        private static void Render( CameraBase CameraState, SceneBase Scene, RenderMethod Method, byte MaxDepth, float Epsilon,
                                    byte RouletteDepth, float MaximumTerminationProbability, Framebuffer Fb, bool UseMultithreading )
        {
            if ( UseMultithreading )
            {
                Parallel.For<ThreadLocalState>( 0, Fb.Rows,
                                               () => new ThreadLocalState( Scene, Method, MaxDepth, Epsilon, RouletteDepth, MaximumTerminationProbability ),
                                               ( Y, Loop, State ) =>
                                               {
                                                   for ( int X = 0; X < Fb.Columns; X++ )
                                                   {
                                                       Fb[Y, X] = CameraState.RenderPixel( Fb.Columns, Fb.Rows, X, Y, State );
                                                   }

                                                   return State;
                                               }, ( State ) => { } );
            }
            else
            {
                ThreadLocalState State = new ThreadLocalState( Scene, Method, MaxDepth, Epsilon, RouletteDepth, MaximumTerminationProbability );

                for ( int Y = 0; Y < Fb.Rows; Y++ )
                {
                    for ( int X = 0; X < Fb.Columns; X++ )
                    {
                        Fb[Y, X] = CameraState.RenderPixel( Fb.Columns, Fb.Rows, X, Y, State );
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static void ReturnWriter(Utf8JsonWriter writer)
        {
            Debug.Assert(t_threadLocalState != null);
            ThreadLocalState state = t_threadLocalState;

            writer.ResetAllStateForCacheReuse();

            int rentedWriters = --state.RentedWriters;

            Debug.Assert((rentedWriters == 0) == ReferenceEquals(state.Writer, writer));
        }
Exemplo n.º 3
0
        public static void ReturnWriterAndBuffer(Utf8JsonWriter writer, PooledByteBufferWriter bufferWriter)
        {
            Debug.Assert(t_threadLocalState != null);
            ThreadLocalState state = t_threadLocalState;

            writer.ResetAllStateForCacheReuse();
            bufferWriter.ClearAndReturnBuffers();

            int rentedWriters = --state.RentedWriters;

            Debug.Assert((rentedWriters == 0) == (ReferenceEquals(state.BufferWriter, bufferWriter) && ReferenceEquals(state.Writer, writer)));
        }
Exemplo n.º 4
0
        public static Utf8JsonWriter RentWriter(JsonSerializerOptions options, PooledByteBufferWriter bufferWriter)
        {
            ThreadLocalState state = t_threadLocalState ??= new();
            Utf8JsonWriter   writer;

            if (state.RentedWriters++ == 0)
            {
                // First JsonSerializer call in the stack -- initialize & return the cached instance.
                writer = state.Writer;
                writer.Reset(bufferWriter, options.GetWriterOptions());
            }
            else
            {
                // We're in a recursive JsonSerializer call -- return a fresh instance.
                writer = new Utf8JsonWriter(bufferWriter, options.GetWriterOptions());
            }

            return(writer);
        }
Exemplo n.º 5
0
 public abstract Color3 RenderPixel( int MaxX, int MaxY, int X, int Y, ThreadLocalState ThreadState );
Exemplo n.º 6
0
            public override Color3 RenderPixel( int MaxX, int MaxY, int X, int Y, ThreadLocalState ThreadState )
            {
                Color3 Pixel = Color3.Black;

                Vector ImagePlanePixelHeight = ImagePlaneHeight / (float)MaxX;
                Vector ImagePlaneSubPixelHeight = ImagePlanePixelHeight / (float)YSamplesPerPixel;

                Vector ImagePlanePixelWidth = ImagePlaneWidth / (float)MaxY;
                Vector ImagePlaneSubPixelWidth = ImagePlanePixelWidth / (float)XSamplesPerPixel;

                Point PixelLowerCorner = ImagePlaneCorner +
                                         (float)X * ImagePlanePixelWidth +
                                         (float)Y * ImagePlanePixelHeight;

                for ( int YY = 0; YY < YSamplesPerPixel; YY++ )
                {
                    for ( int XX = 0; XX < XSamplesPerPixel; XX++ )
                    {
                        Point ImagePlaneLocation = PixelLowerCorner +
                                                   ImagePlaneSubPixelWidth * 0.5f +
                                                   ImagePlaneSubPixelHeight * 0.5f;
                        Vector Direction = PinholeLocation - ImagePlaneLocation;

                        Pixel += SampleWeight * ThreadState.RayTracer.Trace( new Ray( PinholeLocation, Direction ) );

                        PixelLowerCorner += ImagePlaneSubPixelWidth;
                    }

                    PixelLowerCorner += ImagePlaneSubPixelHeight;
                }

                return Pixel;
            }