Skip to content

Commit a58e020

Browse files
committed
Add transformation getters for object-to-world and world-to-object frames
1 parent 8602b8c commit a58e020

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

hiprt/impl/hiprt_device_impl.h

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
19202022
template class hiprtPrivateStack_impl<uint32_t, hiprtPrivateStack::StackSize>;
19212023
template class hiprtGlobalStack_impl<uint32_t, false>;

0 commit comments

Comments
 (0)