<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-32636428</id><updated>2026-09-16T07:02:30.506-06:00</updated><category term="Blender"/><category term="Flash"/><category term="3d"/><category term="Bits of Blender"/><category term="AS3"/><category term="Programming"/><category term="b3d"/><category term="Game"/><category term="Painter"/><category term="YouTube"/><category term="Flex"/><category term="meeting"/><category term="Python"/><category term="ECS"/><category term="FlashDevelop"/><category term="SpriteKit"/><category term="AstraItinera"/><category term="DAZ"/><category term="Perl"/><category term="Swash"/><category term="Swashteroids"/><category term="html"/><category term="iPad"/><category term="typography"/><category term="Alice"/><category term="ArtRage"/><category term="Books"/><category term="Bryce"/><category term="Swift"/><category term="XSLT"/><category term="addon"/><category term="iOS"/><category term="CSS"/><category term="Captivate"/><category term="Comic Book App"/><category term="DVDs"/><category term="Director"/><category term="Grep"/><category term="Illustrator"/><category term="InDesign"/><category term="Near Mint"/><category term="Photoshop"/><category term="Processing"/><category term="SketchUp"/><category term="bit"/><category term="java"/><title type='text'>Nyquist Art + Logic</title><subtitle type='html'>A little info for artists and programmers.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>184</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32636428.post-1260170902092678182</id><published>2026-03-01T12:13:00.001-07:00</published><updated>2026-03-01T12:13:18.780-07:00</updated><title type='text'>Amazing Spider-Man</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie9ORW_Rusx4LNaXTdh4BqxXPcFPvW38ZcFPDLOnDdKhiY8qTBLEVnIno81R9B_G3NnvvA6stOH7a2MG-r3X2qElGRu-xxeAINrn-cX-Q6wMEjXvk646F7UbAngymH-i_ZA6GBY_7SxEswgXJLGfhkObzvGPZRtFSJe6yG-mzXQbG8XpT3i8X00A/s1093/Spider-Man%20on%20newsprint2%20copy.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;867&quot; data-original-width=&quot;1093&quot; height=&quot;508&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie9ORW_Rusx4LNaXTdh4BqxXPcFPvW38ZcFPDLOnDdKhiY8qTBLEVnIno81R9B_G3NnvvA6stOH7a2MG-r3X2qElGRu-xxeAINrn-cX-Q6wMEjXvk646F7UbAngymH-i_ZA6GBY_7SxEswgXJLGfhkObzvGPZRtFSJe6yG-mzXQbG8XpT3i8X00A/w640-h508/Spider-Man%20on%20newsprint2%20copy.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

My Blender Grease Pencil illustration &quot;Amazing Spider-Man&quot; made the CGCookie 2025 reel and it was the only Grease Pencil illustration to make the reel!&amp;nbsp;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;What started as a doodle while I was on the phone, turned into a finished illustration. Using the Grease Pencil can be challenging and rewarding. I learned quite a bit from Grease Pencil guru Paul Caggegi’s excellent courses on the topic.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;The style of the illustration attempts to reflect the Silver Age/Bronze Age of comic books. I even worked with the palette of colors comics used at that time.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CGCookie is the premier Blender training site, so it was quite an honor. Check out the reel here: &lt;a href=&quot;https://lnkd.in/eVftUGEb&quot;&gt;https://lnkd.in/eVftUGEb&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/1260170902092678182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2026/03/amazing-spider-man.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1260170902092678182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1260170902092678182'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2026/03/amazing-spider-man.html' title='Amazing Spider-Man'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie9ORW_Rusx4LNaXTdh4BqxXPcFPvW38ZcFPDLOnDdKhiY8qTBLEVnIno81R9B_G3NnvvA6stOH7a2MG-r3X2qElGRu-xxeAINrn-cX-Q6wMEjXvk646F7UbAngymH-i_ZA6GBY_7SxEswgXJLGfhkObzvGPZRtFSJe6yG-mzXQbG8XpT3i8X00A/s72-w640-h508-c/Spider-Man%20on%20newsprint2%20copy.jpeg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-6179956875400496120</id><published>2026-02-16T07:20:00.001-07:00</published><updated>2026-02-16T07:37:56.314-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Does This Compile?</title><content type='html'>&lt;p&gt;When I was teaching at Sun Microsystems (2000-2002), I created the example below for my Java classes. Around day 3 or 4 I would start writing it on the whiteboard piece-by-piece and asking &quot;does this compile?&quot; Then I&#39;d proceed to walk the students through why it worked. The point was to show how identifiers are resolved, and then show things that would conflict and why.&lt;/p&gt;

&lt;p&gt;What’s changed is I added a little generic static method to add to the fun (they weren’t in the language when I taught).&lt;/p&gt;

&lt;pre style=&quot;background:#f4f4f4; border:1px solid #ddd; padding:15px; overflow:auto; font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace; font-size:13px; line-height:1.4;&quot;&gt;
class x {
    static x x = new x();
    x() { }
    x x(x x) {
        return x;
    }
    static &amp;lt;x&amp;gt; x x(x x) {
        return x;
    }
    public static void main(String[] args) {
        x x = new x();
        System.out.println(x.&amp;lt;String&amp;gt;x(&quot;x&quot;));
    }
}
&lt;/pre&gt;

&lt;p&gt;This code compiles and, when run, prints:&lt;/p&gt;

&lt;pre style=&quot;background:#f4f4f4; border:1px solid #ddd; padding:15px; overflow:auto; font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace; font-size:13px;&quot;&gt;
x
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/6179956875400496120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2026/02/does-this-compile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6179956875400496120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6179956875400496120'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2026/02/does-this-compile.html' title='Does This Compile?'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-6798710147443770264</id><published>2025-08-26T07:21:00.005-06:00</published><updated>2026-02-16T07:38:48.629-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="addon"/><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #79 - Stroke Material Add-On</title><content type='html'>&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot; src=&quot;https://www.youtube.com/embed/wZIUoDLiIMM&quot; title=&quot;Bits of Blender #79 - Stroke Material Add-On&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;In this Bit I show you my new Stroke Material Display add-on/extension. If you work with the Grease Pencil, you may find this very helpful.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://extensions.blender.org/add-ons/stroke-material-display/&quot;&gt;Stroke Material Display on Blender Extensions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The superhero in the video is Safeguard, one of the heroes from &lt;a href=&quot;https://mostcomics.com/&quot;&gt;MOST: The Adventures of Ion and Echo!&lt;/a&gt; and used courtesy of MOST Comics, LLC.&lt;/p&gt;

&lt;p&gt;MOST is a free web comic book done in the classic style of the Silver/Bronze age of comic book. It was done by Richard when he was in college.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/6798710147443770264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/08/bits-of-blender-79-stroke-material-add.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6798710147443770264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6798710147443770264'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/08/bits-of-blender-79-stroke-material-add.html' title='Bits of Blender #79 - Stroke Material Add-On'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/wZIUoDLiIMM/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-1072231352859084124</id><published>2025-08-02T07:30:00.004-06:00</published><updated>2026-02-16T07:40:32.825-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #78 - Mirror and Bisect</title><content type='html'>&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;&quot;&gt;
  &lt;iframe style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot; src=&quot;https://www.youtube.com/embed/MMStT4hhE-k&quot; title=&quot;Bits of Blender #78 - Mirror and Bisect&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;I watched a great video by Lino Thomas at the Blender 2022 conference. Afterwards I felt like I had to explore further mirroring and bisecting (and flipping) to create complexity using the mirror modifier.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0plU9RGxHNI&quot;&gt;One hour of greeble - Live workshop at the Blender Conference 2022&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/1072231352859084124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/08/bits-of-blender-78-mirror-and-bisect.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1072231352859084124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1072231352859084124'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/08/bits-of-blender-78-mirror-and-bisect.html' title='Bits of Blender #78 - Mirror and Bisect'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/MMStT4hhE-k/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-7010370424485536443</id><published>2025-07-07T18:39:00.008-06:00</published><updated>2026-02-16T07:39:24.920-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #77 - Distribute Strokes Extension</title><content type='html'>&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/K4G_dEn5j9E&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;span face=&quot;Roboto, Noto, sans-serif&quot; style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; orphans: 2; white-space: pre-wrap; widows: 2;&quot;&gt;I created a simple extension/add-on to distribute Grease Pencil strokes.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face=&quot;Roboto, Noto, sans-serif&quot; style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; orphans: 2; white-space: pre-wrap; widows: 2;&quot;&gt;I show you how the add-on works, how you can get it, and where you can find the code if you have interest in seeing how extensions work.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/7010370424485536443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/07/bits-of-blender-77-distribute-strokes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/7010370424485536443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/7010370424485536443'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/07/bits-of-blender-77-distribute-strokes.html' title='Bits of Blender #77 - Distribute Strokes Extension'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/K4G_dEn5j9E/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-1194893780220896812</id><published>2025-07-05T18:38:00.002-06:00</published><updated>2026-02-16T07:40:55.092-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #76 - Joining Strokes in 4.4 vs 4.2</title><content type='html'>&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/zJmfrFh26rI&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;span style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; orphans: 2; white-space: pre-wrap; widows: 2;&quot;&gt;The way you join Grease Pencil strokes has changed. In this video I show you how it was in 4.2 LTS and compare it to 4.4.&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/1194893780220896812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/07/bits-of-blender-76-joining-strokes-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1194893780220896812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1194893780220896812'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/07/bits-of-blender-76-joining-strokes-in.html' title='Bits of Blender #76 - Joining Strokes in 4.4 vs 4.2'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/zJmfrFh26rI/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-8032202785521613862</id><published>2025-06-30T18:37:00.001-06:00</published><updated>2026-02-16T07:41:03.483-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #75 - Run multiple instances of Blender on a Mac</title><content type='html'>&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/waqdWqzEYOU&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;span style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; orphans: 2; white-space: pre-wrap; widows: 2;&quot;&gt;How do you run multiple instances of the SAME version of Blender on a Mac? &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face=&quot;Roboto, Noto, sans-serif&quot; style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; white-space: pre-wrap; widows: 2;&quot;&gt;It is a quick tip, in a nutshell... Run this in the Terminal:
open -n -a Blender&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/8032202785521613862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/07/bits-of-blender-75-run-multiple.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/8032202785521613862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/8032202785521613862'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/07/bits-of-blender-75-run-multiple.html' title='Bits of Blender #75 - Run multiple instances of Blender on a Mac'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/waqdWqzEYOU/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-7167084752828790826</id><published>2025-06-28T08:34:00.003-06:00</published><updated>2026-02-16T07:41:08.280-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #74 - Bézier Curves, Part 2</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Lnqi-L5HlB0&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;p&gt;&lt;span face=&quot;Roboto, Noto, sans-serif&quot; style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; orphans: 2; white-space: pre-wrap; widows: 2;&quot;&gt;This Bit builds on Bit #73, going further into using Blender’s beautiful Bézier curve tools. &lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/7167084752828790826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/06/bits-of-blender-74-bezier-curves-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/7167084752828790826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/7167084752828790826'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/06/bits-of-blender-74-bezier-curves-part-2.html' title='Bits of Blender #74 - Bézier Curves, Part 2'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/Lnqi-L5HlB0/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-2550593749014453626</id><published>2025-06-28T08:32:00.006-06:00</published><updated>2026-02-16T07:41:14.254-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #73 - Bézier Curves, Part 1</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/LsJsXXviW94&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;p&gt;&lt;span face=&quot;Roboto, Noto, sans-serif&quot; style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; orphans: 2; white-space: pre-wrap; widows: 2;&quot;&gt;Blender has powerful Bézier curve tools that are a bit different than what you may be used to in other vector programs. This episode introduces you to how Blender handles Bézier handles.&lt;/span&gt;&lt;/p&gt;&lt;span face=&quot;Roboto, Noto, sans-serif&quot; style=&quot;background-color: white; color: #0d0d0d; font-size: 15px; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; white-space: pre-wrap; widows: 2;&quot;&gt;It’s a little different from other vector programs like Adobe Illustrator and Affinity Designer, in fact I think it is better being able to easily see the handle types.
&lt;/span&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/2550593749014453626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/06/bits-of-blender-73-bezier-curves-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/2550593749014453626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/2550593749014453626'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/06/bits-of-blender-73-bezier-curves-part-1.html' title='Bits of Blender #73 - Bézier Curves, Part 1'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/LsJsXXviW94/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-7866989152008486266</id><published>2025-06-23T11:48:00.004-06:00</published><updated>2026-02-16T07:41:19.861-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Bits of Blender #72 - A REAL 3-button Mouse</title><content type='html'>&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/H9K_JKWgJlw&quot; title=&quot;YouTube video player&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;

&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white; color: #0d0d0d; font-family: Roboto, Noto, sans-serif; font-size: 15px; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; white-space: pre-wrap; widows: 2;&quot;&gt;With Blender I use a trackpad, Wacom, and a Huion tablet monitor, but I’ve always wanted a good ol’ fashioned 3-button mouse, and I finally found one! 

This is not a paid endorsement, just news of a cool mouse I found to use with Blender 🤠 You can get the Elecom mouse here:
&lt;a href=&quot;https://www.amazon.com/ELECOM-Japan-Brand-BlueLED-Symmetrical-M-CAD01UBBK/dp/B07W5CXW6M&quot;&gt;https://www.amazon.com/ELECOM-Japan-Brand-BlueLED-Symmetrical-M-CAD01UBBK/dp/B07W5CXW6M&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white; color: #0d0d0d; font-family: Roboto, Noto, sans-serif; font-size: 15px; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; white-space: pre-wrap; widows: 2;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white; color: #0d0d0d; font-family: Roboto, Noto, sans-serif; font-size: 15px; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; white-space: pre-wrap; widows: 2;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/7866989152008486266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/06/bits-of-blender-72-real-3-button-mouse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/7866989152008486266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/7866989152008486266'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/06/bits-of-blender-72-real-3-button-mouse.html' title='Bits of Blender #72 - A REAL 3-button Mouse'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/H9K_JKWgJlw/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-8030938316425815829</id><published>2025-06-20T09:56:00.004-06:00</published><updated>2026-02-16T07:41:32.144-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>New Logo and New Bit!</title><content type='html'>&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/8RxIx215rnQ&quot; title=&quot;YouTube video player&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Blender can be a challenge to learn at first, but its key commands are instantly addictive. I started using Adobe Illustrator with version 1.1 in 1987, but when I discovered Blender 2.37a in 2005, its shortcuts like G, S, R, X, and E quickly overtook 18 years of Illustrator muscle memory. I even caught myself trying to use them in the venerable vector tool!&amp;nbsp;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So for the new Bits of Blender logo (my series of quick tips and tutorials for the Blender community), I turned to Blender itself. I began with thumbnails using the Grease Pencil. For the final artwork, I switched to Blender’s Curve object using version 4.4.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Curve edit mode’s Pen tool, introduced a few years ago, should feel familiar to anyone who’s used vector drawing tools like Illustrator. 

The circular design features text wrapped around the outside of a bezier circle and the inside of another. Getting the text to align inside the circle had me stuck for a moment. I realized it was a matter of scaling the circle on the negative Y axis, which is not something you&#39;d do in Illustrator!&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I created a one-minute &lt;a href=&quot;https://www.youtube.com/watch?v=8RxIx215rnQ&quot;&gt;Bit tutorial&lt;/a&gt; to share the solution.

Let me know what you think of the new logo, and/or share your own tips for working with Blender’s Curve tools!&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFmwI3eUMLFiIL29iKSYiqLhsI4_Z6DXkNIS-u-9yUzhdBWm_RPWX-MWmr-Gqkpxh9IwfWvA4YVjQdIKK34c4eH_91surN5ctJ30re3GFffwy2BGlmUbPw8lbaHRa9luUTQLTeLbXwKkeHVeVj8qBVEhnsVZfNBDgYYGpaz6NQ-7wB9lKRdFKr_Q/s493/IMG_7941.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;459&quot; data-original-width=&quot;493&quot; height=&quot;298&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFmwI3eUMLFiIL29iKSYiqLhsI4_Z6DXkNIS-u-9yUzhdBWm_RPWX-MWmr-Gqkpxh9IwfWvA4YVjQdIKK34c4eH_91surN5ctJ30re3GFffwy2BGlmUbPw8lbaHRa9luUTQLTeLbXwKkeHVeVj8qBVEhnsVZfNBDgYYGpaz6NQ-7wB9lKRdFKr_Q/s320/IMG_7941.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I did thumbnails using the Grease Pencil. Here&#39;s an example of the one I picked to move forward with.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPfX_nk6VkWS0ebS3CLEDAF2ALsksR3guVhi-GH_CXQKzRxxJqXirrEWHsUD3e08oQZ-7iNQ_c93abnuzO8LA7LK-ljMrY_Tt0lXDPRYOH3EW3rIfzqFyg0-FWo6MC9NnfJAQV9_7ajj_-OiYJQ7njaJDpZRjjYAyqREl29zzMMvvSuIBG4P_D1g/s1024/IMG_7645.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1024&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPfX_nk6VkWS0ebS3CLEDAF2ALsksR3guVhi-GH_CXQKzRxxJqXirrEWHsUD3e08oQZ-7iNQ_c93abnuzO8LA7LK-ljMrY_Tt0lXDPRYOH3EW3rIfzqFyg0-FWo6MC9NnfJAQV9_7ajj_-OiYJQ7njaJDpZRjjYAyqREl29zzMMvvSuIBG4P_D1g/s320/IMG_7645.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;It is always good to design in black and white first. This is just a step from being final, I decided I preferred the text in the circle to be all caps.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoceYZfWGnVm6rdZnLbj1yDdKP8cA1zm6MsjNwKsysZm-JG7TmNDTY9tudMAQMX_OCfxW9LqHQUKZLTRQY0Idl-jaqI0B9KrO_IpA8jQ6XXVpTErjqIVrvsBZCRxvuiyApTEsbzIVb6gaHyQkKEg9ZN_ppwXRR18P21n0971vOz8kS1D1yKZ-MfQ/s512/0001-0040.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;512&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoceYZfWGnVm6rdZnLbj1yDdKP8cA1zm6MsjNwKsysZm-JG7TmNDTY9tudMAQMX_OCfxW9LqHQUKZLTRQY0Idl-jaqI0B9KrO_IpA8jQ6XXVpTErjqIVrvsBZCRxvuiyApTEsbzIVb6gaHyQkKEg9ZN_ppwXRR18P21n0971vOz8kS1D1yKZ-MfQ/s320/0001-0040.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Final art, animated.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The logo mentions the year we started, has two sillouettes of the Blender Monkey object to represent me and Richard. The &quot;o&quot; is a nod to the 3D cursor pioneered by Blender. And of course it has a 0 and 1 to represent the computer &quot;bit&quot;, which we use as a play on words for our series (a &quot;bit&quot; as in &quot;a brief performance&quot;).&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/8030938316425815829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/06/new-logo-and-new-bit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/8030938316425815829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/8030938316425815829'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/06/new-logo-and-new-bit.html' title='New Logo and New Bit!'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/8RxIx215rnQ/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-6978630097517946095</id><published>2025-06-09T08:00:00.024-06:00</published><updated>2026-02-16T07:41:56.368-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>A Tour of Blender (and Bits of Blender turns 17)</title><content type='html'>&lt;div&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/qIpe93nSklM&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

Seventeen years ago, Bits of Blender launched on YouTube, back when videos were 320x240 and could not exceed 10 minutes. That was long enough for me and my 9-year-old son, Richard, to share quick Blender tips. 

&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Blender 2.4x had a reputation for being challenging, but we thought a 9-year-old using it might inspire others to get over that initial hump in learning it.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;For our anniversary, we’re dropping a special Bit... a &lt;b&gt;45-minute guided tour of Blender 4.4&lt;/b&gt; as we build an animation from scratch, visiting each of the workspaces.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://youtu.be/qIpe93nSklM&quot;&gt;Watch now&lt;/a&gt; and share your comments on the video or memories of our old Bits! #blender #blender3d&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Side note, this 45-minute episode about Blender was also edited in Blender with its Video Sequence Editor (VSE)!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/6978630097517946095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/06/a-tour-of-blender-and-bits-of-blender.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6978630097517946095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6978630097517946095'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/06/a-tour-of-blender-and-bits-of-blender.html' title='A Tour of Blender (and Bits of Blender turns 17)'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/qIpe93nSklM/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-569790852842014248</id><published>2025-05-31T16:15:00.016-06:00</published><updated>2026-02-16T07:42:26.640-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="addon"/><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Distribute Grease Pencil Strokes</title><content type='html'>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;style&gt;
        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            font-family: Arial, sans-serif;
        }
        .image-wrapper {
            text-align: center;
            margin-bottom: 20px;
        }
        .image-wrapper img {
            max-width: 100%;
            height: auto;
            display: block;
            margin: 0 auto;
        }
        .content {
            text-align: left;
            line-height: 1.6;
        }
        .content a {
            color: #0066cc;
            text-decoration: none;
        }
        .content a:hover {
            text-decoration: underline;
        }
        .hashtags {
            margin-top: 10px;
            color: #555;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;content&quot;&gt;
        &lt;div class=&quot;image-wrapper&quot;&gt;
            &lt;a href=&quot;https://github.com/johnrnyquist/distribute_grease_pencil_strokes&quot;&gt;
                &lt;img src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj86XB9hkHCVxdmzLYS-uWf5kF0mhzJtWH5Shf3kNAJ7l14e8RnwtORLf1ZIcIHV19jTFPAcKrBHjLdl3Ud3bk-slN8BupxpEvPcXB7-jf0wgWH13UaRqOk2Y2IbyeveC8mpIe0qfRYvA6qM_EPIeu6R_z5J6uYv-0_aEflQ64KdrMzxMIbrvry-w=w640-h435&quot; 
                     alt=&quot;Blender Add-On Screenshot&quot; 
                     width=&quot;640&quot; 
                     height=&quot;435&quot;&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;p&gt;I’m happy to share my first Blender Add-On! I couldn’t find a tool to evenly distribute grease pencil strokes in Blender or existing Add-Ons, so I built one myself. It’s simple but gets the job done! Check it out and let me know your thoughts.&lt;/p&gt;
        &lt;p class=&quot;hashtags&quot;&gt;#blender #blender3d&lt;/p&gt;
        &lt;p&gt;&lt;a href=&quot;https://github.com/johnrnyquist/distribute_grease_pencil_strokes&quot;&gt;https://github.com/johnrnyquist/distribute_grease_pencil_strokes&lt;/a&gt;&lt;/p&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/569790852842014248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/05/distribute-grease-pencil-strokes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/569790852842014248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/569790852842014248'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/05/distribute-grease-pencil-strokes.html' title='Distribute Grease Pencil Strokes'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEj86XB9hkHCVxdmzLYS-uWf5kF0mhzJtWH5Shf3kNAJ7l14e8RnwtORLf1ZIcIHV19jTFPAcKrBHjLdl3Ud3bk-slN8BupxpEvPcXB7-jf0wgWH13UaRqOk2Y2IbyeveC8mpIe0qfRYvA6qM_EPIeu6R_z5J6uYv-0_aEflQ64KdrMzxMIbrvry-w=s72-w640-h435-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-6951500932746166856</id><published>2025-03-04T13:07:00.003-07:00</published><updated>2026-02-16T07:42:57.756-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Game"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><category scheme="http://www.blogger.com/atom/ns#" term="SpriteKit"/><title type='text'>Handling Gesture Recognizers and TouchesBegan in SpriteKit</title><content type='html'>&lt;p&gt;Are you working on a SpriteKit game and trying to use both gesture recognizers and touchesBegan? I spent more time than I expected figuring this out. After asking AIs and not getting clear answers, I ended up checking the friendly manual myself.&lt;/p&gt;

&lt;p&gt;Thought I’d write a quick blog post about it—maybe it’ll help someone else searching for this later.&lt;/p&gt;

&lt;p&gt;The issue is that touchesBegan happens before the gesture recognizer. There’s an easy fix: set delaysTouchesBegan to true. Here’s an example:&lt;/p&gt;

&lt;pre
    style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-radius: 0.3em 0.3em 8px 8px; box-sizing: border-box; color: #383a42; direction: ltr; font-size: 13px; hyphens: none; line-height: 1.3; margin-bottom: 0.5em; margin-top: 0px; overflow: auto; padding: 12px; tab-size: 2; width: 718px; word-break: normal; word-spacing: normal;&quot;&gt;&lt;code
    class=&quot;language-swift&quot;
    style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; word-break: normal; word-spacing: normal;&quot;&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #a626a4;&quot;&gt;override&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #a626a4;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span
    class=&quot;token function-definition&quot; style=&quot;background-color: #fafafa; color: #4078f2;&quot;&gt;didMove&lt;/span&gt;&lt;span class=&quot;token&quot;
                                                                                                             style=&quot;background-color: #fafafa;&quot;&gt;(&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt;to view&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;:&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #b76b01;&quot;&gt;SKView&lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;
                                                                                                                    style=&quot;background-color: #fafafa;&quot;&gt;{&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #a626a4;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt; panGestureRecognizer &lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #4078f2;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #b76b01;&quot;&gt;UIPanGestureRecognizer&lt;/span&gt;&lt;span class=&quot;token&quot;
                                                                                                        style=&quot;background-color: #fafafa;&quot;&gt;(&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;:&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #a626a4;&quot;&gt;self&lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;token&quot;
                                                                                                                          style=&quot;background-color: #fafafa;&quot;&gt;:&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token other-directive&quot; style=&quot;background-color: #fafafa; color: #e45649;&quot;&gt;#selector&lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;handlePanFrom&lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;)&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt;
        panGestureRecognizer&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;delegate &lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #4078f2;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #a626a4;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;
        panGestureRecognizer&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #fcff01;&quot;&gt;delaysTouchesBegan&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #4078f2;&quot;&gt;=&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #b76b01;&quot;&gt;true&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #a626a4;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;
                                                                                                       style=&quot;background-color: #fafafa;&quot;&gt;.&lt;/span&gt;&lt;span
    style=&quot;background-color: #fafafa;&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #4078f2;&quot;&gt;!&lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;background-color: #fafafa; color: #4078f2;&quot;&gt;addGestureRecognizer&lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;panGestureRecognizer&lt;/span&gt;&lt;span
    class=&quot;token&quot; style=&quot;background-color: #fafafa;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Why was it tricky to find? I think it’s because SpriteKit doesn’t get much attention these days, so there’s not a lot of discussion about it online. Hopefully this saves you some time!&lt;/p&gt;




</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/6951500932746166856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/03/handling-gesture-recognizers-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6951500932746166856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6951500932746166856'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/03/handling-gesture-recognizers-and.html' title='Handling Gesture Recognizers and TouchesBegan in SpriteKit'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-6901918161949544772</id><published>2025-02-18T07:06:00.003-07:00</published><updated>2026-02-16T07:43:36.800-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ECS"/><category scheme="http://www.blogger.com/atom/ns#" term="Game"/><category scheme="http://www.blogger.com/atom/ns#" term="SpriteKit"/><category scheme="http://www.blogger.com/atom/ns#" term="Swash"/><category scheme="http://www.blogger.com/atom/ns#" term="Swashteroids"/><title type='text'>Swashteroids 2.6</title><content type='html'>&lt;p&gt;&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;Version 2.6 has a lot of new features:&lt;br/&gt;
&lt;ul&gt;
    &lt;li&gt;New Phasing power-up! Temporarily nothing can touch you!&lt;/li&gt;
    &lt;li&gt;New Xray power-up! See what treasures are in which asteroids!&lt;/li&gt;
    &lt;li&gt;New button to trigger shields, enable them in your own time (or not).&lt;/li&gt;
    &lt;li&gt;Improved the TRAINING section.&lt;/li&gt;
    &lt;li&gt;Now using Apple SpriteKit’s physics engine to detect collisions.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Since my last Swashteroids blog post in Dec 2023, I&#39;ve released many updates!&lt;/p&gt;
&lt;blockquote style=&quot;border: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;
    Version 2.6&lt;br/&gt;Version 2.5&lt;br/&gt;Version 2.4.2&lt;br/&gt;Version 2.4.1&lt;br/&gt;Version 2.4&lt;br/&gt;Version 2.3&lt;br/&gt;Version 2.2&lt;br/&gt;Version 2.1.2&lt;br/&gt;Version
    2.1.1&lt;br/&gt;Version 2.1&lt;br/&gt;Version 2.0.1
&lt;/blockquote&gt;
&lt;p&gt;Here&#39;s a video showing all the new power-ups (note: this is level 5)&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
    &lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/dqMh0SzskVk&quot; width=&quot;320&quot;
            youtube-src-id=&quot;dqMh0SzskVk&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;br/&gt;
&lt;div&gt;&lt;br/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/6901918161949544772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2025/02/swashteroids-26.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6901918161949544772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6901918161949544772'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2025/02/swashteroids-26.html' title='Swashteroids 2.6'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/dqMh0SzskVk/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-6129608997069494380</id><published>2023-12-16T07:53:00.003-07:00</published><updated>2026-02-16T07:43:43.222-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ECS"/><category scheme="http://www.blogger.com/atom/ns#" term="Game"/><category scheme="http://www.blogger.com/atom/ns#" term="SpriteKit"/><category scheme="http://www.blogger.com/atom/ns#" term="Swash"/><category scheme="http://www.blogger.com/atom/ns#" term="Swashteroids"/><title type='text'>Swasteroids 2.0</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs1v-G9i_nREgFF4fYqEsDm51Oe2Q0mfNZs1CHMMt9gsS8jY9S-CK_819JudoDRkIKTldu8Ewo9bNm7m2iwLGlSXPive9EHDpulzpVh5Jj1m2iHpfBR8M1tvRv6MC2p9ulpMKNuoasnLJmpsT9TmnDgogVmY_eoNXU8Z2GQf2Mt7U9LGIx2eh4Ug/s1024/SwashteroidsRounded1024x1024.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1024&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs1v-G9i_nREgFF4fYqEsDm51Oe2Q0mfNZs1CHMMt9gsS8jY9S-CK_819JudoDRkIKTldu8Ewo9bNm7m2iwLGlSXPive9EHDpulzpVh5Jj1m2iHpfBR8M1tvRv6MC2p9ulpMKNuoasnLJmpsT9TmnDgogVmY_eoNXU8Z2GQf2Mt7U9LGIx2eh4Ug/s320/SwashteroidsRounded1024x1024.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span face=&quot;system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span face=&quot;system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;I’ve released Swashteroids 2.0 to the App Store! A fun retro open-source game built on my open-source ECS framework Swash.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span face=&quot;system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG54bdVLlrR6bfDOxzPqvKHuj0AntfWj9HU7k-gjBKElGt5CVYHw4ihzYIBXilProPpjZmsnDx7SGwiwjgHsPLoMQ_zUqgDFxaY52ymqLXYdHwvLOAt3M82YEFTurBxbFFuLI3ZiieW5NYxlZ9Hwsj_acxBQ0wqV6K1EzUppAe_66yzJQew57nFQ/s2732/Swashteroids2_LinkedIn.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1698&quot; data-original-width=&quot;2732&quot; height=&quot;199&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG54bdVLlrR6bfDOxzPqvKHuj0AntfWj9HU7k-gjBKElGt5CVYHw4ihzYIBXilProPpjZmsnDx7SGwiwjgHsPLoMQ_zUqgDFxaY52ymqLXYdHwvLOAt3M82YEFTurBxbFFuLI3ZiieW5NYxlZ9Hwsj_acxBQ0wqV6K1EzUppAe_66yzJQew57nFQ/s320/Swashteroids2_LinkedIn.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-size: 17.142857px;&quot;&gt;All new user-interface and art.&lt;/span&gt;&lt;span style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-size: 17.142857px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2d3436;&quot;&gt;&lt;span style=&quot;caret-color: rgb(45, 52, 54); font-size: 17.142857px;&quot;&gt;Play with or without buttons! Plasma torpedoes and hyperspace are now both power-ups, and they&#39;re moving! Game play mechanics have been tweaked, ie asteroids&#39; base speeds increase per level. The game starts easier as well so you can warm up.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div data-block=&quot;true&quot; data-editor=&quot;3c4lh&quot; data-offset-key=&quot;91g0n-0-0&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;div class=&quot;public-DraftStyleDefault-block public-DraftStyleDefault-ltr&quot; data-offset-key=&quot;91g0n-0-0&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;span class=&quot;ig9Cs&quot; data-offset-key=&quot;91g0n-0-0&quot;&gt;https://apps.apple.com/us/app/swashteroids/id6472061502&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/6129608997069494380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2023/12/swasteroids-20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6129608997069494380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6129608997069494380'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2023/12/swasteroids-20.html' title='Swasteroids 2.0'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs1v-G9i_nREgFF4fYqEsDm51Oe2Q0mfNZs1CHMMt9gsS8jY9S-CK_819JudoDRkIKTldu8Ewo9bNm7m2iwLGlSXPive9EHDpulzpVh5Jj1m2iHpfBR8M1tvRv6MC2p9ulpMKNuoasnLJmpsT9TmnDgogVmY_eoNXU8Z2GQf2Mt7U9LGIx2eh4Ug/s72-c/SwashteroidsRounded1024x1024.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-6635819417515662588</id><published>2023-11-20T06:29:00.003-07:00</published><updated>2026-02-16T07:43:49.458-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ECS"/><category scheme="http://www.blogger.com/atom/ns#" term="Game"/><category scheme="http://www.blogger.com/atom/ns#" term="SpriteKit"/><category scheme="http://www.blogger.com/atom/ns#" term="Swash"/><category scheme="http://www.blogger.com/atom/ns#" term="Swashteroids"/><title type='text'></title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG1BvxKOMeWO7JEKXu9E6TD1Ay9bke7zMJ2iA1LSjA_hWMUkti3GB1_pEYGKc4owsU3Mw-tEf7aNY4w6tfikOqrCUUbrvXJSrKE2j0Zd6d5-WNq_9_3XPz77MIZ_wiHekwUm-DVkhZTeKCFICetJaRyeMai9BV4wPqvReAFiZvQ2jT72BRXogFHw/s498/swashteroids_blog.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;498&quot; data-original-width=&quot;496&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG1BvxKOMeWO7JEKXu9E6TD1Ay9bke7zMJ2iA1LSjA_hWMUkti3GB1_pEYGKc4owsU3Mw-tEf7aNY4w6tfikOqrCUUbrvXJSrKE2j0Zd6d5-WNq_9_3XPz77MIZ_wiHekwUm-DVkhZTeKCFICetJaRyeMai9BV4wPqvReAFiZvQ2jT72BRXogFHw/s320/swashteroids_blog.png&quot; width=&quot;319&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;I’ve released Swashteroids to the App Store! A fun retro open-source game built on my open-source ECS framework Swash.&lt;/span&gt;&lt;/p&gt;&lt;div data-block=&quot;true&quot; data-editor=&quot;3c4lh&quot; data-offset-key=&quot;91g0n-0-0&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;div class=&quot;public-DraftStyleDefault-block public-DraftStyleDefault-ltr&quot; data-offset-key=&quot;91g0n-0-0&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;span class=&quot;ig9Cs&quot; data-offset-key=&quot;91g0n-0-0&quot;&gt;https://apps.apple.com/us/app/swashteroids/id6472061502&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/6635819417515662588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2023/11/ive-released-swashteroids-to-app-store.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6635819417515662588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/6635819417515662588'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2023/11/ive-released-swashteroids-to-app-store.html' title=''/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG1BvxKOMeWO7JEKXu9E6TD1Ay9bke7zMJ2iA1LSjA_hWMUkti3GB1_pEYGKc4owsU3Mw-tEf7aNY4w6tfikOqrCUUbrvXJSrKE2j0Zd6d5-WNq_9_3XPz77MIZ_wiHekwUm-DVkhZTeKCFICetJaRyeMai9BV4wPqvReAFiZvQ2jT72BRXogFHw/s72-c/swashteroids_blog.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-5106353357497126129</id><published>2023-11-17T06:26:00.001-07:00</published><updated>2026-02-16T07:44:18.990-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Comic Book App"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><category scheme="http://www.blogger.com/atom/ns#" term="Near Mint"/><title type='text'></title><content type='html'>&lt;p&gt;&lt;span face=&quot;system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjClMw5i8re3AfezVsPqkEsLpgTNjklvFNUpirNFZilyB9veCC3vFmYootnAK27fhcYjyYk7vJ08C4pbh6sXFA4nSJWBnWuxlCxQDvcUiS6v5S0w7LMFEZnO960NZ_UeAJdefeDfMqFC5vsEIvcFlfiqyRY-2PodC15uibdKdCaJVpgUMfRvPlc1A/s496/nearmint.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;496&quot; data-original-width=&quot;496&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjClMw5i8re3AfezVsPqkEsLpgTNjklvFNUpirNFZilyB9veCC3vFmYootnAK27fhcYjyYk7vJ08C4pbh6sXFA4nSJWBnWuxlCxQDvcUiS6v5S0w7LMFEZnO960NZ_UeAJdefeDfMqFC5vsEIvcFlfiqyRY-2PodC15uibdKdCaJVpgUMfRvPlc1A/s320/nearmint.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span face=&quot;system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;Version 2.0 of my &lt;a href=&quot;https://apps.apple.com/us/app/near-mint/id1328733510?platform=iphone&quot;&gt;Near Mint&lt;/a&gt; iOS app is now live! This release has many new features and other improvements. This is an app that helps you organize your comic book collection. It is fast and native since 2017! 🤠&lt;/span&gt;&lt;/p&gt;&lt;div data-block=&quot;true&quot; data-editor=&quot;6e83i&quot; data-offset-key=&quot;5l2st-0-0&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;div class=&quot;public-DraftStyleDefault-block public-DraftStyleDefault-ltr&quot; data-offset-key=&quot;5l2st-0-0&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;span class=&quot;ig9Cs&quot; data-offset-key=&quot;5l2st-0-0&quot;&gt;#comicbooks&lt;/span&gt;&lt;span data-offset-key=&quot;5l2st-1-0&quot;&gt; &lt;/span&gt;&lt;span class=&quot;ig9Cs&quot; data-offset-key=&quot;5l2st-2-0&quot;&gt;#ios&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-block=&quot;true&quot; data-editor=&quot;6e83i&quot; data-offset-key=&quot;ckjcb-0-0&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;div class=&quot;public-DraftStyleDefault-block public-DraftStyleDefault-ltr&quot; data-offset-key=&quot;ckjcb-0-0&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;span data-offset-key=&quot;ckjcb-0-0&quot;&gt;&lt;br data-text=&quot;true&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-block=&quot;true&quot; data-editor=&quot;6e83i&quot; data-offset-key=&quot;88k6r-0-0&quot; style=&quot;caret-color: rgb(45, 52, 54); color: #2d3436; font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 17.142857px; white-space: pre-wrap;&quot;&gt;&lt;div class=&quot;public-DraftStyleDefault-block public-DraftStyleDefault-ltr&quot; data-offset-key=&quot;88k6r-0-0&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;public-DraftStyleDefault-block public-DraftStyleDefault-ltr&quot; data-offset-key=&quot;88k6r-0-0&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;span class=&quot;ig9Cs&quot; data-offset-key=&quot;88k6r-0-0&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/5106353357497126129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2023/11/version-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5106353357497126129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5106353357497126129'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2023/11/version-2.html' title=''/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjClMw5i8re3AfezVsPqkEsLpgTNjklvFNUpirNFZilyB9veCC3vFmYootnAK27fhcYjyYk7vJ08C4pbh6sXFA4nSJWBnWuxlCxQDvcUiS6v5S0w7LMFEZnO960NZ_UeAJdefeDfMqFC5vsEIvcFlfiqyRY-2PodC15uibdKdCaJVpgUMfRvPlc1A/s72-c/nearmint.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-4198749450502859558</id><published>2022-04-14T19:40:00.001-06:00</published><updated>2022-04-14T19:41:24.231-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Swift"/><title type='text'>Swift Arrays to Dictionaries with indices</title><content type='html'>&lt;p&gt;The extension below is to facilitate the creation of dictionaries from arrays. In this case, the dictionary has the array element as the key and the index of that element as the value.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Since I was only working with arrays that held unique values I added a guard statement to enforce that. If you remove it, then your the last duplicated element would have the index as its value.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white; color: #890009; font-family: Menlo; font-size: 13px;&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Menlo; font-size: 13px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #377375; font-family: Menlo; font-size: 13px;&quot;&gt;Array&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Menlo; font-size: 13px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #890009; font-family: Menlo; font-size: 13px;&quot;&gt;where&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Menlo; font-size: 13px;&quot;&gt; Element: &lt;/span&gt;&lt;span style=&quot;background-color: white; color: #9d2807; font-family: Menlo; font-size: 13px;&quot;&gt;Hashable&lt;/span&gt;&lt;span style=&quot;background-color: white; font-family: Menlo; font-size: 13px;&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #890009;&quot;&gt;func&lt;/span&gt; &lt;span style=&quot;color: #0e5365;&quot;&gt;toDictionary&lt;/span&gt;() -&amp;gt; [Element: &lt;span style=&quot;color: #9d2807;&quot;&gt;Int&lt;/span&gt;] {&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #890009;&quot;&gt;guard&lt;/span&gt; &lt;span style=&quot;color: #9d2807;&quot;&gt;Set&lt;/span&gt;(&lt;span style=&quot;color: #890009;&quot;&gt;self&lt;/span&gt;).&lt;span style=&quot;color: #a56311;&quot;&gt;count&lt;/span&gt; == &lt;span style=&quot;color: #890009;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color: #a56311;&quot;&gt;count&lt;/span&gt; &lt;span style=&quot;color: #890009;&quot;&gt;else&lt;/span&gt; {&lt;/p&gt;
&lt;p style=&quot;background-color: white; color: #66620d; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0e5365;&quot;&gt;fatalError&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&quot;&lt;span style=&quot;color: black;&quot;&gt;\(&lt;/span&gt;&lt;span style=&quot;color: #890009;&quot;&gt;#function&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&amp;nbsp;requires arrays with unique values!&quot;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #890009;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #890009;&quot;&gt;self&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;span style=&quot;color: #0e5365;&quot;&gt;enumerated&lt;/span&gt;()&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style=&quot;color: #0e5365;&quot;&gt;reduce&lt;/span&gt;(&lt;span style=&quot;color: #0e5365;&quot;&gt;into&lt;/span&gt;: [Element: &lt;span style=&quot;color: #9d2807;&quot;&gt;Int&lt;/span&gt;]()) { dict, tup &lt;span style=&quot;color: #890009;&quot;&gt;in&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dict[tup.&lt;span style=&quot;color: #7b2b5e;&quot;&gt;1&lt;/span&gt;] = tup.&lt;span style=&quot;color: #7b2b5e;&quot;&gt;0&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;}&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;background-color: white; font-family: Menlo; font-size: 13px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;[&quot;hello&quot;, &quot;world&quot;].toDictionary() // [&quot;world&quot;: 1, &quot;hello&quot;: 0]&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/4198749450502859558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2022/04/swift-arrays-to-dictionaries-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/4198749450502859558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/4198749450502859558'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2022/04/swift-arrays-to-dictionaries-with.html' title='Swift Arrays to Dictionaries with indices'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-1805382392110230681</id><published>2019-06-01T14:03:00.001-06:00</published><updated>2019-06-01T14:15:02.488-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Swift"/><title type='text'>100 Days of Swift</title><content type='html'>&lt;div style=&quot;color: #262626; font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 12px; font-stretch: normal; line-height: normal; min-height: 14px;&quot;&gt;
&lt;div style=&quot;font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;font-kerning: none;&quot;&gt;3. For a tougher challenge, take the image generation code out of&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #b80e3d; font-family: &amp;quot;menlo&amp;quot;; font-stretch: normal; line-height: normal;&quot;&gt;cellForRowAt&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;: generate all images when the app first launches, and use those smaller versions instead. For bonus points, combine the&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #b80e3d; font-family: &amp;quot;menlo&amp;quot;; font-stretch: normal; line-height: normal;&quot;&gt;getDocumentsDirectory()&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;&amp;nbsp;method I introduced in project 10 so that you save the resulting cache to make sure it never happens again.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-stretch: normal; line-height: normal; min-height: 14px;&quot;&gt;
&lt;span style=&quot;font-kerning: none;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;font-kerning: none;&quot;&gt;As a reminder, here’s the code for&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #b80e3d; font-family: &amp;quot;menlo&amp;quot;; font-stretch: normal; line-height: normal;&quot;&gt;getDocumentsDirectory()&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: black; color: #e0d561; font-family: monaco; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: #58d1eb; font-kerning: none;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: #f6f6ef; font-kerning: none;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;getDocumentsDirectory&lt;/span&gt;&lt;span style=&quot;color: #f6f6ef; font-kerning: none;&quot;&gt;() -&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f4005f; font-kerning: none;&quot;&gt;URL&lt;/span&gt;&lt;span style=&quot;color: #f6f6ef; font-kerning: none;&quot;&gt;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: black; color: #f6f6ef; font-family: monaco; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;font-kerning: none;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #58d1eb; font-kerning: none;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;&amp;nbsp;paths =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #98e024; font-kerning: none;&quot;&gt;FileManager&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #58d1eb; font-kerning: none;&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #e0d561; font-kerning: none;&quot;&gt;urls&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #58d1eb; font-kerning: none;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;: .documentDirectory,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #58d1eb; font-kerning: none;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;: .userDomainMask)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: black; color: #f6f6ef; font-family: monaco; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;font-kerning: none;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #58d1eb; font-kerning: none;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;&amp;nbsp;paths[&lt;/span&gt;&lt;span style=&quot;color: #9d65ff; font-kerning: none;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;font-kerning: none;&quot;&gt;]&lt;/span&gt;&lt;br /&gt;
}&lt;/div&gt;
&lt;span style=&quot;color: #262626; font-family: &amp;quot;helvetica neue&amp;quot;; font-size: 12px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
The above is from&amp;nbsp;&lt;a href=&quot;https://www.hackingwithswift.com/read/30/7/wrap-up&quot;&gt;Day 98&lt;/a&gt;&amp;nbsp;of Paul Hudson&#39;s excellent course:&amp;nbsp;&lt;a href=&quot;http://hackingwithswift.com/100/&quot;&gt;100 Days of Swift&lt;/a&gt;. It is Challenge #3 and there is even a &quot;bonus&quot; challenge inside the challenge! In approaching the solution--before coding--I wrote down my thoughts and then gathered snippets of code that I thought would help. My notes are below. I thought it might be helpful for others to share them without giving away the solution.&lt;br /&gt;
&lt;div style=&quot;color: #262626; font-family: &amp;quot;Helvetica Neue&amp;quot;; font-size: 12px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
First, I jotted down the four main things I was concerned with:&lt;br /&gt;
&lt;ol&gt;
&lt;li style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;Read big images from bundle, see&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;project 1&lt;/span&gt;.&lt;/li&gt;
&lt;li style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;Render a image into a rect using CoreGraphics like in &lt;span style=&quot;color: blue;&quot;&gt;project 30.&lt;/span&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;Read the thumbnails in like&amp;nbsp;&lt;span style=&quot;caret-color: rgb(0, 0, 255); color: blue;&quot;&gt;project 10&lt;/span&gt;.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;If a thumbnail does not exist then create it. Also like in&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;project 10&lt;/span&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Next, I gathered the corresponding snippets of the code:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: blue; font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;From&amp;nbsp;&lt;/i&gt;&lt;i&gt;project 1&lt;/i&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #39414a; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
DispatchQueue&lt;span style=&quot;color: #0b2037;&quot;&gt;.&lt;/span&gt;global&lt;span style=&quot;color: #0b2037;&quot;&gt;(qos: .&lt;/span&gt;userInitiated&lt;span style=&quot;color: #0b2037;&quot;&gt;).&lt;/span&gt;async&lt;span style=&quot;color: #0b2037;&quot;&gt; { [&lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;weak&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;in&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #999999; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: #0b2037;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt; fm = &lt;/span&gt;&lt;span style=&quot;color: #39414a;&quot;&gt;FileManager&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39414a;&quot;&gt;default&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #999999; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: #0b2037;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt; path = &lt;/span&gt;&lt;span style=&quot;color: #39414a;&quot;&gt;Bundle&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39414a;&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39414a;&quot;&gt;resourcePath&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #999999; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: #0b2037;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt; items = &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;! fm.&lt;/span&gt;&lt;span style=&quot;color: #39414a;&quot;&gt;contentsOfDirectory&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;(atPath: path)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal; min-height: 11px;&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; pictureNames = items&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style=&quot;color: #39414a;&quot;&gt;filter&lt;/span&gt; { $0.&lt;span style=&quot;color: #39414a;&quot;&gt;hasPrefix&lt;/span&gt;(&lt;span style=&quot;color: #118040;&quot;&gt;&quot;nssl&quot;&lt;/span&gt;) }&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span style=&quot;color: #39414a;&quot;&gt;sorted&lt;/span&gt; { $0 &amp;lt; $1 }&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal; min-height: 11px;&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;self&lt;/span&gt;?.&lt;span style=&quot;color: #3f6e74;&quot;&gt;&lt;b&gt;storms&lt;/b&gt;&lt;/span&gt; = pictureNames.&lt;span style=&quot;color: #39414a;&quot;&gt;map&lt;/span&gt; {&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #1280b2;&quot;&gt;&lt;b&gt;Storm&lt;/b&gt;&lt;/span&gt;(name: $0, imageName: $0) }&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal; min-height: 11px;&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #39414a; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: #0b2037;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;DispatchQueue&lt;span style=&quot;color: #0b2037;&quot;&gt;.&lt;/span&gt;main&lt;span style=&quot;color: #0b2037;&quot;&gt;.&lt;/span&gt;async&lt;span style=&quot;color: #0b2037;&quot;&gt; { [&lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;weak&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;in&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #39414a; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: #0b2037;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aa0d91;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #0b2037;&quot;&gt;?.&lt;/span&gt;collectionView&lt;span style=&quot;color: #0b2037;&quot;&gt;.&lt;/span&gt;reloadData&lt;span style=&quot;color: #0b2037;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
}&lt;/div&gt;
&lt;div style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal; min-height: 16px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: blue; font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;From &lt;/i&gt;&lt;i&gt;project 30&lt;/i&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; path = &lt;span style=&quot;color: #39414a;&quot;&gt;Bundle&lt;/span&gt;.&lt;span style=&quot;color: #39414a;&quot;&gt;main&lt;/span&gt;.&lt;span style=&quot;color: #39414a;&quot;&gt;path&lt;/span&gt;(forResource: imageRootName, ofType: &lt;span style=&quot;color: #aa0d91;&quot;&gt;nil&lt;/span&gt;)!&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; original = &lt;span style=&quot;color: #39414a;&quot;&gt;UIImage&lt;/span&gt;(contentsOfFile: path)!&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal; min-height: 11px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; renderRect = &lt;span style=&quot;color: #39414a;&quot;&gt;CGRect&lt;/span&gt;(origin: .&lt;span style=&quot;color: #39414a;&quot;&gt;zero&lt;/span&gt;, size: &lt;span style=&quot;color: #39414a;&quot;&gt;CGSize&lt;/span&gt;(width: &lt;span style=&quot;color: #392a9c;&quot;&gt;90&lt;/span&gt;, height: &lt;span style=&quot;color: #392a9c;&quot;&gt;90&lt;/span&gt;))&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; renderer = &lt;span style=&quot;color: #39414a;&quot;&gt;UIGraphicsImageRenderer&lt;/span&gt;(size: renderRect.&lt;span style=&quot;color: #39414a;&quot;&gt;size&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal; min-height: 11px;&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; rounded = renderer.&lt;span style=&quot;color: #39414a;&quot;&gt;image&lt;/span&gt; { ctx &lt;span style=&quot;color: #aa0d91;&quot;&gt;in&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ctx.&lt;span style=&quot;color: #39414a;&quot;&gt;cgContext&lt;/span&gt;.&lt;span style=&quot;color: #39414a;&quot;&gt;addEllipse&lt;/span&gt;(in: renderRect)&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ctx.&lt;span style=&quot;color: #39414a;&quot;&gt;cgContext&lt;/span&gt;.&lt;span style=&quot;color: #39414a;&quot;&gt;clip&lt;/span&gt;()&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal; min-height: 11px;&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; original.&lt;span style=&quot;color: #39414a;&quot;&gt;draw&lt;/span&gt;(in: renderRect)&lt;/div&gt;
&lt;div style=&quot;color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal; min-height: 16px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;i&gt;From &lt;/i&gt;&lt;i&gt;project 10&lt;/i&gt;&lt;i&gt;:&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Palatino; font-size: 13px; font-stretch: normal; line-height: normal; text-indent: 18px;&quot;&gt;
&lt;i&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Write:&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; imageName = &lt;span style=&quot;color: #39414a;&quot;&gt;UUID&lt;/span&gt;().&lt;span style=&quot;color: #39414a;&quot;&gt;uuidString&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; imagePath = &lt;span style=&quot;color: #800002;&quot;&gt;&lt;b&gt;getDocumentsDirectory&lt;/b&gt;&lt;/span&gt;().&lt;span style=&quot;color: #39414a;&quot;&gt;appendingPathComponent&lt;/span&gt;(imageName)&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; jpegData = image.&lt;span style=&quot;color: #39414a;&quot;&gt;jpegData&lt;/span&gt;(compressionQuality: &lt;span style=&quot;color: #392a9c;&quot;&gt;0.8&lt;/span&gt;) {&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;try&lt;/span&gt;? jpegData.&lt;span style=&quot;color: #39414a;&quot;&gt;write&lt;/span&gt;(to: imagePath)&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Palatino; font-size: 13px; font-stretch: normal; line-height: normal; text-indent: 18px;&quot;&gt;
&lt;i&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Read:&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #aa0d91;&quot;&gt;let&lt;/span&gt; path = &lt;span style=&quot;color: #800002;&quot;&gt;&lt;b&gt;getDocumentsDirectory&lt;/b&gt;&lt;/span&gt;().&lt;span style=&quot;color: #39414a;&quot;&gt;appendingPathComponent&lt;/span&gt;(person.&lt;span style=&quot;color: #3f6e74;&quot;&gt;&lt;b&gt;imageName&lt;/b&gt;&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;color: blue; font-family: Palatino; font-size: 12px; font-stretch: normal; line-height: normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: white; color: #0b2037; font-family: Menlo; font-size: 10px; font-stretch: normal; line-height: normal;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cell.&lt;span style=&quot;color: #3f6e74;&quot;&gt;&lt;b&gt;imageView&lt;/b&gt;&lt;/span&gt;.&lt;span style=&quot;color: #39414a;&quot;&gt;image&lt;/span&gt; = &lt;span style=&quot;color: #39414a;&quot;&gt;UIImage&lt;/span&gt;(contentsOfFile: path.&lt;span style=&quot;color: #39414a;&quot;&gt;path&lt;/span&gt;)&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/1805382392110230681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2019/06/100-days-of-swift.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1805382392110230681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1805382392110230681'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2019/06/100-days-of-swift.html' title='100 Days of Swift'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-8830854450017642542</id><published>2014-12-31T14:39:00.003-07:00</published><updated>2026-02-16T07:44:45.205-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ECS"/><title type='text'>The Ash Entity Framework</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.ashframework.org/&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ashframework.org/images/logo.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
I’ve been doing object-oriented programming for over 20 years. I’ve worked with many languages in that time. One can improve their ability to abstract the more they work with different languages. A more challenging exercise is to change your programming paradigm.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px; min-height: 14px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
Lately, the paradigm I’ve been experimenting with is &lt;a href=&quot;http://en.wikipedia.org/wiki/Entity_component_system&quot;&gt;entity component systems&lt;/a&gt; (ECS). ECS are touted for game programming. A common scenario in games is for things in the game to changes powers and abilities. To solve this issue in the past, I’ve relied heavily on composition over inheritance. In ECS, that idea is taken to the extreme.&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px; min-height: 14px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
The objects (entities) are made up of components (that are mostly value objects), the logic resides in the systems that operate on the entities. After reading an excellent post by Richard Lord, I decided to give his ECS micro framework a try, it’s call &lt;a href=&quot;http://www.ashframework.org/&quot;&gt;Ash&lt;/a&gt;. &amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px; min-height: 14px;&quot;&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
&lt;b&gt;The Ash Entity Framework&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px; min-height: 14px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
The Ash Entity Framework uses entity, components, systems, and nodes. Ash facilities the work of mapping the systems to the components they work on. Let me define these:&lt;/div&gt;
&lt;ul&gt;
&lt;li style=&quot;font-family: Helvetica; font-size: 12px; margin: 0px;&quot;&gt;&lt;b&gt;Components&lt;/b&gt; are (mostly) simple value objects. They contain little or no behavior.&lt;/li&gt;
&lt;li style=&quot;font-family: Helvetica; font-size: 12px; margin: 0px;&quot;&gt;&lt;b&gt;Entities&lt;/b&gt; hold components. &lt;i&gt;Entities only care about components. &lt;/i&gt;By changing what components an entity has affects which systems affect the entity. This changing of entity composition is important as it impacts node creation as well as which systems execute on it. Entity names must be unique!&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;font-family: Helvetica; font-size: 12px; margin: 0px;&quot;&gt;&lt;b&gt;Systems&lt;/b&gt; operate on lists of nodes. &lt;i&gt;Systems only care about nodes. &lt;/i&gt;Systems contain the logic.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;font-family: Helvetica; font-size: 12px; margin: 0px;&quot;&gt;&lt;b&gt;Nodes&lt;/b&gt; are combinations of one or more components. Node classes are defined and at runtime, an entity that has components matching the definition gets a node created by the Ash engine. Ash also removes and destroys nodes when they are no longer applicable to the entity composition. Node lists use signals--not events--for adding and removing.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
The &lt;b&gt;Engine&lt;/b&gt; is part of the framework. It knows about entities and systems, both of which you add to the engine. It in turn watches entities and--as they change--adds and removes the components to node collections used by systems. The engine creates the node collections and passes them to the appropriate systems.&lt;/div&gt;
&lt;div style=&quot;font-family: Helvetica; font-size: 12px;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/8830854450017642542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2014/12/the-ash-entity-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/8830854450017642542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/8830854450017642542'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2014/12/the-ash-entity-framework.html' title='The Ash Entity Framework'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-5443979885122917544</id><published>2014-02-12T11:44:00.003-07:00</published><updated>2014-02-12T11:44:42.358-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Game"/><title type='text'>ABGC On Sale</title><content type='html'>My course &lt;a href=&quot;http://bit.ly/1aVq8EP&quot;&gt;A Blender Game Character&lt;/a&gt; is on sale at CartoonSmart thru Saturday, $25 (usually $39) #b3d&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5cGBcBv6pd2UPXsGVrHZcEofmTpXD_pJjwYPs86xWnOujwYQZPXyTWhOqITZABMd5nBrB7_v7ySHS597ELMmbAY4BbmbiCtN2U9zZ9i7aU0gfZQiCvNSxcONuYOTV_4nQBdRy1g/s1600/ABGC_box.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5cGBcBv6pd2UPXsGVrHZcEofmTpXD_pJjwYPs86xWnOujwYQZPXyTWhOqITZABMd5nBrB7_v7ySHS597ELMmbAY4BbmbiCtN2U9zZ9i7aU0gfZQiCvNSxcONuYOTV_4nQBdRy1g/s1600/ABGC_box.png&quot; height=&quot;320&quot; width=&quot;275&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/5443979885122917544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2014/02/abgc-on-sale.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5443979885122917544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5443979885122917544'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2014/02/abgc-on-sale.html' title='ABGC On Sale'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5cGBcBv6pd2UPXsGVrHZcEofmTpXD_pJjwYPs86xWnOujwYQZPXyTWhOqITZABMd5nBrB7_v7ySHS597ELMmbAY4BbmbiCtN2U9zZ9i7aU0gfZQiCvNSxcONuYOTV_4nQBdRy1g/s72-c/ABGC_box.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-5846946083752741892</id><published>2013-12-29T12:12:00.000-07:00</published><updated>2013-12-29T12:12:22.470-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3d"/><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="typography"/><title type='text'>Bits of Blender #67 - Text Boxes</title><content type='html'>Did you know you could use text boxes/frames in Blender? John and Richard show you how in this Bit.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 

&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/5PLSu31KzJc?rel=0&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/5846946083752741892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2013/12/bits-of-blender-67-text-boxes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5846946083752741892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5846946083752741892'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2013/12/bits-of-blender-67-text-boxes.html' title='Bits of Blender #67 - Text Boxes'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-5943810823081717361</id><published>2013-12-22T11:44:00.001-07:00</published><updated>2013-12-22T11:44:41.125-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="bit"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="typography"/><title type='text'>Bits of Blender #66 - Object Fonts</title><content type='html'>Do you know how to create your own fonts using Blender objects? This Bit shows you how.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/ZmOHNUr7FBc&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;

&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/5943810823081717361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2013/12/bits-of-blender-66-object-fonts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5943810823081717361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/5943810823081717361'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2013/12/bits-of-blender-66-object-fonts.html' title='Bits of Blender #66 - Object Fonts'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32636428.post-1222023146665029616</id><published>2013-12-16T12:48:00.004-07:00</published><updated>2026-02-16T07:46:09.081-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="b3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Bits of Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><category scheme="http://www.blogger.com/atom/ns#" term="typography"/><title type='text'>Bits of Blender #65 - Typography</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/yHyYXmROdhw&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
It&#39;s the Bits of Blender Christmas edition! In it we show you how to do some typographic tricks using nodes. </content><link rel='replies' type='application/atom+xml' href='http://artandlogic.blogspot.com/feeds/1222023146665029616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://artandlogic.blogspot.com/2013/12/bits-of-blender-65-typography.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1222023146665029616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32636428/posts/default/1222023146665029616'/><link rel='alternate' type='text/html' href='http://artandlogic.blogspot.com/2013/12/bits-of-blender-65-typography.html' title='Bits of Blender #65 - Typography'/><author><name>artandlogic</name><uri>http://www.blogger.com/profile/13407011276341204827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>