@@ -1823,24 +1823,29 @@ HIPRT_DEVICE float3 hiprtPointObjectToWorld(
18231823 hiprt::SceneHeader* sceneHeader = reinterpret_cast <hiprt::SceneHeader*>( scene );
18241824 float3 p = point;
18251825
1826- uint32_t depth;
1826+ uint32_t depth = 0 ;
18271827#pragma unroll
1828- for ( depth = 1 ; depth < hiprtMaxInstanceLevels; ++depth )
1828+ for ( uint32_t i = 0 ; i < hiprtMaxInstanceLevels; ++i )
18291829 {
1830- sceneHeaders[depth - 1 ] = sceneHeader;
1831- const auto & instance = sceneHeader->m_instances [instanceIDs[depth - 1 ]];
1830+ sceneHeaders[i] = sceneHeader;
1831+ const auto & instance = sceneHeader->m_instances [instanceIDs[i]];
1832+ ++depth;
18321833 if ( instance.m_type != hiprtInstanceTypeScene ) break ;
18331834 sceneHeader = instance.m_scene ;
18341835 }
18351836
18361837#pragma unroll
1837- for ( int32_t i = depth - 1 ; i >= 0 ; -- i )
1838+ for ( uint32_t i = 0 ; i < hiprtMaxInstanceLevels; ++ i )
18381839 {
1839- sceneHeader = sceneHeaders[i];
1840- const auto & instance = sceneHeader->m_instances [instanceIDs[i]];
1841- hiprt::Transform tr = hiprt::Transform ( sceneHeader->m_frames , instance.m_frameIndex , instance.m_frameCount );
1842- hiprt::Frame frame = tr.interpolateFrames ( time );
1843- p = frame.transform ( p );
1840+ int32_t j = depth - 1 - i;
1841+ if ( j >= 0 )
1842+ {
1843+ sceneHeader = sceneHeaders[j];
1844+ const auto & instance = sceneHeader->m_instances [instanceIDs[j]];
1845+ hiprt::Transform tr = hiprt::Transform ( sceneHeader->m_frames , instance.m_frameIndex , instance.m_frameCount );
1846+ hiprt::Frame frame = tr.interpolateFrames ( time );
1847+ p = frame.transform ( p );
1848+ }
18441849 }
18451850
18461851 return p;
@@ -1873,24 +1878,29 @@ HIPRT_DEVICE float3 hiprtVectorObjectToWorld(
18731878 hiprt::SceneHeader* sceneHeader = reinterpret_cast <hiprt::SceneHeader*>( scene );
18741879 float3 v = vector;
18751880
1876- uint32_t depth;
1881+ uint32_t depth = 0 ;
18771882#pragma unroll
1878- for ( depth = 1 ; depth < hiprtMaxInstanceLevels; ++depth )
1883+ for ( uint32_t i = 0 ; i < hiprtMaxInstanceLevels; ++i )
18791884 {
1880- sceneHeaders[depth - 1 ] = sceneHeader;
1881- const auto & instance = sceneHeader->m_instances [instanceIDs[depth - 1 ]];
1885+ sceneHeaders[i] = sceneHeader;
1886+ const auto & instance = sceneHeader->m_instances [instanceIDs[i]];
1887+ ++depth;
18821888 if ( instance.m_type != hiprtInstanceTypeScene ) break ;
18831889 sceneHeader = instance.m_scene ;
18841890 }
18851891
18861892#pragma unroll
1887- for ( int32_t i = depth - 1 ; i >= 0 ; -- i )
1893+ for ( uint32_t i = 0 ; i < hiprtMaxInstanceLevels; ++ i )
18881894 {
1889- sceneHeader = sceneHeaders[i];
1890- const auto & instance = sceneHeader->m_instances [instanceIDs[i]];
1891- hiprt::Transform tr = hiprt::Transform ( sceneHeader->m_frames , instance.m_frameIndex , instance.m_frameCount );
1892- hiprt::Frame frame = tr.interpolateFrames ( time );
1893- v = frame.transformVector ( v );
1895+ int32_t j = depth - 1 - i;
1896+ if ( j >= 0 )
1897+ {
1898+ sceneHeader = sceneHeaders[j];
1899+ const auto & instance = sceneHeader->m_instances [instanceIDs[j]];
1900+ hiprt::Transform tr = hiprt::Transform ( sceneHeader->m_frames , instance.m_frameIndex , instance.m_frameCount );
1901+ hiprt::Frame frame = tr.interpolateFrames ( time );
1902+ v = frame.transformVector ( v );
1903+ }
18941904 }
18951905
18961906 return v;
0 commit comments