kicad-developers team mailing list archive
Mailing list archive
Re: PATCH: Raytracing - a more pleasing way sequencing blocks to render ?
On Wed, 1 May 2019 at 06:14, John Beard <john.j.beard@xxxxxxxxx> wrote:
> On 01/05/2019 13:57, Mário Luzeiro wrote:
> > Hi John,
> > yeah the Morton code is to improve cache hits.
> > Regarding the speed test, since OS are multi-tasking there could be some interference on the results so 1s difference is not a very measurable difference ( 4% ).
> > A possibility would be to run the same scene multiple times and make an average of the times.
> Sure, it was just a fun observation. It does change a bit from run to
> run, but I was at least expecting a small penalty. Next up, wipes and
> then perhaps Snake :-D
> A more robust benchmarking harness would probably be the way to go if we
> really were serious about putting the pedal to the metal here.
> But I think the centre-first approach is certainly better usability, but
> I'm unsure about the checkerboard.
I agree, without checkerboard it makes it quicker to see what is going
on in the center. Attached the (even simpler) just spiraling out from
the center patch.
> : https://www.youtube.com/watch?v=cGqAu9gj_F0
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
index b059cfeaf..f7fc54b21 100644
@@ -32,6 +32,7 @@
@@ -2074,6 +2075,13 @@ bool C3D_RENDER_RAYTRACING::initializeOpenGL()
+static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
+ const float dx = (float)a.x - (float)b.x;
+ const float dy = (float)a.y - (float)b.y;
+ return hypotf(dx, dy);
@@ -2123,26 +2131,26 @@ void C3D_RENDER_RAYTRACING::initialize_block_positions()
m_postshader_ssao.UpdateSize( m_realBufferSize );
- // Calc block positions
+ // Calc block positions for regular rendering. Choose an 'inside out'
+ // style of rendering
- m_blockPositions.reserve( (m_realBufferSize.x / RAYPACKET_DIM) *
- (m_realBufferSize.y / RAYPACKET_DIM) );
- i = 0;
- SFVEC2UI blockPos( DecodeMorton2X(i) * RAYPACKET_DIM,
- DecodeMorton2Y(i) * RAYPACKET_DIM );
- if( (blockPos.x >= m_realBufferSize.x) && (blockPos.y >= m_realBufferSize.y) )
- if( (blockPos.x < m_realBufferSize.x) && (blockPos.y < m_realBufferSize.y) )
- m_blockPositions.push_back( blockPos );
+ const int blocks_x = m_realBufferSize.x / RAYPACKET_DIM;
+ const int blocks_y = m_realBufferSize.y / RAYPACKET_DIM;
+ m_blockPositions.reserve( blocks_x * blocks_y );
+ for (int x = 0; x < blocks_x; ++x)
+ for (int y = 0; y < blocks_y; ++y)
+ m_blockPositions.push_back(SFVEC2UI(x * RAYPACKET_DIM,
+ y * RAYPACKET_DIM));
+ const SFVEC2UI center(m_realBufferSize.x/2, m_realBufferSize.y/2);
+ std::sort(m_blockPositions.begin(), m_blockPositions.end(),
+ [&](const SFVEC2UI &a, const SFVEC2UI &b)
+ // Sort order: inside out.
+ return distance(a, center) < distance(b, center);
// Create m_shader buffer