Please Note: I regularly check the Esri official product pages to see when new releases are coming. Today I saw that the Esri CityEngine product pages had been updated to announce Esri CityEngine 2019.0, I’m not announcing anything they haven’t released already onto the web in public. (I’m saying this upfront as I am on the Early Adopter programme for CityEngine and am naturally bound by their conditions)
Update: Esri has released an official blog post about it (but you heard it here first)
The day has come where I eagerly download the latest CityEngine release (I get it a little early as Garsdale Design is a business partner) and maybe seen skipping around the office (okay it’s Sunday and I’m at home ignoring my kids writing this… gulp)… bye bye beta and hello official release and the ability for me to talk about it!
You can also read the official release notes page here.
Often you’ll know it’s about be released as the CityEngine official webpages start to have information about it like this:

Big news is probably the licensing options (no basic only Advanced and now named user!), but as said in previous posts new updates to drawing tools and export options are here to. It looks like they’re refreshed the system requirements too here. As always I recommended you read my blog post on recommended system requirements based on my experience here (this will be updated to reflect any new information).
Let me first say that this release looks like a big one, lots of nice bugfixes and improvements. But also significant new rule functions/operations and integration with ArcGIS Urban and Unreal Studio. DID I ALSO MENTION glTF SUPPORT (import and export)?

So basically Esri CityEngine is a bloody good ‘swiss army knife’ for 3D.
I want to thank all those involved with development this release in Zurich and Redlands you’ve done an amazing job I think. Here’s a cake:

On first look there’s new CityEngine Help which is totally online and is a dramatic change to previous versions some refreshed example imagery too which is good. I seriously hope this doesn’t hinder people who are relatively new to the program. Another added layer of complication to an already steep learning curve will just make me sigh… the menu headings don’t help here (Help–> Offline Help and Manual (2018.1 only) or Help–> CityEngine Help (the real 2019.0 help) )
A new way to manage the Esri.Lib
As most users of CityEngine know there’s a library of pre-worked rule files and assets Esri has included as part of each workspace you create. A new tool to download and manage updates to this dataset has been included. I note we have some new webstyle assets that are GLB format (so a binary version of glTF…).

Change Log
A good place to start is the changelog (available today 12/05/2019) for long time users like myself, what did they fix and what did they add? Okay let’s start with new stuff in CGA. Yes I’ve copied much of this from their official documentation, so I can annotate it for myself (and you)* remember this blog is a mixture of articles for you the reader, and me the forgetful! I encourage you to click through and scroll to the examples to get an understanding of what each does.
*I’ll be updating the annotations below as I start using it properly, initial impressions first 🙂
New Operations listed are:
- rectify operation –> useful I think to straighten up poor underlying geometry
- resetGeometry operation –> good for recursive stacking of underlying shape
- setbackPerEdge operation –> Yes this will be good
- setbackToArea operation –> Now this solves a few problems where I’ve had to use recursion to get to a desired area, overnight I don’t have to do this any more thank you.
New functions are:
- readTextFile function –> Now this will be fun! Being able to read from a CSV from a rule file has been one those things I wished for.
- geometry.boundaryLength function
- splitString function –> Makes sense considering the readTextFile function (think split by delimiter!).
- comp function
- Array util functions: index, item, and size
- Edge attribute functions: edgeAttr.getFloat, edgeAttr.getString, edgeAttr.getBool –> I suspect some of these features are to help us with the new ArcGIS Urban 🙂
For those who like their materials we have some new attributes too!
- matterial attributes:
- material.emissive.{r|g|b}, material.metallic, material.roughness
- material.{emissive|occlusion|roughness|metallic}map and corresponding .{su|sv|tu|tv|rw}
- material.opacitymap.mode
Fixes of the bugs
- convexify operation: Fixed incorrect results on shapes with holes.
- softenNormals, setNormals(auto) operations: Compute correct soft normals for vertices bordering a hole. This bug only appeared when the threshold angle was set to a value less than 180 degrees.
- comp(v), comp(e) operations: Compute correct orientation of the scope z axis for vertex/edge components bordering a hole.
- comp(v), comp(e), alignScopeToGeometry operations: Fixed resulting scopes when applied on edges or vertices.
- roofHip, roofGable operations: Corrected the resulting order and first edge of roof faces if the initial shape contained collinear vertices.
- roofGable operation:
- Fixed a crash in subsequent operations or functions if the initial shape contained near-identical vertices.
- Corrected trim plane generation if the initial shape contained several faces.
- cleanupGeometry operation: Fixed a crash in vertex merge. This happened when hole vertices were within tolerance to vertices that belonged to both another hole and an encircling face.
- Internal geometry cleanup (CityEngine only): Preserve first edge of holes.
- Fixed a bug where normal and bump maps were applied in the inverse normal direction (CityEngine rendering only).
- setback operation: Enhanced result at concave vertices.
- CGA Compiler:
- comp , setback operations: Index selectors passed with a float function name “idx” were always evaluated to 0.
- innerRectangle, shapeL, shapeU, shapeO operation: Do not accept float function names as selector.
- comp ,split ,setback, innerRectangle , scatter , shapeL ,shapeU ,shapeO operations: Fixed a bug where a wrong follow-up rule was used (in case of identical rule names except a numerical suffix + very bad luck).