Welcome to od|forum

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

-HEAVY-

duplicate objects with vex

VEX is relativly nu to me, even when I am familiar with mel and some other programming languages.
So be Patient with me and dont make it to complicated wink.png

At the moment I am creating a brickwall with a few for each Loops and I thought, hey those simple
transformations can even be done in a wrangle.

but all those point creation and create geometry with vex tutorials doesn't take into account when
there is an incoming prim or box that should only be transformed - so i am more confused now.

can somebody give me a short forloop example to move and duplicate a box, when the box is piped into the wrangle?

thx
deHeavy

Share this post


Link to post
Share on other sites

You need to recreate everything from scratch by looping over geometry entities.

// Detail wrangle.

// Compute new position based on copy number and translate parameter.
vector copypos(vector pos; int copynum; vector copyt)
{
    return pos + copyt * copynum;
}

for (int copynum = 1; copynum < 5; copynum++)
{
    // Copy point cloud from input.
    for (int i = 0; i < @numpt; i++)
    {
        addpoint(0, copypos(point(0, "P", i), copynum, {2, 0, 0}));
    }

    // Copy primitives to new points.
    for (int i = 0; i < @numprim; i++)
    {
        int new_prim = addprim(0, "poly");
        foreach (int pt; primpoints(0, i))
        {
            int new_pt = pt + @numpt * copynum;
            addvertex(0, new_prim, new_pt);
        }
    }
}

vex_duplicate.png

It's a waste of time, if you have no good reason to do such thing. Computing transform attributes on copy points with VEX and then copying input geo with Copy node is a more straightforward way.

vex_duplicate.hipnc

Edited by f1480187
1 person likes this

Share this post


Link to post
Share on other sites

thx f1480187 for the effort, but seems a bit overkill to me.
Konstantin over at Sesi-Forum provided me with a much slicker version.
 

vector offset = chv("offset");
int copies = chi("Copies");
int prim_pts[] = primpoints(0, @primnum);

for (int i = 0; i < copies; i++) 
{
    int add_prim = addprim(0, "poly");
    
    foreach(int pt; prim_pts) 
    {
        vector pt_pos = point(0, "P", pt);
        vector offset_Mult = offset * (i + 1);
        int add_pt = addpoint(0, pt_pos + offset_Mult);
        addvertex(0, add_prim, add_pt);
    }
}

but yes i think doing all that create prim, foreach point in prim - create points, create vertex , is maybe a bit much when it comes to bigger scenes.

 

Share this post


Link to post
Share on other sites

The slick snippet copies primitives N times working in Primitive mode. This is faster than copying connected geometry when operating on Detail level: 3.5 vs 4.5 seconds for 500 Pigheads. But if you use Fuse after that, you will wait another 13 seconds. Not a big deal, but you can fuse something that shouldn't be fused, like, neighboring bricks ideally aligned with each other, or disconnected points which wasn't fused intentionally. And Copy and Transform node did whole stuff for 0.5s, 7 to 9 times faster than VEX!

On real task, you may want to copy some attributes on the copies. You will have to keep track of entity numbers, manipulating arrays of integers and managing counter variables. It can be painful and hard to debug. Computing copy transformations will grow quickly too. If you don't generate something (see a good example of such generator asset), I see no reason to duplicate geometry with VEX, it's slower, more difficult, and more limited than using Copy when possible.

Share this post


Link to post
Share on other sites

Yeah, as i said, i got the point. Its a waste of time and resources with not much flexibility. Its better to vex the point and use copys or instances. 

How do you measure all that performance, I dont belive you take a stopclock for that..? 

Share this post


Link to post
Share on other sites

Use Performance Monitor for proper testing. It's a great profiling tool. Press "Record", make something to cook, then stop recording and inspect what was going there. It's very artist-friendly, you can learn it in five minutes.

For quick looks, press MMB on any node and see Last Cook timer. For simple comparisons, I usually Merge nodes and make a non-critical change in common upstream node, like, rename it. So, all Merge's inputs will cook in same time and with similar conditions. For some reason, Houdini shows node' own cook times, which usually a fraction of milliseconds for non-atomic subnets and assets. You need to dive inside. For example, to see actual cook time of Wrangle, dive inside it and MMB on it's Attribute VOP node.

Always make computationally heavy tests. Seconds or even minutes. Comparing milliseconds is prone to temporary anomalies and caching stuff. Also, it's good practice to do several tests with different conditions. Changing load in linear way can affect cook times in non-linear manner.

By the way, sometimes drawing heavy geometry in viewport takes more time than actual cook. Performance Monitor shows viewport statistics too.

Share this post


Link to post
Share on other sites

Greate, thx a lot.  I really have to dive into Performance Monitor.

heavy likes heavy Tests ;) 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now