176 lines
3.5 KiB
Mathematica
176 lines
3.5 KiB
Mathematica
(* ::Package:: *)
|
|
|
|
(* ::Title:: *)
|
|
(*FogVolume*)
|
|
|
|
|
|
(* ::Subtitle:: *)
|
|
(*Convert a level set into a fog volume.*)
|
|
|
|
|
|
(* ::Text:: *)
|
|
(*Copyright Contributors to the OpenVDB Project*)
|
|
(*SPDX-License-Identifier: Apache-2.0*)
|
|
|
|
|
|
(* ::Section:: *)
|
|
(*Initialization & Usage*)
|
|
|
|
|
|
Package["OpenVDBLink`"]
|
|
|
|
|
|
PackageExport["OpenVDBToFogVolume"]
|
|
PackageExport["OpenVDBFogVolume"]
|
|
|
|
|
|
OpenVDBToFogVolume::usage = "OpenVDBToFogVolume[expr] modifies the scalar level set expr by converting it to a fog volume representation.";
|
|
OpenVDBFogVolume::usage = "OpenVDBFogVolume[expr] creates a fog volume representation of expr and stores the result to a new OpenVDB grid.";
|
|
|
|
|
|
(* ::Section:: *)
|
|
(*FogVolume*)
|
|
|
|
|
|
(* ::Subsection::Closed:: *)
|
|
(*OpenVDBToFogVolume*)
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*Main*)
|
|
|
|
|
|
OpenVDBToFogVolume[args___] /; !CheckArgs[OpenVDBToFogVolume[args], {1, 2}] = $Failed;
|
|
|
|
|
|
OpenVDBToFogVolume[args___] :=
|
|
With[{res = iOpenVDBToFogVolume[args]},
|
|
res /; res =!= $Failed
|
|
]
|
|
|
|
|
|
OpenVDBToFogVolume[args___] := mOpenVDBToFogVolume[args]
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*iOpenVDBToFogVolume*)
|
|
|
|
|
|
iOpenVDBToFogVolume[vdb_?OpenVDBScalarGridQ, cutoff_ -> regime_?regimeQ] /; levelSetQ[vdb] :=
|
|
Block[{wcutoff},
|
|
wcutoff = If[TrueQ[Positive[cutoff]],
|
|
cutoff,
|
|
halfWidth[vdb]
|
|
];
|
|
|
|
wcutoff = regimeConvert[vdb, wcutoff, regime -> $worldregime];
|
|
|
|
vdb["levelSetToFogVolume"[wcutoff]];
|
|
|
|
vdb
|
|
]
|
|
|
|
|
|
iOpenVDBToFogVolume[vdb_] := iOpenVDBToFogVolume[vdb, Automatic -> $indexregime]
|
|
|
|
|
|
iOpenVDBToFogVolume[vdb_, cutoff_] /; NumericQ[cutoff] || cutoff === Automatic := iOpenVDBToFogVolume[vdb, cutoff -> $indexregime]
|
|
|
|
|
|
iOpenVDBToFogVolume[___] = $Failed;
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*Argument conform & completion*)
|
|
|
|
|
|
registerForLevelSet[iOpenVDBToFogVolume, 1];
|
|
|
|
|
|
SyntaxInformation[OpenVDBToFogVolume] = {"ArgumentsPattern" -> {_, _.}};
|
|
|
|
|
|
OpenVDBDefaultSpace[OpenVDBToFogVolume] = $indexregime;
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*Messages*)
|
|
|
|
|
|
mOpenVDBToFogVolume[expr_, ___] /; messageScalarGridQ[expr, OpenVDBToFogVolume] = $Failed;
|
|
|
|
|
|
mOpenVDBToFogVolume[expr_, ___] /; messageLevelSetGridQ[expr, OpenVDBToFogVolume] = $Failed;
|
|
|
|
|
|
mOpenVDBToFogVolume[___] = $Failed;
|
|
|
|
|
|
(* ::Subsection::Closed:: *)
|
|
(*OpenVDBFogVolume*)
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*Main*)
|
|
|
|
|
|
OpenVDBFogVolume[args___] /; !CheckArgs[OpenVDBFogVolume[args], {1, 2}] = $Failed;
|
|
|
|
|
|
OpenVDBFogVolume[args___] :=
|
|
With[{res = iOpenVDBFogVolume[args]},
|
|
res /; res =!= $Failed
|
|
]
|
|
|
|
|
|
OpenVDBFogVolume[args___] := mOpenVDBFogVolume[args]
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*iOpenVDBFogVolume*)
|
|
|
|
|
|
iOpenVDBFogVolume[vdb_?OpenVDBScalarGridQ, cutoff_ -> regime_?regimeQ] /; levelSetQ[vdb] :=
|
|
Block[{vdbcopy},
|
|
vdbcopy = OpenVDBCopyGrid[vdb];
|
|
|
|
iOpenVDBToFogVolume[vdbcopy, cutoff -> regime];
|
|
|
|
vdbcopy
|
|
]
|
|
|
|
|
|
iOpenVDBFogVolume[vdb_] := iOpenVDBFogVolume[vdb, Automatic -> $indexregime]
|
|
|
|
|
|
iOpenVDBFogVolume[vdb_, cutoff_] /; NumericQ[cutoff] || cutoff === Automatic := iOpenVDBFogVolume[vdb, cutoff -> $indexregime]
|
|
|
|
|
|
iOpenVDBFogVolume[___] = $Failed;
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*Argument conform & completion*)
|
|
|
|
|
|
registerForLevelSet[iOpenVDBFogVolume, 1];
|
|
|
|
|
|
SyntaxInformation[OpenVDBFogVolume] = {"ArgumentsPattern" -> {_, _.}};
|
|
|
|
|
|
OpenVDBDefaultSpace[OpenVDBFogVolume] = $indexregime;
|
|
|
|
|
|
(* ::Subsubsection::Closed:: *)
|
|
(*Messages*)
|
|
|
|
|
|
mOpenVDBFogVolume[expr_, ___] /; messageScalarGridQ[expr, OpenVDBFogVolume] = $Failed;
|
|
|
|
|
|
mOpenVDBFogVolume[expr_, ___] /; messageLevelSetGridQ[expr, OpenVDBFogVolume] = $Failed;
|
|
|
|
|
|
mOpenVDBFogVolume[___] = $Failed;
|