<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Sunder Iyer</title>
    <description>The latest articles on Forem by Sunder Iyer (@goldenxp).</description>
    <link>https://forem.com/goldenxp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F563262%2F983317eb-173a-4c3b-a9e4-b80481750772.png</url>
      <title>Forem: Sunder Iyer</title>
      <link>https://forem.com/goldenxp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/goldenxp"/>
    <language>en</language>
    <item>
      <title>Ink for Game Design</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Sun, 28 Apr 2024 16:35:15 +0000</pubDate>
      <link>https://forem.com/goldenxp/ink-for-game-design-2e6d</link>
      <guid>https://forem.com/goldenxp/ink-for-game-design-2e6d</guid>
      <description>&lt;p&gt;Ever since I encountered &lt;a href="https://github.com/UnderwaterApps/overlap2d" rel="noopener noreferrer"&gt;Overlap2D&lt;/a&gt; many years ago, I've had thoughts of engine-agnostic game development spinning in the back of my head. Overlap2D was a 2D level editor that exported game data that could be loaded into game frameworks like libGDX, HaxeFlixel, phaser.js and more. What's alluring about this is the idea that your game data is not tied to a specific game engine. In theory, this flexibility can allow you to develop your game sooner and worry about deployment later. If the need to switch game engines arises, perhaps due to licensing changes or platform support, you're safer with engine-agnostic game development strategies. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr55bb1zsoztqzvjpibe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr55bb1zsoztqzvjpibe.png" alt="Screenshot of Overlap2D"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What does this have to do with Inkle's &lt;a href="https://www.inklestudios.com/ink/" rel="noopener noreferrer"&gt;Ink&lt;/a&gt;? Well, Ink is a form of engine-agnostic game data creation. At heart, Ink is a narrative scripting language but because it was conceived as middleware, it can be used by many game development stacks. The primary integration is Unity which supports many platforms on its own but Ink scripts can also be run in the browser, Defold, Godot, Unreal and &lt;a href="https://github.com/inkle/ink-library?tab=readme-ov-file#ink-engine-ports-wrappers-and-integration" rel="noopener noreferrer"&gt;more&lt;/a&gt;. You can write Ink once, test it using Inky or Inklecate and deploy it using your desired framework. I can personally attest to running the same Ink script in the browser with ink.js and in the Defold, Godot and Unity game engines.&lt;/p&gt;

&lt;p&gt;At first glance, Ink looks like it's just a narrative design tool, something you would use to build multi-linear stories like the ones found in Choose-Your-Own-Adventure books. But because of its advanced scripting features, Ink can be used for game design as well! With support for functions, variables, sets, loops and more, it's possible to simulate various &lt;a href="https://github.com/inkle/inky/blob/master/app/main-process/ink/longer-ink-snippets/pontoon_example.ink" rel="noopener noreferrer"&gt;games&lt;/a&gt; purely in Ink.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh85miqxpnv75fhta0o0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh85miqxpnv75fhta0o0.png" alt="Oregon.bas ported to Ink"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has been said that games are all about interesting choices and what is Ink but a framework for setting up decision trees. If you're interested in learning more about Ink, I've written some articles &lt;a href="https://docs.goldenxp.com/ink/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.  Some of these include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.goldenxp.com/ink/worldmap" rel="noopener noreferrer"&gt;Making a World Map in Ink&lt;/a&gt;: learn how to make a navigable world&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.goldenxp.com/ink/cardswiping" rel="noopener noreferrer"&gt;Prototyping a Card Swiping Game in Ink&lt;/a&gt;: if you want to make a game like Reigns, check this one out!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.goldenxp.com/ink/testinginkweb" rel="noopener noreferrer"&gt;Testing Strategies using Inky Web Export&lt;/a&gt;: stress test your game's numbers using automated choices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ysbJcaQ_YF4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;To conclude, Ink can be a powerful toolset for game design. Thanks for reading and stay tuned for more!&lt;/p&gt;

</description>
      <category>ink</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>TIL Outro</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Tue, 03 Jan 2023 19:53:30 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-outro-3heh</link>
      <guid>https://forem.com/goldenxp/til-outro-3heh</guid>
      <description>&lt;p&gt;It should be apparent that this series has ended.&lt;/p&gt;

&lt;p&gt;There are a few reasons for this but primarily, I returned to the workforce where my daily learnings are specific to proprietary projects, and I approach a weirdly gray area when posting publicly about these learnings. &lt;/p&gt;

&lt;p&gt;Thank you to all who tuned in!&lt;br&gt;
Till next time!&lt;/p&gt;

</description>
      <category>database</category>
      <category>performance</category>
      <category>discuss</category>
    </item>
    <item>
      <title>TIL GameCreator Ragdoll Control</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Mon, 24 May 2021 21:08:22 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-gamecreator-ragdoll-control-26ib</link>
      <guid>https://forem.com/goldenxp/til-gamecreator-ragdoll-control-26ib</guid>
      <description>&lt;p&gt;2021-05-24&lt;/p&gt;

&lt;p&gt;It's often quicker/simpler/efficient to write code instead of setting up a visual script. But there's something to be said for &lt;em&gt;expressing&lt;/em&gt; the same result in an elegant visual script. It's like a creative restriction.&lt;/p&gt;

&lt;p&gt;To control a Game Creator Ragdoll, one can loop through and alter the rigid bodies that get auto-generated at runtime.&lt;/p&gt;

&lt;p&gt;One could search for the rigid bodies by component but I opted to store them in a List of GameObjects on the Character itself. It's a small list of 10 objects: spine, head, 4 legs and 4 arm pieces.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---hwBcP1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2l0o1q0kysr1y19a5aii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---hwBcP1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2l0o1q0kysr1y19a5aii.png" alt="List of rigid bodies that make up the ragdoll, pre-stored"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once that's done, it's just a matter of modifying the rigid bodies by looping through the list.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aQpHKm5S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o3hqf599lw0dyxvmw4gv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aQpHKm5S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o3hqf599lw0dyxvmw4gv.png" alt="An Action that modifies and resets rigid bodies"&gt;&lt;/a&gt;&lt;br&gt;
The Modify action applies some upward force and turns off &lt;code&gt;Gravity&lt;/code&gt; and ensures &lt;code&gt;Is Kinematic&lt;/code&gt; is not turned on.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--waOLHBNm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/snuyz7dhnun9uv0vu3hv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--waOLHBNm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/snuyz7dhnun9uv0vu3hv.png" alt="Modify"&gt;&lt;/a&gt;&lt;br&gt;
The Reset action sets Gravity back to the original value. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IqAAMTu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mjmgpufpk63joh5v1xm3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IqAAMTu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mjmgpufpk63joh5v1xm3.png" alt="Reset"&gt;&lt;/a&gt;&lt;br&gt;
End result:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v1j-Av_k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r1qbxv64lnkc0bz9tbxv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v1j-Av_k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r1qbxv64lnkc0bz9tbxv.gif" alt="Animated GIF of a ragdoll being tossed and temporarily suspended"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>gamecreator</category>
    </item>
    <item>
      <title>TIL a Unity GameCreator List Trick</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Fri, 21 May 2021 20:30:21 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-a-unity-gamecreator-list-trick-1d90</link>
      <guid>https://forem.com/goldenxp/til-a-unity-gamecreator-list-trick-1d90</guid>
      <description>&lt;p&gt;2021-05-20&lt;/p&gt;

&lt;p&gt;As time goes on, I'm more enthusiastic about game systems rather than game engines. And lately, I've been enamored with &lt;a href="https://gamecreator.io"&gt;Game Creator&lt;/a&gt;. &lt;br&gt;
Note: I sometimes refer to Game Creator as GameCreator (no space) or GCIO.&lt;/p&gt;

&lt;p&gt;If you have the Shooter module, it involves the following steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup GameCreator and its Shooter module.&lt;/li&gt;
&lt;li&gt;Build a new Ammo asset with specific properties.&lt;/li&gt;
&lt;li&gt;Build a new Weapon asset that uses this Ammo asset. &lt;/li&gt;
&lt;li&gt;Add a game object with a Character Shooter that can Draw the Weapon and Shoot it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I flesh out these steps in more detail in my &lt;a href="https://docs.goldenxp.com/gamecreator-shooter-basic-setup/"&gt;docs&lt;/a&gt; but what I learned today that was rather interesting was that you can pick a random value from a List very easily in Game Creator. This is very useful for moving objects for quick tests or otherwise inducing predictable behaviors. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B9IUi25Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xk9gr3h3ewuq42mpxnll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B9IUi25Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xk9gr3h3ewuq42mpxnll.png" alt="Random List"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eyy I forgot to hit publish :[&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>gamecreator</category>
    </item>
    <item>
      <title>TIL Chromebook Linux Launcher Creation</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Thu, 20 May 2021 01:23:32 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-chromebook-linux-launcher-creation-8g</link>
      <guid>https://forem.com/goldenxp/til-chromebook-linux-launcher-creation-8g</guid>
      <description>&lt;p&gt;2021-05-19&lt;/p&gt;

&lt;p&gt;Previously I set my Chromebook to run Godot but I didn't like opening terminal to run it and would rather have a pinned icon to launch Godot. Debian Packages installed from Chrome's Files have such shortcuts created automatically but &lt;a href="https://appimage.org/"&gt;AppImages&lt;/a&gt; don't. To make a launcher for an AppImage, it's necessary to make a .desktop file and place it in a specific folder.&lt;/p&gt;

&lt;p&gt;One way to make a .desktop file is to open the Text app and write the descriptions by hand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Desktop Entry]
Name=Godot
Comment=Great Game Engine
Exec=/home/goldenxp/apps/godot33
Icon=/home/goldenxp/icons/godot-icon.png
Type=Application
Categories=Development;Graphics;Game
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are &lt;a href="https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html"&gt;other options&lt;/a&gt; one can take advantage of like keywords and terminal display, etc.&lt;/p&gt;

&lt;p&gt;When you're satisfied, you need to save the file in a specific location so that it's picked up by the Chrome OS Launcher. Read &lt;a href="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/garcon/README.md"&gt;here&lt;/a&gt; for some info on this. The location I'm going to use is &lt;code&gt;~/.local/share/applications/&lt;/code&gt;. It's hidden by default so when you want to save it, you'll need to show hidden files.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_aXpD_V9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5i097y6n15dnsssrw7a2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_aXpD_V9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5i097y6n15dnsssrw7a2.png" alt="Show Hidden Files in Chrome's Files App"&gt;&lt;/a&gt;&lt;br&gt;
Once you save it, it should take a couple of seconds for it to show up in the Launcher. Now you can click to launch and even pin the app to the shelf.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SbqKSYq---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h4gokyaure02zvoef93r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SbqKSYq---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h4gokyaure02zvoef93r.png" alt="Resulting icon showing up in Linux Apps"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: I've noticed that some .desktop edits don't register updates in Chrome. The workaround is to delete the .desktop file and remake it.&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>godot</category>
      <category>shelf</category>
    </item>
    <item>
      <title>TIL to Set Unity Quick Search Priority</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Tue, 18 May 2021 01:01:09 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-to-set-unity-quick-search-priority-g3i</link>
      <guid>https://forem.com/goldenxp/til-to-set-unity-quick-search-priority-g3i</guid>
      <description>&lt;p&gt;2021-05-17&lt;/p&gt;

&lt;p&gt;My user interface err usage(?) style tends to be mouse-averse. As an example I prefer using Quick Launcher UIs to clicking around menus and submenus. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b_x0I-fD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iqyxym858r25q3onjbbi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b_x0I-fD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iqyxym858r25q3onjbbi.gif" alt="GIF animations of Power Toys Quick Launcher in action"&gt;&lt;/a&gt;&lt;br&gt;
So once I discovered it, I used Unity Quick Search a bit. But I noticed that most of my frequently needed commands were at the bottom of the list. This is because the default order of providers favors assets first. For me, this meant editor icons and other cruft were given priority first. Fortunately this is easy to reorder under Preferences &amp;gt; Quick Search.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KKjp6T1o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wwo9ztn5b5wcpkdu0b8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KKjp6T1o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wwo9ztn5b5wcpkdu0b8n.png" alt="Screenshot of provider order"&gt;&lt;/a&gt;&lt;br&gt;
Just click the up and down buttons as needed. Favorites, I suppose, can also be used for similar effect but this seems to work for me...for now.&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>search</category>
    </item>
    <item>
      <title>TIL Some Game Dev Options for Chromebooks</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Fri, 14 May 2021 00:29:45 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-some-game-dev-options-for-chromebooks-2p</link>
      <guid>https://forem.com/goldenxp/til-some-game-dev-options-for-chromebooks-2p</guid>
      <description>&lt;p&gt;2021-05-13&lt;/p&gt;

&lt;p&gt;Chromebooks can run both Android and Linux apps, the former (if I recall correctly) is enabled out of the book but the latter needs to be setup. It's rather trivial, though. Just go to Settings, search "Linux" and click the first "Turn on" button you see.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TgL_8WuU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvh60w2e5atubnwg4gmt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TgL_8WuU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvh60w2e5atubnwg4gmt.png" alt="Linux Installer on Chrome OS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an example, you can now download &lt;a href="https://godotengine.org/download/linux"&gt;Godot&lt;/a&gt;, copy it using the Files app to a desired location in Linux Files and run it using the Terminal app.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C8_EtxjE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/akdudegr1xb5msqfobsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C8_EtxjE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/akdudegr1xb5msqfobsp.png" alt="Running Godot thru the Terminal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Linux apps like &lt;a href="https://chrismaltby.itch.io/gb-studio"&gt;GB Studio&lt;/a&gt; are even simpler to setup with Chrome OS allowing direct installation through the right-click menu. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dYrAIzvF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mj8wh5qp727eelhdaavd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dYrAIzvF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mj8wh5qp727eelhdaavd.png" alt="Installing GB Studio is simpler"&gt;&lt;/a&gt;&lt;br&gt;
The nice thing about this installation process is you can pin the app to your shelf and invoke it without opening Terminal.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pCBRIjXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2xgum90p1j6bzcgi0k1o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pCBRIjXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2xgum90p1j6bzcgi0k1o.png" alt="GB Studio pinned"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what I discovered today was ... you could actually run Windows executables using  Wine.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F8GD9-fA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pexv0f19gqaajwtf1nv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F8GD9-fA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pexv0f19gqaajwtf1nv.png" alt="Installing Wine"&gt;&lt;/a&gt;&lt;br&gt;
So as an example, I grabbed portable Notepad++ and extracted it to a &lt;code&gt;win&lt;/code&gt; folder in Linux Files. With wine installed, it was possible to run the Windows executable with a quick command. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LiufNwZZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8umji4nozsqr8zw3c2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LiufNwZZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8umji4nozsqr8zw3c2d.png" alt="Running NPP with Wine"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>chromeos</category>
      <category>wine</category>
    </item>
    <item>
      <title>TIL DOOM 3 Source Compilation</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Tue, 11 May 2021 23:55:14 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-doom-3-source-compilation-3b2f</link>
      <guid>https://forem.com/goldenxp/til-doom-3-source-compilation-3b2f</guid>
      <description>&lt;p&gt;2021-05-11&lt;/p&gt;

&lt;p&gt;For fun, I decided to check out id Tech 4. Instead of using &lt;a href="https://github.com/id-Software/DOOM-3-BFG" rel="noopener noreferrer"&gt;id's repo&lt;/a&gt;, I was turned on to &lt;a href="https://github.com/RobertBeckebans/RBDOOM-3-BFG" rel="noopener noreferrer"&gt;RBDOOM 3&lt;/a&gt; which is a modern version. Fortunately, I found this &lt;a href="https://bartlomiejwolk.wordpress.com/2017/09/12/doom3-bfg-how-to-compile-from-source/" rel="noopener noreferrer"&gt;guide&lt;/a&gt; which made my life 100x easier.&lt;/p&gt;

&lt;p&gt;Following the guide, I cloned the master branch (using GitHub Desktop). I had Visual Studio 2019 already installed which fortunately RBDOOM 3 supports. The next step was to install cmake which I found &lt;a href="https://cmake.org/download/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. I deviated from the guide and didn't use msi, opting for the zip version. This meant I had to ensure cmake's bin folder was in my PATH variable. &lt;/p&gt;

&lt;p&gt;Then I generated the solution using one of the existing batch files, opting for cmake-vs2019-64bit-windows10.bat. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpjac7ukhls32extw6wa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpjac7ukhls32extw6wa.png" alt="Screenshot of batch files"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deviating a little from the guide once more, I skipped ahead and immediately opened the RBDoom3BFG solution generated in the new &lt;code&gt;build&lt;/code&gt; folder which opened up with no issues in VS2019. Without changing anything, I built the solution and this produced an RBDoom3BFG.exe in a Debug folder. Attempting to run this produced missing DLL errors which I took note of.&lt;/p&gt;

&lt;p&gt;Returning to the guide, I jumped to the step I skipped and grabbed ffmpeg-4.4-full_build-shared.7z from &lt;a href="https://www.gyan.dev/ffmpeg/builds/" rel="noopener noreferrer"&gt;gyan.dev&lt;/a&gt;. The necessary DLLs are in the bin folder which I placed alongside the RBDoom3BFG.exe file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avcodec-58.dll&lt;/li&gt;
&lt;li&gt;avformat-58.dll&lt;/li&gt;
&lt;li&gt;avutil-56.dll&lt;/li&gt;
&lt;li&gt;swresample-3.dll&lt;/li&gt;
&lt;li&gt;swscale-5.dll&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or you could copy all the dlls like the guide suggests.&lt;/p&gt;

&lt;p&gt;Upon running the game, I ran into the same error as the guide depicted and instead of copying just default.cfg, I copied the whole &lt;code&gt;RBDOOM-3-BFG\base\&lt;/code&gt; folder into my Saved Games folder.&lt;/p&gt;

&lt;p&gt;Finally it was time to ensure the game assets were available to the build. The game's on &lt;a href="https://isthereanydeal.com/game/doomiiibfgedition/info/#/" rel="noopener noreferrer"&gt;sale&lt;/a&gt; right now on &lt;a href="https://store.steampowered.com/app/208200/Doom_3_BFG_Edition/" rel="noopener noreferrer"&gt;Steam&lt;/a&gt;. Install the game and find its &lt;code&gt;base\&lt;/code&gt; folder where all the assets reside. The guide suggests copying it but I used &lt;a href="https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/mklink" rel="noopener noreferrer"&gt;junctions&lt;/a&gt; instead. Using junctions would mean that I can potentially ruin my game files but since I don't intend to play the game it should be okay.&lt;/p&gt;

&lt;p&gt;Unfortunately after all this, DOOM 3 still didn't run. I got this error.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4apltyfbkb618yto4t0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4apltyfbkb618yto4t0n.png" alt="Error while linking glsl program"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It turns out that the game tried to run with my system's integrated graphics processor which does not support OpenGL 4.5 which RBDOOM 3 now &lt;a href="https://github.com/RobertBeckebans/RBDOOM-3-BFG/issues/523#issuecomment-779578329" rel="noopener noreferrer"&gt;needs&lt;/a&gt;. Indeed, it complained about failing to make OpenGL 4.5 contexts and falling back to OpenGL 4.3. Fortunately I was able to specify which GPU to use.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cj2kneor7gvp92p1xx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cj2kneor7gvp92p1xx0.png" alt="Use the right-click menu to set the GPU"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upon changing to the better graphics card, the game finally ran. I loaded up a dev map.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ygmepa8dl1baflxj9u3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ygmepa8dl1baflxj9u3.png" alt="Game Capture"&gt;&lt;/a&gt;&lt;br&gt;
Rip and Tear, anyone?&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>idtech</category>
      <category>vs2019</category>
    </item>
    <item>
      <title>TIL How to Access Emoji Easily</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Tue, 11 May 2021 00:58:00 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-how-to-access-emoji-easily-176m</link>
      <guid>https://forem.com/goldenxp/til-how-to-access-emoji-easily-176m</guid>
      <description>&lt;p&gt;2021-05-10&lt;/p&gt;

&lt;p&gt;It's often hellacious to use multiple communication apps that all have different emoji support. Also sometimes I like to use icons like ✅ and ⚠ in my documents/checklists and often resort to memorization of numpad codes or opening up a browser and copy/pasting from emojipedia (or whichever hit pops up first in my search engine of choice).&lt;/p&gt;

&lt;p&gt;Luckily on my Windows 10 OS, I can hit Win key + ; and it pops up an emoji helper that supports search and recently used emoji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--glgXqD-r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9sab8zct4zm40gm8zcpl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--glgXqD-r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9sab8zct4zm40gm8zcpl.png" alt="Emoji keyboard helper"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Less headache, more expressiveness.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>windows</category>
      <category>emoticons</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>TIL AssetDatabase Ops</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Wed, 05 May 2021 01:44:39 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-assetdatabase-ops-16ia</link>
      <guid>https://forem.com/goldenxp/til-assetdatabase-ops-16ia</guid>
      <description>&lt;p&gt;2021-05-04&lt;br&gt;
&lt;em&gt;May the fourth be with you&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I exported a &lt;a href="https://dev.to/goldenxp/til-about-sgb-engine-for-unity-3g43"&gt;SGB project&lt;/a&gt; to Unity and needed to change all the shaders on the exported materials. This is a tedious task to do by hand especially when there are many materials --- but fortunately, Unity makes Editor Scripting easy and you can perform batch operations on assets easily.&lt;/p&gt;

&lt;p&gt;I learned about the AssetDatabase and how you can use it to find and manipulate assets. I slapped together a scriptable-wizard that takes two shader values and runs through all materials in the project and swaps the first with the second. This lets me target shaders that I know can be replaced properly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEditor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Wizard&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ScriptableWizard&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Shader&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Shader&lt;/span&gt; &lt;span class="n"&gt;replacement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;MenuItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Batch Ops/Wizard"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SetWizard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ScriptableWizard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DisplayWizard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Some Batch Op"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Wizard&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s"&gt;"Swap Shaders"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnWizardCreate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;guids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;AssetDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FindAssets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"t:material"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;guid&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;guids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AssetDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GUIDToAssetPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;Material&lt;/span&gt; &lt;span class="n"&gt;material&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Material&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AssetDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadAssetAtPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Material&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;material&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shader&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;material&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shader&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;replacement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Replaced shader in "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;material&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;AssetDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveAssets&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;AssetDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Refresh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following wizard shows up when I access it from the top menu.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uRvsoiZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r2uxrc53oi53iqhygc87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uRvsoiZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r2uxrc53oi53iqhygc87.png" alt="Wizard and output log"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fortunately, the script ran with no issues and I was able to avoid tedious shader replacement. I'm sure it's prone to errors but I'll deal with those as they happen.&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>assetdabase</category>
    </item>
    <item>
      <title>TIL CSS v* units</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Fri, 16 Apr 2021 01:10:31 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-css-v-units-3k71</link>
      <guid>https://forem.com/goldenxp/til-css-v-units-3k71</guid>
      <description>&lt;p&gt;2021-04-15&lt;/p&gt;

&lt;p&gt;When games and browsers combine! I'm displaying text for a web visual novel using TuesdayJS and I'm running into font visibility issues on some devices. &lt;/p&gt;

&lt;p&gt;Fortunately CSS has some useful units that work relative to the viewport! There's&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vw - 0.01x of the viewport width&lt;/li&gt;
&lt;li&gt;vh - 0.01x of the viewport height&lt;/li&gt;
&lt;li&gt;vmin - 0.01x of the smaller of the two dimensions&lt;/li&gt;
&lt;li&gt;vmax - 0.01x of the greater of the two dimensions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far using a font size based on the vmin gives me a result that seems to work nicely on different screens.&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>TIL Xbox UWP Basic Fixes</title>
      <dc:creator>Sunder Iyer</dc:creator>
      <pubDate>Wed, 07 Apr 2021 05:31:11 +0000</pubDate>
      <link>https://forem.com/goldenxp/til-xbox-uwp-basic-fixes-5dn0</link>
      <guid>https://forem.com/goldenxp/til-xbox-uwp-basic-fixes-5dn0</guid>
      <description>&lt;p&gt;2021-04-06&lt;/p&gt;

&lt;p&gt;There are two basic issues when you output a Unity game to Xbox as a UWP application. The first one is the visible white edges (tv overscan) and the second one is the mouse pointer.&lt;/p&gt;

&lt;p&gt;Most of the &lt;a href="https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/tailoring-for-xbox"&gt;official docs&lt;/a&gt; describes solutions for C# XAML but Unity only supports IL2CPP for UWP builds. &lt;/p&gt;

&lt;p&gt;To address this change, you need to edit &lt;code&gt;app.xaml.cpp&lt;/code&gt; instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;RequiresPointerMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ApplicationRequiresPointerMode&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WhenRequested&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// mouse mode off&lt;/span&gt;
&lt;span class="c1"&gt;// &lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InitializeUnity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ApplicationView&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetForCurrentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SuppressSystemOverlays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ApplicationView&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetForCurrentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SetDesiredBoundsMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ApplicationViewBoundsMode&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UseCoreWindow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// overscan fix&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>todayilearned</category>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>uwp</category>
    </item>
  </channel>
</rss>
