Questions for Rhino developers on programming/codebase

My nephew is a fledgling developer in HS and is really curious about pursuing computer science and eventually being a developer in a graphics-related tool. I know you guys are busy but if you ever have the time, I have a list of really scattered questions he’s asked as he’s trying to get a feel for lots of different developer experiences: Unreal engine, CAD programs, etc.

  • What are the most essential skills to have in the being able to work on Rhino’s actual 3D engine / NURBs engine / etc?

  • What mathematic fields are most crucial for it? And are traditional CS curriculums typically enough to provide the level of math expertise needed to work on a product like Rhino?

  • In your personal experiences, what are some of the most complex/challenging subsets of programming behind a tool like Rhino that an “average” student/developer might not be exposed to (like, say, developing a restaurant reservation system)? Where might a person learn more about these topics?

  • Rhino sounds like it’s extremely domain-specific technology. How much of your day-to-day software development is straight-forward business logic implementation for features (like: export file to New Format X, making a new toolbar, making a better color palette manager) versus really specialized (like: creating a better boolean operation)?

  • Does a company like McNeel typically aim to hire generalists who can gradually become more specialized over time, or for real specialists (like 100% graphics programmers) who are naturally capable of handling some traditional software / bread-and-butter feature development from time-to-time?

  • In this day and age, assuming time/money wasn’t a huge factor, would you ever even consider rebuilding core parts of Rhino in something like C or Assembly? Are the speed advantages of this even practical anymore given the state of modern hardware?

  • On the flipside, in terms of scripting / business logic: do you guys have any opinions on languages like Lua? Many game companies seem to write their core engines in C++ and then use Lua for all game scripting / logic / etc citing its easier to write in and just as performant. If you could do it all over again, would you adopt something like Lua (or something else similar to it) for building features on top of a NURBs engine?

  • This is a random one we were talking about the other day. There’s this article criticizing the SVG format: SVG: The Good, the Bad and the Ugly | Eisfunke, with lots of heated debate on it, like SVG: The Good, the Bad and the Ugly | Hacker News. If you compare what SVG ultimately does, it seems like it utterly pales in comparison to the technical power/sophistication of vectors/curves/etc in Rhino. Does McNeel have some proprietary format for storing/expressing/managing curve data? Is it even comparable to SVG format? If SVG is such a complex rabbit hole that trips up the rest of the developer community, how is Rhino effectively doing 100X more complicated things than representing curve data without so much heated debate/controversy/bottlenecking of its own processes?

Any insights of any kind that I could share on literally any of these Qs would be unbelievably appreciated. Thanks!

I would suggest to look into open source graphics tools: Blender (I started with this), FreeCAD, Krita, GIMP, different 3D engines like Godot, Ogre3d. There are more projects that cover a huge part of the graphics and design world.

These are all programs that will most definitely give lots of practice in working with complete and complex projects.

For the NURBS and geometry kernel a strong mathematical understanding of the topics is needed.

Regarding scripting the question is about the eco system available for the specific language.

For Rhino I don’t think the Lua language is very useful compared to Python. If in the future we move to a CPython integration instead of IronPython our users will have access to a very mature and large ecosystem. Lua doesn’t have the same extensiveness. I personally like Lua, but I don’t see it work all that well in Rhino.

Rewriting in C or assembly doesn’t make much sense. The core of Rhino is already in C++. In this day of age it is often better to leave the low-level optimizations to the compiler.

When you develop a program you need to consider also the ease of developing. Add to that the requirement for cross-platform code. It is better to write only once than multiple times.

Anyway, my time in Rhino started with the integration of the Cycles render engine from Blender into Rhino as the Raytraced mode in v6 and now as Rhino Render in v7. Most of the work did not require complex maths.

Edit addendum: I am a self-learned programmer. I studied Finnish language at university, but never completed that. I might in the future.

5 Likes

So, you are almost a god already. :sunglasses:

PS: I don’t want to hijack the thread, so I will only leave this hidden for those who want to see the ultimate definition of Finnish language. :innocent:

Summary

3 Likes

I worked for seven years in Finland and I came to the conclusion that the Finnish language is probably a cryptography protocol in disguise…

// Rolf

6 Likes

I think the first requirement is the ability to visualize 3d objects in your mind’s eye, not just in visual terms but along with the mathematics that describe them. For most people this ability is developed, but I have met people who just can’t do it because that’s not the way their mind works.

As far as the math background goes, the usual STEM path is probably a good foundation. Engineers and physicists pursue an advanced algebra and calculus path and partial differential equations.
Electrical engineers and mechanical engineers interested in dynamics and vibration study Laplace and Fourier transforms.
A background in statistics probably isn’t very important but certainly matrix algebra is. In the same sense that youngsters struggle to master basic math on paper and then with experience can add, subtract, multiply and even divide in their head, a person working in scientific computer programming will have an ability to “see” the vector calculations in their head. I don’t think anyone is born with this ability and those who have it developed it over years; perhaps decades. Starting at HS age when the mind is supple helps a lot. So does actually designing, building and working with the physical objects that people design with CAD. (Cars, boats, planes, houses, furniture, etc, etc.)

One of the things that might not occur to the casual observer is the database aspects of a system like Rhino. Like an airline (or restaurant) reservation system, CAD programs are what’s called “real time”. Back in the day this was a big deal specialty, but now with all the web applications its pretty mainstream. Nevertheless, there’s still a lot of knowledge and techniques for maximizing performance developed over the decades that must be acquired by a fledgling developer. Sometimes I think that CAD systems are developed by model-oriented programmers whose primary focus and experience is drafting and graphic arts. Not saying this is a bad thing, because if the user interface and functionality they design doesn’t cut it nobody will want to use their system. On the other hand, if it does all the things right but at snail’s pace nobody will want to use it either. Or if their lack of database system design experience prevents them from envisioning novel approaches to some feature or other, possibly discouraging them from even trying.

Just a few comments from someone who has been around scientific and engineering programming since the punch-card days.

What do you think, @dalelear

Since you asked, here’s an opinion for what a high school student might consider as they educate themselves. This opinion is worth about as much as you paid for it.

For a person in high school who finds some facet of current technology inspiring, I’d suggest it is important to explore broadly rather than focus narrowly.

As far as laying the underpinnings for solid mathematical skills, I’d suggest making a first pass over the basics of calculus, linear algebra, and statistics. Doing that and emerging with solid skills is a tall order. At the age of 18, I knew none of these things and got my feet wet the first few years of college.

For exploring mathematics, 3Blue1Brown is a good place to start. If the student is inspired by computer science, spend some time learning the foundations of fundamental techniques by poking around in Knuth’s magnum opus “The Art of Computer Programming.”

Hand in hand with learning mathematics, physical and applied science, is to actually make things and do experiments. Thinking, sketching on paper, and cobbling together contraptions builds solid visualization and problem solving skills. I am inspired by people like Advoko, Blondihacks, Clickspring, and twoodrfd.

Learning basic coding skill is easy. Acquiring problem solving skills, developing methods for learning new things well, practicing clear communication, learning to collaborate productively, learning to appreciate beautiful things, and creating beautiful things are much more difficult. In my experience as a student, parent, and teacher, every year of study is basically the Kindergarten syllabus with topics changed.

If a young person is really fascinated with computer programming, strive for elegant, durable, and clear solutions. Try solving the same problem different ways. Then take the best bits from several attempts and see if you can combine them in clever ways. Writing solid, stable, durable code requires lots of rewrites, evaluations, and tests. (I spend as much or more time writing testing code as I spend writing application code.)

8 Likes

Along the lines of 3Blue1Brown, a couple other youtube channels I enjoy are numberphile and computerphile. A bit more on the entertainment side, but good stuff on those.

Thank you all for the input, sincerely. Incredibly appreciated.

If rendering is of interest I can also highly recommend the PBR Book www.pbr-book.org. It not only explains physically based rendering in depth while providing all the source code as one reads, it is also a very, very good example of the literate programming paradigm.

It looks like a link but it doesn’t work. Googling “pbr” brings up Professional Bull Riders, Petroleo Brasileiro and Pabst Blue ribbon. Googling “pbr book” does the trick.

Weird, must be some discourse funkiness. Edited to have the link also outside the markdown.

Follow up question, this time from me!

I recently discovered Figma is written in C++ but uses WebAssembly: https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x, and therefore it runs in the browser perfectly fine.

Given that Rhino is written in C++, couldn’t it simply be “compiled” using WebAssembly to offer an in-browser and cross-platform version of Rhino?

1 Like

It isn’t as simple as that. Rhino has a great many dependencies, and a sizeable chunck of Rhino is also written in C#, .NET.

We do offer a version of OpenNURBS transpiled to WebAssembly though, rhino3dm.js.

The entirety of Rhino is probably too much effort to be feasible if even possible at all - I wouldn’t know how any of our MFC code would compile, which is much of the GUI, or the other part of our GUI that is written in C#.

2 Likes