@@ -1926,6 +1926,108 @@ HIPRT_DEVICE float3 hiprtVectorWorldToObject(
19261926 return v;
19271927}
19281928
1929+ // transformation getters
1930+ HIPRT_DEVICE hiprtFrameSRT hiprtGetObjectToWorldFrameSRT ( hiprtScene scene, uint32_t instanceID, float time )
1931+ {
1932+ const hiprt::SceneHeader* sceneHeader = reinterpret_cast <const hiprt::SceneHeader*>( scene );
1933+ const hiprt::Transform tr (
1934+ sceneHeader->m_frames ,
1935+ sceneHeader->m_instances [instanceID].m_frameIndex ,
1936+ sceneHeader->m_instances [instanceID].m_frameCount );
1937+ const hiprt::Frame frame = tr.interpolateFrames ( time );
1938+
1939+ hiprt::SRTFrame srtFrame;
1940+ #if defined( HIPRT_MATRIX_FRAME )
1941+ hiprtFrameMatrix mf;
1942+ memcpy ( mf.matrix , frame.m_matrix , sizeof ( mf.matrix ) );
1943+ mf.time = frame.m_time ;
1944+ srtFrame = hiprt::SRTFrame ( mf );
1945+ #else
1946+ srtFrame = frame;
1947+ #endif
1948+
1949+ hiprtFrameSRT result;
1950+ result.rotation = hiprt::qtToAxisAngle ( srtFrame.m_rotation );
1951+ result.scale = srtFrame.m_scale ;
1952+ result.translation = srtFrame.m_translation ;
1953+ result.time = srtFrame.m_time ;
1954+ return result;
1955+ }
1956+
1957+ HIPRT_DEVICE hiprtFrameSRT hiprtGetWorldToObjectFrameSRT ( hiprtScene scene, uint32_t instanceID, float time )
1958+ {
1959+ const hiprt::SceneHeader* sceneHeader = reinterpret_cast <const hiprt::SceneHeader*>( scene );
1960+ const hiprt::Transform tr (
1961+ sceneHeader->m_frames ,
1962+ sceneHeader->m_instances [instanceID].m_frameIndex ,
1963+ sceneHeader->m_instances [instanceID].m_frameCount );
1964+ const hiprt::Frame frame = tr.interpolateFrames ( time );
1965+
1966+ float matrixInv[3 ][4 ];
1967+ hiprt::computeInvTransformMatrix ( frame, matrixInv );
1968+
1969+ hiprtFrameMatrix mf;
1970+ memcpy ( mf.matrix , matrixInv, sizeof ( matrixInv ) );
1971+ mf.time = frame.m_time ;
1972+
1973+ const hiprt::SRTFrame invSrtFrame ( mf );
1974+
1975+ hiprtFrameSRT result;
1976+ result.rotation = hiprt::qtToAxisAngle ( invSrtFrame.m_rotation );
1977+ result.scale = invSrtFrame.m_scale ;
1978+ result.translation = invSrtFrame.m_translation ;
1979+ result.time = invSrtFrame.m_time ;
1980+ return result;
1981+ }
1982+
1983+ HIPRT_DEVICE hiprtFrameMatrix hiprtGetObjectToWorldFrameMatrix ( hiprtScene scene, uint32_t instanceID, float time )
1984+ {
1985+ const hiprt::SceneHeader* sceneHeader = reinterpret_cast <const hiprt::SceneHeader*>( scene );
1986+ const hiprt::Transform tr (
1987+ sceneHeader->m_frames ,
1988+ sceneHeader->m_instances [instanceID].m_frameIndex ,
1989+ sceneHeader->m_instances [instanceID].m_frameCount );
1990+ const hiprt::Frame frame = tr.interpolateFrames ( time );
1991+
1992+ hiprtFrameMatrix result;
1993+ #if defined( HIPRT_MATRIX_FRAME )
1994+ memcpy ( result.matrix , frame.m_matrix , sizeof ( result.matrix ) );
1995+ result.time = frame.m_time ;
1996+ #else
1997+ float Q[3 ][3 ];
1998+ hiprt::qtToRotationMatrix ( frame.m_rotation , Q );
1999+ for ( uint32_t i = 0 ; i < 3 ; ++i )
2000+ {
2001+ result.matrix [i][0 ] = Q[i][0 ] * frame.m_scale .x ;
2002+ result.matrix [i][1 ] = Q[i][1 ] * frame.m_scale .y + Q[i][0 ] * frame.m_shear .x ;
2003+ result.matrix [i][2 ] = Q[i][2 ] * frame.m_scale .z + Q[i][1 ] * frame.m_shear .z + Q[i][0 ] * frame.m_shear .y ;
2004+ }
2005+ result.matrix [0 ][3 ] = frame.m_translation .x ;
2006+ result.matrix [1 ][3 ] = frame.m_translation .y ;
2007+ result.matrix [2 ][3 ] = frame.m_translation .z ;
2008+ result.time = frame.m_time ;
2009+ #endif
2010+ return result;
2011+ }
2012+
2013+ HIPRT_DEVICE hiprtFrameMatrix hiprtGetWorldToObjectFrameMatrix ( hiprtScene scene, uint32_t instanceID, float time )
2014+ {
2015+ const hiprt::SceneHeader* sceneHeader = reinterpret_cast <const hiprt::SceneHeader*>( scene );
2016+ const hiprt::Transform tr (
2017+ sceneHeader->m_frames ,
2018+ sceneHeader->m_instances [instanceID].m_frameIndex ,
2019+ sceneHeader->m_instances [instanceID].m_frameCount );
2020+ const hiprt::Frame frame = tr.interpolateFrames ( time );
2021+
2022+ float matrixInv[3 ][4 ];
2023+ hiprt::computeInvTransformMatrix ( frame, matrixInv );
2024+
2025+ hiprtFrameMatrix result;
2026+ memcpy ( result.matrix , matrixInv, sizeof ( result.matrix ) );
2027+ result.time = frame.m_time ;
2028+ return result;
2029+ }
2030+
19292031// explicit template instatiation
19302032template class hiprtPrivateStack_impl <uint32_t , hiprtPrivateStack::StackSize>;
19312033template class hiprtGlobalStack_impl <uint32_t , false >;
0 commit comments