<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Uncategorized Archives - URage</title>
	<atom:link href="https://urage.net/blog/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>https://urage.net/blog/category/uncategorized/</link>
	<description>Hating Unity? So we do - Help rage with us!</description>
	<lastBuildDate>Wed, 17 Dec 2025 01:47:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://urage.net/wp-content/uploads/2024/05/cropped-unityrage-logo-e1722825408774-32x32.png</url>
	<title>Uncategorized Archives - URage</title>
	<link>https://urage.net/blog/category/uncategorized/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Create Low poly Model from High poly</title>
		<link>https://urage.net/blog/create-low-poly-model-from-high-poly/</link>
		
		<dc:creator><![CDATA[rainer]]></dc:creator>
		<pubDate>Fri, 31 Oct 2025 15:07:31 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://urage.net/?p=6401</guid>

					<description><![CDATA[<p>The post <a href="https://urage.net/blog/create-low-poly-model-from-high-poly/">Create Low poly Model from High poly</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element wpb_animate_when_almost_visible wpb_fadeIn fadeIn" >
		<div class="wpb_wrapper">
			<p>There are multiple Remeshing options in Blender which are great for many cases. But unfortunately when it comes to Lowpoly models, none of the remeshing options really result in what we expected to see.</p>
<h3>Generated (fake low poly):</h3>
<h3>Remeshed (QuadriFlow):</h3>
<h3>Remeshed (Quad Remesher):</h3>
<p>So how do we deal with this? Don&#8217;t worry, it&#8217;s easier than u thought, the answer is to just decimate the faces.</p>
<p>If you want to remesh a highpoly model to a real, blocky/lowpoly styled mesh, all you need is the <strong>Decimate modifier.</strong></p>
<p>But wait, remeshing your model before might still be a good idea to create a better high poly model first, especially when your model has issues like missing faces.</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element wpb_animate_when_almost_visible wpb_fadeInUp fadeInUp" >
		<div class="wpb_wrapper">
			<h2>Create Low Poly Model</h2>
<ol>
<li>Make a copy of your High poly Model</li>
<li>Merge Vertices</li>
<li>Decimate (Symmetry X + Triangulate)</li>
<li>Merge Vertices (just to be sure)</li>
<li>(optional) Ctrl+T to triangulate (if not done yet with Decimate modifier)</li>
</ol>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element wpb_animate_when_almost_visible wpb_fadeInUp fadeInUp" >
		<div class="wpb_wrapper">
			<h2>Texturize Low Poly Model</h2>
<ol>
<li>Make sure Topology fits your needs for texturing</li>
<li>Create a Color Palette Texture from your Albedo Map</li>
</ol>
<ol>
<li>
<ul>
<li>with my AutoPaletteTexture-Addon for Blender</li>
<li>Online</li>
</ul>
</li>
<li>Create a new Material (append it, don&#8217;t remove the old material yet)</li>
<li>Add the Color Palette Texture to your Material as Albedo Map</li>
<li>Assign faces step by step to new Material (make sure it&#8217;s selected) and to UV Unwrap for the newly assigned faces</li>
<li>If needed, readjust vertices/edges by double clicking G and grab on a desired axis</li>
</ol>
<h1>🚀 Scaling and Snapping UVs to a Clustered Palette in Blender</h1>
<p>Working with textures and UVs in Blender can be a tedious task, especially when you want consistent color mapping across complex meshes. Recently, I dove into creating a <strong>Blender addon</strong> that allows you to scale UV islands and snap faces to a clustered color palette. Here’s a summary of the process, the challenges, and the solutions we implemented.</p>

		</div>
	</div>
</div></div></div></div><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper"><div class="vc_separator wpb_content_element vc_separator_align_center vc_sep_width_100 vc_sep_border_width_2 vc_sep_pos_align_center vc_separator_no_text vc_sep_color_pink wpb_content_element  wpb_content_element" ><span class="vc_sep_holder vc_sep_holder_l"><span class="vc_sep_line"></span></span><span class="vc_sep_holder vc_sep_holder_r"><span class="vc_sep_line"></span></span>
</div>
	<div class="wpb_text_column wpb_content_element wpb_animate_when_almost_visible wpb_fadeInUp fadeInUp" >
		<div class="wpb_wrapper">
			<h2>🎯 The Goal</h2>
<p>The main goal was to create a tool that:</p>
<ol>
<li><strong>Scales individual UV islands</strong> for better layout control.</li>
<li><strong>Samples colors from textures</strong> and clusters them into a limited palette.</li>
<li><strong>Snaps each face’s UVs</strong> to the palette colors, making texture maps uniform and easier to work with.</li>
</ol>
<p>This is particularly useful in stylized texturing workflows, game-ready assets, or when creating modular assets with consistent color blocks.</p>
<hr>
<h2>🔍 Challenges &amp; Learning Points</h2>
<h3>1. Sampling Colors Efficiently</h3>
<p>Initially, the code tried to copy the entire original texture to sample colors. This caused <strong>memory issues</strong> and extremely slow performance on large images.</p>
<p><strong>Solution:</strong></p>
<ul>
<li>Create a temporary copy of the image.</li>
<li>Scale it down to a maximum resolution (e.g., 512px) for faster color sampling.</li>
<li>Sample colors from this smaller version while maintaining correct UV mapping.</li>
</ul>
<p>This drastically reduced processing time without sacrificing much visual accuracy.</p>
<hr>
<h3>2. Handling Blender Image Pixels</h3>
<p>Blender’s <code>Image.pixels</code> array has a <strong>fixed size</strong>, and directly assigning a list of a different length caused a <code>ValueError</code>.</p>
<p><strong>Solution:</strong></p>
<ul>
<li>Create a temporary image with the same size as the original.</li>
<li>Copy pixels first, then scale it internally using <code>image.scale()</code>.</li>
</ul>
<p>This approach safely resized the texture without errors.</p>
<hr>
<h3>3. UV Island Scaling</h3>
<p>Scaling UV islands individually required identifying <strong>connected UV islands</strong>. This involved:</p>
<ul>
<li>Iterating over selected faces.</li>
<li>Using a stack-based search to collect connected faces sharing UVs.</li>
<li>Scaling the UVs relative to their center.</li>
</ul>
<p>This ensures each island scales proportionally without affecting others.</p>
<hr>
<h3>4. K-Means Color Clustering</h3>
<p>To reduce the texture’s colors to a limited palette, we implemented a <strong>simple k-means clustering</strong> algorithm:</p>
<ul>
<li>Initialize <code>k</code> cluster centers from sampled colors.</li>
<li>Iterate several times to assign colors to clusters.</li>
<li>Compute cluster averages to define final palette colors.</li>
</ul>
<p>This gives users control over the <strong>number of colors</strong> and ensures a consistent color palette.</p>
<hr>
<h3>5. User Options for Performance vs Accuracy</h3>
<p>During testing, we noticed that using a <strong>downscaled image</strong> sometimes produced slightly different results.</p>
<p><strong>Solution:</strong> Add a <strong>checkbox</strong> in the UI:</p>
<ul>
<li>✅ Use downscaled image → faster but approximate.</li>
<li>❌ Use full-resolution image → slower but exact.</li>
</ul>
<p>Additionally, users can set a <strong>maximum resolution</strong> for downscaled images, allowing them to balance speed and accuracy.</p>
<hr>
<h2>🛠️ Blender Operator UI</h2>
<p>The final addon exposes these controls in the UV editor:</p>
<pre><code>UV Island Scale: [0.1]
Max Colors: [16]
Block Size: [8]
☑ Use Downscaled Image
    Downscale Max Size: [512]
</code></pre>
<ul>
<li><strong>UV Island Scale:</strong> How much to scale each UV island.</li>
<li><strong>Max Colors:</strong> Number of colors in the clustered palette.</li>
<li><strong>Block Size:</strong> Size of each color block in the generated palette texture.</li>
<li><strong>Use Downscaled Image:</strong> Toggle between fast approximate sampling and full-res sampling.</li>
<li><strong>Downscale Max Size:</strong> Maximum resolution for downscaled texture sampling.</li>
</ul>
<hr>
<h2>✅ Key Takeaways</h2>
<ol>
<li><strong>Always respect Blender’s fixed array sizes</strong> when modifying images.</li>
<li><strong>Temporary downscaled textures</strong> are a simple and effective performance hack.</li>
<li><strong>UV islands can be scaled independently</strong> by finding connected faces.</li>
<li><strong>K-means clustering</strong> is a practical method for reducing color complexity.</li>
<li><strong>User options for performance vs accuracy</strong> make the tool flexible and user-friendly.</li>
</ol>
<p>The Voxel Remesh Modifier can still be useful, for example to quickly fix holes or other issues in your mesh.<br />
You can then (optional: unsubdivide) and decimate the mesh afterwards.</p>
<p>This tool can also create pixel-art versions of an existing image:</p>
<ol>
<li>Add a Plane</li>
<li>Add Texture to Plane Material</li>
<li>Add Multiresolution Modifier</li>
<li>Click &#8220;Simple&#8221; 5-6 times</li>
<li>Apply the Modifier</li>
<li>Go to Edit Mode and check if topology suits your needs</li>
<li>If it&#8217;s too less yet: start over with <strong>step 3</strong></li>
<li>Run LowpolyUV</li>
</ol>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://urage.net/blog/create-low-poly-model-from-high-poly/">Create Low poly Model from High poly</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Building a Multiplayer Game with FishNet &#038; Unity Relay</title>
		<link>https://urage.net/blog/building-a-multiplayer-game-with-fishnet-unity-relay/</link>
		
		<dc:creator><![CDATA[rainer]]></dc:creator>
		<pubDate>Mon, 13 Oct 2025 12:05:08 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://urage.net/?p=6140</guid>

					<description><![CDATA[<p>The post <a href="https://urage.net/blog/building-a-multiplayer-game-with-fishnet-unity-relay/">Building a Multiplayer Game with FishNet &#038; Unity Relay</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>Multiplayer games are more accessible than ever, thanks to tools like <strong>FishNet</strong> and <strong>Unity Relay</strong>. In this guide, we’ll explore how to:</p>
<ul>
<li>✅ Set up <strong>FishNet</strong> with <strong>Unity Transport (UTP)</strong></li>
<li>✅ Use <strong>Unity Relay</strong> for seamless P2P connections</li>
<li>✅ Host and join games with <strong>join codes</strong></li>
<li>✅ Optimize networking for a <strong>3D fishnet-style game</strong></li>
</ul>
<p>key resources:</p>
<ul>
<li><a href="https://github.com/ooonush/FishyUnityTransport/releases/tag/2.0.0-pre.2">FishyUnityTransport 2.0.0-pre.2</a> (Relay-compatible transport)</li>
<li><a href="https://github.com/maxkratt/fish-networking-getting-started/tree/master/Assets">Fish-Networking Getting Started</a> (Sample project)</li>
</ul>
<h2>Why FishNet + Unity Relay?</h2>
<p>FishNet is a <strong>high-performance</strong> networking solution for Unity, while <strong>Unity Relay</strong> solves NAT traversal without dedicated servers. Together, they enable:</p>
<ul>
<li><strong>P2P connections</strong> without port forwarding.</li>
<li><strong>Cross-platform play</strong> (PC, mobile, consoles).</li>
<li><strong>Secure connections</strong> via Relay’s encrypted tunnels.</li>
</ul>
<h2>Setting Up FishNet with Unity Transport</h2>
<h3>Installation</h3>
<ol>
<li>Install <strong>FishNet</strong> via the [Asset Store](https://assetstore.unity.com/packages/tools/network/fish-net-networking-evolved-207815).</li>
<li>Add FishyUnityTransport:
<ul>
<li>Download [FishyUnityTransport 2.0.0-pre.2](https://github.com/ooonush/FishyUnityTransport/releases/tag/2.0.0-pre.2).</li>
<li>Import it into your project (`FishNet → Import Transport`).</li>
</ul>
</li>
<li>Configure Transport:
<ul>
<li>&nbsp;In `FishNet Manager`, assign <strong>FishyUnityTransport</strong>.</li>
<li>Set <strong>Protocol Type</strong> to `Relay` for UTP + Relay support.</li>
</ul>
</li>
</ol>
<h2>Conclusion</h2>
<p>With <strong>FishNet + Unity Relay</strong>, you can build <strong>scalable, secure</strong> multiplayer games without complex server setups. Try it in your next project!</p>
<p><strong>Resources</strong>:</p>
<ul>
<li>[FishyUnityTransport GitHub](https://github.com/ooonush/FishyUnityTransport)</li>
<li>[Fish-Networking Starter Project](https://github.com/maxkratt/fish-networking-getting-started)</li>
</ul>
<h2>Integrating Unity Relay</h2>
<h3>Step 1: Install Required Unity Packages</h3>
<p><strong>Unity Packages (via Package Manager)</strong></p>
<ul>
<li>com.unity.transport</li>
<li>com.unity.services.relay</li>
<li>com.unity.services.authentication</li>
</ul>
<h3>Step 2: Authenticate Players</h3>
<p>Before hosting/joining, authenticate anonymously:</p>
<h3>Step 3: Host a Game</h3>
<p>&nbsp;</p>
<h3>Step 4: Join a Game</h3>
<p>&nbsp;</p>
<h2>Key Scripts for Multiplayer</h2>
<h3>Networked Player Movement</h3>
<p>&nbsp;</p>
<p>&#8211; <strong>Check Relay Dashboard</strong>: Monitor allocations in [Unity Gaming Services](https://dashboard.unity3d.com/).<br />
&#8211; <strong>Logs</strong>: Debug with `Debug.Log` or `NetworkManager.Logging`.</p>
<h2>Performance Tips</h2>
<p>&#8211; **Optimize Bandwidth**: Use `[Networked]` sparingly.<br />
&#8211; **Lag Compensation**: Implement client-side prediction if needed.<br />
&#8211; **Scale with Relay**: Upgrade for more CCUs (concurrent users).</p>
<h3>Synchronized Fish Net (Server Authority)</h3>
<p>&nbsp;</p>
<h2>Testing &amp; Debugging</h2>
<p><strong>Use ParrelSync</strong>: Test multiplayer in the editor with cloned instances.</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://urage.net/blog/building-a-multiplayer-game-with-fishnet-unity-relay/">Building a Multiplayer Game with FishNet &#038; Unity Relay</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Generate Scripts at Runtime in Unity</title>
		<link>https://urage.net/blog/generate-scripts-at-runtime-in-unity/</link>
		
		<dc:creator><![CDATA[rainer]]></dc:creator>
		<pubDate>Mon, 13 Oct 2025 11:35:16 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://urage.net/?p=6229</guid>

					<description><![CDATA[<p>The post <a href="https://urage.net/blog/generate-scripts-at-runtime-in-unity/">Generate Scripts at Runtime in Unity</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>&nbsp;</p>
<div style="width: 1170px;" class="wp-video"><video class="wp-video-shortcode" id="video-6229-1" width="1170" height="623" preload="metadata" controls="controls"><source type="video/mp4" src="https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime.mp4?_=1" /><a href="https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime.mp4">https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime.mp4</a></video></div><br />
<div style="width: 1170px;" class="wp-video"><video class="wp-video-shortcode" id="video-6229-2" width="1170" height="623" preload="metadata" controls="controls"><source type="video/mp4" src="https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime2.mp4?_=2" /><a href="https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime2.mp4">https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime2.mp4</a></video></div>
<pre></pre>
<p>&nbsp;</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://urage.net/blog/generate-scripts-at-runtime-in-unity/">Generate Scripts at Runtime in Unity</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime.mp4" length="515740" type="video/mp4" />
<enclosure url="https://urage.net/wp-content/uploads/2025/10/generate_scripts_at_runtime2.mp4" length="591064" type="video/mp4" />

			</item>
		<item>
		<title>Setting Up ComfyUI with Hunyuan3DWrapper on Windows (GPU + CUDA 12.6)</title>
		<link>https://urage.net/blog/generate-texturized-3d-models-with-comfyui-hunyuan3d-a-complete-guide/</link>
		
		<dc:creator><![CDATA[rainer]]></dc:creator>
		<pubDate>Fri, 29 Aug 2025 09:04:28 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://urage.net/?p=6168</guid>

					<description><![CDATA[<p>The post <a href="https://urage.net/blog/generate-texturized-3d-models-with-comfyui-hunyuan3d-a-complete-guide/">Setting Up ComfyUI with Hunyuan3DWrapper on Windows (GPU + CUDA 12.6)</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>Installing <strong>Hunyuan3DWrapper</strong> can be tricky, especially if you want to <strong>texturize 3D models</strong>. Prebuilt rasterizer wheels may fail on certain GPUs, and DLL errors are common. This guide walks you step-by-step through a <strong>reliable setup</strong>.</p>
<p><a href="https://docs.comfy.org/tutorials/3d/hunyuan3D-2">https://docs.comfy.org/tutorials/3d/hunyuan3D-2</a></p>
<p><iframe title="How to use ComfyUI for beginners." width="1170" height="658" src="https://www.youtube.com/embed/23VkGD-4uwk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<hr>
<p>&nbsp;</p>
<h2>💻 Ready-to-Run Setup Script</h2>
<p><strong>Windows</strong> (Install_ComfyUI_with_Hunyuan3D-2.bat)</p>
<p>&nbsp;</p>
<h2><strong>1️⃣</strong><strong> System Prerequisites</strong></h2>
<table>
<thead>
<tr>
<th>Component</th>
<th>Version / Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>CUDA Toolkit</td>
<td><a href="https://developer.nvidia.com/cuda-12-6-0-download-archive">12.6 (runtime DLLs accessible)</a></td>
</tr>
<tr>
<td>NVIDIA GPU Driver</td>
<td><a href="https://www.nvidia.com/en-us/software/nvidia-app/">Latest compatible with CUDA 12.6</a></td>
</tr>
<tr>
<td>Python</td>
<td><a href="https://www.python.org/downloads/release/python-31211/">3.12.11 (64-bit)</a></td>
</tr>
<tr>
<td>Git</td>
<td><a href="https://git-scm.com/downloads/win">Recent version</a></td>
</tr>
<tr>
<td>Windows</td>
<td>10/11, 64-bit</td>
</tr>
<tr>
<td>Visual C++ Redistributable (x64)</td>
<td><a href="https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170">2022</a></td>
</tr>
</tbody>
</table>
<blockquote><p>
⚠️ Missing any of these can lead to <strong>DLL load errors</strong>.
</p></blockquote>
<p><strong>Make sure you have a ton of free space available in your Disk:</strong></p>
<ul>
<li>Python venv: ~6GB</li>
<li>ComfyUI: ~375MB (without models) ~45GB (with models)</li>
</ul>
<hr>
<h2><strong>2️⃣ Python Virtual Environment</strong></h2>
<p>Run in the <strong>root directory</strong> where <code>python_embeded</code> is located:</p>
<pre><code class="language-bat">python_embeded\python.exe -m venv venv
call venv\Scripts\activate
</code></pre>
<hr>
<h2><strong>3️⃣ PyTorch 2.6 + CUDA 12.6</strong></h2>
<p>Run <strong>inside the activated venv</strong>, in any directory:</p>
<pre><code class="language-bat">pip install torch==2.6.0+cu126 torchvision==0.21.0+cu126 torchaudio==2.6.0+cu126 --extra-index-url https://download.pytorch.org/whl/cu126
</code></pre>
<hr>
<h2><strong>4️⃣ Install ComfyUI and Hunyuan3DWrapper</strong></h2>
<p>Run in the <strong>root directory</strong> where <code>ComfyUI</code> folder exists:</p>
<pre><code class="language-bat">git clone https://github.com/comfyanonymous/ComfyUI.git
git clone https://github.com/kijai/ComfyUI-Hunyuan3DWrapper.git ComfyUI\custom_nodes\ComfyUI-Hunyuan3DWrapper

pip install -r ComfyUI\requirements.txt
pip install -r ComfyUI\custom_nodes\ComfyUI-Hunyuan3DWrapper\requirements.txt
pip install transparent_background

:: Optional prebuilt rasterizer wheel
pip install ComfyUI\custom_nodes\ComfyUI-Hunyuan3DWrapper\wheels\custom_rasterizer-0.1.0+torch260.cuda126-cp312-cp312-win_amd64.whl
</code></pre>
<hr>
<h2><strong>5️⃣ Build Rasterizer from Source (for 3090 / Ampere)</strong></h2>
<p>Run <strong>inside the folder</strong>:</p>
<pre><code>ComfyUI\custom_nodes\ComfyUI-Hunyuan3DWrapper\custom_rasterizer
</code></pre>
<p>Steps:</p>
<pre><code class="language-bat">set TORCH_CUDA_ARCH_LIST=8.6
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
python -m pip install . --force-reinstall
</code></pre>
<blockquote><p>
✅ Fixes “no kernel image available” and DLL errors.
</p></blockquote>
<hr>
<h2><strong>6️⃣ Launch ComfyUI</strong></h2>
<p>Run in the <strong>root directory</strong> of ComfyUI:</p>
<pre><code class="language-bat">call venv\Scripts\activate
python ComfyUI\main.py --windows-standalone-build
</code></pre>
<hr>
<h2><strong>7️⃣ 3D Model Workflow</strong></h2>
<ol>
<li><strong>Provide Input</strong>
<ul>
<li>2D image (analyzed for depth)</li>
<li>Or rough 3D base shape (sphere, cube, cylinder)</li>
</ul>
</li>
<li><strong>Generate 3D Model</strong>
<ul>
<li>Adjust resolution, mesh detail, textures</li>
<li>Click <strong>Generate</strong></li>
</ul>
</li>
<li><strong>Refine &amp; Texturize</strong>
<ul>
<li>Enhance mesh</li>
<li>Apply custom textures</li>
</ul>
</li>
<li><strong>Export</strong>
<ul>
<li>OBJ, FBX, STL</li>
</ul>
</li>
<li><strong>Blender Cleanup</strong>
<ul>
<li>Merge vertices: <code>M → By Distance</code></li>
<li>Convert triangles to quads: <code>Alt+J</code></li>
<li>Shade Auto Smooth</li>
</ul>
</li>
</ol>
<hr>
<h2><strong>8️⃣ Lessons Learned</strong></h2>
<ul>
<li>Prebuilt wheels can fail; rebuild from source for Ampere GPUs.</li>
<li>Match <strong>PyTorch, CUDA, Python, and wheel versions</strong>.</li>
<li>Use <strong>venv</strong> for isolation.</li>
<li>Ensure <strong>MSVC Build Tools + Ninja</strong> are installed.</li>
</ul>
<hr>
<h2><strong>TL;DR</strong></h2>
<ol>
<li>Install CUDA 12.6, NVIDIA drivers, Git, VC++ redistributable</li>
<li>Use a <strong>venv</strong></li>
<li>Install PyTorch 2.6 + CUDA 12.6, ComfyUI, Hunyuan3DWrapper, transparent_background</li>
<li>If rasterizer fails, <strong>build from source</strong> (<code>TORCH_CUDA_ARCH_LIST=8.6</code>)</li>
<li>Launch ComfyUI from venv</li>
</ol>
<hr>
<h2><strong class="mr-2 flex-self-stretch"><a href="https://github.com/AIGODLIKE/ComfyUI-BlenderAI-node" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame">ComfyUI-BlenderAI-node</a></strong></h2>
<p class="f4 my-3">Used for AI model generation, next-generation Blender rendering engine, texture enhancement&amp;generation (based on ComfyUI)</p>
<p>Download: <a href="https://github.com/AIGODLIKE/ComfyUI-BlenderAI-node">https://github.com/AIGODLIKE/ComfyUI-BlenderAI-node</a></p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://urage.net/blog/generate-texturized-3d-models-with-comfyui-hunyuan3d-a-complete-guide/">Setting Up ComfyUI with Hunyuan3DWrapper on Windows (GPU + CUDA 12.6)</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ways of Storing Data in Unity: PlayerPrefs, EditorPrefs, and JSON Files</title>
		<link>https://urage.net/blog/ways-of-storing-data-in-unity-playerprefs-editorprefs-and-json-files/</link>
		
		<dc:creator><![CDATA[rainer]]></dc:creator>
		<pubDate>Mon, 30 Jun 2025 09:18:13 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[editorprefs]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[playerprefs]]></category>
		<guid isPermaLink="false">https://urage.net/?p=1759</guid>

					<description><![CDATA[<p>The post <a href="https://urage.net/blog/ways-of-storing-data-in-unity-playerprefs-editorprefs-and-json-files/">Ways of Storing Data in Unity: PlayerPrefs, EditorPrefs, and JSON Files</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>When developing a game or application in Unity, one of the critical aspects to consider is how to store and manage data. Unity provides several methods to store data, each suited for different use cases. Here, we will explore three common methods: PlayerPrefs, EditorPrefs, and JSON files, and discuss when to use each.</p>
<h2><strong>PlayerPrefs</strong></h2>
<blockquote><p>
<strong>Don&#8217;t save larger data into PlayerPrefs<br />
</strong>
</p></blockquote>
<p><strong>PlayerPrefs </strong>are a simple way to store and access player preferences and other small pieces of data. PlayerPrefs is a key-value storage system, where you can save and retrieve data using string keys.</p>
<p><strong>Common Use Cases:</strong></p>
<ul>
<li>Saving player settings (e.g., audio volume, graphics settings).</li>
<li>Storing player progress or scores.</li>
<li>Remembering simple user preferences.</li>
</ul>
<pre class="wp-block-preformatted">// Retrieve data
int highScore = PlayerPrefs.GetInt("HighScore");
float volume = PlayerPrefs.GetFloat("Volume");
string playerName = PlayerPrefs.GetString("PlayerName");</pre>
<p><strong>Pros:</strong></p>
<ul>
<li>Easy to use and quick to implement.</li>
<li>Built into Unity, no need for external libraries.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Limited data types (int, float, string)
<ul>
<li>Unity PlayerPrefsExtra gives you the ability to save more complexe data types such as : Vectors, Bool, Colors, Lists, &#8230; and it uses the Unity&#8217;s PlayerPrefs under the hood. <a href="https://github.com/herbou/UnityPlayerPrefsExtra">https://github.com/herbou/UnityPlayerPrefsExtra</a></li>
</ul>
</li>
<li>Not suitable for large or complex data.</li>
<li>Data is stored in plain text, which can be easily modified.</li>
</ul>
<h2>EditorPrefs</h2>
<p><strong>EditorPrefs</strong> is similar to PlayerPrefs but is used specifically for storing data related to the Unity Editor. This can be helpful for saving editor-specific settings and preferences that should persist between sessions.</p>
<p><strong>Common Use Cases:</strong></p>
<ul>
<li>Storing custom editor tool settings.</li>
<li>Remembering window positions and sizes in the Unity Editor.</li>
<li>Saving editor preferences.</li>
</ul>
<p><strong>Example:</strong></p>
<p>// Save editor preference<br />
EditorPrefs.SetInt(&#8220;CustomToolWindowX&#8221;, 100);<br />
EditorPrefs.SetFloat(&#8220;CustomToolOpacity&#8221;, 0.8f);<br />
EditorPrefs.SetString(&#8220;LastOpenProject&#8221;, &#8220;/Projects/MyGame&#8221;);</p>
<p>// Retrieve editor preference<br />
int windowX = EditorPrefs.GetInt(&#8220;CustomToolWindowX&#8221;);<br />
float opacity = EditorPrefs.GetFloat(&#8220;CustomToolOpacity&#8221;);<br />
string lastOpenProject = EditorPrefs.GetString(&#8220;LastOpenProject&#8221;);</p>
<p><strong>Pros:</strong></p>
<ul>
<li>Ideal for storing data that should persist across editor sessions.</li>
<li>Easy to use and integrates well with custom editor scripts.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Limited to editor-only data, not suitable for runtime data.</li>
<li>Similar limitations to PlayerPrefs in terms of data types.</li>
</ul>
<h2>JSON Files</h2>
<p><strong>JSON (JavaScript Object Notation)</strong> is a flexible and human-readable format for storing structured data. Unity&#8217;s <code>JsonUtility</code> class can be used to serialize and deserialize objects to and from JSON.</p>
<p><strong>Common Use Cases:</strong></p>
<ul>
<li>Saving game states.</li>
<li>Storing complex configurations or settings.</li>
<li>Sharing data between different parts of the game or with external systems.</li>
</ul>
<p><strong>Example:</strong></p>
<p>[System.Serializable]<br />
public class PlayerData<br />
{<br />
public string playerName;<br />
public int highScore;<br />
public float volume;<br />
}</p>
<p>// Save data to JSON file<br />
PlayerData playerData = new PlayerData { playerName = &#8220;JohnDoe&#8221;, highScore = 100, volume = 0.5f };<br />
string json = JsonUtility.ToJson(playerData);<br />
File.WriteAllText(Application.persistentDataPath + &#8220;/playerData.json&#8221;, json);</p>
<p>// Load data from JSON file<br />
string json = File.ReadAllText(Application.persistentDataPath + &#8220;/playerData.json&#8221;);<br />
PlayerData loadedData = JsonUtility.FromJson(json);</p>
<p><strong>Pros:</strong></p>
<ul>
<li>Supports complex data structures.</li>
<li>Human-readable and easy to debug.</li>
<li>Can be used to share data across different systems.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Requires more code to implement compared to PlayerPrefs and EditorPrefs.</li>
<li>Reading and writing to files can be slower and more error-prone.</li>
</ul>
<h2>Choosing the Right Method</h2>
<p>When deciding which data storage method to use, consider the following:</p>
<ol>
<li><strong>Simplicity vs. Complexity:</strong> For simple, straightforward data like settings and preferences, PlayerPrefs or EditorPrefs are often sufficient. For more complex data, JSON files provide greater flexibility.</li>
<li><strong>Runtime vs. Editor:</strong> Use PlayerPrefs for runtime data and EditorPrefs for editor-specific data.</li>
<li><strong>Data Security:</strong> PlayerPrefs and EditorPrefs store data in plain text, which can be easily modified. For more secure data storage, consider using JSON files with encryption or other secure storage methods.</li>
<li><strong>Data Size:</strong> PlayerPrefs and EditorPrefs are not designed for large amounts of data. For larger or more complex datasets, JSON files are more appropriate.</li>
</ol>
<p>In summary, PlayerPrefs and EditorPrefs offer quick and easy ways to store simple data, ideal for player preferences and editor settings, respectively. JSON files, on the other hand, provide a more robust solution for handling complex and structured data, suitable for saving game states and configurations. Choose the method that best fits your specific needs and the complexity of the data you need to manage.</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://urage.net/blog/ways-of-storing-data-in-unity-playerprefs-editorprefs-and-json-files/">Ways of Storing Data in Unity: PlayerPrefs, EditorPrefs, and JSON Files</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Setting up a Matrix Server using Ansible and Docker</title>
		<link>https://urage.net/blog/setting-up-a-matrix-server-using-ansible-and-docker/</link>
		
		<dc:creator><![CDATA[rainer]]></dc:creator>
		<pubDate>Sun, 25 Aug 2024 19:00:22 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ansible]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[element]]></category>
		<category><![CDATA[matrix]]></category>
		<category><![CDATA[synapse]]></category>
		<guid isPermaLink="false">https://urage.net/?p=1838</guid>

					<description><![CDATA[<p>Matrix is an open standard for decentralized communication, and Synapse is its reference implementation. If you want to set up your own [&#8230;]</p>
<p>The post <a href="https://urage.net/blog/setting-up-a-matrix-server-using-ansible-and-docker/">Setting up a Matrix Server using Ansible and Docker</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Matrix is an open standard for decentralized communication, and Synapse is its reference implementation. If you want to set up your own Matrix server, using Docker and Ansible can make the process much smoother. This blog post will guide you through the setup process using the excellent <code>matrix-docker-ansible-deploy</code> repository by Slavi Pantaleev. Along the way, I&#8217;ll share some of my findings and the steps I took to overcome a few hurdles.</p>
<pre>Prerequisites</pre>
<pre><code>sudo lsof -i :80
</code></pre>
<p>Before diving into the setup, ensure your system meets the prerequisites outlined in the official documentation:</p>
<ol>
<li><strong>Clone the Repository</strong>:
<pre><code>git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git
cd matrix-docker-ansible-deploy
</code></pre>
</li>
<li><strong>Install Required Dependencies</strong>:
<ul>
<li>First, ensure you have the necessary tools installed:
<pre><code>sudo apt update
sudo apt install curl git ansible
</code></pre>
<p>Next, install Rust and <code>just</code>, a command runner that makes working with this setup easier:</p>
<pre><code>curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
git clone https://github.com/casey/just.git
cd just
cargo build --release
sudo mv target/release/just /usr/local/bin/
just --version  # Verify the installation
</code></pre>
</li>
</ul>
</li>
<li><strong>Firewall Configuration</strong>:<br />
Ensure your server is properly configured to allow necessary traffic:</p>
<pre><code># Allow HTTP and HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Allow TURN ports
sudo ufw allow 3478/tcp
sudo ufw allow 3478/udp
sudo ufw allow 5349/tcp
sudo ufw allow 5349/udp

# Allow Matrix Federation API
sudo ufw allow 8448/tcp

# Allow UDP port range for TURN
sudo ufw allow 49152:49172/udp

# Enable UFW if it's not already enabled
sudo ufw enable

# Verify the rules
sudo ufw status verbose
</code></pre>
</li>
<li><strong>Check for Port Conflicts</strong>:<br />
Before proceeding, check if the necessary ports are already in use:</p>
<pre><code>sudo lsof -i :80
</code>if port is occupied, resolve the conflict before continuing.</pre>
<pre><code>just register-user
</code></pre>
<pre><code>git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git
cd matrix-docker-ansible-deploy</code></pre>
</li>
</ol>
<hr />
<p><strong>Setting Up the Matrix Server</strong></p>
<pre><code>
</code></pre>
<p>With the prerequisites in place, you can proceed with the server setup.</p>
<ol>
<li><strong>Install Ansible Galaxy Dependencies</strong>:<br />
From within the <code>matrix-docker-ansible-deploy</code> directory:</p>
<pre><code>ansible-galaxy install -r requirements.yml
</code></pre>
</li>
<li><strong>Run the Setup Playbook</strong>:<br />
Use <code>just</code> to install all necessary roles and start the server:</p>
<pre><code>just roles
ansible-playbook -i inventory/hosts setup.yml --tags=install-all,ensure-matrix-users-created,start --ask-become-pass
</code></pre>
</li>
<li><strong>Dealing with Service Failures</strong>:<br />
During my setup, I encountered an issue with the <code>matrix-traefik</code> service failing to start due to a port conflict:</p>
<pre><code>systemd[1]: matrix-traefik.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: matrix-traefik.service: Failed with result 'exit-code'.
systemd[1]: matrix-traefik.service: Scheduled restart job, restart counter is at 289.
</code></pre>
<p>The solution was to identify which service was occupying port</p>
<pre><code>just register-user   
</code></pre>
<pre><code>git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git
cd matrix-docker-ansible-deploy
</code></pre>
<p>and either stop it or configure <code>traefik</code> to use a different port.</li>
<li><strong>Configuring Matrix Synapse</strong>:
<ul>
<li>If you need to register users, you can use the <code>just</code> command:
<pre><code>just register-user   
</code></pre>
</li>
<li>To configure Synapse further, such as disabling the ability to join remote rooms:
<pre><code>sudo su - matrix
nano /matrix/synapse/config/homeserver.yaml
</code></pre>
<p>Add or modify the following configuration:</p>
<pre><code>sudo apt update
sudo apt install curl git ansible
</code></pre>
<pre><code>git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git
cd matrix-docker-ansible-deploy
</code></pre>
</li>
<li>After making changes, restart the Synapse service:
<pre><code>sudo apt update
sudo apt install curl git ansible
</code></pre>
<pre><code></code></pre>
</li>
</ul>
</li>
</ol>
<hr />
<pre>https://github.com/etkecc/synapse-admin/?tab=readme-ov-file
</pre>
<p><strong>Final Thoughts and Support</strong></p>
<p>Setting up a Matrix server using Docker and Ansible with <code>matrix-docker-ansible-deploy</code> is a powerful and flexible approach, especially if you plan to manage multiple services or scale your deployment. However, it’s important to be prepared for some potential troubleshooting along the way, especially when it comes to port conflicts and service configurations.</p>
<p>The Matrix community and the maintainers of this playbook offer fantastic support:</p>
<ul>
<li><strong>Matrix Room</strong>: <a href="https://matrix.to/#/#matrix-docker-ansible-deploy:devture.com">#matrix-docker-ansible-deploy:devture.com</a></li>
<li><strong>IRC Channel</strong>: <code>#matrix-docker-ansible-deploy</code> on the Libera Chat IRC network (<a href="irc://irc.libera.chat:&lt;br /&gt;&lt;pre wp-pre-tag-6&gt;&lt;/pre&gt; &lt;p&gt;,&lt;/p&gt; &lt;pre&gt;&lt;code&gt;just roles ansible-playbook -i inventory/hosts setup.yml --tags=install-all,ensure-matrix-users-created,start --ask-become-pass &lt;/code&gt;&lt;/pre&gt; &lt;pre wp-pre-tag-6&gt;&lt;/pre&gt; &lt;p&gt;,&lt;/p&gt; &lt;pre&gt;&lt;code&gt;just roles ansible-playbook -i inventory/hosts setup.yml --tags=install-all,ensure-matrix-users-created,start --ask-become-pass &lt;/code&gt;&lt;/pre&gt; &lt;pre wp-pre-tag-9&gt;&lt;/pre&gt; &lt;p&gt;,&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sudo su - matrix nano /matrix/synapse/config/homeserver.yaml &lt;/code&gt;&lt;/pre&gt; &lt;pre wp-pre-tag-7&gt;&lt;/pre&gt; &lt;p&gt;,&lt;/p&gt; &lt;pre&gt;&lt;code&gt;systemd[1]: matrix-traefik.service: Main process exited, code=exited, status=1/FAILURE systemd[1]: matrix-traefik.service: Failed with result 'exit-code'. systemd[1]: matrix-traefik.service: Scheduled restart job, restart counter is at 289. &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;">irc.libera.chat:</a>
<pre></pre>
<pre><code>just roles
ansible-playbook -i inventory/hosts setup.yml --tags=install-all,ensure-matrix-users-created,start --ask-become-pass
</code></pre>
<pre><code>sudo su - matrix
nano /matrix/synapse/config/homeserver.yaml
</code></pre>
<pre><code>systemd[1]: matrix-traefik.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: matrix-traefik.service: Failed with result 'exit-code'.
systemd[1]: matrix-traefik.service: Scheduled restart job, restart counter is at 289.
</code></pre>
</li>
<li><strong>GitHub Issues</strong>: <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy/issues">spantaleev/matrix-docker-ansible-deploy/issues</a></li>
</ul>
<p>The post <a href="https://urage.net/blog/setting-up-a-matrix-server-using-ansible-and-docker/">Setting up a Matrix Server using Ansible and Docker</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Taskitty Progress Report (07/2024)</title>
		<link>https://urage.net/blog/taskitty-progress-report-07-2024/</link>
		
		<dc:creator><![CDATA[rainer]]></dc:creator>
		<pubDate>Sun, 04 Aug 2024 14:33:59 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://urage.net/?p=1768</guid>

					<description><![CDATA[<p>The post <a href="https://urage.net/blog/taskitty-progress-report-07-2024/">Taskitty Progress Report (07/2024)</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h2>We&#8217;re excited to share the latest updates on Taskitty ٩(⸝⸝ᵕᴗᵕ⸝⸝)و*̣̩⋆̩*</h2>
<p>In this progress report, we&#8217;ll outline some short tasks, Visuals and Features, as well as very short tasks, Nice Little things and medium tasks.</p>
<p>Below, you&#8217;ll find a summary of what we&#8217;ve achieved so far and an overview of the exciting features and improvements we&#8217;re planning for upcoming versions.</p>
<h3>Upcoming Version</h3>
<pre>✔ keyboard up in comments window text field to edit last comment (done in: 0.10.0)
✔ add due date for task (done in: 0.10.0)
✔ milestones (done in: 0.10.0)
✔ proper sort order in versions (done in: 0.10.0)
✔ improve the look of the footer panel (done in: 0.10.0)
✔ donedatetime for tasks (done in: 0.10.0)
✔ remove selected task when pressing delete key (done in: 0.10.0)
✔ escape key to clear search filter (done in: 0.10.0)
✔ set donedatetime of task when marking task as done
✔ implement reflections
✔ Mind Map prototype for brainstorm feature
✔ do a HasTag(long id) and HasTag(string tagName) function in board
✔ needs lib for newtonsoft json for unity 2021 and earlier
✔ "start date" field for card table
✔ basic work on members
✔ "remove"-button in checklist to avoid accidental removing task instead
✔ marking hidden tasks as done or doing will now unhide them
✔ \+ in checklist for done todos
✔ on pressing escape twice after editting task, unselect the task
✔ finish the white/dark text colors
✔ "blog" aka notes with optional daily notes</pre>
<h3>v0.10.0</h3>
<pre>✔ add an "upcoming version" entry to the version popups (done in: 0.9.0)
✔ somehow we have 2 tasks marked as done without a done in version
✔ when adding a task in the done list, no done in version is set
✔ Add a "released in version" field to create a detailed and accurate changelog</pre>
<h3>New Tasks</h3>
<ul>
<li>option to pop out footer panel</li>
<li>rly think about do popup task to edit like trello as 2nd option</li>
<li>repeating/recurring/periodic tasks</li>
<li>User Roles and Permissions</li>
<li>taskitty discord bot to taskitty</li>
<li>copy tasks from one taskitty to another from different projects</li>
<li>texture paint</li>
<li>more checks when version is 1.0 and changing to 2.0 (there are errors in the taskitty gui) and also null/empty versions</li>
<li>somehow done_datetime of some tasks are being set to now in some cases</li>
<li>save current db as lastuseddb in editorprefs and load it on taskitty start.</li>
<li>close popped out task panel when getting deleted / or hide content and show undo button</li>
<li>filters and text search should be board specific</li>
<li>we need a UR_TkProgressReport class to save progress reports</li>
<li>also show board dropdown in add new task. we need it when we add a task from outside taskitty</li>
<li>members for boards</li>
<li>prob need to make another unitypackage that installs newtonsoft json dll only if &lt; unity 2022</li>
<li>repeatingEndDateTime column in card table for repeating tasks. we prob dont need time, since it&#8217;s handled by repeating interval and ends with the last on that day. do it anyways to be safe for the future</li>
<li>show warning (as message somewhere, not popup) on taskitty startup, when there are tasks without an added in version</li>
<li>on task add, warn if there is no or no valid version set</li>
<li>if version change detected, and previous version is empty, ask user to set added version to the current version for tasks with empty addedversion</li>
<li>ask user to unmark task as doing when moving doing task out of doing list</li>
<li>multiple members modify database</li>
<li>tag cover</li>
<li>covers visually disappear after leaving playmode</li>
<li>change current member name</li>
<li>Copy Board feature</li>
<li>profile picture</li>
<li>when clicking new task from taskitty editor toolbar, we could think about a hacky workaround to prevent showing taskitty when it&#8217;s not opened yet: set a flag and dont show anything in taskitty. instead show our add task panel in the editor window.</li>
<li>screenshotter for in editor and in game screenshots</li>
</ul>
<p>This Progress Report was generated with Taskitty ≽^•⩊•^≼ &#8211; Learn More: <a href="https://urage.net/taskitty">https://urage.net/taskitty</a></p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://urage.net/blog/taskitty-progress-report-07-2024/">Taskitty Progress Report (07/2024)</a> appeared first on <a href="https://urage.net">URage</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
