Add Chromium-only Blender WebEngine parity work
This commit is contained in:
109
blender-5.2.0/intern/cycles/hydra/field.cpp
Normal file
109
blender-5.2.0/intern/cycles/hydra/field.cpp
Normal file
@@ -0,0 +1,109 @@
|
||||
/* SPDX-FileCopyrightText: 2022 NVIDIA Corporation
|
||||
* SPDX-FileCopyrightText: 2022 Blender Foundation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 */
|
||||
|
||||
#include "hydra/field.h"
|
||||
#include "hydra/util.h"
|
||||
|
||||
#include "util/log.h"
|
||||
|
||||
#ifdef WITH_OPENVDB
|
||||
# include "hydra/session.h"
|
||||
# include "scene/image_vdb.h"
|
||||
# include "scene/scene.h"
|
||||
#endif
|
||||
|
||||
#include <pxr/imaging/hd/sceneDelegate.h>
|
||||
#include <pxr/imaging/hd/volumeFieldSchema.h>
|
||||
#include <pxr/usd/sdf/assetPath.h>
|
||||
|
||||
HDCYCLES_NAMESPACE_OPEN_SCOPE
|
||||
|
||||
#ifdef WITH_OPENVDB
|
||||
class HdCyclesVolumeLoader : public VDBImageLoader {
|
||||
public:
|
||||
HdCyclesVolumeLoader(const std::string &filePath, const std::string &gridName)
|
||||
: VDBImageLoader(gridName)
|
||||
{
|
||||
/* Disable delay loading and file copying, this has poor performance on network drives. */
|
||||
const bool delay_load = false;
|
||||
try {
|
||||
openvdb::io::File file(filePath);
|
||||
# ifdef OPENVDB_USE_DELAYED_LOADING
|
||||
file.setCopyMaxBytes(0);
|
||||
# endif
|
||||
if (file.open(delay_load)) {
|
||||
grid = file.readGrid(gridName);
|
||||
}
|
||||
}
|
||||
catch (const openvdb::IoError &e) {
|
||||
LOG_ERROR << "Error loading OpenVDB file: " << e.what();
|
||||
}
|
||||
catch (...) {
|
||||
LOG_ERROR << "Error loading OpenVDB file: Unknown error";
|
||||
}
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
HdCyclesField::HdCyclesField(const SdfPath &bprimId, const TfToken & /*typeId*/) : HdField(bprimId)
|
||||
{
|
||||
}
|
||||
|
||||
HdCyclesField::~HdCyclesField() = default;
|
||||
|
||||
HdDirtyBits HdCyclesField::GetInitialDirtyBitsMask() const
|
||||
{
|
||||
return DirtyBits::DirtyParams;
|
||||
}
|
||||
|
||||
void HdCyclesField::Sync(HdSceneDelegate *sceneDelegate,
|
||||
HdRenderParam *renderParam,
|
||||
HdDirtyBits *dirtyBits)
|
||||
{
|
||||
#ifdef WITH_OPENVDB
|
||||
const SdfPath &id = GetId();
|
||||
|
||||
if (*dirtyBits & DirtyBits::DirtyParams) {
|
||||
const HdSceneIndexPrim prim = GetPrim(sceneDelegate, id);
|
||||
HdVolumeFieldSchema schema = HdVolumeFieldSchema::GetFromParent(prim.dataSource);
|
||||
|
||||
SdfAssetPath assetPath;
|
||||
if (auto ds = schema.GetFilePath()) {
|
||||
assetPath = ds->GetTypedValue(0.0f);
|
||||
}
|
||||
|
||||
std::string filename = assetPath.GetResolvedPath();
|
||||
if (filename.empty()) {
|
||||
filename = assetPath.GetAssetPath();
|
||||
}
|
||||
|
||||
if (!filename.empty()) {
|
||||
TfToken fieldName;
|
||||
if (auto ds = schema.GetFieldName()) {
|
||||
fieldName = ds->GetTypedValue(0.0f);
|
||||
}
|
||||
|
||||
if (!fieldName.IsEmpty()) {
|
||||
unique_ptr<ImageLoader> loader = make_unique<HdCyclesVolumeLoader>(filename,
|
||||
fieldName.GetString());
|
||||
|
||||
const SceneLock lock(renderParam);
|
||||
|
||||
ImageParams params;
|
||||
params.frame = 0.0f;
|
||||
|
||||
_handle = lock.scene->image_manager->add_image(std::move(loader), params, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
(void)sceneDelegate;
|
||||
(void)renderParam;
|
||||
#endif
|
||||
|
||||
*dirtyBits = DirtyBits::Clean;
|
||||
}
|
||||
|
||||
HDCYCLES_NAMESPACE_CLOSE_SCOPE
|
||||
Reference in New Issue
Block a user