Compare commits
20
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb083a0005 | ||
|
|
b97c74469c | ||
|
|
3fe1509536 | ||
|
|
2ddbbe9fc7 | ||
|
|
7a959c7112 | ||
|
|
1508f4d8a6 | ||
|
|
b812006831 | ||
|
|
163d6e6470 | ||
|
|
4121cb6457 | ||
|
|
43c4160b8d | ||
|
|
c3c0e9a525 | ||
|
|
6541727419 | ||
|
|
4bbee94388 | ||
|
|
a36ce6ea76 | ||
|
|
db472789d3 | ||
|
|
f95ab007d2 | ||
|
|
0ea0c4a94c | ||
|
|
09863ad9e3 | ||
|
|
c82f2b9e52 | ||
|
|
49a8644d13 |
@@ -0,0 +1,77 @@
|
|||||||
|
name: Commit V36 Retail Soft decode
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- test/v36-retail-jfa-soft
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
commit-v36-soft:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: test/v36-retail-jfa-soft
|
||||||
|
|
||||||
|
- name: Apply V36 decode
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
python3 <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
p = Path('src/outline/d3d9_hook.zig')
|
||||||
|
s = p.read_text()
|
||||||
|
if 'V36 RETAIL-SOFT' in s:
|
||||||
|
raise SystemExit(0)
|
||||||
|
start = s.index('/// V32 POLISH: hard 3px outline, no feather.')
|
||||||
|
end = s.index('/// Debug: composite silhouette RT directly.')
|
||||||
|
lines = [
|
||||||
|
'/// V36 RETAIL-SOFT: keep the proven V34 JFA, soften only final decode.',
|
||||||
|
'/// c0 = (screen_width, screen_height, core_radius_px, halo_radius_px).',
|
||||||
|
'/// Uses the same two texture reads as V34: no 17-tap full-screen morphology.',
|
||||||
|
'const jfa_decode_src =',
|
||||||
|
' "ps_3_0\\n" ++',
|
||||||
|
' "def c1, 0.0, 0.22, 0.82, -0.002\\n" ++',
|
||||||
|
' "def c2, 1.0, 0.95, 0.58, 0.0\\n" ++',
|
||||||
|
' "dcl_2d s0\\n" ++',
|
||||||
|
' "dcl_2d s1\\n" ++',
|
||||||
|
' "dcl_texcoord0 v0\\n" ++',
|
||||||
|
' "texld r0, v0, s0\\n" ++',
|
||||||
|
' "sub r1.xy, v0.xy, r0.xy\\n" ++',
|
||||||
|
' "mul r1.xy, r1.xy, c0.xy\\n" ++',
|
||||||
|
' "dp2add r1.z, r1, r1, c1.x\\n" ++',
|
||||||
|
' "mul r3.x, c0.z, c0.z\\n" ++',
|
||||||
|
' "mul r3.y, c0.w, c0.w\\n" ++',
|
||||||
|
' "sub r4.x, r1.z, r3.y\\n" ++',
|
||||||
|
' "cmp r6.w, r4.x, c1.x, c1.y\\n" ++',
|
||||||
|
' "sub r4.x, r1.z, r3.x\\n" ++',
|
||||||
|
' "cmp r6.w, r4.x, r6.w, c1.z\\n" ++',
|
||||||
|
' "texld r5, v0, s1\\n" ++',
|
||||||
|
' "add r5.x, r5.a, c1.w\\n" ++',
|
||||||
|
' "cmp r6.w, r5.x, c1.x, r6.w\\n" ++',
|
||||||
|
' "mov r6.xyz, c2.xyz\\n" ++',
|
||||||
|
' "mov oC0, r6\\n";',
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
]
|
||||||
|
s = s[:start] + '\n'.join(lines) + s[end:]
|
||||||
|
old = ' // V34: hard 3px edge unchanged; JFA seed precision is now full-float.\n c0 = [4]f32{ fw, fh, 3.0, 0.0 };'
|
||||||
|
new_cpu = ' // V36: thin 1.5px core plus a subtle 3px halo.\n c0 = [4]f32{ fw, fh, 1.5, 3.0 };'
|
||||||
|
if old not in s:
|
||||||
|
raise SystemExit('V34 CPU decode constants not found')
|
||||||
|
p.write_text(s.replace(old, new_cpu))
|
||||||
|
PY
|
||||||
|
|
||||||
|
- name: Commit source
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
if git diff --quiet; then exit 0; fi
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git add src/outline/d3d9_hook.zig
|
||||||
|
git commit -m "V36: soft Retail-style JFA decode"
|
||||||
|
git push origin HEAD:test/v36-retail-jfa-soft
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
name: V36 ExitFix Baseline
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- test/v36-exitfix-baseline
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: mlugg/setup-zig@v2
|
||||||
|
with:
|
||||||
|
version: '0.16.0'
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
zig build all-variants -Doptimize=ReleaseSmall \
|
||||||
|
-Dweirdperformance=false \
|
||||||
|
-Doutline=true \
|
||||||
|
-Dcustomassets=true \
|
||||||
|
-Dtransmogfix=true
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf package dist
|
||||||
|
mkdir -p package/DLL package/Interface/AddOns/WeirdUtils_Outline dist
|
||||||
|
cp zig-out/variants/outline.dll package/DLL/outline.dll
|
||||||
|
cp src/outline/addon/Bindings.xml package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/Outline.lua package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/WeirdUtils_Outline.toc package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
printf '%s\n' \
|
||||||
|
'V36 runtime + process-exit safety only.' \
|
||||||
|
'Base runtime commit: 4bbee94388f98843b738e275fd9482576be80654.' \
|
||||||
|
'Compared with V34, only src/outline/d3d9_hook.zig changes runtime behavior.' \
|
||||||
|
'main branch is untouched.' \
|
||||||
|
'WeirdPerformance is disabled in this standalone build and not modified.' \
|
||||||
|
> package/README_TEST.txt
|
||||||
|
(cd package && sha256sum DLL/outline.dll > SHA256SUMS.txt && zip -r ../dist/WeirdUtils_V36_EXITFIX_BASELINE.zip DLL Interface README_TEST.txt SHA256SUMS.txt)
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: WeirdUtils-V36-EXITFIX-BASELINE
|
||||||
|
path: dist/WeirdUtils_V36_EXITFIX_BASELINE.zip
|
||||||
|
if-no-files-found: error
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
name: V37A DIP Passthrough
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- test/v37a-dip-passthrough
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: mlugg/setup-zig@v2
|
||||||
|
with:
|
||||||
|
version: '0.16.0'
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
zig build all-variants -Doptimize=ReleaseSmall \
|
||||||
|
-Dweirdperformance=false \
|
||||||
|
-Doutline=true \
|
||||||
|
-Dcustomassets=true \
|
||||||
|
-Dtransmogfix=true
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf package dist
|
||||||
|
mkdir -p package/DLL package/Interface/AddOns/WeirdUtils_Outline dist
|
||||||
|
cp zig-out/variants/outline.dll package/DLL/outline.dll
|
||||||
|
cp src/outline/addon/Bindings.xml package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/Outline.lua package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/WeirdUtils_Outline.toc package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
printf '%s\n' \
|
||||||
|
'V37A DIP passthrough isolation test.' \
|
||||||
|
'EndScene and DrawIndexedPrimitive vtable hooks are installed.' \
|
||||||
|
'DIP detour performs no Outline capture/state/resource work and immediately calls original DIP.' \
|
||||||
|
'Reset remains untouched.' \
|
||||||
|
'Visible outline is intentionally absent in this diagnostic build.' \
|
||||||
|
'main branch untouched; WeirdPerformance not modified.' \
|
||||||
|
> package/README_TEST.txt
|
||||||
|
(cd package && sha256sum DLL/outline.dll > SHA256SUMS.txt && zip -r ../dist/WeirdUtils_V37A_DIP_PASSTHROUGH.zip DLL Interface README_TEST.txt SHA256SUMS.txt)
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: WeirdUtils-V37A-DIP-PASSTHROUGH
|
||||||
|
path: dist/WeirdUtils_V37A_DIP_PASSTHROUGH.zip
|
||||||
|
if-no-files-found: error
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
name: V37A EndScene Only
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- test/v37a-endscene-only
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: mlugg/setup-zig@v2
|
||||||
|
with:
|
||||||
|
version: '0.16.0'
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
zig build all-variants -Doptimize=ReleaseSmall \
|
||||||
|
-Dweirdperformance=false \
|
||||||
|
-Doutline=true \
|
||||||
|
-Dcustomassets=true \
|
||||||
|
-Dtransmogfix=true
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf package dist
|
||||||
|
mkdir -p package/DLL package/Interface/AddOns/WeirdUtils_Outline dist
|
||||||
|
cp zig-out/variants/outline.dll package/DLL/outline.dll
|
||||||
|
cp src/outline/addon/Bindings.xml package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/Outline.lua package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/WeirdUtils_Outline.toc package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
printf '%s\n' \
|
||||||
|
'V37A EndScene-only isolation test.' \
|
||||||
|
'Base: V37A no-Reset-hook + ExitFix.' \
|
||||||
|
'Only IDirect3DDevice9::EndScene is hooked.' \
|
||||||
|
'DrawIndexedPrimitive and Reset are untouched.' \
|
||||||
|
'Visible outline is intentionally absent in this diagnostic build.' \
|
||||||
|
'main branch untouched; WeirdPerformance not modified.' \
|
||||||
|
> package/README_TEST.txt
|
||||||
|
(cd package && sha256sum DLL/outline.dll > SHA256SUMS.txt && zip -r ../dist/WeirdUtils_V37A_ENDSCENE_ONLY.zip DLL Interface README_TEST.txt SHA256SUMS.txt)
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: WeirdUtils-V37A-ENDSCENE-ONLY
|
||||||
|
path: dist/WeirdUtils_V37A_ENDSCENE_ONLY.zip
|
||||||
|
if-no-files-found: error
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
name: V37A No AutoRehook
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- test/v37a-no-autorehook
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: mlugg/setup-zig@v2
|
||||||
|
with:
|
||||||
|
version: '0.16.0'
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
zig build all-variants -Doptimize=ReleaseSmall \
|
||||||
|
-Dweirdperformance=false \
|
||||||
|
-Doutline=true \
|
||||||
|
-Dcustomassets=true \
|
||||||
|
-Dtransmogfix=true
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf package dist
|
||||||
|
mkdir -p package/DLL package/Interface/AddOns/WeirdUtils_Outline dist
|
||||||
|
cp zig-out/variants/outline.dll package/DLL/outline.dll
|
||||||
|
cp src/outline/addon/Bindings.xml package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/Outline.lua package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/WeirdUtils_Outline.toc package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
printf '%s\n' \
|
||||||
|
'V37A no-auto-rehook isolation test.' \
|
||||||
|
'Base: V37A radii-only + ExitFix.' \
|
||||||
|
'Only runtime change: automatic lateRehookIfLost() call removed from RenderDraw.' \
|
||||||
|
'Initial deferred D3D9 hook installation remains unchanged.' \
|
||||||
|
'main branch untouched; WeirdPerformance not modified.' \
|
||||||
|
> package/README_TEST.txt
|
||||||
|
(cd package && sha256sum DLL/outline.dll > SHA256SUMS.txt && zip -r ../dist/WeirdUtils_V37A_NO_AUTOREHOOK.zip DLL Interface README_TEST.txt SHA256SUMS.txt)
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: WeirdUtils-V37A-NO-AUTOREHOOK
|
||||||
|
path: dist/WeirdUtils_V37A_NO_AUTOREHOOK.zip
|
||||||
|
if-no-files-found: error
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
name: V37A No Reset Hook
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- test/v37a-no-reset-hook
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: mlugg/setup-zig@v2
|
||||||
|
with:
|
||||||
|
version: '0.16.0'
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
zig build all-variants -Doptimize=ReleaseSmall \
|
||||||
|
-Dweirdperformance=false \
|
||||||
|
-Doutline=true \
|
||||||
|
-Dcustomassets=true \
|
||||||
|
-Dtransmogfix=true
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf package dist
|
||||||
|
mkdir -p package/DLL package/Interface/AddOns/WeirdUtils_Outline dist
|
||||||
|
cp zig-out/variants/outline.dll package/DLL/outline.dll
|
||||||
|
cp src/outline/addon/Bindings.xml package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/Outline.lua package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/WeirdUtils_Outline.toc package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
printf '%s\n' \
|
||||||
|
'V37A no-Reset-hook isolation test.' \
|
||||||
|
'Base: V37A no-auto-rehook + ExitFix.' \
|
||||||
|
'EndScene and DrawIndexedPrimitive hooks remain active.' \
|
||||||
|
'Reset hook is NOT installed.' \
|
||||||
|
'Visible outline rendering should still work.' \
|
||||||
|
'main branch untouched; WeirdPerformance not modified.' \
|
||||||
|
> package/README_TEST.txt
|
||||||
|
(cd package && sha256sum DLL/outline.dll > SHA256SUMS.txt && zip -r ../dist/WeirdUtils_V37A_NO_RESET_HOOK.zip DLL Interface README_TEST.txt SHA256SUMS.txt)
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: WeirdUtils-V37A-NO-RESET-HOOK
|
||||||
|
path: dist/WeirdUtils_V37A_NO_RESET_HOOK.zip
|
||||||
|
if-no-files-found: error
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
name: V37A Radii Only
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- test/v37a-radii-only
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: mlugg/setup-zig@v2
|
||||||
|
with:
|
||||||
|
version: '0.16.0'
|
||||||
|
- name: Build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
zig build all-variants -Doptimize=ReleaseSmall \
|
||||||
|
-Dweirdperformance=false \
|
||||||
|
-Doutline=true \
|
||||||
|
-Dcustomassets=true \
|
||||||
|
-Dtransmogfix=true
|
||||||
|
- name: Package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf package dist
|
||||||
|
mkdir -p package/DLL package/Interface/AddOns/WeirdUtils_Outline dist
|
||||||
|
cp zig-out/variants/outline.dll package/DLL/outline.dll
|
||||||
|
cp src/outline/addon/Bindings.xml package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/Outline.lua package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
cp src/outline/addon/WeirdUtils_Outline.toc package/Interface/AddOns/WeirdUtils_Outline/
|
||||||
|
printf '%s\n' \
|
||||||
|
'V37A isolation test.' \
|
||||||
|
'Base: V36 + ExitFix (stable in user test).' \
|
||||||
|
'Only runtime change: radii 1.5/3.0 -> 1.35/3.20.' \
|
||||||
|
'V36 decode shader remains unchanged.' \
|
||||||
|
'main branch untouched; WeirdPerformance not modified.' \
|
||||||
|
> package/README_TEST.txt
|
||||||
|
(cd package && sha256sum DLL/outline.dll > SHA256SUMS.txt && zip -r ../dist/WeirdUtils_V37A_RADII_ONLY.zip DLL Interface README_TEST.txt SHA256SUMS.txt)
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: WeirdUtils-V37A-RADII-ONLY
|
||||||
|
path: dist/WeirdUtils_V37A_RADII_ONLY.zip
|
||||||
|
if-no-files-found: error
|
||||||
+5
-2
@@ -1048,11 +1048,14 @@ comptime {
|
|||||||
pub export fn DllMain(
|
pub export fn DllMain(
|
||||||
_: ?*anyopaque,
|
_: ?*anyopaque,
|
||||||
reason: u32,
|
reason: u32,
|
||||||
_: ?*anyopaque,
|
reserved: ?*anyopaque,
|
||||||
) callconv(WINAPI) std.os.windows.BOOL {
|
) callconv(WINAPI) std.os.windows.BOOL {
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
1 => install(),
|
1 => install(),
|
||||||
0 => uninstall(),
|
0 => {
|
||||||
|
// Process-exit safety only; runtime Outline behavior is unchanged.
|
||||||
|
if (reserved == null) uninstall();
|
||||||
|
},
|
||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
return @enumFromInt(1);
|
return @enumFromInt(1);
|
||||||
|
|||||||
+22
-93
@@ -732,34 +732,31 @@ const jfa_prop_src =
|
|||||||
"mov oC0.xy, r8.xy\n" ++
|
"mov oC0.xy, r8.xy\n" ++
|
||||||
"mov oC0.zw, c1.xx\n";
|
"mov oC0.zw, c1.xx\n";
|
||||||
|
|
||||||
/// V32 POLISH: hard 3px outline, no feather.
|
/// V36 RETAIL-SOFT: keep the proven V34 JFA, soften only final decode.
|
||||||
/// c0 = (screen_width, screen_height, radius_px=3, 0).
|
/// c0 = (screen_width, screen_height, core_radius_px, halo_radius_px).
|
||||||
/// The shader squares radius_px and emits a binary 0/1 edge alpha.
|
/// Uses the same two texture reads as V34: no 17-tap full-screen morphology.
|
||||||
const jfa_decode_src =
|
const jfa_decode_src =
|
||||||
"ps_3_0\n" ++
|
"ps_3_0\n" ++
|
||||||
"def c1, 0.0, 1.0, -0.002, 0.0\n" ++
|
"def c1, 0.0, 0.22, 0.82, -0.002\n" ++
|
||||||
|
"def c2, 1.0, 0.95, 0.58, 0.0\n" ++
|
||||||
"dcl_2d s0\n" ++
|
"dcl_2d s0\n" ++
|
||||||
"dcl_2d s1\n" ++
|
"dcl_2d s1\n" ++
|
||||||
"dcl_texcoord0 v0\n" ++
|
"dcl_texcoord0 v0\n" ++
|
||||||
// Nearest seed and pixel-space squared distance.
|
|
||||||
"texld r0, v0, s0\n" ++
|
"texld r0, v0, s0\n" ++
|
||||||
"sub r1.xy, v0.xy, r0.xy\n" ++
|
"sub r1.xy, v0.xy, r0.xy\n" ++
|
||||||
"mul r1.xy, r1.xy, c0.xy\n" ++
|
"mul r1.xy, r1.xy, c0.xy\n" ++
|
||||||
"dp2add r1.z, r1, r1, c0.w\n" ++
|
"dp2add r1.z, r1, r1, c1.x\n" ++
|
||||||
// Seed colour.
|
"mul r3.x, c0.z, c0.z\n" ++
|
||||||
"texld r2, r0, s1\n" ++
|
"mul r3.y, c0.w, c0.w\n" ++
|
||||||
// Hard radius test: dist² < radius² => alpha 1, otherwise 0.
|
"sub r4.x, r1.z, r3.y\n" ++
|
||||||
"mov r3.x, c0.z\n" ++
|
"cmp r6.w, r4.x, c1.x, c1.y\n" ++
|
||||||
"mul r3.x, r3.x, r3.x\n" ++
|
"sub r4.x, r1.z, r3.x\n" ++
|
||||||
"sub r3.y, r1.z, r3.x\n" ++
|
"cmp r6.w, r4.x, r6.w, c1.z\n" ++
|
||||||
"mov r6.w, c1.y\n" ++
|
|
||||||
"cmp r4.w, r3.y, c0.w, r6.w\n" ++
|
|
||||||
// Do not paint over the model interior.
|
|
||||||
"texld r5, v0, s1\n" ++
|
"texld r5, v0, s1\n" ++
|
||||||
"add r5.x, r5.a, c1.z\n" ++
|
"add r5.x, r5.a, c1.w\n" ++
|
||||||
"cmp r4.w, r5.x, c0.w, r4.w\n" ++
|
"cmp r6.w, r5.x, c1.x, r6.w\n" ++
|
||||||
"mov r4.xyz, r2.xyz\n" ++
|
"mov r6.xyz, c2.xyz\n" ++
|
||||||
"mov oC0, r4\n";
|
"mov oC0, r6\n";
|
||||||
|
|
||||||
/// Debug: composite silhouette RT directly. Forces alpha to 1.0 where silhouette
|
/// Debug: composite silhouette RT directly. Forces alpha to 1.0 where silhouette
|
||||||
/// has any content (alpha >= 0.002), 0.0 elsewhere. Bypasses JFA entirely.
|
/// has any content (alpha >= 0.002), 0.0 elsewhere. Bypasses JFA entirely.
|
||||||
@@ -999,79 +996,10 @@ fn hkDIP(
|
|||||||
) callconv(hook.cc.stdcall) i32 {
|
) callconv(hook.cc.stdcall) i32 {
|
||||||
debug_dip_seen = true;
|
debug_dip_seen = true;
|
||||||
|
|
||||||
|
// Isolation test: keep the DIP vtable detour installed, but do no
|
||||||
|
// Outline state capture/resource work here. Call the original directly.
|
||||||
const OrigDIP = *const fn (*anyopaque, u32, i32, u32, u32, u32, u32) callconv(hook.cc.stdcall) i32;
|
const OrigDIP = *const fn (*anyopaque, u32, i32, u32, u32, u32, u32) callconv(hook.cc.stdcall) i32;
|
||||||
const origFn: OrigDIP = @ptrFromInt(orig_dip);
|
const origFn: OrigDIP = @ptrFromInt(orig_dip);
|
||||||
|
|
||||||
// ---- Cache outline draws for EndScene replay ----
|
|
||||||
if (model_hook.rendering_outline) {
|
|
||||||
debug_outline_dip_seen = true;
|
|
||||||
const model_ptr = model_hook.current_model;
|
|
||||||
const color = tracker.getModelColor(model_ptr) orelse
|
|
||||||
return origFn(device, prim_type, base_vtx, min_vtx, num_verts, start_idx, prim_count);
|
|
||||||
const category = tracker.getModelCategory(model_ptr);
|
|
||||||
|
|
||||||
// Ensure resources will be available for replay in EndScene
|
|
||||||
if (!shaders_attempted) ensureShaders(device);
|
|
||||||
ensureResources(device);
|
|
||||||
if (outline_ps == null or rt_silhouette_surf == null)
|
|
||||||
return origFn(device, prim_type, base_vtx, min_vtx, num_verts, start_idx, prim_count);
|
|
||||||
|
|
||||||
// Cache if room available
|
|
||||||
if (cached_draw_count < MAX_CACHED_DRAWS) {
|
|
||||||
const idx = cached_draw_count;
|
|
||||||
var draw = &cached_draws[idx];
|
|
||||||
|
|
||||||
// Draw parameters
|
|
||||||
draw.prim_type = prim_type;
|
|
||||||
draw.base_vtx = base_vtx;
|
|
||||||
draw.min_vtx = min_vtx;
|
|
||||||
draw.num_verts = num_verts;
|
|
||||||
draw.start_idx = start_idx;
|
|
||||||
draw.prim_count = prim_count;
|
|
||||||
|
|
||||||
// Outline info
|
|
||||||
draw.color = color;
|
|
||||||
draw.category = category;
|
|
||||||
|
|
||||||
// Capture current GPU state (AddRef COM objects to keep them alive)
|
|
||||||
deviceGetStreamSource(device, 0, &draw.vb, &draw.vb_offset, &draw.vb_stride);
|
|
||||||
// GetStreamSource AddRef's the VB - we keep the ref until replay
|
|
||||||
draw.ib = deviceGetIndices(device);
|
|
||||||
// GetIndices AddRef's the IB
|
|
||||||
draw.vertex_decl = deviceGetPtr(device, types.VT.GetVertexDeclaration);
|
|
||||||
// GetVertexDeclaration AddRef's
|
|
||||||
draw.vertex_shader = deviceGetPtr(device, types.VT.GetVertexShader);
|
|
||||||
// GetVertexShader AddRef's
|
|
||||||
for (0..4) |stage| {
|
|
||||||
draw.tex[stage] = deviceGetTexture(device, @intCast(stage));
|
|
||||||
draw.alpha_op[stage] = deviceGetTSS(device, @intCast(stage), types.D3DTSS.ALPHAOP);
|
|
||||||
draw.alpha_arg1[stage] = deviceGetTSS(device, @intCast(stage), types.D3DTSS.ALPHAARG1);
|
|
||||||
draw.alpha_arg2[stage] = deviceGetTSS(device, @intCast(stage), types.D3DTSS.ALPHAARG2);
|
|
||||||
}
|
|
||||||
draw.pixel_shader = deviceGetPtr(device, types.VT.GetPixelShader);
|
|
||||||
draw.state_block = deviceCreateStateBlock(device);
|
|
||||||
if (draw.state_block != null) debug_state_block_seen = true;
|
|
||||||
draw.alpha_test_enable = deviceGetRS(device, types.D3DRS.ALPHATESTENABLE);
|
|
||||||
draw.alpha_ref = deviceGetRS(device, types.D3DRS.ALPHAREF);
|
|
||||||
draw.alpha_func = deviceGetRS(device, types.D3DRS.ALPHAFUNC);
|
|
||||||
draw.alpha_blend_enable = deviceGetRS(device, types.D3DRS.ALPHABLENDENABLE);
|
|
||||||
draw.src_blend = deviceGetRS(device, types.D3DRS.SRCBLEND);
|
|
||||||
draw.dst_blend = deviceGetRS(device, types.D3DRS.DESTBLEND);
|
|
||||||
|
|
||||||
// Capture VS constants (bone matrices, world/view/proj transforms)
|
|
||||||
deviceGetVSConstF(device, 0, &draw.vs_consts, MAX_VS_CONST_REGS);
|
|
||||||
|
|
||||||
cached_draw_count = idx + 1;
|
|
||||||
frame_has_outlines = true;
|
|
||||||
debug_cached_draw_seen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// DEBUG23: no stencil writes. Preserve WoW's D3D state and draw once.
|
|
||||||
// The cached geometry is replayed later into the silhouette RT.
|
|
||||||
return origFn(device, prim_type, base_vtx, min_vtx, num_verts, start_idx, prim_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---- Normal path ----
|
|
||||||
return origFn(device, prim_type, base_vtx, min_vtx, num_verts, start_idx, prim_count);
|
return origFn(device, prim_type, base_vtx, min_vtx, num_verts, start_idx, prim_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1417,8 +1345,8 @@ fn runJfaPipeline(device: *anyopaque) void {
|
|||||||
if (saved_rt0) |rt| deviceSetRenderTarget(device, 0, rt);
|
if (saved_rt0) |rt| deviceSetRenderTarget(device, 0, rt);
|
||||||
deviceSetTexture(device, 0, rt_jfa_a_tex);
|
deviceSetTexture(device, 0, rt_jfa_a_tex);
|
||||||
deviceSetTexture(device, 1, rt_silhouette_tex);
|
deviceSetTexture(device, 1, rt_silhouette_tex);
|
||||||
// V34: hard 3px edge unchanged; JFA seed precision is now full-float.
|
// V37A isolation test: V37 radii only, V36 decode shader unchanged.
|
||||||
c0 = [4]f32{ fw, fh, 3.0, 0.0 };
|
c0 = [4]f32{ fw, fh, 1.35, 3.20 };
|
||||||
deviceSetPSConstF(device, 0, &c0);
|
deviceSetPSConstF(device, 0, &c0);
|
||||||
deviceSetPtr(device, types.VT.SetPixelShader, jfa_decode_ps.?);
|
deviceSetPtr(device, types.VT.SetPixelShader, jfa_decode_ps.?);
|
||||||
deviceSetRS(device, types.D3DRS.ALPHABLENDENABLE, 1);
|
deviceSetRS(device, types.D3DRS.ALPHABLENDENABLE, 1);
|
||||||
@@ -1630,9 +1558,10 @@ pub fn installHooks() bool {
|
|||||||
const vtable_ptr = getD3D9VTable() orelse return false;
|
const vtable_ptr = getD3D9VTable() orelse return false;
|
||||||
d3d9_vtable = vtable_ptr;
|
d3d9_vtable = vtable_ptr;
|
||||||
|
|
||||||
|
// Isolation test: hook EndScene + DrawIndexedPrimitive.
|
||||||
|
// Reset remains untouched.
|
||||||
if (!patchVtableEntry(vtable_ptr, types.VT.EndScene, @intFromPtr(&hkEndScene), &orig_endscene)) return false;
|
if (!patchVtableEntry(vtable_ptr, types.VT.EndScene, @intFromPtr(&hkEndScene), &orig_endscene)) return false;
|
||||||
if (!patchVtableEntry(vtable_ptr, types.VT.DrawIndexedPrimitive, @intFromPtr(&hkDIP), &orig_dip)) return false;
|
if (!patchVtableEntry(vtable_ptr, types.VT.DrawIndexedPrimitive, @intFromPtr(&hkDIP), &orig_dip)) return false;
|
||||||
if (!patchVtableEntry(vtable_ptr, types.VT.Reset, @intFromPtr(&hkReset), &orig_reset)) return false;
|
|
||||||
|
|
||||||
hooks_installed = true;
|
hooks_installed = true;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -94,10 +94,8 @@ fn renderDrawDetour(this: u32, view_matrix: u32, batch_data: u32, batch_indices:
|
|||||||
api.initD3D9Deferred();
|
api.initD3D9Deferred();
|
||||||
}
|
}
|
||||||
|
|
||||||
// AutoFix: OutlineDebug() previously performed lateRehookIfLost() by hand.
|
// Isolation test: keep the initial deferred D3D9 hook install, but do not
|
||||||
// Check periodically from this always-active native model hook instead.
|
// repeatedly verify/rewrite the live vtable while rendering.
|
||||||
autoRepairD3D9Hooks();
|
|
||||||
|
|
||||||
// Skip reordering if nothing to outline or too many batches
|
// Skip reordering if nothing to outline or too many batches
|
||||||
if (!tracker.enabled or !tracker.hasTargets() or batch_count == 0 or batch_count > MAX_REORDER) {
|
if (!tracker.enabled or !tracker.hasTargets() or batch_count == 0 or batch_count > MAX_REORDER) {
|
||||||
render_draw_hook.callOriginal(.{ this, view_matrix, batch_data, batch_indices, batch_count });
|
render_draw_hook.callOriginal(.{ this, view_matrix, batch_data, batch_indices, batch_count });
|
||||||
|
|||||||
Reference in New Issue
Block a user