Files
UnrealEngine/Engine/Source/ThirdParty/OpenVDB/openvdb-12.0.0/openvdb_wolfram/OpenVDBLink/Grids.m
2025-05-18 13:04:45 +08:00

990 lines
30 KiB
Mathematica

(* ::Package:: *)
(* ::Title:: *)
(*Grids*)
(* ::Subtitle:: *)
(*Basic operations on OpenVDB Grids.*)
(* ::Text:: *)
(*Copyright Contributors to the OpenVDB Project*)
(*SPDX-License-Identifier: Apache-2.0*)
(* ::Section:: *)
(*Initialization & Usage*)
Package["OpenVDBLink`"]
PackageImport["OpenVDBLink`LTemplate`"]
PackageExport["OpenVDBGrid"]
PackageExport["OpenVDBGridQ"]
PackageExport["OpenVDBGrids"]
PackageExport["OpenVDBGridTypes"]
PackageExport["OpenVDBScalarGridQ"]
PackageExport["OpenVDBIntegerGridQ"]
PackageExport["OpenVDBVectorGridQ"]
PackageExport["OpenVDBBooleanGridQ"]
PackageExport["OpenVDBMaskGridQ"]
PackageExport["OpenVDBCreateGrid"]
PackageExport["OpenVDBClearGrid"]
PackageExport["OpenVDBCopyGrid"]
PackageExport["$OpenVDBSpacing"]
PackageExport["$OpenVDBHalfWidth"]
PackageExport["$OpenVDBCreator"]
PackageExport["OpenVDBDefaultSpace"]
OpenVDBGrid::usage = "OpenVDBGrid[id, type] represents an instance of an OpenVDB grid of a given type.";
OpenVDBGridQ::usage = "OpenVDBGridQ[expr] returns True if expr represents an active instance of an OpenVDB grid.";
OpenVDBGrids::usage = "OpenVDBGrids[] returns a list of active OpenVDB grids.";
OpenVDBGridTypes::usage = "OpenVDBGridTypes[] returns a list of all valid grid types.";
OpenVDBScalarGridQ::usage = "OpenVDBScalarGridQ[expr] returns True if expr represents an active instance of an OpenVDB scalar grid.";
OpenVDBIntegerGridQ::usage = "OpenVDBIntegerGridQ[expr] returns True if expr represents an active instance of an OpenVDB integer grid.";
OpenVDBVectorGridQ::usage = "OpenVDBVectorGridQ[expr] returns True if expr represents an active instance of an OpenVDB vector grid.";
OpenVDBBooleanGridQ::usage = "OpenVDBBooleanGridQ[expr] returns True if expr represents an active instance of an OpenVDB Boolean grid.";
OpenVDBMaskGridQ::usage = "OpenVDBMaskGridQ[expr] returns True if expr represents an active instance of an OpenVDB mask grid.";
OpenVDBCreateGrid::usage = "OpenVDBCreateGrid[] creates an instance of an OpenVDB grid.";
OpenVDBClearGrid::usage = "OpenVDBClearGrid[expr] clears all data in an OpenVDB grid, effectively leaving the grid empty.";
OpenVDBCopyGrid::usage = "OpenVDBCopyGrid[expr] creates a copy of an OpenVDB grid.";
$OpenVDBSpacing::usage = "$OpenVDBSpacing is a global variable that represents the default voxel spacing.";
$OpenVDBHalfWidth::usage = "$OpenVDBHalfWidth is a global variable that represents the default signed distance field half width. The default value is 3.0.";
$OpenVDBCreator::usage = "$OpenVDBCreator is a global variable that fills the creator metadata when a grid is created. The default value is None.";
OpenVDBDefaultSpace::usage = "OpenVDBDefaultSpace[f] returns the default coordinate space (\"Index\" or \"World\") of the OpenVDBLink function f, or Missing[\"NotApplicable\"] if f does not need a coordinate space.";
(* ::Section:: *)
(*OpenVDB grids*)
(* ::Subsection::Closed:: *)
(*OpenVDBGrid*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBGrid[i_, type_][(func_String)[args___]] := typeClass[type][i][func[args]]
(* ::Subsubsection::Closed:: *)
(*Formatting*)
OpenVDBGrid /: MakeBoxes[vdb_OpenVDBGrid?OpenVDBGridQ, fmt_] :=
Block[{lvlsetQ, class, infos, icon},
lvlsetQ = levelSetQ[vdb];
infos = {
If[StringQ[vdb["Name"]], {BoxForm`SummaryItem[{"Name: ", vdb["Name"]}]}, Nothing],
{BoxForm`SummaryItem[{"Class: ", formatGridClass[vdb]}]},
{BoxForm`SummaryItem[{"Type: ", formatTreeType[vdb["GridType"]]}]},
{BoxForm`SummaryItem[{"Voxel size: ", voxelSize[vdb]}]},
If[lvlsetQ, {BoxForm`SummaryItem[{"Half width: ", vdb["HalfWidth"]}]}, Nothing],
{BoxForm`SummaryItem[{"Expression ID: ", vdb[[1]]}]}
};
icon = Which[
lvlsetQ,
$lvlseticon,
fogVolumeQ[vdb],
$fogvolicon,
OpenVDBScalarGridQ[vdb],
$scalargridicon,
OpenVDBVectorGridQ[vdb],
$vecgridicon,
OpenVDBIntegerGridQ[vdb],
$intgridicon,
OpenVDBBooleanGridQ[vdb],
$boolgridicon,
OpenVDBMaskGridQ[vdb],
$maskgridicon,
True,
None
];
BoxForm`ArrangeSummaryBox[
OpenVDBGrid,
vdb,
icon,
infos[[1 ;; 2]],
infos[[3 ;; -1]],
fmt,
"Interpretable" -> Automatic
]
]
formatGridClass[vdb_?levelSetQ] = "Level set";
formatGridClass[vdb_?fogVolumeQ] = "Fog volume";
formatGridClass[vdb_?OpenVDBVectorGridQ] = $vectorType;
formatGridClass[vdb_?OpenVDBIntegerGridQ] = $integerType;
formatGridClass[vdb_?OpenVDBScalarGridQ] = $scalarType;
formatGridClass[vdb_?OpenVDBBooleanGridQ] = $booleanType;
formatGridClass[vdb_?OpenVDBMaskGridQ] = $maskType;
formatGridClass[_] = None;
formatTreeType[type_String] /; StringMatchQ[type, "Tree_" ~~ t__ ~~ ("_" ~~ (DigitCharacter..)).. /; StringFreeQ[t, "_"]] :=
Block[{split, t, dig},
split = StringSplit[type, "_"];
t = split[[2]];
dig = split[[3 ;; -1]];
StringRiffle[dig, {t <> " (", ",", ")"}]
]
formatTreeType[expr_] := expr
(* ::Subsection::Closed:: *)
(*OpenVDBGridQ*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBGridQ[vdb:OpenVDBGrid[_, type_]] := ManagedLibraryExpressionQ[vdb, typeGridName[type]]
OpenVDBGridQ[___] = False;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBGridQ] = {"ArgumentsPattern" -> {_}};
(* ::Subsection::Closed:: *)
(*OpenVDBGrids*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBGrids[args___] /; !CheckArgs[OpenVDBGrids[args], {0, 1}] = $Failed;
OpenVDBGrids[args___] :=
With[{res = iOpenVDBGrids[args]},
res /; res =!= $Failed
]
OpenVDBGrids[args___] := mOpenVDBGrids[args]
(* ::Subsubsection::Closed:: *)
(*iOpenVDBGrids*)
iOpenVDBGrids[] := iOpenVDBGrids[Automatic]
iOpenVDBGrids[Automatic] := Select[iOpenVDBGrids[All], Length[#] > 0&]
iOpenVDBGrids[All] :=
With[{typesnoaliases = Join @@ Keys /@ $GridClassData},
Association[# -> iOpenVDBGrids[#]& /@ typesnoaliases]
]
iOpenVDBGrids[type_String?aliasTypeQ] := iOpenVDBGrids[resolveAliasType[type]]
iOpenVDBGrids[type_String] :=
Block[{gridlist},
gridlist = Quiet @ LExpressionList[typeGridName[type]];
If[ListQ[gridlist],
OpenVDBGrid[#, type]& @@@ gridlist,
$Failed
]
]
iOpenVDBGrids[types:{___String}] :=
With[{grids = iOpenVDBGrids /@ types},
AssociationThread[types, grids] /; FreeQ[grids, $Failed]
]
iOpenVDBGrids[___] = $Failed;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBGrids] = {"ArgumentsPattern" -> {_.}};
addCodeCompletion[OpenVDBGrids][$gridTypeList];
(* ::Subsubsection::Closed:: *)
(*Messages*)
mOpenVDBGrids[Automatic|All] = $Failed;
mOpenVDBGrids[expr_List] /; Complement[expr, OpenVDBGridTypes[]] =!= {} :=
(
Message[OpenVDBGrids::type2, expr];
$Failed
)
mOpenVDBGrids[expr_] /; !MemberQ[OpenVDBGridTypes[], expr] :=
(
Message[OpenVDBGrids::type, expr];
$Failed
)
mOpenVDBGrids[___] = $Failed;
OpenVDBGrids::type = "`1` is not a supported grid type. Evaluate OpenVDBGridTypes[] to see the list of supported types.";
OpenVDBGrids::type2 = "`1` is not a list of supported grid types. Evaluate OpenVDBGridTypes[] to see the list of supported types.";
(* ::Subsection::Closed:: *)
(*OpenVDBGridTypes*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBGridTypes[args___] /; !CheckArgs[OpenVDBGridTypes[args], {0, 1}] = $Failed;
OpenVDBGridTypes[args___] :=
With[{res = iOpenVDBGridTypes[args]},
res /; res =!= $Failed
]
OpenVDBGridTypes[args___] := mOpenVDBGridTypes[args]
(* ::Subsubsection::Closed:: *)
(*iOpenVDBGridTypes*)
Scan[(iOpenVDBGridTypes[#] = Join[DeleteMissing[Values[$GridClassData[#]][[All, "Alias"]]], Keys[$GridClassData[#]]])&, $classTypeList]
iOpenVDBGridTypes[All] = $gridTypeList;
iOpenVDBGridTypes[] = iOpenVDBGridTypes[All];
iOpenVDBGridTypes[___] = $Failed;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBGridTypes] = {"ArgumentsPattern" -> {_.}};
addCodeCompletion[OpenVDBGridTypes][$classTypeList];
(* ::Subsubsection::Closed:: *)
(*Messages*)
mOpenVDBGridTypes[All] = $Failed;
mOpenVDBGridTypes[expr_] /; !MemberQ[$classTypeList, expr] :=
(
Message[OpenVDBGridTypes::type, expr];
$Failed
)
mOpenVDBGridTypes[___] = $Failed;
OpenVDBGridTypes::type = "`1` is not a supported family of grids.";
(* ::Section:: *)
(*Specific grids*)
(* ::Subsection::Closed:: *)
(*OpenVDBScalarGridQ*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBScalarGridQ[vdb:OpenVDBGrid[_, type_]] := OpenVDBGridQ[vdb] && !MissingQ[$GridClassData[$scalarType, type]]
OpenVDBScalarGridQ[___] = False;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBScalarGridQ] = {"ArgumentsPattern" -> {_}};
(* ::Subsection::Closed:: *)
(*OpenVDBIntegerGridQ*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBIntegerGridQ[vdb:OpenVDBGrid[_, type_]] := OpenVDBGridQ[vdb] && !MissingQ[$GridClassData[$integerType, type]]
OpenVDBIntegerGridQ[___] = False;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBIntegerGridQ] = {"ArgumentsPattern" -> {_}};
(* ::Subsection::Closed:: *)
(*OpenVDBVectorGridQ*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBVectorGridQ[vdb:OpenVDBGrid[_, type_]] := OpenVDBGridQ[vdb] && !MissingQ[$GridClassData[$vectorType, type]]
OpenVDBVectorGridQ[___] = False;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBVectorGridQ] = {"ArgumentsPattern" -> {_}};
(* ::Subsection::Closed:: *)
(*OpenVDBBooleanGridQ*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBBooleanGridQ[vdb:OpenVDBGrid[_, $booleanType]] := OpenVDBGridQ[vdb]
OpenVDBBooleanGridQ[___] = False;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBBooleanGridQ] = {"ArgumentsPattern" -> {_}};
(* ::Subsection::Closed:: *)
(*OpenVDBMaskGridQ*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBMaskGridQ[vdb:OpenVDBGrid[_, $maskType]] := OpenVDBGridQ[vdb]
OpenVDBMaskGridQ[___] = False;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBMaskGridQ] = {"ArgumentsPattern" -> {_}};
(* ::Section:: *)
(*Constructor & destructor*)
(* ::Subsection::Closed:: *)
(*OpenVDBCreateGrid*)
(* ::Subsubsection::Closed:: *)
(*Main*)
Options[OpenVDBCreateGrid] = {"BackgroundValue" -> Automatic, "Creator" :> $OpenVDBCreator, "GridClass" -> None, "Name" -> None};
OpenVDBCreateGrid[args___] /; !CheckArgs[OpenVDBCreateGrid[args], {0, 2}] = $Failed;
OpenVDBCreateGrid[args___] :=
With[{res = iOpenVDBCreateGrid[args]},
res /; res =!= $Failed
]
OpenVDBCreateGrid[args___] := mOpenVDBCreateGrid[args]
(* ::Subsubsection::Closed:: *)
(*iOpenVDBCreateGrid*)
Options[iOpenVDBCreateGrid] = Options[OpenVDBCreateGrid];
iOpenVDBCreateGrid[opts:OptionsPattern[]] := iOpenVDBCreateGrid[$OpenVDBSpacing, $gridTypeList[[1]], opts]
iOpenVDBCreateGrid[spacing_?Positive, opts:OptionsPattern[]] := iOpenVDBCreateGrid[spacing, $gridTypeList[[1]], opts]
iOpenVDBCreateGrid[spacing_?Positive, type_String, opts:OptionsPattern[]] :=
Block[{vdb = newVDB[type]},
(
setVDBProperties[vdb, "VoxelSize" -> spacing, opts]
) /; OpenVDBGridQ[vdb]
]
iOpenVDBCreateGrid[ovdb_?OpenVDBGridQ, opts:OptionsPattern[]] :=
Block[{vdb = newVDB[ovdb[[2]]], vdbprops},
vdbprops = OpenVDBProperty[ovdb, {"VoxelSize", "BackgroundValue", "Creator", "GridClass", "Name"}, "RuleList"];
(
setVDBProperties[vdb, opts, Sequence @@ vdbprops]
) /; OpenVDBGridQ[vdb]
]
iOpenVDBCreateGrid[___] = $Failed;
newVDB[type_?aliasTypeQ] := newVDB[resolveAliasType[type]]
newVDB[type_String] :=
With[{res = Quiet @ CreateManagedLibraryExpression[typeGridName[type], OpenVDBGrid[#, type]&]},
res /; res =!= $Failed
]
newVDB[___] = $Failed;
(* ::Subsubsection::Closed:: *)
(*setVDBProperties*)
Options[setVDBProperties] = Join[Options[OpenVDBCreateGrid], {"VoxelSize" :> $OpenVDBSpacing}];
setVDBProperties[vdb_, OptionsPattern[]] :=
Block[{bg, creator, gclass, name, spacing},
bg = OptionValue["BackgroundValue"];
creator = OptionValue["Creator"];
gclass = OptionValue["GridClass"];
name = OptionValue["Name"];
spacing = OptionValue["VoxelSize"];
OpenVDBSetProperty[
vdb,
{
If[bg === Automatic, Nothing, "BackgroundValue" -> bg],
"Creator" -> creator,
"GridClass" -> gclass,
"Name" -> name,
"VoxelSize" -> spacing
}
];
vdb
]
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBCreateGrid] = {"ArgumentsPattern" -> {_., _., OptionsPattern[]}};
addCodeCompletion[OpenVDBCreateGrid][None, $gridTypeList];
(* ::Subsubsection::Closed:: *)
(*Messages*)
Options[mOpenVDBCreateGrid] = Options[OpenVDBCreateGrid];
mOpenVDBCreateGrid[OptionsPattern[]] /; !TrueQ[$OpenVDBSpacing > 0] :=
(
Message[OpenVDBCreateGrid::novoxsz];
$Failed
);
mOpenVDBCreateGrid[vx_, ___] /; !TrueQ[vx > 0] && !OptionQ[vx] :=
(
Message[OpenVDBCreateGrid::nonpos, vx, 1];
$Failed
)
mOpenVDBCreateGrid[_, type_, ___] /; !MemberQ[$gridTypeList, type] && !OptionQ[type] :=
(
Message[OpenVDBCreateGrid::type, type];
$Failed
)
mOpenVDBCreateGrid[___] = $Failed;
OpenVDBCreateGrid::novoxsz = "No grid spacing is provided since $OpenVDBSpacing is not a positive number.";
OpenVDBCreateGrid::nonpos = "`1` at position `2` is expected to be a positive number";
OpenVDBCreateGrid::type = "`1` is not a supported grid type. Evaluate OpenVDBGridTypes[] to see the list of supported types."
(* ::Subsection::Closed:: *)
(*OpenVDBClearGrid*)
(* ::Subsubsection::Closed:: *)
(*Main*)
OpenVDBClearGrid[args___] /; !CheckArgs[OpenVDBClearGrid[args], 1] = $Failed;
OpenVDBClearGrid[args___] :=
With[{res = iOpenVDBClearGrid[args]},
res /; res =!= $Failed
]
OpenVDBClearGrid[args___] := mOpenVDBClearGrid[args]
(* ::Subsubsection::Closed:: *)
(*iOpenVDBClearGrid*)
SetAttributes[iOpenVDBClearGrid, Listable];
iOpenVDBClearGrid[vdb_?OpenVDBGridQ] :=
(
vdb["createEmptyGrid"[]];
vdb
)
iOpenVDBClearGrid[___] = $Failed;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBClearGrid] = {"ArgumentsPattern" -> {_}};
(* ::Subsubsection::Closed:: *)
(*Messages*)
mOpenVDBClearGrid[expr_] /; !OpenVDBGridQ[expr] && !VectorQ[expr, OpenVDBGridQ] :=
(
Message[OpenVDBClearGrid::grids, expr];
$Failed
)
mOpenVDBClearGrid[___] = $Failed;
OpenVDBClearGrid::grids = "`1` is not a grid or list of grids.";
(* ::Subsection::Closed:: *)
(*OpenVDBCopyGrid*)
(* ::Subsubsection::Closed:: *)
(*Main*)
Options[OpenVDBCopyGrid] = {"Creator" -> Inherited, "Name" -> Inherited};
OpenVDBCopyGrid[args___] /; !CheckArgs[OpenVDBCopyGrid[args], 1] = $Failed;
OpenVDBCopyGrid[args___] :=
With[{res = iOpenVDBCopyGrid[args]},
res /; res =!= $Failed
]
OpenVDBCopyGrid[args___] := mOpenVDBCopyGrid[args]
(* ::Subsubsection::Closed:: *)
(*iOpenVDBCopyGrid*)
Options[iOpenVDBCopyGrid] = Options[OpenVDBCopyGrid];
iOpenVDBCopyGrid[vdb_?OpenVDBGridQ, OptionsPattern[]] :=
Block[{vdbcopy},
vdbcopy = newVDB[vdb[[2]]];
(
vdbcopy["copyGrid"[vdb[[1]]]];
OpenVDBSetProperty[vdb, {"Creator", "Name"}, OptionValue[{"Creator", "Name"}]];
vdbcopy
) /; OpenVDBGridQ[vdbcopy]
]
iOpenVDBCopyGrid[___] = $Failed;
(* ::Subsubsection::Closed:: *)
(*Argument conform & completion*)
SyntaxInformation[OpenVDBCopyGrid] = {"ArgumentsPattern" -> {_, OptionsPattern[]}};
(* ::Subsubsection::Closed:: *)
(*Messages*)
mOpenVDBCopyGrid[expr_, ___] /; messageGridQ[expr, OpenVDBCopyGrid, False] = $Failed;
mOpenVDBCopyGrid[___] = $Failed;
(* ::Section:: *)
(*Default spacing, half width, and creator*)
(* ::Subsection::Closed:: *)
(*$OpenVDBSpacing*)
(* ::Text:: *)
(*OpenVDB uses default spacing of 1.0. We leave $OpenVDBSpacing initially unset to prevent confusion.*)
$OpenVDBSpacing /: SetDelayed[$OpenVDBSpacing, expr_] :=
(
OwnValues[$OpenVDBSpacing] = {HoldPattern[$OpenVDBSpacing] :> With[{w = expr}, w /; Positive[w]]};
)
$OpenVDBSpacing /: Set[$OpenVDBSpacing, w_?Positive] :=
(
OwnValues[$OpenVDBSpacing] = {HoldPattern[$OpenVDBSpacing] :> w};
w
)
$OpenVDBSpacing /: Set[$OpenVDBSpacing, _] :=
(
Message[$OpenVDBSpacing::setpos];
$Failed
)
$OpenVDBSpacing::setpos = "$OpenVDBSpacing must be set to a positive number.";
(* ::Subsection::Closed:: *)
(*$OpenVDBHalfWidth*)
$OpenVDBHalfWidth /: SetDelayed[$OpenVDBHalfWidth, expr_] :=
(
OwnValues[$OpenVDBHalfWidth] = {HoldPattern[$OpenVDBHalfWidth] :> With[{w = expr}, w /; w >= 1.05]};
)
$OpenVDBHalfWidth /: Set[$OpenVDBHalfWidth, w_ /; w > 0] :=
(
OwnValues[$OpenVDBHalfWidth] = {HoldPattern[$OpenVDBHalfWidth] :> w};
w
)
$OpenVDBHalfWidth /: Set[$OpenVDBHalfWidth, e_] :=
(
Message[$OpenVDBHalfWidth::setpos];
$Failed
);
$OpenVDBHalfWidth::setpos = "$OpenVDBHalfWidth must be set to a positive number.";
(* ::Text:: *)
(*OpenVDB typically uses 3.0 by default.*)
If[!ValueQ[$OpenVDBHalfWidth],
$OpenVDBHalfWidth = 3.0
];
(* ::Subsection::Closed:: *)
(*$OpenVDBCreator*)
$OpenVDBCreator /: SetDelayed[$OpenVDBCreator, expr_] :=
(
OwnValues[$OpenVDBCreator] = {HoldPattern[$OpenVDBCreator] :> With[{c = expr}, c /; StringQ[c] || c === None]};
)
$OpenVDBCreator /: Set[$OpenVDBCreator, c_ /; StringQ[c] || c === None] :=
(
OwnValues[$OpenVDBCreator] = {HoldPattern[$OpenVDBCreator] :> c};
c
)
$OpenVDBCreator /: Set[$OpenVDBCreator, _] :=
(
Message[$OpenVDBCreator::badset];
$Failed
);
$OpenVDBCreator::badset = "$OpenVDBCreator must be set to a string or None.";
If[!ValueQ[$OpenVDBCreator],
$OpenVDBCreator = None
];
(* ::Subsection::Closed:: *)
(*OpenVDBDefaultSpace*)
OpenVDBDefaultSpace[_] = Missing["NotApplicable"];
OpenVDBDefaultSpace[___] = $Failed;
SyntaxInformation[OpenVDBDefaultSpace] = {"ArgumentsPattern" -> {_}};
(* ::Section:: *)
(*Icons*)
(* ::Subsection::Closed:: *)
(*Level Set*)
$lvlseticon = With[{
pts1 = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}},
pts2 = {{-1, 0}, {-0.5, -0.5}, {0, -1}, {0.5, -0.5}, {1, 0}, {0.5, 0.5}, {0, 1}, {-0.5, 0.5}},
tfs = TranslationTransform /@ {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}
},
Graphics[
{
AbsoluteThickness[0.5],
{Darker[Green], BSplineCurve[#[.5pts1], SplineDegree -> 3, SplineClosed -> True]& /@ tfs},
{Darker[Blend[{Red, Green}, 5./6]], BSplineCurve[#[.65pts1], SplineDegree -> 2, SplineClosed -> True]& /@ tfs},
{Blend[{GrayLevel[0.2], Darker[Blend[{Red, Green}, 4./6]]}, 0.75], BSplineCurve[#[.82pts2], SplineDegree -> 3, SplineClosed -> True]& /@ tfs},
{GrayLevel[0.2], BSplineCurve[pts1, SplineDegree -> 1, SplineClosed -> True]},
{Blend[{GrayLevel[0.2], Darker[Blend[{Red, Green}, 2./6]]}, 0.75], BSplineCurve[.82pts2, SplineDegree -> 3, SplineClosed -> True]},
{Darker[Blend[{Red, Green}, 1./6]], BSplineCurve[.65pts1, SplineDegree -> 2, SplineClosed -> True]},
{Darker[Red], BSplineCurve[.5pts1, SplineDegree -> 3, SplineClosed -> True]}
},
ImageSize -> Dynamic[{Automatic, 3.5Divide[CurrentValue["FontCapHeight"], AbsoluteCurrentValue[Magnification]]}],
PlotRange -> {{-1, 1}, {-1, 1}}
]
];
(* ::Subsection::Closed:: *)
(*Fog Volume*)
$fogvolicon = Graphics[Raster[CompressedData["
1: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
"], {{0, 0}, {80., 80.}}, {0, 255}, ColorFunction -> GrayLevel],
ImageSize -> Dynamic[{Automatic, 3.5 Divide[CurrentValue["FontCapHeight"], AbsoluteCurrentValue[Magnification]]}],
PlotRange -> {{0, 80.}, {0, 80.}}
];
(* ::Subsection::Closed:: *)
(*Scalar*)
(* ::Input:: *)
(*ArrayPlot[Table[Sin[j^2+i],{i,Pi,0,-Pi/7},{j,0,Pi,Pi/7}],Mesh->All,MeshStyle->Directive[AbsoluteThickness[0.1],GrayLevel[0.2]],ColorFunction->"WL12DefaultVectorGradient",Frame->False]*)
$scalargridicon = Show[
Uncompress["1:eJzdlXlQU1cUh4OggwgUKFRxq1ZlnHEphCUZtB7sYCU0RNlqoyMQ9EVjYgQeEURAplbKWNwtVMU0ghAWDQhuFAUmEoSiDCGshdIQINAEEUYWl1GaAM2rhDdmpv/1zrw795573nfPO/d33l0eesiPaUIgEFBTTbc1ghG2n7UHZc7SWrRmKguNZBprZ3M0nR8DjUQiEO3cdOrRjukd3/y0bZEKhCHum0RFMqAmhM+PdmiBl+F5TPf8Z3A0ln1vNbUF0oXVlvzWGiBMtEGQVTh+FDLaNTX/pw3CleI7J8mpvTr7MQm/rfl0H8yvIxb4KaVwa2GMvKamDdjD/K+jUsoBOV/KCws6ClvNbubYuip1fOFjV8GOIz06zrlZ4/7UA52QxAgZsGdJ4NezQRaU4i6df1kWs2ZjV4dePD8QGCRLZ4WevTV94yMBtVfPbvPwkgu9sFtnb3IeSyy3lEPC/PQn2cFiiG5stL63oBuWl4lPmH3XDDaPFCvPxBTBIlJtgPvSHl08JYkijnkTxvdaWB1MjWiAp+IlY9doN8C/cxUj/gDm/7z/Tv3n7d168ZAl6v1vw5V69uBab5Vbp378QnGp2GQnlofUN+Ux8hwp8La3vnA/mAF9ZY7xu4U9EPnUYnVmvwIE+/pFHoNV0GXVTDvvheVzsXpN09a9GH9UlO2VTr0Fh5jXjFvuhgL9bBWnxB87rxHaAXNCln48g7uWJ5kQ+kBNf1lmpjTT+VMKj8WTsrDzZcT9aNpS+RdwfOqpuTQZLDsR8cmS4ZZpPAIhC03khjKV8OSCUVByrxpuuvIrLw41QhYlZstiVKbjbxjnrBWvx/J57mkGtz0pHwierfyHsSHQTv6zoiHww/Ff3l6k/rZEP//JmdaXiBK5zl4Q9noTxaYTPIRc6xFBBVjPcbcel3aBwCHDsyO8FCQvL37/u3cU+DwW3U3egO27xqsMWfGHXI+vro16Q8pv19l7n/E3ujg2wM3j3cvYaB6EiVWZsWEf1o+kMnldfjmmf7+QePukKjXUnWLaPqhuhNPG7ZlJ1TKIu5oWLy6VwS8NryrsxnNg0Kd3V1pMDwQzZ1XZDDVBt116eDavEOqe7HSatw7bN8wijmZ1GztHW9EO4pmKPtifkbBJ/lk9WDUkBrT6toEgVV7SQemEZYyVUYs+lcC5eQP3uWL8+rULZDNeoANwTzXQ9CW9FcpIHpXOIxLop6l2quoUsMdR6OAgqoIrqHBH1/YucFpvO/zKKBfsv7Cr4zfSIfi52fBmuhKacsjH3l1XwNKgn9c2b6mCbb9J6W93Y/sOCdLC93b/q05JH6M17nJYEZA+uqFcDDc8L6YMmXcDbXG4r4+pChSEPGNZmgxWZlxYZx/YAnj/T0XBrmLhUiVUmTPN1xfUQh35TR4vTg5rBWnsF5RmOFvCrVllVwTeN5Ts8RU9ED12BYmWFkHmiK/po2om3N4s7RndpoTY5FyGS6oaXlt4exSebIT7Y2kpn/o26OJ/F/g4W+qJxX+qbbbHA5N6WJ2Q5W57/DqkBC+4aiXAzmt2rlcgrwLL87Tr4r0ZxUgzcJzsZ1ghT/bvr7C0UJaRPtl45n38eBwENdcMNnMjWQwOi4GyuPvQ2RrDVwwOikw6ztV0nqwIZE8k6zDC1MJRa+0roeghDi8SCdDce2wugqIRly9pWzFM+mhf01yLR6jIYYQztVY9tTYZCRdhzsX/ftxskA3NBi6BhEsgGUhwwyW4GUhwxSW4GkhwwSW4GEhwxiU4G0gg4hKIBhKccAlO/7k6HP9Xup/pO2esiBn8nHAJTgYSiLgEooEEZ1yCs4EEF1yCi4EEV1yCq4EEN1yCm4EEEi6BZCCBjEvQ+w9OKH1C2BGMg8h0ies8LCdEy9qrFSfqH3mEg2BixmpAVxaYvgkTTQ5TQm+FaWCtN+UgYx/iz4pBWEs0s78BmhqH9A=="],
ImageSize -> Dynamic[{Automatic, 3.51 Divide[CurrentValue["FontCapHeight"], AbsoluteCurrentValue[Magnification]]}]
];
(* ::Subsection::Closed:: *)
(*Integer*)
(* ::Input:: *)
(*ArrayPlot[Round[2Rescale[Table[Sin[j^2+i],{i,Pi,0,-Pi/7},{j,0,Pi,Pi/7}]],1],Mesh->All,MeshStyle->Directive[AbsoluteThickness[0.1],GrayLevel[0.2]],ColorRules->{0->ColorData[112,2],1->ColorData[112,1],2->ColorData[112,3]},Frame->False]*)
$intgridicon = Show[
Uncompress["1:eJztlc1Kw0AQx+MnrYjgI+itt+a7t0WQFqEgVC9ehLRu6mKskk0rPXkQ74IXW/AVvIsHhV7sE9jeBE+9+QjuJqHFNoMbSBDEhQyb2dlfZpf/ZDaqZxV7QZIkmmGm5Frnx6RG7XnuWWSmTKgXrC8zU7Goh13M3zPhw+dX17faZXmELp4Ou5svfSSFA/IH4xONSr0cpR8/+iFOr3jw3Ll7RdX6yv3bYIB2H3I3w+EIxeUklSfkh/KMm3/c+LTvOe69/eefbP5pc5Lip12nSfnT1knaef5W/lPt4tvbzhyb5AMbsVIILLhHjmpFs1+qNB1MV9lkq+ERyyEWJY06XWKOouVQHARmmdkmLq55pIVtTqfrfEuVnjlND++zznfSwJS63Q4fjyiI4dtYY2yXcQs74Vo/XAsyaWA7C98AeLaoU0feB0gwQYIpSDBAgiFI0EGCLkjQQIImSFBBgipIUECCIkiQQcK0huPXR/5P6T7qnJEVEREngwRZkKCABEWQoIIEVZCggQRNkKCDBF2QYIAEQ5BgggRTkFAACTP/QV/pvrBd6xRPS3wcseaLlhxxcdI9r+3giZgnNTAui4m+JX+8o1DoQ/QFB7hP1Q=="],
ImageSize -> Dynamic[{Automatic, 3.51 Divide[CurrentValue["FontCapHeight"], AbsoluteCurrentValue[Magnification]]}]
];
(* ::Subsection::Closed:: *)
(*Vector*)
(* ::Input:: *)
(*VectorPlot[{-1-x^2+y,1+x-y^2},{x,-3,3},{y,-3,3},Frame->False,VectorPoints->4,VectorSizes->4{1,1},VectorStyle->{Arrowheads[0.22],Thickness[.03]}]*)
$vecgridicon = Graphics[
{Arrowheads[0.2], Thickness[0.03],
Uncompress["1:eJyV1XswXGcUAPBdj3omgla8aohWyEx34hGkIt9ukCYaGUFElDQ23lGSQzCtDBLZ6EwSKqp02kbbtBVDjEdEE9wNIR6LehVZFNtYQ8MKZcNa/XZGOpObP677z537zbn3u78559zzWXDjfML1GAxGvAq+HImKTwhXem2lrFipK1acA25xMXEA/oOdnvaW0wi8L8tawrIaEIiqOKPa6dMonKl4WBVfOABxSaSdXlvBOT8zuROSEvA2R2oXWy0nSPGWfgkjdEyND4k+6m7pjpp8Spcpenpxol2EoNY5YBpsxhE4KwvXHQkRLZe5QcGX1+VtBAynWB2f3i4ju/aNCI6yChcJyHGYt228okXtGjdOElrvxxzrqyvCIfkYgvmsjKaquj9ouVoME8JmXZYQTE2xj9l7rJFdafH1RUacWgTX5KJKs7lN5Mu4OjWwLGkSwc9fJK5+rvIUga6xjt5cwhQtF29qvrsjWoMNMs/vlVJbmaTvwiLLNCh0178IVKzFJ/e2qFG7AsRGQ/yTwwjYYx0ud9txvixKS5MiWU0EHZek16raxUZEwIcp25WzK2fI+VL5OFGvfI8yHzevNFByf5WgdJ29wcNF70GQWWbwqOo+di2xnI36jP+m5UoJ5ifkFc0iaPVaJALsJWTXRpwAp/ezv/v01EtqV8ux043C67h8U+sL3Ipa7KoWLOpo5/fQcu0eNLM1HFNmQ6a1qkCrYJnsYt/KcLmVijdP9kzNLpHOU7vyDD7RzcvFb/zVIdzRsYBv6h+NzeeXNtHqr9yfZsO4fvh/+3Nhv77RUCsixavvqnd09mvwX8WpXenF7jEB/p0IIvRHYsNrsOvHU8llgodiWvnSjo/iJoTiXTqTi0PU9z4m54vL8rp2Q7BKvIojSldDp8Axn4n7y8KmLYKv6C+/21ea6k/Q6y9WX60VowjPifNO5UU1o2Kyy7zOLnct9d7/cWrXr/ooq1FtAsFxoa1YpoUHWe9SX6VSwwCtOqpr5mXKtfGcmLMbKWS6jpJdkpneWaVJPCc24tSurSs6yILVhyCmuMuBo8jXu3tqQirrx2nla8huRSe4cpqAtH2T0cNBDDYp7hnPrLX2ZfKBsRi3Zb1snNo1PiCZ4Fi1IChRTrtg8jt2qVrz3DxiZ2i56pDj7FtXhwgA5wOziQ+YZNdGHME5/PFd8YPUrraczJnD73UjSJfHyl4o8nXGp83E/vQzWq72ZCco4OI50eMo8z3o/pz8P/aa7nD69gLulm9O8Oy+nlvZRH+5HvIvzHyG4E71kmrdwVEEsmZJec6cmFZ/TZ0xyTh8e40A6XTXEwdzbXK+tI++cBV+oMqHbduibNREm3A1q7SaD0TgducdMt/5FRPf6MbcjH7HtoeWK1JkVSFSf05A11lf78CyN1z5pkNepssTBHC3cg1rH7+kdnEjY90b8/H5eL5kuPlhB67jPe9fCtdkDbTqqHHzQUHOpXHFaQYhR354w7Uc4xH+2UV8Tkl4lksDk5twXQ6+tLCzX4hgS13CR0FPsKv7zj+7he2ttFzhhZZKdYVqbMhInagITdYkuxyImtUr9VIE0kk339/s5Og/Yy52Jw=="]},
ImageSize -> Dynamic[{Automatic, 3.5 Divide[CurrentValue["FontCapHeight"], AbsoluteCurrentValue[Magnification]]}],
PlotRange->{{-3,3},{-3,3}},
PlotRangePadding->Scaled[.05]
];
(* ::Subsection::Closed:: *)
(*Boolean*)
(* ::Input:: *)
(*SeedRandom[610];*)
(*ArrayPlot[UnitStep[RandomReal[{0,1},{8,8}]-0.5],Mesh->All,MeshStyle->Directive[AbsoluteThickness[0.1],GrayLevel[0.2]],ColorRules->{0->Lighter[ColorData[112,4],0.25],1->Lighter[ColorData[112,1],0.25]},Frame->False]*)
$boolgridicon = Show[
Uncompress["1:eJxTTMoPSmNmYGAo5gAS7kWJBRmZycVpTCARFiDhk1lcApFnAxJBicUlqUWpID4HFIPYSkvy0uN/vrL3aXv8k2fFTXsGMLhgj0scRksdnrPA1++ZvVZ/Xour61WS1ZNqDq3FSXUnrf1Fa/cMFX8NVLoabOFDLfVDJb0NlfJksIUPqeJo1QUKz5MRyDCAkFhkLCAkTj2G2KoiTJuCSnNSi3mADMe8kszEnMzE4sy89GJWoIBbYk5xKkQhJ5BwySxKTS7JLEtNA5leLAjSklScn1NakhoCrPmy81KLi4tmzQSBnfYQNSBtwIqx0ie1LDUHKncSKgdxSV5qGifuEMDpN2y+xhoeOE0wx2mCOZEmmOE0wYxIE0xxmmBKpAkmOE0wIdIEY5wmGBNpghFOE4yINMEQpwnoaZj0/GEwrNI9Nn9izRFY1BniNMGQSBOMcJpgRKQJxjhNMCbSBBOcJpgQaYIpThNMiTTBDKcJZkSaYI7TBHMiTbDAaQJGOQhO6eCEXZSYm4qexOEq+MCJNjMFlDiLg0sqc1IRiRmRB+DZApG+GcDggT00od+0BwB5P3G0"],
ImageSize -> Dynamic[{Automatic, 3.51 Divide[CurrentValue["FontCapHeight"], AbsoluteCurrentValue[Magnification]]}]
];
(* ::Subsection::Closed:: *)
(*Mask*)
(* ::Input:: *)
(*SeedRandom[610];*)
(*ArrayPlot[UnitStep[RandomReal[{0,1},{8,8}]-0.5],Mesh->All,MeshStyle->Directive[AbsoluteThickness[0.1],GrayLevel[0.2]],ColorRules->{0->Black,1->None},Frame->False]*)
$maskgridicon = Show[
Uncompress["1:eJzdlm1Kw0AQhuMnLYjgEbxB891/QRBF6K/aC6R1oosxlUxa6FH0Jh7BI/jPI3gEd7OhwXYHp0hI7UImH+/Mk93Nu2HPx9NhcmBZFnZkuM7j5wcxwWRfPTmUYSCw0PqxDMMYC8hB3XeqQyXp9hWZz1ydalTdpvV/5bet/9b/pvX/3v+m9bbnp21+299/2/8/2z5/Tevb7s9d/z7NjX9lu/Dj7mZPXvR0NCh9Hcka27QVWX/TcJYCnsiLi6wQcSpiFNk9HskHV3GKoBO7MlyKHCaFmEOi6HimSsY4TWcFjOTO5zEDxPz1RbW3SOeoMrkxWgxgDmmlvVea7kkGSZeeAXJsplEb54MkhCQhZBICkhAwCT5J8JkEjyR4TIJLElwmwSEJDpNgk4RVD2++Pno75XvTOI0rwpBnkwSbSXBIgsMkuCTBZRI8kuAxCT5J8JmEgCQETEJIEkImoU8S1v6DpdNLY+fxE6xafJlxWppW3Clz4m2xSKE2c70Glsui9rdVts+oMvpH9A2oYMqv"],
ImageSize -> Dynamic[{Automatic, 3.51 Divide[CurrentValue["FontCapHeight"], AbsoluteCurrentValue[Magnification]]}]
];