-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.xml
891 lines (789 loc) · 65.7 KB
/
index.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
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Gustav Olsson</title>
<link>http://gustavolsson.com/</link>
<description>Recent content on Gustav Olsson</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Wed, 22 Apr 2020 19:29:21 +0200</lastBuildDate><atom:link href="http://gustavolsson.com/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>December Adventure 2023</title>
<link>http://gustavolsson.com/projects/december-adventure-2023/</link>
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/december-adventure-2023/</guid>
<description><p><a href="https://eli.li/december-adventure">Eli&rsquo;s December Adventure</a> is a low-key alternative to <a href="https://adventofcode.com/">Advent of Code</a> focused on working on personal projects every day throughout December.</p>
<p>As I find it hard to dedicate time to work on personal projects daily, my plan for the adventure is not necessarily to be productive every day but to stay focused on the things I want to do.</p>
<p>Here are my plans:</p>
<ul>
<li>Get my uxn emulator <a href="http://gustavolsson.com/projects/uxnfloppy/">uxnfloppy</a> to a releasable state
<ul>
<li><del>Optimize vga mode 12 (640x480) sprite drawing</del></li>
<li><del>Refactor DEO/DEI to use a device page</del></li>
<li>Make it possible to run large roms and, if I have the time, add support for the File device and read/writes to the USB stick/floppy</li>
</ul>
</li>
<li>Make a debug/gizmo renderer for my 3d game engine <a href="http://gustavolsson.com/projects/sprout-engine/">sprout</a>
<ul>
<li>To show collision volumes, camera frustums and the like</li>
<li>Figure out how to handle singleton-like features that should be callable from anywhere (e.g. <code>gizmoDrawLine(...)</code>)</li>
<li>Show the camera frustum of nodes with the Camera attribute</li>
</ul>
</li>
<li>Make an uxn rom with the forest or ocean scene I have been thinking about</li>
<li>Bring the camera with me more often, and take more pictures</li>
<li>Improve my daily routine, waste less time</li>
<li>Be more present when I&rsquo;m not at the computer</li>
</ul>
<h2 id="other-adventures-im-following">Other adventures I&rsquo;m following:</h2>
<ul>
<li><a href="http://wastingmoves.com/december_adventure_2023.html">tbsp</a></li>
<li><a href="http://plastic-idolatry.com/erik/2023/dec/">d_m</a></li>
<li><a href="https://rabbits.srht.site/decadv/">100 rabbits</a></li>
</ul>
<h2 id="progress">Progress</h2>
<h3 id="day-13-14">Day 13-14</h3>
<ul>
<li>Further optimzied vga output by having a separate min/max range per screen layer</li>
<li><a href="https://merveilles.town/@gustav/111578414311130420">bunnymark.tal now runs at 60 fps</a> until about 2000 bunnies are drawn in 640x480</li>
<li><a href="https://merveilles.town/@gustav/111578436129940304">noodle.tal is also running at a high frame rate</a> but the ps/2 mouse support seems to have room for improvement (on device, only the trackpad produces smooth movements)</li>
</ul>
<h3 id="day-9">Day 9</h3>
<ul>
<li>Ran up against the slow vga bus again (6-8mhz) when blitting the backbuffer to screen which turned out to be why all roms were capped at 34 fps</li>
<li>Optimized the blitting code to only blit changed layers and min/max byte offset</li>
<li>noodle.tal now runs at 60 fps most of the time!</li>
</ul>
<h3 id="day-7">Day 7</h3>
<ul>
<li>Implemented the Varvara&rsquo;s Datetime device using the BIOS CMOS real-time clock
<ul>
<li>It turned out to be easy and was a relief after the complicated vga mode 12/ps2 work</li>
</ul>
</li>
<li>With that done, bunnymark.tal reports correct fps and it runs at 30 fps up to 1000 bunnies, at which point it drops to 20 fps. I still want this emulator to be close to uxnemu in performance so there is still some ways to go, but I&rsquo;m happy for the time being. I want to investigate why bunnymark starts at 30 fps and not 60 fps with no bunnies at all, though.</li>
</ul>
<h3 id="day-5">Day 5</h3>
<ul>
<li>Reimplemented a slow version of Screen/pixel for vga mode 12 because I&rsquo;m starting to feel jaded on the x86 assembly</li>
<li>Refactored DEO/DEI to use a device page. This gave a noticable speed-up!</li>
<li>noodle.tal is now running well on device in 640x480! Not sure if its 30fps or 60fps though, will need to investigate.</li>
</ul>
<h3 id="day-3-4">Day 3-4</h3>
<ul>
<li>Optimized uxnfloppy sprite drawing so that no non-screen memory is used when drawing a scanline!</li>
</ul>
<h3 id="day-2">Day 2</h3>
<ul>
<li>Thought about what I wanted and put up this page</li>
</ul>
</description>
</item>
<item>
<title>uxnfloppy</title>
<link>http://gustavolsson.com/projects/uxnfloppy/</link>
<pubDate>Fri, 21 Jul 2023 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/uxnfloppy/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/uxnfloppy/uxnfloppy_noodle.jpg"><img width="100%" src="http://gustavolsson.com/projects/uxnfloppy/uxnfloppy_noodle_hua560b467d8c45c5fbedeec51ba992883_2319862_1200x0_resize_q70_box.jpg"></a></p>
<h2 id="uxnfloppy">uxnfloppy</h2>
<p>uxnfloppy is a bootable <a href="https://100r.co/site/uxn.html">Uxn/Varvara emulator</a>/operating system that aims to be able to run graphical Uxn roms on any x86 computer built since the early 90s using only a floppy disk or thumb drive, no pre-installed operating system necessary.</p>
<p>The project is written in 16bit x86 assembly targetting BIOS and uses VGA for graphics and PS/2 for mouse and keyboard input. It&rsquo;s not portable to other architectures (such as ARM) or the newest PCs (that lack legacy BIOS support), but it has been a great learning experience and I actually like the fact that it only works on what&rsquo;s usually called &ldquo;obsolete tech&rdquo;, especially in the light of the massive e-waste problem.</p>
<p>The project is currently very work-in-progress, but I will create a public open-source repository once it&rsquo;s a bit more feature complete and cleaned up.</p>
</description>
</item>
<item>
<title>sprout engine</title>
<link>http://gustavolsson.com/projects/sprout-engine/</link>
<pubDate>Wed, 29 Mar 2023 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/sprout-engine/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/sprout-engine/1.png"><img width="100%" src="http://gustavolsson.com/projects/sprout-engine/1_hufdcc95da6d2db8f82b3ec734305272f5_664054_1200x0_resize_q70_bgffffff_box_3.jpg"></a></p>
<h2 id="sprout-engine">sprout engine</h2>
<p>Sprout is a minimalist 3d game engine written in C.</p>
</description>
</item>
<item>
<title>turn3d v1.1.2</title>
<link>http://gustavolsson.com/blog/turn3d-v1.1/</link>
<pubDate>Wed, 06 Jul 2022 19:46:18 +0200</pubDate>
<guid>http://gustavolsson.com/blog/turn3d-v1.1/</guid>
<description><p>I&rsquo;ve recently spent some time improving and re-releasing my 3d scanning app for iOS, <a href="http://gustavolsson.com/projects/turn3d/">turn3d</a>. The following are the most notable changes:</p>
<ul>
<li>Significantly more stable tracking</li>
<li>Occluded parts of a scan no longer degrade as the focus moves to something else</li>
<li>Improved voxel field accumulation that results in less noise</li>
<li>Interactive orbit camera in preview screen</li>
</ul>
<p>Please <a href="http://gustavolsson.com/contact/">let me know</a> if you find the app useful!</p>
</description>
</item>
<item>
<title>Hello! (New website in 2020)</title>
<link>http://gustavolsson.com/blog/hello-2020/</link>
<pubDate>Sat, 26 Sep 2020 21:38:11 +0200</pubDate>
<guid>http://gustavolsson.com/blog/hello-2020/</guid>
<description><p>Welcome to yet another website&hellip;</p>
</description>
</item>
<item>
<title>Scan the world around you using turn3d!</title>
<link>http://gustavolsson.com/blog/turn3d-release/</link>
<pubDate>Sat, 26 Sep 2020 21:26:04 +0200</pubDate>
<guid>http://gustavolsson.com/blog/turn3d-release/</guid>
<description><p>I just released my latest app, turn3d. turn3d enables you to 3d scan the world around you using only a semi-modern iOS device. <a href="http://gustavolsson.com/projects/turn3d/">Check it out here!</a></p>
<div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/4Zck6mI_xPo"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/4Zck6mI_xPo?autoplay=1><img src=https://img.youtube.com/vi/4Zck6mI_xPo/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
</description>
</item>
<item>
<title>Contact</title>
<link>http://gustavolsson.com/contact/</link>
<pubDate>Tue, 08 Sep 2020 22:42:53 +0200</pubDate>
<guid>http://gustavolsson.com/contact/</guid>
<description><p>To get in touch with me, send an email to <code>contact@&lt;my full name without spaces&gt;.com</code>.</p>
<p>If you have a question regarding one of my Unity toolkits, send an email to <code>support@&lt;my full name without spaces&gt;.com</code>.</p>
<p>I make sure to answer every email I get but please note that I have a full-time job and that I only work on these projects in my spare time, so it can take some time for me to reply.</p>
<blockquote>
<p>If you’re having a technical issue with any of my Unity toolkits, please prepare a <code>.unitypackage</code> file that illustrates the problem so that I can quickly reproduce it on my end. Note that it usually takes some time for me to get back to you if the request requires testing on my end. Finally, I prioritize support for paid assets over free ones, but feel free to send me a question regardless!</p>
</blockquote>
</description>
</item>
<item>
<title>About</title>
<link>http://gustavolsson.com/about/</link>
<pubDate>Wed, 22 Apr 2020 19:27:55 +0200</pubDate>
<guid>http://gustavolsson.com/about/</guid>
<description><p>Hello! My name is Gustav. This site is a repository of projects I am working on and things I have created in the past. I have always been interested in making things and programming has been my main focus ever since I started writing programs 23 years ago.</p>
<p>I&rsquo;m currently located in Gothenburg, Sweden, Earth.</p>
</description>
</item>
<item>
<title>turn3d</title>
<link>http://gustavolsson.com/projects/turn3d/</link>
<pubDate>Wed, 22 Jan 2020 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/turn3d/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/4Zck6mI_xPo"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/4Zck6mI_xPo?autoplay=1><img src=https://img.youtube.com/vi/4Zck6mI_xPo/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="turn3d">turn3d</h2>
<p><em>3d scan the world around you using any iOS device!</em></p>
<p>This app lets you scan the real-world by creating a 3d model of what the back-facing camera sees in real-time. Place a virtual capture box around a subject, start scanning and simply walk around the subject to progressively fill in the gaps. When you&rsquo;re happy with the result, you can export the 3d model to a file that you can share with your friends or upload to an online repository.</p>
<p>You have full ownership of any exported content that you create using the app. turn3d is to 3d scans what a camera is to pictures.</p>
<p>The app currently supports 3 different export file formats:</p>
<ul>
<li>usdz - natively supported by many iOS apps, such as iMessage</li>
<li>obj - can be imported into many different 3d software packages</li>
<li>xyz - a raw high resolution point cloud (where each line in the file describes a point with a normal in the &ldquo;x y z nx ny nz r g b 0.0&rdquo; format)</li>
</ul>
<p>To get the best possible result try to:</p>
<ul>
<li>walk around the placed capture cube before starting to scan in order to improve tracking</li>
<li>move the phone slowly, especially when you&rsquo;re walking to a new view point</li>
<li>keep many objects in the camera frame at all times as this helps tracking</li>
<li>avoid objects closer than 35 cm to the camera</li>
<li>avoid uniform surfaces such as white walls or texture-less floors</li>
<li>avoid reflective surfaces such as shiny floors or glass windows</li>
</ul>
<h4 id="privacy-policy">Privacy policy</h4>
<p>The app does not track the user in any way. All computation is done locally on the device and the finished 3d scan is only stored in the local storage of the device that performed the scan.</p>
<p>Exported 3d scans are regular files and can be shared just like any other type of file (such as text documents or image files for example). Once a 3d scan is exported to a file, it is outside the control of the app and the sole responsibility of the user.</p>
</description>
</item>
<item>
<title>Rope Toolkit</title>
<link>http://gustavolsson.com/projects/rope-toolkit/</link>
<pubDate>Wed, 11 Dec 2019 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/rope-toolkit/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/ogJTIjGgG9U"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/ogJTIjGgG9U?autoplay=1><img src=https://img.youtube.com/vi/ogJTIjGgG9U/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="rope-toolkit">Rope Toolkit</h2>
<p>The Rope Toolkit brings <em>stable</em> and <em>fast</em> rope physics to your project. The rope component can be used to simulate simple wires or more advanced setups with pulleys and weights that require active collision detection. The bundled example scenes show how to connect the rope up to simulate cranes, rope bridges, swings and a boxing ring.</p>
<p>The rope component is written with performance in mind and many compute intensive tasks are handled by <a href="https://unity.com/dots">Unity jobs on separate threads accelerated using the Burst compiler</a>. As a result, the toolkit has excellent performance on mobile devices.</p>
<h4 id="features">Features</h4>
<ul>
<li>Stable &amp; fast rope physics</li>
<li>Mobile friendly!</li>
<li>Many tweakable user parameters</li>
<li>Ability to dynamically split ropes using the SplitAt() method</li>
<li>4 different rope connection types allow interaction with the rest of the scene
<ul>
<li>Pin Rope To Transform</li>
<li>Pin Transform To Rope</li>
<li>Pull Rigidbody To Rope</li>
<li>Two Way Coupling Between Rigidbody And Rope</li>
</ul>
</li>
<li>Scene view handles for adjusting rope spawn curve</li>
<li>High performance is achieved using Unity jobs and the Burst compiler
<ul>
<li>Typical performance for the example scene with collisions enabled:
<ul>
<li>~0.2 ms spent in job threads</li>
<li>~0.7 ms spent on the main thread</li>
</ul>
</li>
<li>Typical performance for the example scene with collisions disabled:
<ul>
<li>~0.15 ms spent in job threads</li>
<li>~0.35 ms spent on the main thread</li>
</ul>
</li>
</ul>
</li>
<li>Full source code</li>
<li>Example scenes
<ul>
<li>Main
<ul>
<li>Shows how ropes and rigidbodies can be connected together in a typical scene</li>
<li>Use the mouse to interact with the rope and the Space key to split ropes being interacted with</li>
</ul>
</li>
<li>DynamicAttach
<ul>
<li>Shows how to attach and detach ropes using the scripts</li>
</ul>
</li>
<li>BoxingRing
<ul>
<li>Shows how rope and rigidbodies can influence each other through collisions</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="current-limitations">Current Limitations</h4>
<ul>
<li>Collision support for convex Mesh, Box, Sphere and Capsule colliders only</li>
<li>Scripting knowledge required for creating stable rope suspended platforms other than rope bridges</li>
</ul>
<h4 id="requirements">Requirements</h4>
<ul>
<li>Burst 1.1.2 or above</li>
</ul>
</description>
</item>
<item>
<title>Sharp Shadows Toolkit</title>
<link>http://gustavolsson.com/projects/sharp-shadows-toolkit/</link>
<pubDate>Wed, 04 Sep 2019 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/sharp-shadows-toolkit/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/TGPnXySucr4"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/TGPnXySucr4?autoplay=1><img src=https://img.youtube.com/vi/TGPnXySucr4/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="sharp-shadows-toolkit">Sharp Shadows Toolkit</h2>
<p>The Sharp Shadows Toolkit is a code package that brings sharp, pixel-perfect shadows to your Universal Render Pipeline (URP) project. Many games and experiences target a non-photo-realistic art style for which sharp shadows are better suited than the built-in shadows that tend to be either too soft or too jagged, especially on low quality settings.</p>
<p>The toolkit can be useful in a wide variety of scenarios, from old-school drop shadows for characters in a mobile game to ubiquitous high quality shadows for an architecture visualization project.</p>
<h4 id="features">Features</h4>
<ul>
<li>Dynamic pixel-perfect shadows for the Lightweight/Universal Render Pipeline</li>
<li>No jagged shadow edges or visible pixels</li>
<li>Seamless editor integration using automatic asset post processing</li>
<li>Custom shadow direction for e.g. drop shadows</li>
<li>Two rendering modes
<ul>
<li><code>Inject Into Screen Space Shadow Resolve Texture</code>: Inject into screen space shadow texture for optimal image quality</li>
<li><code>Multiply Scene After Opaque</code>: Draw after opaque geometry for optimal performance</li>
</ul>
</li>
<li>Handles both skinned and non-skinned meshes</li>
<li>No restriction on the mesh geometry of the shadow caster</li>
<li>Multi-object editing</li>
<li>Fog support</li>
</ul>
<h4 id="current-limitations">Current Limitations</h4>
<ul>
<li>For the Lightweight/Universal Render Pipeline only</li>
<li>Only supports the main directional light of the scene</li>
<li>No support for custom vertex displacement</li>
<li>Alpha blended or clipped geometry will produce solid shadows (the shape of the triangles)</li>
<li>Skinned mesh shadows may appear cracked if they are subject to large deformations</li>
<li>Shadows are not anti-aliased when injected into screen space shadow texture</li>
</ul>
<h4 id="supported-unity-builds">Supported Unity builds</h4>
<table>
<thead>
<tr>
<th>Unity version</th>
<th>Build tested</th>
<th>LWRP/URP version</th>
</tr>
</thead>
<tbody>
<tr>
<td>Unity 2019.1</td>
<td>2019.1.10f1</td>
<td>5.7.2</td>
</tr>
<tr>
<td>Unity 2019.2</td>
<td>2019.2.3f1</td>
<td>6.9.1</td>
</tr>
<tr>
<td>Unity 2019.3</td>
<td>2019.3.0b2, 2019.3.5f1</td>
<td>7.0.1, 7.1.8</td>
</tr>
<tr>
<td>Unity 2021.1</td>
<td>2021.1.11f1</td>
<td>11.0.0</td>
</tr>
<tr>
<td>Unity 2021.2</td>
<td>2021.2.6f1, 2021.2.19f1</td>
<td>12.1.2, 12.1.6</td>
</tr>
<tr>
<td>Unity 2021.3</td>
<td>2021.3.22f1</td>
<td>12.1.10</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>Note</strong> Due to the large number of possible Unity/URP version combinations, only the above combinations are officially supported.</p>
</blockquote>
</description>
</item>
<item>
<title>Inversed Timing Belt</title>
<link>http://gustavolsson.com/projects/inversed-timing-belt-idea/</link>
<pubDate>Tue, 12 Mar 2019 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/inversed-timing-belt-idea/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/2YC-0C8oPUo"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/2YC-0C8oPUo?autoplay=1><img src=https://img.youtube.com/vi/2YC-0C8oPUo/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="inversed-timing-belt-transmission">Inversed Timing Belt Transmission</h2>
<p>One day, I had an idea for a compact gearing mechanism. It is light, compact and has no backlash (that I&rsquo;ve noticed). The inner pulley is 20 teeth, the outer ring is 120 teeth and the belt is 150 teeth.</p>
<p>It was a nightmare to compute the dimensions analytically so I finally gave up and made a small python program that solved the problem numerically. This worked out great and I was able to 3d print the prototype shown in the video above.</p>
<h4 id="behavior-under-load">Behavior under load</h4>
<p>I was initially hopeful that the setup would perform well under load, but that turned out to be false. Unfortunately, when a load is applied there is a small inwards force on the belt making it prone to detaching from the outer ring.</p>
<p>Increasing the number of bearings or replacing them with a continous loop of pins/cylinders that rotate as the belt rotates might minimize the issue, but I&rsquo;ve not gotten around to try it yet.</p>
<h4 id="prior-work">Prior work</h4>
<p>After coming up with the idea, I found a similar mechanism mentioned in the conference paper <code>ePaddle mechanism: Towards the development of a versatile amphibious locomotion mechanism</code>. After publishing the video above I got a comment that directed me to a US patent (<code>US5954611</code>) that seems to describe the same mechanism in detail.</p>
</description>
</item>
<item>
<title>Seaside Racing Remastered (Windows/macOS/Linux)</title>
<link>http://gustavolsson.com/blog/seaside-racing-remastered/</link>
<pubDate>Tue, 12 Mar 2019 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/blog/seaside-racing-remastered/</guid>
<description><p>After getting an email from yet another person who enjoyed the original Seaside Racing back when it was released on the Xbox 360 in 2010, I decided to start working on a PC port last summer. After a few months of part-time work, it is finally done!</p>
<p>Check it out on itch.io here: <a href="http://seasideracing.se">seasideracing.se</a></p>
<p>The gameplay should be exactly the same as the original and the graphics a bit better. The Xbox avatars have been replaced by my own set of randomly generated characters that look just mad enough. There is both keyboard and gamepad support now and there is also an option for 2 players to share a gamepad (in case you have fewer gamepads than players on the couch). There are also some small improvements: You can now see if someone is spectating (and waiting to join) and the host also has the ability to restart a race early (to let spectators into the game).</p>
<p>Most of the work I did was on the networking backend. I used the excellent MonoGame framework to replace the deprecated XNA framework and it worked very well for the most part, but the networking had to be re-written from scratch. Other Xbox Live Indie Games that supported networking should be able to use my work, please let me know if you know of any!</p>
</description>
</item>
<item>
<title>Seaside Racing</title>
<link>http://gustavolsson.com/projects/seaside-racing/</link>
<pubDate>Fri, 22 Feb 2019 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/seaside-racing/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/p0fVm1LTZUw"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/p0fVm1LTZUw?autoplay=1><img src=https://img.youtube.com/vi/p0fVm1LTZUw/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="seaside-racing">Seaside Racing</h2>
<p>Experience the thrill of driving a soapbox car down a mountain in this chaotic cult classic kart racer, accidentally knocking your competitors into the sea or getting lost in green fields without as much as a road sign to help you find your way.</p>
<h4 id="actual-features">Actual features</h4>
<ul>
<li>Physics-based multiplayer kart racing!</li>
<li>Up to 12 players over the Internet or local network</li>
<li>1-4 local players split screen (online or offline)</li>
<li>Share-a-gamepad option for up to 4 players using 2 game pads</li>
</ul>
<h4 id="questionable-features">Questionable features</h4>
<ul>
<li>3 large seaside maps (no more, no less)</li>
<li>Randomly generated avatars (you can switch but not choose)</li>
<li>Possible to get lost (the game doesn&rsquo;t even know where to go)</li>
<li>Unpredictable respawn logic (that makes it possible to reach tricky places)</li>
<li>No placement indicator</li>
</ul>
<h4 id="cult-classic">Cult classic</h4>
<p>This is a remastered version of the <a href="http://gustavolsson.com/projects/seaside-racing-xblig/">original Seaside Racing</a> that was released on Xbox Live Indie Games in 2010.</p>
<p>The original game has a cult following among <em>at least</em> one group of friends in Indiana, USA, since its original release on Xbox Live Indie Games in 2010. Since publishing this, I&rsquo;ve also been notified that there is a cult following in High Wycombe, England, UK in addition to the aforementioned cult following in the USA.</p>
</description>
</item>
<item>
<title>Sokol for Android</title>
<link>http://gustavolsson.com/projects/sokol-android/</link>
<pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/sokol-android/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/sokol-android/phone.jpg"><img width="100%" src="http://gustavolsson.com/projects/sokol-android/phone_hu535661bce2c742bf7a0f6a055ac0b6d1_1581504_1200x0_resize_q70_box.jpg"></a></p>
<p>The Sokol libraries by <a href="https://twitter.com/FlohOfWoe">@Andre Weissflog</a> are simple <a href="https://github.com/nothings/stb/blob/master/docs/stb_howto.txt">STB-style</a> cross-platform libraries for C and C++ (written in C) that make it easy to create 2d and 3d graphics projects that work on multiple platforms.</p>
<p>As I had an Android phone at the time, I spent some time implementing Android support in the Sokol library that takes care of context creation, <code>sokol_app.h</code>. My changes were merged in January 2019.</p>
</description>
</item>
<item>
<title>PICO-8 Display Driver</title>
<link>http://gustavolsson.com/projects/pico8-display-driver/</link>
<pubDate>Thu, 30 Aug 2018 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/pico8-display-driver/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/pico8-display-driver/dd_jelpi.jpg"><img width="100%" src="http://gustavolsson.com/projects/pico8-display-driver/dd_jelpi_hu0e59e5cbb7aafc4c6c796ed314c54d2b_1171914_1200x0_resize_q70_box.jpg"></a></p>
<h2 id="pico-8-display-driver">PICO-8 Display Driver</h2>
<p>I got an idea the other day to write a display driver in PICO-8 using the GPIO pins and here it is. The cart replaces the <code>flip()</code> function with a custom one that writes the PICO-8 frame buffer to a connected display (with a ssd1351 controller) over <a href="https://en.wikipedia.org/wiki/Serial_Peripheral_Interface">SPI</a> using the GPIO pins on a Raspberry Pi. Turns out that it actually works :)</p>
<p>I use <a href="https://www.adafruit.com/product/1431">this display/controller board from Adafruit</a></p>
<p>Emulating SPI over the GPIO pins seems to be quite slow however and it takes about 5 seconds to render a single frame. I believe that if zep <a href="http://wiringpi.com/reference/spi-library/">exposes the hardware SPI functionality of wiringPi</a> in addition to the GPIO pins it would run in real time. You can try commenting out the first line in <code>spi_write_n()</code> to &ldquo;emulate&rdquo; hardware SPI (with DD_ENABLE=TRUE).</p>
<p>Instructions are included in the cart if you would like to try it at home. Remember to enable GPIO pins on the RPi first and running pico8 as super user (&ldquo;sudo ./pico8&rdquo;)</p>
<p>Wishlist:</p>
<pre tabindex="0"><code>* hardware spi (example: spi8(byte), spi32(four_bytes), spi(0x6000,8192) -- from memory)
* delay functionality (like Arduino&#39;s delayMicros())
</code></pre><h4 id="update-2020-09-05">UPDATE! (2020-09-05)</h4>
<p>After checking the <a href="https://www.lexaloffle.com/pico8_manual.txt">official PICO-8 manual</a>, it seems like zep added support for hardware SPI by means of the <code>serial()</code> function in version 0.1.12!</p>
</description>
</item>
<item>
<title>Master's Thesis</title>
<link>http://gustavolsson.com/projects/masters-thesis/</link>
<pubDate>Tue, 01 Mar 2016 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/masters-thesis/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/2PQxhMdhRSw"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/2PQxhMdhRSw?autoplay=1><img src=https://img.youtube.com/vi/2PQxhMdhRSw/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="masters-thesis--dice-stockholm">Master&rsquo;s Thesis @ DICE Stockholm</h2>
<p>As my master&rsquo;s thesis in Complex Adaptive Systems at <a href="https://www.chalmers.se/">Chalmers University of Technology</a>, I developed a new system for real-time water animation and rendering that enables realistic interactions between water and terrain in virtual scenes. I implemented the system in Frostbite, DICE&rsquo;s in-house game engine. The thesis was carried out as a master&rsquo;s thesis worker/intern on the Battlefield 1 team.</p>
<h4 id="abstract">Abstract</h4>
<p>Realistic simulation and rendering of water is a challenge within the field of computer graphics because of its inherent multi-scale nature. When observing a large body of water such as the sea, there are small waves and perturbations visible close to the observer. As the distance increases, the small scale details form large scale wave patterns that may be several kilometers away. A common approach to rendering large bodies of water in real-time is to simulate deep water waves in a small area and repeat the wave motions across the water surface at different spatial scales in order to minimize repetition patterns. This method gives excellent results at open sea but cannot react to changes in water depth or the terrain of the virtual scene. In this thesis, an algorithm for rendering large expanses of water that interact with the terrain of the virtual scene in real-time is presented. The proposed algorithm first simulates water waves in a pre-computation step and saves wavefront parameters on a coarse triangle mesh as proposed by Jeschke and Wojtan [2015]. Then, the stored simulation is evaluated and the water surface is rendered in real-time using a novel staggered update scheme. The staggered update scheme effectively improves the rendering performance by a factor of 8 and makes it possible to render water surfaces of up to 16 square kilometers with excellent visual quality and wave patterns at multiple spatial scales.</p>
</description>
</item>
<item>
<title>Ocean Toolkit</title>
<link>http://gustavolsson.com/projects/ocean-toolkit/</link>
<pubDate>Tue, 16 Feb 2016 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/ocean-toolkit/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/cbI2lq2HWZU"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/cbI2lq2HWZU?autoplay=1><img src=https://img.youtube.com/vi/cbI2lq2HWZU/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="ocean-toolkit">Ocean Toolkit</h2>
<p>The Ocean Toolkit is a code package that brings realistic infinite ocean rendering to your Unity3d project. The water surface is offset according to a custom wave function which can be used to control large scale waves. Small scale waves are realized using scrolling normal maps. The toolkit is easy-to-use and does not require any coding. Works with the <a href="http://gustavolsson.com/projects/buoyancy-toolkit/">Buoyancy Toolkit</a> out-of-the-box.</p>
<h4 id="features">Features</h4>
<ul>
<li>Realistic infinite ocean rendering</li>
<li>Customizable wave function that offsets the water surface</li>
<li>Small scale detail realized using scrolling normal maps</li>
<li>Refraction and underwater light absorption to accurately convey depth</li>
<li>Reflections using Screen Space Raytracing or conventional reflection probes</li>
<li>Shoreline foam</li>
<li>Optional caustics for the seafloor</li>
<li>Clean look that fits most projects</li>
<li>Can be clipped to a rectangle for lakes</li>
<li>Runs well on high-end Android devices (tested on a Moto X 2nd gen using fixed refraction color and low poly screen space mesh)</li>
</ul>
<h4 id="current-limitations">Current Limitations</h4>
<ul>
<li>There is currently no image effect for when the camera is below the water surface</li>
</ul>
</description>
</item>
<item>
<title>Laser Scanner Prototype</title>
<link>http://gustavolsson.com/blog/laser-scanner-prototype/</link>
<pubDate>Sun, 15 Nov 2015 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/blog/laser-scanner-prototype/</guid>
<description><p>For the last couple of weeks, I&rsquo;ve been working on a custom laser scanner design. Basically, a laser scanner is a device that uses 2 mirrors to direct a laser beam to a specific point in space and it can, when moving fast enough, be used to draw geometric patterns onto some planar surface. The reason I&rsquo;m interested in building a laser scanner is that they&rsquo;re a fundamental component of many CNC machines such as high-end 3d printers (based on the Selective Laser Sintering (SLS) or Stereolithography (SLA) techniques) or etching machines.</p>
<p>The plan is to first create a XY-scanner module that is capable of reasonable resolution (~50 micrometers = 0.05mm) within a small rectangular area (100x100mm) on a planar surface. The next step is to design an open-source laser etching module that can be used as an experimentation platform for different manufacturing techniques. The first steps could be laser etching or even cutting of very thin sheets of different materials. When this works, I imagine add-ons to this platform that enables SLS or SLA 3d printing with minimal external components.</p>
<p>I&rsquo;ve completed a first prototype using stepper motors to drive the 2 mirrors. The stepper motors have a resolution of 0.9 degrees per step, resulting in 400 steps per revolution. This is nowhere near the resolution required but I wanted to experiment with how well microstepping can increase this resolution in practice. In theory, microstepping should increase the resolution by 32-128x depending on what motor driver is used. In practice however, the microsteps are not even enough to be usable. The motor can step 4-8 microsteps with reasonable linearity but every now and then a &ldquo;microstep&rdquo; occurs that is 2-4 times the angle of the others. Increasing the current limit makes it better, but the current required to make the movement reasonably smooth at low speeds is so great that the motor becomes extremely hot and starts to stall. I&rsquo;ve tried with one Nema 14 motor with a rated current of 0.5A and one Nema 17 motor rated for 1.2A.</p>
<div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/xjAPKuPjYdk"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/xjAPKuPjYdk?autoplay=1><img src=https://img.youtube.com/vi/xjAPKuPjYdk/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<p>Bottom line: microstepping should really only be used to make the movement of a stepper motor smoother, not to increase its resolution.</p>
<p>So this leaves me with 3 options: use some kind of gearing to improve the resolution of the stepper motors, use off-the-shelf galvanometers or design custom galvanometers from scratch. I don&rsquo;t like option one because it seems overly complicated for the problem at hand (rotate a mirror over a [-15,15] degree range), there will be mechanical backlash in such a system, and geared stepper motors are both expensive and difficult to source. I&rsquo;m not even going to consider option two because retail galvanometers are even more expensive and difficult to source.</p>
<p>This leaves me with option three, designing my own laser galvanometer. Since this is quite a big undertaking I will go slow and put this project on the back-burner for the time being. Time to focus on other stuff!</p>
<p>PS. I&rsquo;m a newbie when it comes to electronics so please don&rsquo;t take my word for anything I say in this area.</p>
</description>
</item>
<item>
<title>Hello! (New website in 2015)</title>
<link>http://gustavolsson.com/blog/hello-2015/</link>
<pubDate>Thu, 22 Oct 2015 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/blog/hello-2015/</guid>
<description><p>When I moved to the new site, I decided not to have a blog because I wanted to focus on making things instead writing updates. What I&rsquo;ve realized is that there is a point to summarizing and publishing a log entry of what I work on from time to time. It helps me see the progress that I&rsquo;m making more clearly and it also gives me time to think through the decisions I make along the way. So here it is!</p>
<p>This log will primarily be written for myself as a reference for the future and as a means to be more productive. However, I will also post more official news items regarding my commercial projects from time to time.</p>
<p>Lately, I have been focused on physical projects so the log will start off with these and then as I get more free time from university I&rsquo;ll start working on the go toolkits again. I have a long list of improvements I want to make to each of the toolkits, so stay tuned :)</p>
</description>
</item>
<item>
<title>Top-Down Resin 3d Printer</title>
<link>http://gustavolsson.com/projects/resin-printer-idea/</link>
<pubDate>Thu, 24 Sep 2015 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/resin-printer-idea/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/resin-printer-idea/sketch.jpg"><img width="100%" src="http://gustavolsson.com/projects/resin-printer-idea/sketch_hu96917e10bf73bb983323b5b353061619_664476_1200x0_resize_q70_box.jpg"></a></p>
<h2 id="top-down-resin-3d-printer-idea">Top-Down Resin 3d Printer Idea</h2>
<p>The idea is to use a pocket of air to keep the surface level of the resin constant throughout the build, guaranteeing consistent layer heights. In addition, the higher pressure might ease reflow of resin after dipping?</p>
<p>High print speeds might be possible if the pocket is filled with pure oxygen gas that inhibits resin hardening at the surface. The focus point of the projector should then be slightly below the surface of the resin. As the resin solidifies slightly below the surface and is pulled down by the platform, new resin flows in from all sides (ideally) undisturbed by the effect of surface tension.</p>
</description>
</item>
<item>
<title>Mail Monster (LD#33)</title>
<link>http://gustavolsson.com/projects/mail-monster/</link>
<pubDate>Tue, 25 Aug 2015 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/mail-monster/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/mail-monster/1.png"><img width="100%" src="http://gustavolsson.com/projects/mail-monster/1_hu6445cea4e11c16c369e927816de56f3c_60351_1200x0_resize_q70_bgffffff_box_3.jpg"></a></p>
<h2 id="mail-monster-ludum-dare-33">Mail Monster (Ludum Dare #33)</h2>
<p>You are the mail monster, pick up the mail without ruining the whole town! (You get a time penalty if you happen to destroy anything)</p>
<p><code>ARROWS TO MOVE+C TO JUMP</code></p>
</description>
</item>
<item>
<title>Dōbutsu Ball (NMS2014)</title>
<link>http://gustavolsson.com/projects/dobutsu-ball/</link>
<pubDate>Sat, 23 Aug 2014 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/dobutsu-ball/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/dobutsu-ball/Title.png"><img width="100%" src="http://gustavolsson.com/projects/dobutsu-ball/Title_hu4e20d11e5d28acb5c233ba5b6dc6a042_4684345_1200x0_resize_q70_bgffffff_box_3.jpg"></a></p>
<h2 id="dōbutsu-ball-no-more-sweden-2014">Dōbutsu Ball (No More Sweden 2014)</h2>
<p>Me and two friends, <a href="https://twitter.com/ossianboren">Ossian</a> and <a href="https://twitter.com/kjellhaften">Kjell</a>, made a game called Dōbutsu Ball during the No More Sweden 2014 game jam. It&rsquo;s a game about two animals trapped in an eternal dodgeball match.</p>
<h4 id="presentation">Presentation</h4>
<p>See our presentation at the 1 minute 40 second mark below:</p>
<div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/ITZBBWLYv-8"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/ITZBBWLYv-8?autoplay=1><img src=https://img.youtube.com/vi/ITZBBWLYv-8/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
</description>
</item>
<item>
<title>Quadcopter Autopilot</title>
<link>http://gustavolsson.com/projects/autoquad/</link>
<pubDate>Thu, 30 Aug 2012 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/autoquad/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/QRjoU2Wplj4"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/QRjoU2Wplj4?autoplay=1><img src=https://img.youtube.com/vi/QRjoU2Wplj4/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="quadcopter-autopilot">Quadcopter Autopilot</h2>
<p>This is an autopilot for a quadcopter drone I wrote from scratch back in 2012. I used the physics engine in Unity3d to validate my ideas and develop the control logic, then I used the same autopilot code in a physical set up.</p>
<p>At the time, I was very new to electronics and I chose an embedded platform that required the code to run on a host computer. Thus, a sensor reading had to travel from the IMU on the quadcopter to the host computer (via USB) and then the control signal had to travel back again to the motor controllers. Unfortunately, this introduced a considerable delay in the control loop which made the quadcopter oscillate once airborne. However, the quadcopter actually flew a couple of times so I call the endeavour a success!</p>
</description>
</item>
<item>
<title>Shadow Volumes Toolkit</title>
<link>http://gustavolsson.com/projects/shadow-volumes-toolkit/</link>
<pubDate>Mon, 01 Aug 2011 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/shadow-volumes-toolkit/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/shadow-volumes-toolkit/1.png"><img width="100%" src="http://gustavolsson.com/projects/shadow-volumes-toolkit/1_hu4d55def35ea0a7d7f457348786022a5a_231336_1200x0_resize_q70_bgffffff_box_3.jpg"></a></p>
<h2 id="shadow-volumes-toolkit">Shadow Volumes Toolkit</h2>
<blockquote>
<p><strong>This package is DEPRECATED</strong> See the <a href="http://gustavolsson.com/projects/sharp-shadows-toolkit/">Sharp Shadows Toolkit</a> for modern alternative!</p>
</blockquote>
<p>The Shadow Volumes Toolkit adds dynamic, pixel-perfect shadows to your projects. Use the Quick Shadow Setup dialog to instantly add shadows to your game objects, specify light/shadow properties and see the results in real-time. The toolkit supports all three Unity light types and any mesh can act as a shadow caster.</p>
<h4 id="features">Features</h4>
<ul>
<li>Dynamic, pixel-perfect shadows based on the Shadow Volume algorithm</li>
<li>Stencil buffer support in Unity 4.2</li>
<li>Supports all three Unity light types</li>
<li>Supports skinned meshes</li>
<li>Works even when the camera is in shadow</li>
<li>No scripting required</li>
</ul>
<p>The toolkit is not&hellip;</p>
<ul>
<li>a complete renderer</li>
<li>a replacement for Unity Pro lighting/shadows</li>
<li>using the patented depth-fail technique</li>
</ul>
<h4 id="limitations">Limitations</h4>
<ul>
<li>Antialiasing only works with the Stencil Buffer backend</li>
<li>Best performance is achieved with 2-manifold/closed source meshes</li>
<li>Only a single light can cast shadows at any given moment</li>
<li>Custom vertex shaders won&rsquo;t affect shadows</li>
</ul>
<h4 id="video">Video</h4>
<div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/6u_56AH5FNo"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/6u_56AH5FNo?autoplay=1><img src=https://img.youtube.com/vi/6u_56AH5FNo/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
</description>
</item>
<item>
<title>Shatter Toolkit</title>
<link>http://gustavolsson.com/projects/shatter-toolkit/</link>
<pubDate>Fri, 08 Jul 2011 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/shatter-toolkit/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/zP86sce0pLk"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/zP86sce0pLk?autoplay=1><img src=https://img.youtube.com/vi/zP86sce0pLk/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="shatter-toolkit">Shatter Toolkit</h2>
<p>The Shatter Toolkit enables you to easily shatter or split any game object dynamically in real-time, whether you want to smash walls or slice fruits. The toolkit creates the necessary geometry, fills the holes and instantiates the new game objects for you.</p>
<p>One line of code shatters or splits a game object and no scripting is required if you use the bundled helper scripts.</p>
<h4 id="features">Features</h4>
<ul>
<li>Split game objects by specifying an array of planes</li>
<li>Shatter game objects by specifying a point</li>
<li>Fills the holes (cut area) in the mesh after a split has occurred</li>
<li>Tweakable uv-mapping for the cut area
<ul>
<li>WorldUvMapper - repeats a texture a number of times per world-unit</li>
<li>TargetUvMapper - maps the cut area to a specific part of the texture</li>
</ul>
</li>
<li>No scripting required</li>
</ul>
</description>
</item>
<item>
<title>Buoyancy Toolkit</title>
<link>http://gustavolsson.com/projects/buoyancy-toolkit/</link>
<pubDate>Sun, 09 Jan 2011 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/buoyancy-toolkit/</guid>
<description><div class="video">
<iframe
src="https://www.youtube-nocookie.com/embed/IcAQa3lOk0g"
srcdoc="<style>*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;top:0;bottom:0;width:100%;margin:auto;}span{height:1.5em;text-align:center;font:60px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black;}</style><a href=https://www.youtube-nocookie.com/embed/IcAQa3lOk0g?autoplay=1><img src=https://img.youtube.com/vi/IcAQa3lOk0g/hqdefault.jpg><span>▶</span></a>"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
<h2 id="buoyancy-toolkit">Buoyancy Toolkit</h2>
<p>The Buoyancy Toolkit is a code package for the Unity3d game engine that brings realistic buoyancy simulation to your project. Rigidbodies will float when submerged in fluid volumes of different densities and wave functions such as water pools or oceans with large waves. The shape and volume of one or more connected colliders will be taken into account to let the geometry follow the waves realistically. The toolkit is ideal for making anything float in water but can also be used to simulate the lift a balloon or airship experiences in the atmosphere. The toolkit is easy-to-use and does not require any scripting. Works with the <a href="http://gustavolsson.com/projects/ocean-toolkit/">Ocean Toolkit</a> out-of-the-box.</p>
<h4 id="features">Features</h4>
<ul>
<li>Realistic buoyancy simulation</li>
<li>Surface waves if a wave function is specified (using a custom script, example provided)</li>
<li>Weighting for straightforward tweaking of the buoyancy force</li>
<li>Disable weighting and use realistic object properties (scale, mass, fluid density) to mimic real-life</li>
<li>Works well with other rigidbody forces</li>
</ul>
</description>
</item>
<item>
<title>Seaside Racing (XBLIG)</title>
<link>http://gustavolsson.com/projects/seaside-racing-xblig/</link>
<pubDate>Sun, 25 Jul 2010 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/seaside-racing-xblig/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/seaside-racing-xblig/logo.png"><img width="100%" src="http://gustavolsson.com/projects/seaside-racing-xblig/logo_hueb100b72a2ac6c06d21dc19eb9d6ece7_103663_1200x0_resize_q70_bgffffff_box_3.jpg"></a></p>
<h2 id="seaside-racing-xbox-live-indie-games">Seaside Racing (Xbox Live Indie Games)</h2>
<p><a href="http://gustavolsson.com/projects/seaside-racing/">Check out the remastered Windows/Steam Deck/Linux version here!</a></p>
<p>Compete with your friends in this multiplayer kart racer! Play 1-4 players splitscreen either locally, over system link or on Xbox Live for a total of 8 players. Use your own Xbox Avatar and race through 3 different seaside courses!</p>
<h4 id="features">Features</h4>
<ul>
<li>Physics-based multiplayer kart racing!</li>
<li>Up to 8 players on Xbox Live or over System link</li>
<li>1-4 players splitscreen (online or offline)</li>
<li>3 playable maps</li>
</ul>
</description>
</item>
<item>
<title>Sailor (LD#11)</title>
<link>http://gustavolsson.com/projects/sailor/</link>
<pubDate>Sun, 20 Apr 2008 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/sailor/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/sailor/1.png"><img width="100%" src="http://gustavolsson.com/projects/sailor/1_hub03ba823582ca3490a568a8be7a7a784_40232_1200x0_resize_q70_bgffffff_box_3.jpg"></a></p>
<h2 id="sailor-ludum-dare-11">Sailor (Ludum Dare #11)</h2>
<p>The game let’s you build a boat and sail the sea. Try to stay afloat as long as possible, it’s not as easy as it sounds!</p>
</description>
</item>
<item>
<title>Physics Engine</title>
<link>http://gustavolsson.com/projects/physics-engine-old/</link>
<pubDate>Mon, 01 Jan 2007 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/physics-engine-old/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/physics-engine-old/6.png"><img width="100%" src="http://gustavolsson.com/projects/physics-engine-old/6_hu9d9c4f4d0fa852c912334d7d9c496874_68176_1200x0_resize_q70_bgffffff_box_3.jpg"></a></p>
<h2 id="physics-engine">Physics Engine</h2>
<p>This is a 3d rigidbody physics engine I wrote in high-school. I later used it to create the <a href="http://gustavolsson.com/projects/seaside-racing-xblig/">original</a> and the <a href="http://gustavolsson.com/projects/seaside-racing/">remastered</a> version of Seaside Racing.</p>
<h4 id="collision-detection">Collision Detection</h4>
<p>I implemented the <a href="https://en.wikipedia.org/wiki/Gilbert%E2%80%93Johnson%E2%80%93Keerthi_distance_algorithm">Gilbert-Johnson-Keerthi distance algorithm</a> to handle collision detection. As it turns out, the Expanding Polytype Algorithm is not needed to find good contact points when objects intersect (because of the shape of the Minkowski Sum/Difference on intersection) and I used a much simpler algorithm that simply shot a ray &ldquo;out&rdquo; along the line going through the two objects&rsquo; centers. This worked extremely well in practice!</p>
</description>
</item>
<item>
<title>Real-Time Raytracer (CPU)</title>
<link>http://gustavolsson.com/projects/real-time-raytracer-old/</link>
<pubDate>Sun, 01 Jan 2006 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/real-time-raytracer-old/</guid>
<description><p>A short-lived experiment with real-time raytring on the CPU, written in C++.</p>
<p>The idea was that one could use an adaptively tesselated screen space grid to only raytrace pixels that influenced the end result greatly, for example pixels along the edge of an object or edge of a region in shadow.</p>
<p>If the 4 corner pixels of a grid cell where different enough, the grid cell would be subdivided into 4 sub-cells that were evaluated further. Once a grid cell was deemed &ldquo;good enough&rdquo;, pixels still left inside the cell were colored using linear interpolation.</p>
<p>The inner workings of the algorithm is most visible in the first set of images in the gallery below:</p>
</description>
</item>
<item>
<title>Early Projects (1999-2006)</title>
<link>http://gustavolsson.com/projects/early-projects/</link>
<pubDate>Fri, 01 Jan 1999 00:00:00 +0000</pubDate>
<guid>http://gustavolsson.com/projects/early-projects/</guid>
<description>
<p><a href="http://gustavolsson.com/projects/early-projects/robo2.jpg"><img width="100%" src="http://gustavolsson.com/projects/early-projects/robo2_hua3111abb8b3e8862f83204d59f567fdc_14484_1200x0_resize_q70_box.jpg"></a></p>
<h2 id="early-projects-1999-to-2007">Early Projects (1999 to 2007)</h2>
<p>This page is dedicated to my early travels into programming and computer graphics. The code for most of these experiments and small programs are long gone, but I&rsquo;ve managed to find some remnants in the form of screenshots :)</p>
<h4 id="robo-2003">Robo (2003)</h4>
<p>Robo was my first ever 3d game. I wrote it using Visual Basic 6 and DirectX8 when I was 13 years old, and I was very proud :)</p>
</description>
</item>
</channel>
</rss>