Attempt to fix object collisions with ChunkMerge. Not working?

This commit is contained in:
Empathic Qubit 2021-05-30 07:53:13 -04:00
parent b7439100a1
commit 2220f68d35
10 changed files with 7503 additions and 24 deletions

1
.vscode/tasks.json vendored
View file

@ -11,7 +11,6 @@
"kind": "build"
},
"command": "${workspaceFolder}/build.ps1",
"args": ["-KickVortex"],
"problemMatcher": [
"$PapyrusCompiler"
]

32
ChunkMerge.ahk Normal file
View file

@ -0,0 +1,32 @@
SetTitleMatchMode, RegEx
WinWait, ahk_exe i)ChunkMerge.exe
WinActivate, ahk_exe i)ChunkMerge.exe
ControlFocus Button1, A
Send {Space}
Clipboard := ChunkMerge_NifFile
Send +{Insert}
Send {Enter}
WinWaitActive, i)ChunkMerge
ControlFocus Button2, A
Send {Space}
Clipboard := ChunkMerge_CollisionFile
Send +{Insert}
Send {Enter}
WinWaitActive, i)ChunkMerge
ControlFocus, ComboBox1, A
Send, %ChunkMerge_TemplateFile%
ControlFocus, Mesh Data, A
Send {Space}
ControlFocus, Name of NiTriShape, A
Send {Space}
Send {Enter}
Sleep 3000
WinClose, ahk_exe i)ChunkMerge.exe

148
build.ps1
View file

@ -2,6 +2,9 @@
.SYNOPSIS
Builds the plugin and optionally reloads it in Vortex.
.PARAMETER InstallDependencies
Installs script dependencies with Chocolatey, except Papyrus, and quit
.PARAMETER Scripts
Build Papyrus scripts
@ -12,19 +15,29 @@
Build GIMP textures
.PARAMETER Zip
Build the ZIP AND NOTHING ELSE. You probably don't want this option
Build the ZIP AND NOTHING ELSE. You probably don't want this option.
.PARAMETER KickVortex
Syncs the plugin with Vortex. If there are file conflicts, take changes
from the game directory! This will have changes from the ESP that were
made in Creation Kit! You need to symlink the /plugin directory into
the staging area, preferably using setup-dev.ps1 script.
Syncs the plugin with Vortex. This option requires Node.js and pnpm to
communicate with Vortex. Keep in mind that this only half works if Vortex
wasn't already started, so if it fails just run the script again.
If there are file conflicts, take changes from the game directory! This will
have changes from the ESP that were made in Creation Kit! You need to
symlink the /plugin directory into the mod staging area, preferably using
setup-dev.ps1 script.
.PARAMETER KickPort
The port for Vortex to listen on.
.PARAMETER Reload
Reloads Skyrim after building. It completely kills and restarts the game
as I had trouble getting hlp and reloadscript commands to work.
Kills Skyrim before and loads it after building. It completely kills the game
because I had trouble getting hlp and reloadscript commands to work.
#>
param (
[Parameter(Mandatory = $False)]
[Switch]
$InstallDependencies,
[Parameter(Mandatory = $False)]
[Switch]
$Scripts,
@ -34,6 +47,7 @@ param (
[Parameter(Mandatory = $False)]
[Switch]
$Textures,
[Parameter(Mandatory = $False)]
[Switch]
$Zip,
@ -41,11 +55,24 @@ param (
[Parameter(Mandatory = $False)]
[Switch]
$KickVortex,
[Parameter(Mandatory = $False)]
[int]
$KickPort = 6969,
[Parameter(Mandatory = $False)]
[Switch]
$Reload
)
if($InstallDependencies) {
# Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco install blender gimp 7zip autohotkey
}
if(-not $Scripts -and -not $Models -and -not $Textures -and -not $Zip) {
$Scripts = $true
$Textures = $true
@ -79,7 +106,7 @@ if(-not $SkyrimBase) {
$steamLibraries = @()
$steamLibraries += @($steamInstallPath)
$steamLibraries += Get-Member -InputObject $libraryFolders.Value -MemberType Dynamic | where-object -Property Name -Match "[0-9]+" | foreach { $libraryFolders.Value[$_.Name].ToString() }
$steamLibraries += Get-Member -InputObject $libraryFolders.Value -MemberType Dynamic | where-object -Property Name -Match "[0-9]+" | ForEach-Object { $libraryFolders.Value[$_.Name].ToString() }
$manifestPath = $None
foreach($steamLibrary in $steamLibraries) {
@ -110,6 +137,12 @@ if(-not $SkyrimBase) {
)).FullName
}
if($Reload) {
if($Proc) {
Stop-Process $Proc
}
}
if($Scripts) {
# Compile the scripts
& "$SkyrimBase/Papyrus Compiler/PapyrusCompiler.exe" `
@ -127,7 +160,8 @@ if($Scripts) {
if($Textures) {
Push-Location "$PSScriptRoot"
gimp-console -n -i --batch-interpreter python-fu-eval -b "import export_gimp_textures"
$Gimp = (Get-Item -Path @("$Env:ProgramFiles/GIMP*/bin/gimp-console*.exe", "${env:ProgramFiles(x86)}/GIMP*/bin/gimp-console*.exe")).FullName
& $Gimp -n -i --batch-interpreter python-fu-eval -b "import export_gimp_textures"
if($LastExitCode -ne 0) {
return $LastExitCode
@ -136,12 +170,81 @@ if($Textures) {
Pop-Location
}
if($Models) {
blender --background --python "$PSScriptRoot/export_blender_models.py"
$Blender = (Get-Item -Path @("${env:ProgramFiles(x86)}/blender*/blender*/blender.exe", "$env:ProgramFiles/blender*/blender*/blender.exe")).FullName
& $Blender --background --python "$PSScriptRoot/export_blender_models.py"
if($LastExitCode -ne 0) {
return $LastExitCode
}
$ChunkmergeBase = "$PSScriptRoot/build/ChunkMerge"
$MeshSourceDir = "$PSScriptRoot/Source/Meshes/_EQ_ItemRoulette"
$MeshDestDir = "$PSScriptRoot/plugin/Data/Meshes/_EQ_ItemRoulette"
$ChunkMergeZip = "$PSScriptRoot/build/chunkmerge.7z"
if(-not (Test-Path $ChunkmergeBase)) {
Invoke-WebRequest -Uri "https://github.com/downloads/skyfox69/NifUtils/ChunkMerge0155.7z" -OutFile $ChunkMergeZip
7z x "-o$PSScriptRoot/build" $ChunkMergeZip
}
$ChunkMergeConfig = @"
<Config>
<PathSkyrim>$SkyrimBase</PathSkyrim>
<PathNifXML>$PSScriptRoot/nif.xml</PathNifXML>
<PathTemplate>$MeshSourceDir</PathTemplate>
<LastTexture></LastTexture>
<LastTemplate></LastTemplate>
<DirSource></DirSource>
<DirDestination></DirDestination>
<DirCollision></DirCollision>
<MatHandling>0</MatHandling>
<VertexColorHandling>0</VertexColorHandling>
<UpdateTangentSpace>1</UpdateTangentSpace>
<ReorderProperties>1</ReorderProperties>
<CollTypeHandling>1</CollTypeHandling>
<CollMaterial>-553455049</CollMaterial>
<MaterialScan>
<MatScanTag>SkyrimHavokMaterial</MatScanTag>
<MatScanName>SKY_HAV_</MatScanName>
<MatScanPrefixList>
<MatScanPrefix>Material</MatScanPrefix>
</MatScanPrefixList>
<MatScanIgnoreList>
<MatScanIgnore>Unknown</MatScanIgnore>
</MatScanIgnoreList>
</MaterialScan>
<DirectXView>
<ShowTexture>1</ShowTexture>
<ShowWireframe>0</ShowWireframe>
<ShowColorWire>0</ShowColorWire>
<ForceDDS>0</ForceDDS>
<ColorWireframe>ffffffff</ColorWireframe>
<ColorWireCollision>ffffff00</ColorWireCollision>
<ColorBackground>ff200020</ColorBackground>
<ColorSelected>ffff00ff</ColorSelected>
<TexturePathList>
</TexturePathList>
</DirectXView>
</Config>
"@
Out-File -Encoding ascii -FilePath "$ChunkmergeBase/ChunkMerge.xml" -InputObject $ChunkMergeConfig
$ChunkMerge = "$ChunkmergeBase/ChunkMerge.exe"
& $ChunkMerge
# FIXME This path is not recursive because ChunkMerge can't handle it
foreach($ChunkTemplate in (Get-Item "$MeshSourceDir/*_template.nif")) {
$env:ChunkMerge_NifFile = Join-Path $MeshDestDir ($ChunkTemplate.Name -replace "_template.", ".")
$env:ChunkMerge_CollisionFile = Join-Path $MeshDestDir ($ChunkTemplate.Name -replace "_template.", "_collision.")
$env:ChunkMerge_TemplateFile = $ChunkTemplate.Name
Start-Process -Wait -FilePath AutoHotkey -ArgumentList @("$PSScriptRoot/ChunkMerge.ahk")
if($LastExitCode -ne 0) {
return $LastExitCode
}
}
}
if($Zip) {
@ -154,23 +257,28 @@ if($Zip) {
if($KickVortex) {
# Restart Vortex and kick off deploy-mods event via Chrome Debug Protocol.
Stop-Process -Name Vortex -ErrorAction SilentlyContinue
$env:KICK_PORT=6969
$VortexPath = (Get-ItemProperty HKLM:\SOFTWARE\57979c68-f490-55b8-8fed-8b017a5af2fe).InstallLocation
$GameId = (Get-Item "$env:APPDATA/Vortex/skyrim*").BaseName
& "$VortexPath/Vortex.exe" --remote-debugging-port=$env:KICK_PORT --game=$GameId
$VortexRunningWithDebuggingPortActive = `
(Get-NetTCPConnection -State Listen -LocalPort $KickPort -ErrorAction SilentlyContinue) `
| Where-Object {
$tcpConn = $_
Get-Process -Name Vortex | Where-Object { $tcpConn.OwningProcess -eq $_.Id }
}
$env:KICK_PORT=$KickPort
if (-not $VortexRunningWithDebuggingPortActive) {
Stop-Process -Name Vortex -ErrorAction SilentlyContinue
$VortexPath = (Get-ItemProperty HKLM:\SOFTWARE\57979c68-f490-55b8-8fed-8b017a5af2fe).InstallLocation
$GameId = (Get-Item "$env:APPDATA/Vortex/skyrim*").BaseName
& "$VortexPath/Vortex.exe" --remote-debugging-port=$KickPort --game=$GameId
}
pnpm install -C "$PSScriptRoot"
node "$PSScriptRoot/kick-vortex.js"
Stop-Process -Name Vortex -ErrorAction SilentlyContinue
}
if($Reload) {
if($Proc) {
Stop-Process $Proc
}
# Prefer SKSE loader if we have it installed
$SkyrimExe = Get-Item -Path @(
"$SkyrimBase/skse*_loader.exe",

View file

@ -1,5 +1,6 @@
import bpy
import os
import itertools
from pathlib import Path
curdir = Path(__file__).parent
@ -10,12 +11,12 @@ mesh_src_dir = curdir.joinpath("Source/Meshes")
print("Mesh Source directory: " + str(mesh_src_dir))
mesh_dest_dir = plugin_data_dir.joinpath("Meshes")
print("Mesh Dest directory: " + str(mesh_dest_dir))
blend_paths = Path(mesh_src_dir).rglob("*.blend")
blend_paths = itertools.chain(Path(mesh_src_dir).rglob("*_mesh.blend"), Path(mesh_src_dir).rglob("*_collision.blend"))
for blend_path in blend_paths:
dest_blend_path = mesh_dest_dir.joinpath(blend_path.relative_to(mesh_src_dir))
nif_parent = dest_blend_path.parent
nif_path = nif_parent.joinpath(dest_blend_path.stem + '.nif')
print(str(blend_path) + " -> " + str(nif_path))
nif_path = nif_parent.joinpath(dest_blend_path.stem.replace('_mesh', '') + '.nif')
print("CONVERTING: " + str(blend_path) + " -> " + str(nif_path))
try:
nif_parent.mkdir(parents=True)
except FileExistsError:

7339
nif.xml Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.