#include "hdPrman/coordSys.h"
#include "hdPrman/context.h"
#include "hdPrman/debugCodes.h"
#include "hdPrman/renderParam.h"
#include "hdPrman/rixStrings.h"
#include "pxr/usd/sdf/types.h"
#include "pxr/base/tf/staticTokens.h"
#include "pxr/imaging/hd/sceneDelegate.h"
#include "pxr/imaging/hf/diagnostic.h"
#include "RtParamList.h"
PXR_NAMESPACE_OPEN_SCOPE
HdPrmanCoordSys::HdPrmanCoordSys(SdfPath const& id)
: HdCoordSys(id)
, _coordSysId(riley::CoordinateSystemId::k_InvalidId)
{
}
HdPrmanCoordSys::~HdPrmanCoordSys()
{
}
void
HdPrmanCoordSys::Finalize(HdRenderParam *renderParam)
{
HdPrman_Context *context =
static_cast<HdPrman_RenderParam*>(renderParam)->AcquireContext();
_ResetCoordSys(context);
}
void
HdPrmanCoordSys::_ResetCoordSys(HdPrman_Context *context)
{
riley::Riley *riley = context->riley;
if (_coordSysId != riley::CoordinateSystemId::k_InvalidId) {
riley->DeleteCoordinateSystem(_coordSysId);
_coordSysId = riley::CoordinateSystemId::k_InvalidId;
}
}
void
HdPrmanCoordSys::Sync(HdSceneDelegate *sceneDelegate,
HdRenderParam *renderParam,
HdDirtyBits *dirtyBits)
{
HdPrman_Context *context =
static_cast<HdPrman_RenderParam*>(renderParam)->AcquireContext();
SdfPath id = GetId();
riley::Riley *riley = context->riley;
if (*dirtyBits) {
_ResetCoordSys(context);
HdTimeSampleArray<GfMatrix4d, HDPRMAN_MAX_TIME_SAMPLES> xf;
sceneDelegate->SampleTransform(id, &xf);
TfSmallVector<RtMatrix4x4, HDPRMAN_MAX_TIME_SAMPLES>
xf_rt_values(xf.count);
for (size_t i=0; i < xf.count; ++i) {
xf_rt_values[i] = HdPrman_GfMatrixToRtMatrix(xf.values[i]);
}
const riley::Transform xform = {
unsigned(xf.count), xf_rt_values.data(), xf.times.data()};
RtParamList attrs;
attrs.SetString(RixStr.k_name,
RtUString(SdfPath::StripNamespace(id.GetName()).c_str()));
_coordSysId = riley->CreateCoordinateSystem(xform, attrs);
}
*dirtyBits = HdChangeTracker::Clean;
}
HdDirtyBits
HdPrmanCoordSys::GetInitialDirtyBitsMask() const
{
return HdChangeTracker::AllDirty;
}
bool
HdPrmanCoordSys::IsValid() const
{
return _coordSysId != riley::CoordinateSystemId::k_InvalidId;
}
PXR_NAMESPACE_CLOSE_SCOPE