Skip to content

Commit 7d1a015

Browse files
authored
Merge pull request #60 from jpola-amd/jpola/dev/matrix_api_restore
Add transformation getters for object-to-world and world-to-object frames
2 parents 16d7899 + a58e020 commit 7d1a015

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
@@ -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
19302032
template class hiprtPrivateStack_impl<uint32_t, hiprtPrivateStack::StackSize>;
19312033
template class hiprtGlobalStack_impl<uint32_t, false>;

0 commit comments

Comments
 (0)