Houdini Vex

attributes vs variables
    f@name  // Attribute, assigned to geo
    float name  // Variable, within wrangle only
declaring data types
    // Float
    f@name  or  float name
    // Integer
    i@name  or  int name
    // String
    s@name  or  string name
    // Vector
    v@name  or  vector name
    // Array (List)
    string name[], float name[], etc.
some built-in attributes
    @ptnum  // Point id
    @numpt  // Total number of points
    @primnum  // Primitive id
    @numprim  // Total number of primitives
    @Time  // Current time, in seconds
    @Frame  // Current frame
    // With sub-components
    @Cd (@Cd.r, @Cd.g, @Cd.b)  // Color
    @P (@P.x, @P.y, @P.z)  // Position
    @N (@N.x, @N.y, @N.z)  // Normal

sub-components can use rgb, xyz, or [0][1][2]

working with strings
    // Convert from float to string
    string name = sprintf("%f", float);
    // Combine strings
    string name = concat("string", "string");
    // Result: stringstring
    // Split a string
    string parts[] = split("string_01", "_");
    // Result: ["string", "01"]

channel references on wrangles
    ch('channel_name')  // Float channel
    chi('channel_name')  // Integer channel
    chv ('channel_name')  // Vector channel
    chs ('channel_name')  // String channel
    chramp ('channel_name', attr)  // Ramp channel (in 0-1 range)

click the plug button to the right to automatically create non-existing channels

some functions
    fit(attr, oldmin, oldmax, newmin, newmax)
    // Takes a number between 2 values and fits it between 2 new values
    rand()  // Generates a random number between 0 and 1
    sin(), cos()  // Sine and Cosine, in radians
    radians(degrees)  // Converts a number from degrees to radians
    length(vector)  // Measures the length of a vector
    distance(pt1, pt2)  // Measures the distance between two points
    len(list)  // Counts the number of items in a list

normalize point number
invert (must be in 0-1 range)
    f@result = 1 - @attribute;
measure the distance between a point and the origin
    float dist = length(@P);

general syntax
    // Each line must end with ;
    // If statements
    if (test == value) {
        code to execute;
        code to execute;

Some useful HScript

point attribute reference
    point("path/to/node", point_num, "attribute", attribute_index)
    // For example:
    point("../transform", 1, "P", 0)  // Reads @P.x for point 1
primitive attribute reference
    prim("/path/to/node", prim_num, "attribute", attribute_index)