374 字
2 分钟
Extra Decal Pre Processor
Prerequisite
- Cities: Skylines 2
- ExtraAssetsImporter
- PowerShell 7
WINDOWS EMBEDED POWERSHELL IS OUTDATEDThe powershell that comes with windows is powershell 5, which doesn’t fully realize the functionality of 7!
Step
- Setup Mod toolchain in CS2, basically check it in game.
- Follow the tutorial to create mods that depend on EAI, this article does not focus on these.
- Build decals.
Let’s assume a scenario where you have a folder for all your HD decals (.png) and you need to create uniform decals and thumbnails based on these decals.
So you have:
D:\lorem├─blahblah│ a.png│ b1.png│ b2.png│ b3.png│ b4.png│ b1.png│ b2.png
decal.json
can be obtained from the EAI example.
Place build.ps1
and decal.json
to this directory. Then:
D:\lorem├─blahblah│ build.ps1│ decal.json│ a.png│ b1.png│ b2.png│ b3.png│ b4.png│ b1.png│ b2.png
Content in build.ps1
function GenerateIconAndMesh { param( $file )
try { $originalImage = [System.Drawing.Image]::FromFile($file.FullName) $maxSize = [Math]::Max($originalImage.Width, $originalImage.Height) $aspectRatio = $originalImage.Width / $originalImage.Height $squareImage = New-Object System.Drawing.Bitmap $maxSize, $maxSize
$graphics = [System.Drawing.Graphics]::FromImage($squareImage) $graphics.Clear([System.Drawing.Color]::Transparent)
$x = ($maxSize - $originalImage.Width) / 2 $y = ($maxSize - $originalImage.Height) / 2
$graphics.DrawImage($originalImage, $x, $y, $originalImage.Width, $originalImage.Height)
$resizedImage = New-Object System.Drawing.Bitmap 128, 128 $resizeGraphics = [System.Drawing.Graphics]::FromImage($resizedImage) $resizeGraphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$resizeGraphics.DrawImage($squareImage, 0, 0, 128, 128) $resizeGraphics.Dispose()
$newFilePath = [IO.Path]::Combine($file.DirectoryName, "icon.png") $resizedImage.Save($newFilePath)
Write-Host "Saved icon to $newFilePath"
$jsonPath = Join-Path $file.DirectoryName "decal.json"
if (Test-Path $jsonPath) { $json = Get-Content $jsonPath -Raw | ConvertFrom-Json
$json.Vector.colossal_MeshSize.x = $aspectRatio * 1.5 $json.Vector.colossal_MeshSize.z = 1.5
$json | ConvertTo-Json -Depth 10 | Set-Content $jsonPath
Write-Host "Aspect Ratio = $aspectRatio" } else { Write-Warning "decal.json not found in the directory of $($file.DirectoryName)" } } catch { Write-Warning "Error processing file $($file.FullName): $_" } finally { # dispose if ($null -ne $graphics) { $graphics.Dispose() } if ($null -ne $squareImage) { $squareImage.Dispose() } if ($null -ne $resizedImage) { $resizedImage.Dispose() } if ($null -ne $originalImage) { $resizedImage.Dispose() } }}
Get-ChildItem | Foreach-Object { if ($_.Extension -eq ".png") { $folder = "./$($_.BaseName)" mkdir $folder -ErrorAction SilentlyContinue $base = "./$($_.BaseName)/_BaseColorMap.png" Copy-Item $_.FullName -Destination $base # $icon = "./$($_.BaseName)/icon.png" # Copy-Item $_.FullName -Destination $icon if (Test-Path ./decal.json) { Copy-Item ./decal.json -Destination $folder } else { Write-Warning "decal.json not found" }
GenerateIconAndMesh(Get-Item $base) }}
Run this script in a terminal. A quick way to open a terminal is to type pwsh
in explorer’s bar.
./build.ps1
Now you’ve got everything done.
Extra Decal Pre Processor
https://nptr.cc/posts/2024-06/cities2-extra-decal-preprocessor/