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 ); } } } }
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)); }
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))); }
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); }
public abstract Color3 RenderPixel( int MaxX, int MaxY, int X, int Y, ThreadLocalState ThreadState );
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; }