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