Blender V5.0
file_reader.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "hydra/file_reader.h"
6#include "hydra/camera.h"
8
9#include "util/log.h"
10#include "util/path.h"
11#include "util/unique_ptr.h"
12
13#include "scene/scene.h"
14
15#include <pxr/base/plug/registry.h>
16#include <pxr/imaging/hd/dirtyList.h>
17#include <pxr/imaging/hd/renderDelegate.h>
18#include <pxr/imaging/hd/renderIndex.h>
19#include <pxr/imaging/hd/rprimCollection.h>
20#include <pxr/imaging/hd/task.h>
21#include <pxr/usd/usd/stage.h>
22#include <pxr/usd/usdGeom/camera.h>
23#include <pxr/usd/usdGeom/metrics.h>
24#include <pxr/usdImaging/usdImaging/delegate.h>
25
27
28/* Dummy task whose only purpose is to provide render tag tokens to the render index. */
29class DummyHdTask : public HdTask {
30 public:
31 DummyHdTask(HdSceneDelegate * /*delegate*/, const SdfPath &id)
32 : HdTask(id), tags({HdRenderTagTokens->geometry, HdRenderTagTokens->render})
33 {
34 }
35
36 protected:
37 void Sync(HdSceneDelegate * /*delegate*/,
38 HdTaskContext * /*ctx*/,
39 HdDirtyBits * /*dirtyBits*/) override
40 {
41 }
42
43 void Prepare(HdTaskContext * /*ctx*/, HdRenderIndex * /*render_index*/) override {}
44
45 void Execute(HdTaskContext * /*ctx*/) override {}
46
47 const TfTokenVector &GetRenderTags() const override
48 {
49 return tags;
50 }
51
52 TfTokenVector tags;
53};
54
55void HdCyclesFileReader::read(Session *session, const char *filepath, const bool use_camera)
56{
57 /* Initialize USD. */
58 PlugRegistry::GetInstance().RegisterPlugins(path_get("usd"));
59
60 /* Open Stage. */
61 const UsdStageRefPtr stage = UsdStage::Open(filepath);
62 if (!stage) {
63 LOG_ERROR << "USD failed to read " << filepath;
64 return;
65 }
66
67 /* Init paths. */
68 const SdfPath root_path = SdfPath::AbsoluteRootPath();
69 const SdfPath task_path("/_hdCycles/DummyHdTask");
70
71 /* Create render delegate. */
72 HdRenderSettingsMap settings_map;
73 settings_map.insert(std::make_pair(HdCyclesRenderSettingsTokens->stageMetersPerUnit,
74 VtValue(UsdGeomGetStageMetersPerUnit(stage))));
75
76 HdCyclesDelegate render_delegate(settings_map, session, true);
77
78 /* Create render index and scene delegate. */
79 unique_ptr<HdRenderIndex> render_index(HdRenderIndex::New(&render_delegate, {}));
80 unique_ptr<UsdImagingDelegate> scene_delegate = make_unique<UsdImagingDelegate>(
81 render_index.get(), root_path);
82
83 /* Add render tags and collection to render index. */
84 HdRprimCollection collection(HdTokens->geometry, HdReprSelector(HdReprTokens->smoothHull));
85 collection.SetRootPath(root_path);
86
87 render_index->InsertTask<DummyHdTask>(scene_delegate.get(), task_path);
88
89#if PXR_VERSION < 2111
90 HdDirtyListSharedPtr dirty_list = std::make_shared<HdDirtyList>(collection,
91 *(render_index.get()));
92 render_index->EnqueuePrimsToSync(dirty_list, collection);
93#else
94 render_index->EnqueueCollectionToSync(collection);
95#endif
96
97 /* Create prims. */
98 const UsdPrim &stage_root = stage->GetPseudoRoot();
99 scene_delegate->Populate(stage_root.GetStage()->GetPrimAtPath(root_path), {});
100
101 /* Sync prims. */
102 HdTaskContext task_context;
103 HdTaskSharedPtrVector tasks;
104 tasks.push_back(render_index->GetTask(task_path));
105
106 render_index->SyncAll(&tasks, &task_context);
107 render_delegate.CommitResources(&render_index->GetChangeTracker());
108
109 /* Use first camera in stage.
110 * TODO: get camera from UsdRender if available. */
111 if (use_camera) {
112 for (const UsdPrim &prim : stage->Traverse()) {
113 if (prim.IsA<UsdGeomCamera>()) {
114 HdSprim *sprim = render_index->GetSprim(HdPrimTypeTokens->camera, prim.GetPath());
115 if (sprim) {
116 HdCyclesCamera *camera = dynamic_cast<HdCyclesCamera *>(sprim);
117 camera->ApplyCameraSettings(render_delegate.GetRenderParam(), session->scene->camera);
118 break;
119 }
120 }
121 }
122 }
123}
124
const TfTokenVector & GetRenderTags() const override
void Execute(HdTaskContext *) override
DummyHdTask(HdSceneDelegate *, const SdfPath &id)
void Prepare(HdTaskContext *, HdRenderIndex *) override
TfTokenVector tags
void Sync(HdSceneDelegate *, HdTaskContext *, HdDirtyBits *) override
void ApplyCameraSettings(PXR_NS::HdRenderParam *renderParam, CCL_NS::Camera *cam) const
PXR_NS::HdRenderParam * GetRenderParam() const override
void CommitResources(PXR_NS::HdChangeTracker *tracker) override
static void read(Session *session, const char *filepath, const bool use_camera=true)
unique_ptr< Scene > scene
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE
#define LOG_ERROR
Definition log.h:101
string path_get(const string &sub)
Definition path.cpp:337