About a month ago, we looked at the recent announcement of a brand new operator family called Point Operators (POPs for short), which will be coming to TouchDesigner later this year. We’ve since had a chance to learn a bit more about the new operator family firsthand, and suffice to say there’s a lot of new functionality, techniques, and information to unpack! In this post, we’ll take a deeper look at POPs, covering some basic questions you might have about TouchDesigner’s new operator family.
Disclaimer: before we get started, one thing to note is that POPs are still in the alpha stage, and so this information may change by the time they are added to the stable release!
What are Point Operators?
POPs (Point Operators) are a new family of GPU-based operators in TouchDesigner that are used to create and/or modify 3D data. The 3D data that POPs contain can be rendered by the Render TOP, or passed to external devices like LED arrays and lasers. A POP is made of a points list, a vertex list, and a primitive list.
Points are the building blocks of polygons, lines, line strips, spline curves, point clouds, particle systems, any 3D geometrical shape and any form of data points. In TouchDesigner, POPs can be used to create all of the above!
Every POP contains a set of points with a set of Attributes. The table below includes a few examples of commonly used attributes.
Attribute Name | Number of Components |
Position (P) | 3 (XYZ position of point) |
Normal (N) | 3 (XYZ direction vector) |
Color (Color) | 4 (RGBA color values) |
However, attributes don’t stop there! Custom attributes can be defined by the user, and certain POPs will automatically generate additional attributes.
To make this data easier to visualize, a new popViewer component has been added. In the image above, the popViewer showcases a Sphere POP which contains the three attributes from the previous table. Each point position is defined by a white dot, the color assigned to that point by a larger colorful circle around the white dot, and finally the point’s normal vector is shown by a red arrow.
What kinds of POPs will be available in TouchDesigner?
As with other TouchDesigner operator families, POPs include “generator” operators that create new shapes or import them from files or other systems, and “filter” operators that modify data coming from other POPs. In the OP Create dialog image above, the “generators” have a slightly darker colored background, while the “filters” have a lighter colored background.
As we surmised in the last article, there are some familiar operators to be found. This includes similar functionality to previously available SOPs, but also features some adaptations from the TOP and CHOP families. In the spirit of node-based programming, the POP family provides a lot of operators for doing complex math without having to resort to code. POPs like Transform, Math, and Normalize eliminate a lot of need for coding.
Can POPs be rendered?
Yes! Like SOPs, POPs can be used in conjunction with a Geometry COMP and be rendered via the Render TOP. Similarly, MATs can be used to apply materials to the Geometry COMP. POPs and SOPs can be rendered in the same Render TOP. In the example below, a Sphere POP is being rendered.
Can POPs be used for Geometry Instancing?
Yes! Geometry Instancing can be done in the same way as SOPs/CHOPs/DATs. POP attributes can be used on the instancing pages of the Geometry COMP. In the example below, a Grid POP’s Point attribute is used to create instances of the Sphere POP seen in the previous example.
How do POPs compare to SOPs?
From Derivative themselves: “POPs are a replacement and re-think of TouchDesigner’s historically first operator family, SOPs, with many new features and advantages. Like SOPs, POPs are a procedural family of operators that create and affect points, and primitives like triangles, quads and lines. POPs implement point clouds and particles, and [allow for the importing of] FBX, obj and Alembic files.“
That said, POPs are not a direct re-implementation of the SOP family of operators. New operators have been added for various tasks. For example, the Normal POP can be used to create surface normals and tangents, whereas this was accomplished in SOPs via the Attribute Create SOP. POPs can be seen as providing a more modern workflow than SOPs, taking the best of SOPs, CHOPs, and TOPs.
One of the many advantages that POPs have over SOPs is that they run on the GPU as highly-parallelized compute shaders. SOPs are CPU-based, and thus are limited in what sorts of manipulations and processes can be utilized in real-time (or to put it another way, without a major performance hit). Because they utilize the GPU, POPs offer TouchDesigner developers a major performance increase over SOPs, creating opportunities for very complex effects and data manipulation in real-time.
POPs are also optimized to use less memory. They will only create attributes that are being modified or created anew. If an attribute such as position is not being modified, it will use position from the previous POP in the network.
Working with point clouds in TouchDesigner is not something you can do with SOPs and was previously accomplished via a series of point cloud-related TOPs. All point cloud-related TOPs have been implemented in POPs (along with some new additions as well), and are no longer limited to 4 channels of data.
As we looked at above, POPs, like SOPs, can be rendered via the Render TOP and be used for Geometry Instancing.
For now, POPs are unable to do meshes (grids where rows/columns are defined), tracing, full extrudes on any linestrip, booleans, or triangulation of closed linestrips. However, these features are in the works.
What’s the deal with the primitive list and vertex list?
As mentioned earlier, a POP is made of a points list, a vertex list, and a primitive list. A point list seems obvious enough, but what about the other two? Let’s take a look at an example.
In the image below, we’ve got a Grid POP that’s been set up to create a simple square. In the Grid POP’s viewer, we can see the wireframe of the square, which shows that the geometry is created using two triangle primitives. The three POP To DATs at the bottom of the image showcase the point list, vertex list, and primitive list of the Grid POP. The point list contains all of the points that make up the final geometry, one for each corner of the shape. Next to the index value, we can see columns for the XYZ position of each point, as well as Normals and Texture Coordinates.
The central popto_vertices DAT contains the vertices list. Here, we can get a picture of the vertices that each primitive contains. Each vertex corresponds to a point in the point list, which is referenced by index number. For example, the fifth row of popto_vertices tells us that the second point of the second primitive (the prim:vindex value is 1:1) corresponds to a point_index value of 3 in the point list. Looking at the popto_points DAT, this corresponds to the last row of the table, the point (0.5, 0.5).
Finally, in popto_primitives, we have a list of the primitives. From this list, we can find out the primitive type and the corresponding vertices. The numbers listed in the vertices column are index numbers, which correspond to the points list. You’ll notice that these numbers are the same as what is seen in the point_index column of the vertices list: for the first primitive in the primitives list, the vertices column reads 0 1 3, which matches the point_index values of the first three rows of the vertices list (0, 1 and 3). These index values correspond to points 0, 1 and 3 in the points list.
Get Our 7 Core TouchDesigner Templates, FREE
We’re making our 7 core project file templates available – for free.
These templates shed light into the most useful and sometimes obtuse features of TouchDesigner.
They’re designed to be immediately applicable for the complete TouchDesigner beginner, while also providing inspiration for the advanced user.
What primitive types are available?
The Primitive types in POPs are:
- Point primitive – has one index into the point list
- Line primitive – a set of two points in the point list
- Line Strip primitive – a set of any number of points in the point list
- Triangle primitive – a set of three points
- Quad primitive – a set of four points
Line strips can be open or closed. If closed, their last vertex points to the same point as the first vertex.
It is possible to have a set of points without primitives. If the POP is to be used for instancing, for example, only the point list is taken into consideration. The example below shows a Create POP which is generating a single point without primitives.
However, if you’re looking to render the points with a Render TOP, you’ll need to have some kind of primitive attached, even if it is just a Point Primitive.
Wrap-Up
As mentioned in the intro, there’s a lot to POPs — far more than can be covered in a single post! We hope that this post answers some of your initial questions about the POPs family of operators in TouchDesigner. Stay tuned, more to come!