Vaiva Kazanaviciute


About Me

VFX Artist


Paris, France

Houdini Engine

Digital Assets  | Pyro FX  | VEX  | Python
プロシージャルワークフロー  | Solaris  | Mantra  | Karma  | Fluids  | 説明  | PDG
Realtime FX


Not Specified

Recent Forum Posts

What is the data storage method of Houdini Opencl? 2024年6月15日14:50

From [] :
/// Attempt to build a GPU-backed attribute from our geometry.
/// Returns 0 on failure.
/// You do not own the resulting GA_CEAttribute.
GA_CEAttribute* SIM_Geometry::getReadableCEAttribute(GA_AttributeOwner owner, const UT_StringRef &aname, GA_StorageClass storage, int &tuplesize, bool isarray, bool docopy) const { return getReadableCEAttributePrec(owner, aname, storage, GA_PRECISION_32, tuplesize, isarray, docopy); }
virtual GA_CEAttribute* SIM_Geometry::getReadableCEAttributePrec(GA_AttributeOwner owner, const UT_StringRef &aname, GA_StorageClass storage, GA_Precision prec, int &tuplesize, bool isarray, bool docopy) const;

From [] :
cl::Buffer GA_CEAttribute::buffer() const { return myBuffer; }
cl::Buffer GA_CEAttribute::indexBuffer() const { return myIndexBuffer; }

So, I imagine a correct way of obtaining a handle to a GPU buffer would be to obtain GA_CEAttribute ptr from SIM_Geometry
that you get from SIM_Object
that you get from GAS_SubSolver::solveGasSubclass override in your solver class.

And judging by SIM_Geometry public interface, I think it's not going to alloc/build a new buffer for attrib if there already exists one and it wasn't flushed

how to delete specific points in group selections 2024年6月14日11:13

The point wrangle code below will remove lines that are not aligned with Z axis.
Parameter `threshold` determines how much a line can deviate from the axis before it would get deleted.

int other = neighbour(0, @ptnum, 0);
if (other > @ptnum) {

vector pos = point(0, "P", other);

if (abs(dot({0, 0, 1}, normalize(@P - pos))) < 1 - chf("threshold")) {
  removepoint(0, @ptnum);
  removepoint(0, other);

Cache multiple object from DOP network simultaneously 2024年6月14日9:54

Have both of your caches write same frames at the same time.

You can do that either by creating cook dependency between your file nodes (File A node in write mode -> null without copy input -> merge with branch B -> File B node).
File B node depends on File A node being cooked, and File A writes on cook.

Or if you're using ROPs or PDGs, just run them frame-by-frame instead of node-by-node.