<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C# Programming on Abhishta</title><link>https://abhishtagatya.github.io/tags/c%23-programming/</link><description>Recent content in C# Programming on Abhishta</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sun, 14 Sep 2025 00:00:00 +0100</lastBuildDate><atom:link href="https://abhishtagatya.github.io/tags/c%23-programming/index.xml" rel="self" type="application/rss+xml"/><item><title>Generic Keyboard &amp; Mouse Sprite Animation Library</title><link>https://abhishtagatya.github.io/posts/generic-keyboard-mouse-sprite-animation-library/</link><pubDate>Sun, 14 Sep 2025 00:00:00 +0100</pubDate><guid>https://abhishtagatya.github.io/posts/generic-keyboard-mouse-sprite-animation-library/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/7BmosOk9iag?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h3 id="tldr"&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://u3d.as/3DJ2"target="_blank"
 class="relative inline-flex items-center"
&gt;Unity Asset Store
 &lt;svg id="external-link" class="h-3 w-3 ml-1 absolute top-0 right-0 transform translate-x-2/5 -translate-y-1/3"
 fill="none"
 stroke="currentColor"
 viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/&gt;&lt;/svg&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://abhishta.itch.io/generick-kbm"target="_blank"
 class="relative inline-flex items-center"
&gt;Itch Sprite Only Version
 &lt;svg id="external-link" class="h-3 w-3 ml-1 absolute top-0 right-0 transform translate-x-2/5 -translate-y-1/3"
 fill="none"
 stroke="currentColor"
 viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/&gt;&lt;/svg&gt;
&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Photo Tagging System in Unity 6 URP</title><link>https://abhishtagatya.github.io/posts/photo-tagging-system-in-unity-6-urp/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0100</pubDate><guid>https://abhishtagatya.github.io/posts/photo-tagging-system-in-unity-6-urp/</guid><description>&lt;p&gt;
&lt;figure class="image-figure not-prose my-8" 
 data-lightbox-enabled="true"
 data-gallery-type="auto"&gt;
 &lt;div class="image-container"&gt;
 &lt;img
 src="https://abhishtagatya.github.io/posts/photo-tagging-system-in-unity-6-urp/pot.png"
 alt=""
 title="Photo Tagging System Demo"
 
 
 
 
 width="1440"
 height="900"
 
 
 
 loading="lazy"
 decoding="async"
 data-gallery-src="https://abhishtagatya.github.io/posts/photo-tagging-system-in-unity-6-urp/pot.png"
 data-gallery-alt=""
 data-gallery-title="Photo Tagging System Demo" /&gt;&lt;/div&gt;

 &lt;figcaption class="image-caption"&gt;
 Photo Tagging System Demo
 &lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;In my game &lt;em&gt;Quality Assurance&lt;/em&gt;, I needed a system to &lt;strong&gt;tag objects with colors&lt;/strong&gt; and later sample that information for gameplay mechanics. Crucially, this information needed to be &lt;strong&gt;hidden from the player&lt;/strong&gt;, so it must be rendered off-screen.&lt;/p&gt;
&lt;p&gt;This article describes how I implemented a &lt;strong&gt;custom color tag encoding pass&lt;/strong&gt; in Unity URP, using &lt;code&gt;ScriptableRendererFeature&lt;/code&gt; and &lt;code&gt;MaterialPropertyBlock&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Visualizing Brno in Unity</title><link>https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/</link><pubDate>Thu, 15 May 2025 00:00:00 +0100</pubDate><guid>https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/</guid><description>&lt;style&gt;
 
#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 {
 width: 100%;
}

#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .masonry-container {
 width: 100%;
 position: relative;
}

#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .masonry-item {
 display: inline-block;
 width: 100%;
 margin-bottom: 15px;
 break-inside: avoid;
 box-sizing: border-box;
}

#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .masonry-item img {
 width: 100%;
 height: auto;
 display: block;
 transition: transform 0.3s ease-in-out;
 border-radius: 0.5rem;
}

#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .glightbox {
 display: block;
 text-decoration: none;
 overflow: hidden;
 cursor: pointer;
 border-radius: 0.5rem;
}

#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .glightbox:hover,
#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .glightbox:focus {
 text-decoration: none;
 outline: none;
}

#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .masonry-item:hover img {
 transform: scale(1.05);
}

#masonry-0b8f0d8456b9e4543b946041e42eaca9-1 .masonry-item {
 overflow: hidden;
 border-radius: 0.5rem;
}
&lt;/style&gt;

&lt;div class="masonry-gallery" 
 id="masonry-0b8f0d8456b9e4543b946041e42eaca9-1"
 data-columns="3"
 data-gutter="15"
 data-animate="true"
 data-use-transform="true"
 data-center="true"
 data-max-columns="5"
 data-lightbox="true"&gt;

 &lt;div class="masonry-container"&gt;
 &lt;div class="masonry-item"&gt;&lt;a href="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/preview.png" 
 class="glightbox"
 data-gallery="masonry-0b8f0d8456b9e4543b946041e42eaca9-1"data-description="&lt;h4&gt;GISMU Snapshot #1&lt;/h4&gt;"&gt;
 
 &lt;img
 src="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/preview.png"
 alt=""
 title="GISMU Snapshot #1"
 
 
 
 
 width="1919"
 height="1079"
 
 
 
 loading="lazy"
 decoding="async"
 data-gallery-src="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/preview.png"
 data-gallery-alt=""
 data-gallery-title="GISMU Snapshot #1" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="masonry-item"&gt;&lt;a href="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/snapshot-a.png" 
 class="glightbox"
 data-gallery="masonry-0b8f0d8456b9e4543b946041e42eaca9-1"data-description="&lt;h4&gt;GISMU Snapshot #2&lt;/h4&gt;"&gt;
 
 &lt;img
 src="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/snapshot-a.png"
 alt=""
 title="GISMU Snapshot #2"
 
 
 
 
 width="1919"
 height="1079"
 
 
 
 loading="lazy"
 decoding="async"
 data-gallery-src="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/snapshot-a.png"
 data-gallery-alt=""
 data-gallery-title="GISMU Snapshot #2" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="masonry-item"&gt;&lt;a href="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/snapshot-b.png" 
 class="glightbox"
 data-gallery="masonry-0b8f0d8456b9e4543b946041e42eaca9-1"data-description="&lt;h4&gt;GISMU Snapshot #3&lt;/h4&gt;"&gt;
 
 &lt;img
 src="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/snapshot-b.png"
 alt=""
 title="GISMU Snapshot #3"
 
 
 
 
 width="1919"
 height="1079"
 
 
 
 loading="lazy"
 decoding="async"
 data-gallery-src="https://abhishtagatya.github.io/posts/visualizing-brno-in-unity/snapshot-b.png"
 data-gallery-alt=""
 data-gallery-title="GISMU Snapshot #3" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;script&gt;
(function() {
 const containerId = 'masonry-0b8f0d8456b9e4543b946041e42eaca9-1';
 const config = {
 columns: 3 ,
 gutter: 15 ,
 maxColumns: 5 ,
 lightbox: true ,
 animate: "true",
 useTransform: "true",
 center: "true"
 };
 
 console.log('Initializing masonry gallery:', containerId, config);
 
 function initMasonryGallery() {
 const container = document.getElementById(containerId);
 if (!container) {
 console.error('Masonry container not found:', containerId);
 return;
 }
 
 const masonryContainer = container.querySelector('.masonry-container');
 if (!masonryContainer) {
 console.error('Masonry inner container not found');
 return;
 }
 
 
 if (typeof Macy === 'undefined') {
 console.error('Macy.js not loaded');
 return;
 }
 
 console.log('Found container and Macy, initializing...');
 
 
 try {
 const macyInstance = Macy({
 container: masonryContainer,
 trueOrder: false,
 waitForImages: true,
 useOwnImageLoader: false,
 debug: false,
 mobileFirst: true,
 columns: config.columns,
 margin: {
 x: config.gutter,
 y: config.gutter
 },
 breakAt: {
 1400: Math.min(config.maxColumns, config.columns),
 1200: Math.min(config.maxColumns, config.columns),
 940: Math.min(config.maxColumns, config.columns), 
 768: Math.min(3, config.columns),
 520: Math.min(2, config.columns),
 400: 1
 }
 });
 
 console.log('Macy initialized successfully for', containerId);
 
 
 const images = masonryContainer.querySelectorAll('img');
 let loadedImages = 0;
 const totalImages = images.length;
 
 function onImageLoad() {
 loadedImages++;
 console.log(`Image ${loadedImages}/${totalImages} loaded`);
 
 if (loadedImages === totalImages) {
 setTimeout(() =&gt; {
 if (macyInstance &amp;&amp; macyInstance.reCalculate) {
 macyInstance.reCalculate(true);
 console.log('Macy layout recalculated after all images loaded');
 }
 }, 100);
 }
 }
 
 images.forEach(img =&gt; {
 if (img.complete) {
 onImageLoad();
 } else {
 img.addEventListener('load', onImageLoad);
 img.addEventListener('error', onImageLoad);
 }
 });
 
 } catch (error) {
 console.error('Error initializing Macy:', error);
 }
 
 
 if (config.lightbox) {
 if (typeof GLightbox !== 'undefined') {
 try {
 
 let globalLightboxConfig = window.HUGO_GALLERY_CONFIG?.lightbox_options || {};
 
 if (typeof globalLightboxConfig === 'string') {
 try {
 globalLightboxConfig = JSON.parse(globalLightboxConfig);
 } catch (e) {
 console.error('Error parsing masonry GLightbox config:', e);
 globalLightboxConfig = {};
 }
 } 
 const lightbox = GLightbox({
 selector: `#${containerId} .glightbox`,
 touchNavigation: globalLightboxConfig.touchnavigation ?? globalLightboxConfig.touchNavigation ?? true,
 loop: globalLightboxConfig.loop ?? true,
 draggable: globalLightboxConfig.draggable ?? true,
 zoomable: globalLightboxConfig.zoomable ?? true,
 preload: globalLightboxConfig.preload ?? true,
 width: globalLightboxConfig.width || '90vw',
 height: globalLightboxConfig.height || '90vh',
 descPosition: globalLightboxConfig.descposition || globalLightboxConfig.descPosition || 'bottom',
 onOpen: () =&gt; {
 console.log('GLightbox opened for', containerId);
 }
 });
 
 console.log('GLightbox initialized successfully for', containerId, 'with global config');
 
 } catch (error) {
 console.error('Error initializing GLightbox:', error);
 }
 } else {
 console.error('GLightbox not loaded but lightbox is enabled');
 }
 }
 }
 
 
 function waitForLibraries() {
 let attempts = 0;
 const maxAttempts = 50;
 
 function check() {
 attempts++;
 
 const macyReady = typeof Macy !== 'undefined';
 const lightboxReady = !config.lightbox || typeof GLightbox !== 'undefined';
 
 if (macyReady &amp;&amp; lightboxReady) {
 initMasonryGallery();
 } else if (attempts &lt; maxAttempts) {
 setTimeout(check, 100);
 } else {
 console.error('Timeout waiting for libraries. Macy:', macyReady, 'GLightbox:', lightboxReady);
 }
 }
 
 check();
 }
 
 
 if (document.readyState === 'loading') {
 document.addEventListener('DOMContentLoaded', waitForLibraries);
 } else {
 setTimeout(waitForLibraries, 50);
 }
})();
&lt;/script&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;During my time at &lt;strong&gt;HCILab&lt;/strong&gt;, under the supervision of &lt;strong&gt;Jonas Rosecký&lt;/strong&gt;, I developed &lt;strong&gt;GISMU&lt;/strong&gt;, a Unity-based system for visualizing geospatial data in 3D. The project focused on Brno, CZ, exploring how terrain, transport, and infrastructure data could be transformed into an interactive environment — with future potential for VR exploration.&lt;/p&gt;</description></item></channel></rss>