forked from jekyllt/jasper2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeed.xml
2068 lines (1786 loc) · 150 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.6.2">Jekyll</generator><link href="/https://tools.engineer/feed.xml" rel="self" type="application/atom+xml" /><link href="/https://tools.engineer/" rel="alternate" type="text/html" /><updated>2020-09-30T08:05:52-07:00</updated><id>/https://tools.engineer/</id><title type="html">Victor Stepanov</title><subtitle>Passionate about making game developers more productive</subtitle><entry><title type="html">Notes for ‘What is USD: A Primer’ SIGGRAPH 2019</title><link href="/https://tools.engineer/siggraph2019-what-is-usd-a-primer" rel="alternate" type="text/html" title="Notes for 'What is USD: A Primer' SIGGRAPH 2019" /><published>2020-09-29T18:00:00-07:00</published><updated>2020-09-29T18:00:00-07:00</updated><id>/https://tools.engineer/siggraph2019-what-is-usd-a-primer</id><content type="html" xml:base="/https://tools.engineer/siggraph2019-what-is-usd-a-primer"><p><strong>TLDW Summary</strong>: This talk is an intro to the key concepts and terminology of Universal Scene Description. The presentation shows examples of how USD is integrated into SideFX products.</p>
<h2 id="key-terms">Key Terms</h2>
<div class="keyword-container">
<ul class="keyword-container">
<li>Universal Scene Description</li>
<li>Scene Graph</li>
<li>Layer</li>
<li>Hydra</li>
<li>DCC</li>
</ul>
<style>
.keyword-container > ul
{
font-size: 16px;
list-style-type: none;
padding:15px;
}
.keyword-container > li
{
background-color:#f3f3f3;
display : inline;
padding:5px;
margin:2px;
margin-bottom: 100px;
border-radius: 5px;
}
</style>
</div>
<h2 id="presentation-time-stamps">Presentation Time Stamps</h2>
<p><a href="https://www.youtube.com/watch?v=Yp_TRVD3wjQ" target="_blank">Link</a> to the talk on YouTube.</p>
<ul>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=41" target="_blank">at minute 1</a> What is USD?</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=237" target="_blank">at minute 4</a> “Layer” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=253" target="_blank">at minute 4</a> “Stage” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=285" target="_blank">at minute 4</a> “Composition Arcs” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=339" target="_blank">at minute 5</a> “SubLayers” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=434" target="_blank">at minute 7</a> “Namespace” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=542" target="_blank">at minute 9</a> “Opinions” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=694" target="_blank">at minute 11</a> “Sublayering” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=749" target="_blank">at minute 12</a> “References” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=879" target="_blank">at minute 14</a> “Payload” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=1017" target="_blank">at minute 16</a> “Instancing” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=1105" target="_blank">at minute 18</a> “VariantSet” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=1318" target="_blank">at minute 22</a> “Hydra” term</li>
<li><a href="https://youtu.be/Yp_TRVD3wjQ?t=1429" target="_blank">at minute 23</a> Q&amp;A</li>
</ul>
<h2 id="key-concepts">Key Concepts</h2>
<p><em>the ‘more’ link will take you to the USD glossary</em></p>
<ul>
<li><strong>Layer</strong>: a <em>file</em> on disk (<a href="https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-Layer">find out more</a>)</li>
<li><strong>Stage</strong>: the resulting composition of the <em>layers</em> (<a href="https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-Stage">find out more</a>)</li>
<li><strong>Composition Arcs</strong>: different ways to combine layers into a <em>stage</em> (<a href="https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-CompositionArcs">find out more</a>)</li>
<li><strong>SubLayers</strong>: the way to refer to other layers within a <em>layer</em> (<a href="https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-SubLayers">find out more</a>)</li>
<li><strong>Opinions</strong>: a system for resolving conflicts when combining <em>layers</em> (<a href="https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-Opinions">find out more</a>)</li>
<li><strong>Namespace</strong>: path to the primitives in the <em>scene graph</em> (<a href="https://graphics.pixar.com/usd/docs/USD-Glossary.html#USDGlossary-Namespace">find out more</a>)</li>
</ul>
<h1 id="the-problemschallenges">The Problems/Challenges</h1>
<ul>
<li>Have a single standardized format for describing a 3D scene</li>
<li>The format needs to be open for multiple parties to use and extend</li>
<li>The format should be easy to implement</li>
</ul>
<h1 id="propositions">Propositions</h1>
<ul>
<li>Start learning and using USD in your pipelines to take advantage of the built-in integration into popular DDC tools, commercial rendering engines, and commercial game engines.</li>
<li>You will need a tool to visualize how USD composes the scene graphs to get the final result.</li>
</ul>
<h1 id="arguments">Arguments</h1>
<ul>
<li>Pixar developed USD</li>
<li>USD is becoming an industry standard</li>
<li>USD is open and actively developed</li>
</ul>
<h1 id="key-points">Key Points</h1>
<ul>
<li>USD is for assembling scene and editing 3D data</li>
<li>USD is about enhancing the communication between Digital Content Creation tools</li>
<li>Layer == Scene Graph == USD File</li>
<li>USD can enable non-destructive editing of data from lower layers</li>
<li>The concept of splitting the scene into multiple files allows the artist not to load the whole resulting scene, a.k.a. “Stage”</li>
<li>Compositing USD files (referencing other USD files in a USD file) works like PhotoShop layers</li>
<li>“opinions” are used to resolve scene graph composition conflicts. Layer on top will have a stronger “opinion” then the layer below that</li>
<li>Need a standalone viewer/tool to understand how the scene is created
<ul>
<li>“This can get super confusing.”</li>
<li>“This can get very complicated.”</li>
</ul>
</li>
</ul>
<hr />
<h1 id="notable-parts-of-the-talk">Notable parts of the talk</h1>
<h2 id="enabling-multiple-artist-work">Enabling multiple artist work</h2>
<p><em>timestamp: 2 minutes into the presentation</em></p>
<ul>
<li>It allows multiple artists to work on the same scene
<ul>
<li>Every department can have its own USD file</li>
</ul>
</li>
</ul>
<p><img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_3-51.png" alt="Presentation Timestamp 3:53 USD basic structure" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=233"> YouTube</a>. Presentation Timestamp 3:53.</span></p>
<h2 id="composing-multiple-usd-files">Composing multiple USD files</h2>
<p><em>timestamp: 4 minutes into the presentation</em></p>
<p><img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_4-23.png" alt="Presentation Timestamp 4:23 term stage" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=267"> YouTube</a>. Presentation Timestamp 4:23.</span></p>
<h2 id="sublayering">Sublayering</h2>
<p><em>timestamp: 5 minutes into the presentation</em></p>
<ul>
<li>An empty root layer creates an empty stage</li>
<li>USD composition works by combining scene graphs (USD files/Layers)
<ul>
<li>a.k.a. sublayering</li>
</ul>
</li>
</ul>
<p><img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_5-53.png" alt="Presentation Timestamp 5:53 two USD files" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=353"> YouTube</a>. Presentation Timestamp 5:53.</span></p>
<p><img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_8-00.png" alt="Presentation Timestamp 8:00 two usd files" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=480"> YouTube</a>. Presentation Timestamp 8:00.</span></p>
<ul>
<li><em>opinions</em> are used to resolve conflicts between scene graphs</li>
</ul>
<p><img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_11-25.png" alt="Presentation Timestamp 11:25 composing USD files" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=662"> YouTube</a>. Presentation Timestamp 11:25.</span></p>
<h2 id="references">References</h2>
<p><em>timestamp: 12 minutes into the presentation</em></p>
<ul>
<li>“You reference one primitive from one file into the namespace of an existing primitive of a referencing scene graph”
<ul>
<li>You can make a primitive into a reference to a scene graph in another file</li>
<li>You can define root primitives as default primitives
<ul>
<li>USD will look for default primitives</li>
</ul>
</li>
<li>The idea is not to just graft a scene graph on top of the existing scene graph. The idea is to specify the location wherein the existing scene graph USD inserts the source scene graph.
<img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_14-14.png" alt="Presentation Timestamp 14:14 referencing example" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=854"> YouTube</a>. Presentation Timestamp 14:14.</span></li>
</ul>
</li>
</ul>
<h2 id="payloads">Payloads</h2>
<p><em>timestamp: 14 minutes into the presentation</em></p>
<ul>
<li>Only load what you want
<img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_15-54.png" alt="Presentation Timestamp 15-54 payload example full scene" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=954"> YouTube</a>. Presentation Timestamp 15-54.</span></li>
</ul>
<p><img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_15-57.png" alt="Presentation Timestamp 15-57 payload example full scene" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=957"> YouTube</a>. Presentation Timestamp 15-57.</span></p>
<h2 id="3-ways-to-compose">3 ways to compose</h2>
<ul>
<li>There are 3 principal ways to bring a USD file into a scene graph
<ul>
<li>Layers
<ul>
<li>adding a USD file on top of an existing USD file</li>
</ul>
</li>
<li>Referencing
<ul>
<li>adding a select primitive of another USD file into a specific location in the base USD file</li>
</ul>
</li>
<li>Payload
<ul>
<li>a reference that you can load or not
<ul>
<li>done for memory management and processing time</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="variantset">Variantset</h2>
<p><em>timestamp: 18 minutes into the presentation</em></p>
<ul>
<li>a non-destructive set of alternatives
<ul>
<li>examples:
<ul>
<li>dented models that are dented</li>
<li>models with different textures materials applied</li>
<li>models ageing over time</li>
<li>storing LODs</li>
</ul>
</li>
</ul>
</li>
<li>The alternatives are chosen non-destructively by using the “opinion” layer stack</li>
</ul>
<h2 id="hydra">Hydra</h2>
<p><em>timestamp: 22 minutes into the presentation</em></p>
<p><img src="https://tools.engineer/assets/images/posts/siggraph2019-what-is-usd-a-primer/Screen_Shot_at_23-08.png" alt="Presentation Timestamp 23-08 what is Hydra" width="700" style="margin: .1em auto" />
<span style="font-size:50%;text-align:center;display:block">Rob Stauffer. <i>What is USD: A Primer</i>. July 2019, SIGGRAPH, <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ?t=1388"> YouTube</a>. Presentation Timestamp 23-08.</span></p>
<h2 id="notes-from-the-qa">Notes from the Q&amp;A</h2>
<p><em>timestamp: 23 minutes into the presentation</em></p>
<ul>
<li>in theory USD should make the interop between different DCC tools easier
<ul>
<li>it all depends on the way the given DCC supports USD</li>
</ul>
</li>
<li>
<p><em>previz</em> in Virtual Production can be defined as a USD layer</p>
</li>
<li>USD can hold geometry
<ul>
<li>You can set up a USD scene in a way where:
<ul>
<li>Some USD files will contain the Scene Description and some USD files will contain the geometry
<ul>
<li>example: <a href="https://graphics.pixar.com/usd/downloads.html">Pixar USD Kitchen set</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>currently missing support for skeletal animation rigs</p>
</li>
<li>
<p>it is possible to define your own types to store different metadata</p>
</li>
<li>there isn’t a standard way to organize the USD layer files
<ul>
<li>some studios organize per department</li>
<li>some organize everything in a flat file</li>
</ul>
</li>
<li>
<p>you can support multiple renderers, but you might need to store multiple material definitions</p>
</li>
<li>Future work:
<ul>
<li>Making it easier to work with materials for different renderers
<ul>
<li>MaterialX</li>
<li>MDL Material</li>
</ul>
</li>
<li>Supporting shaders</li>
</ul>
</li>
</ul>
<hr />
<h1 id="thoughts">Thoughts</h1>
<h2 id="applications-in-game-dev">Applications in Game dev</h2>
<ul>
<li>The possibility of leveraging third-party DCCs tools that will use the same format to save levels
<ul>
<li>a seamless workflow between proprietary studio technologies and third-party tools</li>
</ul>
</li>
<li>From what I understand you can use USD in 3 different ways:
<ul>
<li><code class="highlighter-rouge">interchange</code> - intermediate format to communicate between tools (buffer/temp files)
<ul>
<li><code class="highlighter-rouge">low</code> commitment to USD</li>
</ul>
</li>
<li><code class="highlighter-rouge">store</code> - the authoritative persistent format that all the tools use and save (all your proprietary tools save into a USD file)
<ul>
<li><code class="highlighter-rouge">medium</code> commitment to USD</li>
</ul>
</li>
<li><code class="highlighter-rouge">render</code> - implement the Hydra API to render from USD
<ul>
<li><code class="highlighter-rouge">high</code> commitment to USD</li>
<li>a third-party DCC, that supports USD, can render using your proprietary render engine ( see <a href="http://www.cgchannel.com/2020/07/see-blenders-cycles-renderer-running-in-the-houdini-viewport" target="_blank">Blender’s Cycles renderer running in the Houdini viewport</a> )</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="practical-truths">Practical Truths</h2>
<p><em>General Tools Development Wisdom</em></p>
<ul>
<li><strong>Layers can power non-destructive workflows.</strong> - layers are key for implementing non-destructive workflows.</li>
<li><strong>Communicating hierarchies is hard.</strong> - it can be a challenge for a non-technical user to grasp hierarchies, especially if merging of hierarchies is a feature.</li>
<li><strong>Visualization is paramount.</strong> - getting the visualization “right” can make all the difference.</li>
</ul>
<h2 id="practical-principles">Practical Principles</h2>
<p><em>General Tools Development Principles</em></p>
<ul>
<li>
<p>Make it easy for your users to visualize the internal data. Don’t just render the underlying data and call it a day. (see <a href="https://tools.engineer//tools-tutorial-day-a-tale-of-three-data-schemas" target="_blank">GDC 2018 Notes for “A Tale of Three Data Schemas”</a> )</p>
</li>
<li>
<p><em>Layers</em> are great for separating artists and department work.</p>
</li>
</ul>
<h2 id="questions-that-came-to-mind">Questions that came to mind</h2>
<ul>
<li>Is there a good comparison of scene description file formats (open and not)?
<ul>
<li><a href="http://nickporcino.com/posts/last_mile_interchange.html" target="_blank">Article “Last mile interchange” by Nick Porcino</a></li>
<li><a href="https://all3dp.com/3d-file-format-3d-files-3d-printer-3d-cad-vrml-stl-obj/" target="_blank">The Most Common 3D File Formats (don’t have USD)</a></li>
</ul>
</li>
<li>Who supports USD?
<ul>
<li><a href="https://docs.blender.org/manual/en/latest/files/import_export/usd.html">Blender</a></li>
<li><a href="https://docs.unrealengine.com/en-US/Support/Builds/ReleaseNotes/4_24/index.html#new:liveuniversalscenedescriptionstage_beta_">Unreal</a></li>
<li><a href="https://blogs.unity3d.com/2019/03/28/pixars-universal-scene-description-for-unity-out-in-preview/">Unity</a></li>
<li><a href="https://github.com/Autodesk/maya-usd">Maya</a></li>
</ul>
</li>
<li>Why the “payload” functionality can’t be done via “composition arcs”?
<ul>
<li><a href="https://twitter.com/meshula" target="_blank">Nick Porcino</a> answered:
Composition arcs is just a graph nomenclature. The “arc” expresses the relationship.
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code> level3 -&gt; is_active_in -&gt; world
lighting -&gt; is_referenced_by -&gt; level3
night_lighting -&gt; overrides -&gt; lighting
grunt -&gt; extends -&gt; player
red_costume -&gt; is_referenced_by -&gt; grunt
</code></pre></div> </div>
<p>The mesh in the costume is a payload. The lights in the night_lighting scene might be a payload. etc….</p>
</li>
</ul>
</li>
</ul>
<h2 id="notes-from-the-vault-club">Notes from the Vault Club</h2>
<p>During the discussion in the <a href="http://thetoolsmiths.org/vault_club" target="_blank">Vault Club</a>, I learned a lot. Here are some highlights.</p>
<ul>
<li>some game dev studios are experimenting with proof-of-concept level editor that saves the scene graph as USD</li>
<li>
<p><a href="https://twitter.com/eskilsteenberg" target="_blank">Eskil Steenberg</a> pointed out that USD is more about managing interdepartmental workflows, then about what graphics engineer would look for in a format (polygons, pixels, shaders). “USD, assumes that its part of a pipeline of large DCC applications that supports formats like Alembic, OpenEXR, OpenVDB, OpenShadingLanguage to store the actual data.”</p>
</li>
<li><a href="https://twitter.com/meshula" target="_blank">Nick Porcino</a> mentioned that one of the possible names for USD was “Layered Scene Description”. :)</li>
<li>The name “Hydra” - comes from the idea that you would implement your own rendering “head”.</li>
<li>There might be an issue with the coupling between <code class="highlighter-rouge">blind data</code> and <code class="highlighter-rouge">known data</code>. Meaning that if an application creates custom data that is based on the USD data, we might break that custom data by modifying the USD data outside the current application.</li>
</ul>
<div style="background-color:#FFFF94;border-left: 18px solid #ffff48;padding-left: 50px;">
<p></p>
<p>These notes are just the main ideas of the talk. They don’t contain anecdotes and examples. If you want to learn more, I would advise watching the talk on <a target="_blank" href="https://youtu.be/Yp_TRVD3wjQ">YouTube</a>.</p>
<p></p>
</div>
<h2 id="the-toolsmiths">The Toolsmiths</h2>
<p><img src="https://tools.engineer/assets/images/thetoolsmiths_cover_1000x2881.png" alt="The Toolsmiths logo" width="700" /></p>
<p>I took these notes as part of our little “Book Club” for Game Tools related videos <a href="http://thetoolsmiths.org/vault_club" target="_blank">The Toolsmiths #vault club</a></p>
<p>Join us on <a href="http://thetoolsmiths.org/join_slack_team" target="_blank">Slack</a>.</p>
<p>Join us on <a href="https://twitter.com/thetoolsmiths" target="_blank">Twitter</a>.</p>
<h2 id="links">Links</h2>
<ul>
<li><a href="https://youtu.be/Yp_TRVD3wjQ" target="_blank">What is USD: A Primer, Rob Stauffer, SIGGRAPH 2019</a></li>
</ul>
<h2 id="related-blog-links">Related Blog Links</h2>
<ul>
<li>Notes for <a href="https://tools.engineer//tools-tutorial-day-a-tale-of-three-data-schemas">GDC 2018 Notes for “A Tale of Three Data Schemas”</a></li>
</ul>
<h2 id="related-talksvideos">Related Talks\Videos</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=x9ikzGQW0ys" target="_blank">SIGGRAPH 2016 Real-Time Graphics in Pixar Film Production</a></li>
<li><a href="https://developer.apple.com/videos/play/wwdc2017/610/" target="_blank">WWDC 2017 From Art to Engine with Model I/O</a></li>
<li><a href="https://www.gdcvault.com/play/1026345/The-Future-of-Scene-Description" target="_blank">GDC 2019 The Future of Scene Description on ‘God of War’</a></li>
<li><a href="https://www.youtube.com/playlist?list=PLNUaMVwYjKk8QDlM8gQSLbl8jxLRgc7d6" target="_blank">USD at UTS Animal Logic Academy video presentations</a></li>
</ul>
<h2 id="related-resources">Related resources</h2>
<ul>
<li><a href="https://wiki.aswf.io/display/WGUSD/USD+Projects+and+Resources" target="_blank">USD Projects and Resources</a></li>
<li><a href="https://github.com/vfxpro99/usd-resources" target="_blank">Resources USD</a></li>
<li><a href="http://nickporcino.com/posts/last_mile_interchange.html" target="_blank">Article “Last mile interchange” by Nick Porcino</a></li>
<li><a href="http://www.cgchannel.com/2020/07/see-blenders-cycles-renderer-running-in-the-houdini-viewport" target="_blank">See Blender’s Cycles renderer running in the Houdini viewport, CG Channel</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=AnimalLogic.vscode-usda-syntax" target="_blank">VSCode USD Language support</a></li>
<li><a href="https://github.com/quelsolaar/HxA" target="_blank">HxA 3D asset format, Eskil Steenberg</a></li>
<li><a href="https://lesterbanks.com/2020/03/how-to-integrate-fx-using-usd-and-houdini-solaris" target="_blank">How to Integrate FX Using USD and Houdini Solaris - Lesterbanks</a></li>
<li><a href="https://www.sidefx.com/products/houdini/solaris/" target="_blank">Solaris, SideFX</a></li>
<li><a href="https://yoann01.github.io/blog/2019/10/01/USD.html" target="_blank">Intro to USD</a></li>
<li><a href="https://www.alembic.io" target="_blank">Alembic - an open computer graphics interchange framework</a></li>
</ul>
<h2 id="credits">Credits</h2>
<p>Post cover image by <a target="_blank" href="https://pixabay.com/users/AlexanderStein-45237/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=182220">Alexander Stein</a> from <a target="_blank" href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=182220">Pixabay</a></p></content><author><name>Victor Stepanov</name></author><category term="GDC" /><category term="visual-arts" /><category term="interchange" /><category term="computer-graphics" /><category term="scene-description" /><category term="usd" /><category term="dcc" /><summary type="html">TLDW Summary: This talk is an intro to the key concepts and terminology of Universal Scene Description. The presentation shows examples of how USD is integrated into SideFX products.</summary></entry><entry><title type="html">Notes for “Procedural World Generation of ‘Far Cry 5’” GDC2018</title><link href="/https://tools.engineer/gdc2018-procedural-world-generation-of-far-cry-5" rel="alternate" type="text/html" title="Notes for "Procedural World Generation of 'Far Cry 5'" GDC2018" /><published>2020-08-08T18:00:00-07:00</published><updated>2020-08-08T18:00:00-07:00</updated><id>/https://tools.engineer/gdc2018-procedural-world-generation-of-far-cry-5</id><content type="html" xml:base="/https://tools.engineer/gdc2018-procedural-world-generation-of-far-cry-5"><p><strong>TLDW Summary</strong>: This talk is about how FC5 developers created a pipeline for generating a realistic game world using procedural recipes. The talk contains a high-level overview of the pipeline with two deep dives into the details of the tools.</p>
<h2 id="key-terms">Key Terms</h2>
<div class="keyword-container">
<ul class="keyword-container">
<li>procedural workflow</li>
<li>an ecosystem of procedural tools</li>
<li>Houdini Engine</li>
<li>biome recipes</li>
<li>determinism</li>
<li>terrain</li>
<li>2d mask</li>
</ul>
<style>
.keyword-container > ul
{
font-size: 16px;
list-style-type: none;
padding:15px;
}
.keyword-container > li
{
background-color:#f3f3f3;
display : inline;
padding:5px;
margin:2px;
margin-bottom: 100px;
border-radius: 5px;
}
</style>
</div>
<h2 id="presentation-time-stamps">Presentation Time Stamps</h2>
<ul>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 2</a> Introduction</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 2</a> The goals of the procedural pipeline</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 6</a> The tools that were developed</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 15</a> The system from the user’s point of view</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 12</a> How the pipeline is working under the hood</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 16</a> The Cliff generation tool</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 25</a> The Biome generation tool</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 46</a> What changed during development</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 49</a> Conclusion</li>
<li><a href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far" target="_blank">at minute 52</a> Q&amp;A</li>
</ul>
<h2 id="key-concepts">Key Concepts</h2>
<ul>
<li><strong>biome</strong> : an area of a game world with distinct terrain, vegetation, and animal life.
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_71_sub_biome.png" alt="slide 71 sub biome" width="700" style="margin: .1em auto" />
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #71.</p>
</li>
<li><strong>map</strong> : parts of a game <em>world</em> that are not loaded at the same time</li>
<li><strong>section</strong> : a part of a <em>map</em> (256m X 256m)</li>
<li><strong>sector</strong> : a part of a <em>section</em> (64m X 64m), the smallest part of a world that can be <em>baked</em>
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_34_sector.png" alt="slide 34 sector" width="700" style="margin: .1em auto" />
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #34.</p>
</li>
<li><strong>recipe</strong> : a set of rules that given a set of inputs determines what <em>entities</em> need to be placed at a given location</li>
<li><strong>points of interest</strong> : a <em>map</em> <em>location</em> reserved for user input and editing</li>
</ul>
<h1 id="the-problemschallenges">The Problems/Challenges</h1>
<ul>
<li>Filling up empty space is easy, but filling it up so it looks <em>natural</em> is a big challenge.</li>
<li>The workflow required to fill up large open spaces beautifully, quickly, while maintaining the <em>flexibility</em> for applying user input.
<ul>
<li>The workflow had to allow fine-tuning of smaller <em>locations</em> to deliver <em>tight gameplay experiences</em>.</li>
</ul>
</li>
<li><em>Terraforming</em> can’t be locked at the start of the project
<ul>
<li>The terrain of the game would be constantly changing, and the <em>biomes</em> would need to be constantly updated. Updating the biomes by hand wasn’t an option.</li>
<li>The asset placement needs to be consistent with the terrain topology.</li>
</ul>
</li>
<li>The pipeline needs to run without human intervention to regenerate the content in a <em>build farm</em> setting.</li>
<li>The pipeline needs to generate small <em>sections</em> of the world separately.</li>
<li>The parts of the world should be generated <em>deterministically</em> to enable stitching parts together.</li>
</ul>
<h1 id="propositions">Propositions</h1>
<ul>
<li>The biomes procedural system should be able to simulate <em>natural phenomena</em>.
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_80_natural.png" alt="slide 80 natural phenomena" width="700" style="margin: .1em auto" />
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #80.</p>
<p><img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_99_canopy.png" alt="slide 99 natural phenomena" width="700" style="margin: .1em auto" /></p>
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #99.</p>
</li>
<li>Build <em>biome recipes</em> that react to the physical features of the land to ensure <em>coherence</em> throughout the world
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_89_physical_features.png" alt="slide 89 natural phenomena" width="700" style="margin: .1em auto" />
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #89.</p>
</li>
<li>
<p>The iterative process is vital to the quality of the game</p>
</li>
<li>Use Houdini Engine to run the full map generation in a nightly build</li>
<li><em>same input</em> = <em>same result</em> (determinism matters)</li>
<li>The ecosystem of tools needs to be user friendly
<ul>
<li>shelf tools</li>
<li>be able to override procedural results</li>
</ul>
</li>
<li>User must be able to bake data as they work</li>
</ul>
<h1 id="key-points">Key Points</h1>
<ul>
<li>They developed a sophisticated procedural pipeline for creating a realistic game world using Houdini and Houdini Engine</li>
<li>Originally they just wanted to develop the <em>biome tool</em>, but they ended up developing a suite of tools.</li>
<li>The <em>heart</em> of the pipeline is the <em>data exchange</em> between the Houdini Engine and the Game Engine
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_70_import_2d_data.png" alt="slide 70 importing 2d data" width="700" style="margin: .1em auto" />
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #70.</p>
</li>
<li>They developed an <em>ecosystem of procedural tools</em>, where one tool would provide the input to the next tool
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_38_the_pipeline.png" alt="slide 38 high-level pipeline overview" width="700" style="margin: .1em auto" />
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #38.</p>
</li>
<li>They regenerate the entire game world every night on special <em>build machines</em>.</li>
</ul>
<hr />
<h1 id="notable-parts-of-the-talk">Notable parts of the talk</h1>
<hr />
<h2 id="user-iteration-workflow">User Iteration Workflow</h2>
<p><em>timestamp: 6 minutes into the presentation</em></p>
<ol>
<li>Terraforming pass</li>
<li>Define freshwater
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_22_fresh_water.png" alt="slide 22 high-level pipeline overview" width="700" style="margin: .1em auto" /> <span style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of ‘Far Cry 5’</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #22.</span></li>
<li>Run the <em>cliff generation tool</em> to create cliffs on steep terrain</li>
<li>Use <em>Biome painter</em> and run procedural generation to spawn the vegetation</li>
<li>Setting up <em>Points of Interest</em> (a.k.a. location)
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_26_point_of_interest.png" alt="slide 26 high-level pipeline overview" width="700" style="margin: .1em auto" /> <span style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of ‘Far Cry 5’</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #26.</span>
<ol>
<li>Paint an area with the grass Biome</li>
<li>Laying down a road spline</li>
<li>Bake roads and refresh biome</li>
<li>Add buildings, props</li>
<li>Apply terrain texture</li>
<li>Add more Trees with the forest sub-biome</li>
<li>Bake/refresh biome</li>
<li>Add fence spline</li>
<li>Add power line spline
<ol>
<li>Snap power line connector to house</li>
<li>Bake/refresh biome</li>
</ol>
</li>
</ol>
</li>
</ol>
<h2 id="user-non-destructive-workflow">User Non-Destructive Workflow</h2>
<p><em>timestamp: 11 minutes into the presentation</em></p>
<ol>
<li>Update level of terrain</li>
<li>Bake/refresh biome
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_35_bake.png" alt="slide 35 high-level pipeline overview" width="700" style="margin: .1em auto" />
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #35.</p>
</li>
</ol>
<h1 id="how-the-pipeline-is-working-under-the-hood">How the pipeline is working under the hood</h1>
<p><em>timestamp: 12 minutes into the presentation</em></p>
<ul>
<li>At the heart of the pipeline is the data exchange between the Houdini Engine and the Game Engine</li>
<li>Inputs for the pipeline are sent from the Game Engine to Houdini via a Python Script
<ul>
<li>world information</li>
<li>spline &amp; shapes</li>
<li>file paths</li>
<li>Terrain Sectors (Main input that the generation is linked to)</li>
<li>heightmaps</li>
<li>Biome painter</li>
<li>2D terrain masks</li>
<li>Houdini Geometry (that might have been generated by another procedural tool)</li>
</ul>
</li>
<li>Outputs of Houdini
<ul>
<li>List of outputs
<ul>
<li>Entity point could
<img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_37_entity_point_cloud.png" alt="slide 37 high-level pipeline overview" width="700" style="margin: .1em auto" /></li>
</ul>
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #37.</p>
<ul>
<li>Terrain texture layers</li>
<li>Terrain heightmap layers</li>
<li>2D terrain data</li>
<li>Geometry</li>
<li>Terrain logic zones</li>
</ul>
</li>
<li>The data is saved onto a disk using temp “buffers”</li>
</ul>
</li>
<li>The output of one tool influences the output of another tool
<ul>
<li>The tools use masks to communicate with each other</li>
</ul>
</li>
</ul>
<h1 id="examples-of-tools">Examples of tools</h1>
<h2 id="cliffs-tool">Cliffs tool</h2>
<p><em>timestamp: 16 minutes into the presentation</em></p>
<p><img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_65_cliff_tool.png" alt="slide 65 cliff tool" width="700" style="margin: .1em auto" /></p>
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #65.</p>
<h2 id="biomes-tool">Biomes Tool</h2>
<p><em>timestamp: 25 minutes into the presentation</em></p>
<p><img src="assets/images/posts/gdc2018-procedural-world-generation-of-far-cry-5/slide_69_biome_tool.png" alt="slide 69 biome tool" width="700" style="margin: .1em auto" /></p>
<p style="font-size:50%">Carrier, Etienne. <i>Procedural World Generation of 'Far Cry 5'</i>. Mar. 2018, GDC, <a target="_blank" href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far"> GDC Vault Slide Location</a>. Presentation Slide #69.</p>
<h1 id="lessons-learned">Lessons Learned</h1>
<p><em>timestamp: 46 minutes into the presentation</em></p>
<ul>
<li>Making the steps of the <em>pipeline simple</em>. Don’t require knowledge of when the underlying data is generated or how it affects the <em>downstream tasks</em>.</li>
<li>The <em>blending of biomes</em> is a complicated feature for the users to use and the developers to debug.</li>
<li>This level of customization and generation at this scale <em>can impact the gameplay</em>.</li>
<li>This is just a taste of what is possible to produce using this type of <em>procedural technology</em>.</li>
<li>You won’t get it right on your first try. Keep iterating and simplifying the pipeline. Be flexible - plans and requirements change.</li>
<li><em>Pay attention</em> to how the users use the tools. If you think a feature will be useful it doesn’t mean that the users will use it.</li>
</ul>
<hr />
<h1 id="thoughts">Thoughts</h1>
<hr />
<h2 id="solved-problemschallenges">Solved Problems/Challenges</h2>
<p><em>Did they solve what they set out to solve?</em></p>
<ul>
<li>They shipped FC5</li>
<li>They developed suite of tools:
<ul>
<li>The freshwater tool</li>
<li>Fences &amp; power line tool</li>
<li>Cliff generation tool</li>
<li>Biome tool (to spawn vegetation)</li>
<li>Fog tool</li>
<li>World map tool (scatter trees on the world map)</li>
<li>Power line tool
<ul>
<li>Auto snapping if a user made an error (with-in a given threshold distance)</li>
</ul>
</li>
</ul>
</li>
<li>The pipeline is automated and runs nightly</li>
<li>The workflow allowed for quick <strong>iteration</strong> and the ability to <em>“bake as you work”</em></li>
<li>Use <em>biome recipes</em> to define what vegetation will be placed in different parts of the map (near water, near cliffs, at high altitude)</li>
</ul>
<h2 id="practical-truths">Practical Truths</h2>
<p><em>General Tools Development Wisdom</em></p>
<ul>
<li><strong>“At first you won’t understand the problem”.</strong> - You won’t get a system design “right” from the first attempt.</li>
<li><strong>“You are not your users”.</strong> - If you think something is a good feature, it doesn’t mean that the users will think so.</li>
<li><strong>“Users don’t have to know the implementation details”.</strong> - Users will not remember complicated cause-and-effect scenarios.</li>
<li><strong>“Watch out for Hidden Cascade Effects”.</strong> - In a fully automated system, a user might not see/ suspect that their changes are affecting another system that is out of view.</li>
<li><strong>“The speed of iteration is vital to the quality of the game”.</strong> - Don’t let the tools be the bottleneck of the iteration process.</li>
</ul>
<h2 id="practical-principles">Practical Principles</h2>
<p><em>General Tools Development Principles</em></p>
<ul>
<li>Enable user input and <em>customization</em> inside a procedural generation system.</li>
<li><em>Observe users</em> to understand what is important for them.</li>
<li><em>K.I.S.S.</em>: Keep It Stupid Simple</li>
<li>Search for the balance between <em>control</em> and <em>automation</em>.</li>
</ul>
<h2 id="questions-that-came-to-mind">Questions that came to mind</h2>
<ul>
<li>What are some websites/resources about good <em>Digital Content Creation tool</em> architecture/patterns? Maybe even some checklists?
<ul>
<li>Like :
<ul>
<li>“Don’t forget to make a headless client for your tool”</li>
<li>“Don’t forget to add python scripting”</li>
<li>“Don’t forget to think about determinism when saving</li>
</ul>
</li>
</ul>
</li>
<li>Is there any alternative to Houdini? (not counting <strong>rolling your own</strong>)</li>
<li>How do they edit the road network that spans multiple <strong>maps</strong> (parts of the <strong>world</strong>)?</li>
<li>How long into the future when level art for <strong>second class</strong> points of interest will be fully defined by recipes? When will it be mainstream?</li>
</ul>
<div style="background-color:#FFFF94;border-left: 18px solid #ffff48;padding-left: 50px;">
<p></p>
<p>These notes are just the main ideas of the talk. They don’t contain anecdotes and examples. If you want to learn more, I would advise watching the talk on the <a target="_blank" href="https://www.gdcvault.com/play/1025215/Procedural-World-Generation-of-Far">GDC Vault</a>.</p>
<p></p>
</div>
<h2 id="the-toolsmiths">The Toolsmiths</h2>
<p><img src="https://tools.engineer/assets/images/thetoolsmiths_cover_1000x2881.png" alt="The Toolsmiths logo" width="700" /></p>
<p>I took these notes as part of our little “Book Club” for GDC Vault Videos <a href="http://thetoolsmiths.org/vault_club" target="_blank">The Toolsmiths #vault club</a></p>
<p>Join us on <a href="http://thetoolsmiths.org/join_slack_team" target="_blank">Slack</a>.</p>
<p>Join us on <a href="https://twitter.com/thetoolsmiths" target="_blank">Twitter</a>.</p>
<h2 id="links">Links</h2>
<ul>
<li><a href="https://www.gdcvault.com/play/1025557/Procedural-World-Generation-of-Far" target="_blank">Slides: Procedural World Generation of ‘Far Cry 5’</a></li>
</ul>
<h2 id="related-talksvideos">Related Talks\Videos</h2>
<ul>
<li><a href="https://www.gdcvault.com/play/1024029/-Ghost-Recon-Wildlands-Terrain" target="_blank">GDC 2017 ‘Ghost Recon Wildlands’: Terrain Tools and Technology</a></li>
<li><a href="https://www.gdcvault.com/browse/gdc-18/play/1025261/Terrain-Rendering-in-Far-Cry" target="_blank">GDC 2018 Terrain Rendering in ‘Far Cry 5’</a></li>
<li><a href="https://www.gdcvault.com/browse/gdc-18/play/1025264/The-Asset-Build-System-of" target="_blank">GDC 2018 The Asset Build System of ‘Far Cry 5’</a></li>
<li><a href="https://www.youtube.com/watch?v=OklvMqMCkc4&amp;feature=youtu.be" target="_blank">GAT #69: River - 2k19 Edition</a></li>
</ul>
<h2 id="credits">Credits</h2>
<p>Post cover image by <a href="https://pixabay.com/users/Pexels-2286921/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1852955">Pexels</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1852955">Pixabay</a></p></content><author><name>Victor Stepanov</name></author><category term="GDC" /><category term="procedural" /><category term="visual-arts" /><category term="level-art" /><category term="level-design" /><summary type="html">TLDW Summary: This talk is about how FC5 developers created a pipeline for generating a realistic game world using procedural recipes. The talk contains a high-level overview of the pipeline with two deep dives into the details of the tools.</summary></entry><entry><title type="html">Notes for “Tools for ‘Marvel’s Spider-Man’ Editing with Immutable Data” GDC2019</title><link href="/https://tools.engineer/gdc2019-tools-for-marvels-spider-man-editing-with-immutable-data" rel="alternate" type="text/html" title="Notes for "Tools for 'Marvel's Spider-Man' Editing with Immutable Data" GDC2019" /><published>2019-07-13T18:00:00-07:00</published><updated>2019-07-13T18:00:00-07:00</updated><id>/https://tools.engineer/gdc2019-tools-for-marvels-spider-man-editing-with-immutable-data</id><content type="html" xml:base="/https://tools.engineer/gdc2019-tools-for-marvels-spider-man-editing-with-immutable-data"><p><strong>TLDW Summary</strong>: This talk is a tour of the technologies that Insomniac Games developed to transition from their web based tools to their new desktop tools. Highlighting what challenges they encountered when replacing the tool chain in mid production.</p>
<h2 id="keywords">Keywords</h2>
<div class="keyword-container">
<ul class="keyword-container">
<li>Data Design</li>
<li>Immutable Data</li>
<li>Mid Production</li>
<li>Data Definition Language (DDL)</li>
<li>Porting</li>
</ul>
<style>
.keyword-container > ul
{
font-size: 16px;
list-style-type: none;
padding:15px;
}
.keyword-container > li
{
background-color:#f3f3f3;
display : inline;
padding:5px;
margin:2px;
margin-bottom: 100px;
border-radius: 5px;
}
</style>
</div>
<h2 id="presentation-time-stamps">Presentation Time Stamps</h2>
<ul>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 1</a> Background</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 2</a> Making Changes</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 6</a> Mission Directive</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 15</a> Implicitly shared data with Copy-on-write</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 29</a> Immutable Data</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 32</a> The Edit Loop</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 41</a> Hazards Encountered</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 45</a> Conclusion</li>
<li><a href="https://www.gdcvault.com/play/1026080/Tools-for-Marvel-s-Spider">at min 47</a> Q&amp;A</li>
</ul>
<h1 id="background">Background</h1>
<ul>
<li>Insomniac Games started to develop Web-Based Tools in 2010 (written in JavaScript)
<ul>
<li>This lead to some issues and the engine team decided to go back to the regular desktop tools
<ul>
<li>for more see <a href="http://www.gdcvault.com/play/1024465/Insomniac-s-Web-Tools-A">GDC 2017 “Insomniac’s Web Tools: A Postmortem”</a></li>
</ul>
</li>
<li>Insomniac Games shipped 6 games with the web tools</li>
</ul>
</li>
<li>This talk is about what happened after the “Insomniac’s Web Tools: A Postmortem”</li>
</ul>
<h1 id="making-changes">Making Changes</h1>
<p><em>timestamp: 2 min into the presentation</em></p>
<ul>
<li>In 2015 the work started on the transition from JavaScript to C++ Qt with a 4 man team</li>
<li>The refactoring had to be done while the tools were still in use</li>
<li>Sunset Overdrive pushed the JS world editor to its limits and ‘Marvel’s Spider-Man’ Manhattan would be even bigger
<ul>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/map-scale.jpg" alt="slide: Sunset Overdrive vs'Marvel's Spider-Man' Manhattan size" width="700" /></li>
</ul>
</li>
<li>the team needed to port 12 editors from JS
<ul>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/world-editor.jpg" alt="slide: world editor" width="700" /></li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/animation-editor.jpg" alt="slide: animation editor" width="700" /></li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/cinematics-editor.jpg" alt="slide: cinematics editor" width="700" /></li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/vfx-editor.jpg" alt="slide: vfx editor" width="700" /></li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/12-editors.jpg" alt="slide: 12 editors" width="700" /></li>
</ul>
</li>
<li>the goals of the refactoring were
<ul>
<li>performance (being able to work with large data sets)
<ul>
<li>multi-threading support</li>
</ul>
</li>
<li>easier to maintain</li>
<li>type safety (JS “Uncaught TypeError: undefined is not a function”)</li>
</ul>
</li>
</ul>
<h1 id="mission-directive">Mission Directive</h1>
<p><em>timestamp: 6 min into the presentation</em></p>
<ul>
<li>the tool porting was planned to be done when a significant part of the content would have been created with the old tools
<ul>
<li>needed to provide an upgrade path or data compatibility</li>
</ul>
</li>
<li>the C++ tools need to have the same UX and UI as the JS tools to make the switching between the tools as seamless as possible.
<ul>
<li>no feature requests were accepted to make it possible to finish on time</li>
</ul>
</li>
<li>The tools were 100% data compatible
<ul>
<li>this enabled the users to fall back to the JS tools when they hit an issue with the C++ version</li>
</ul>
</li>
<li>the JS tools were using a local client/server model
<ul>
<li>the local server was called LunaServer
<ul>
<li>for more check out the GDC2012 talk about <a href="https://gdcvault.com/play/1015531/Developing-Imperfect-Software-How-to">Developing Imperfect Software: How to Prepare for Development Pipeline Failure</a></li>
</ul>
</li>
<li>LunaServer
<ul>
<li>stores its state in MongoDB</li>
<li>responsible for file system IO</li>
<li>responsible for Perforce operations</li>
<li>sync changes to assets between tools</li>
</ul>
</li>
</ul>
</li>
<li>their own in-house DDL
<ul>
<li>made JSON type safe with a DDL compiler (ToolsDDL) that would compile the DDL into C++ code (set/get)</li>
<li>tools use in memory JSON representation (to reduce complexity and the need to convert between C++ object)modification</li>
</ul>
</li>
<li>to represent a game object, they use JSON trees which are the same as hash table of hash tables</li>
</ul>
<h1 id="implicitly-shared-data-with-copy-on-write">Implicitly shared data with Copy-on-write</h1>
<p><em>timestamp: 15 min into the presentation</em></p>
<ul>
<li>a detailed explanation of the Implicitly shared data with Copy-on-write pattern at @ 15-36</li>
<li>basic idea
<ul>
<li>a global state is implicitly shared between modules</li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/modify_worldNode_0.jpg" alt="slide: modify worldNode step one" width="700" /></li>
<li>when a module wants to update the global state, a copy is made</li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/modify_worldNode.jpg" alt="slide: modify worldNode step two" width="700" /></li>
<li>after the modification is done the rest of the modules get notified to fetch the pointer to the new object</li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/modify_worldNode_2.jpg" alt="slide: modify worldNode step three" width="700" /></li>
</ul>
</li>
<li>implicit sharing makes it easy to compute the diff of 2 JSON trees
<ul>
<li>this is because as soon as 2 subtrees point to the same shared subtree, you don’t need to traverse that part of the tree any further.</li>
</ul>
</li>
</ul>
<h1 id="immutable-data">Immutable Data</h1>
<p><em>timestamp: 29 min into the presentation</em></p>
<ul>
<li>the same idea of Implicitly shared data <strong>without</strong> Copy-on-write
<ul>
<li>no setters</li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/Immutable_Data.jpg" alt="slide: Immutable Data class" width="700" /></li>
</ul>
</li>
<li>this makes it easier to reason about the code</li>
</ul>
<div style="font-style: normal;font-size: 26px;margin-left: 32px;font-family: Consolas, 'Times New Roman', Verdana;border-left: 4px solid #3a5ebf;padding-left: 20px;">
<p></p>
"Immutable is not const. const only controls access, immutable is a guarantee."
<p></p>
</div>
<p></p>
<ul>
<li>they like to think about this as a step towards functional programming</li>
<li>designing an API that is like a function that returns a new value based on the old value
<ul>
<li>without any
<ul>
<li>side effects</li>
<li>preconditions</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="the-edit-loop">The Edit Loop</h1>
<p><em>timestamp: 32 min into the presentation</em></p>
<ul>
<li>LunaEdit is the module that is responsible for editing asset
<ul>
<li>creating a new object from an object that was passed in</li>
</ul>
</li>
<li>LunaEdit is also responsible for
<ul>
<li>handling Perforce checkout</li>
<li>handling the undo system</li>
<li>sending updates to the LunaServer (updating the DB and files on disk)</li>
<li>broadcast changes all of the modules in the system (change/update)</li>
</ul>
</li>
<li>all of the complexity of working with the data format is hidden in one place - the LunaEdit module</li>
<li><img src="assets/images/posts/tools-for-marvels-spider-man-editing-with-immutable-data/edit_loop.jpg" alt="slide: The Edit Loop" width="700" /></li>
</ul>
<h1 id="hazards-encountered">Hazards Encountered</h1>