Group T5DE's settings, and add the renderer's frame rate
CI / test (push) Successful in 1m15s

T5DE's settings page is now in sections like IMVU's pages: Diagnostics, and,
with the T5DE Renderer patch, Graphics with the renderer's Frame Rate (30, 60,
120, 240, 360 or Uncapped), kept in HKCU\Software\T5DE\Graphics.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
dhkatzandClaude Opus 5.5 committed 2026-10-28 20:38:52 -07:00
1 parent d1189ba0ef
commit b3f1cfddfe
3 files changed
+104 -6

No files matched your search

+4 -1
View File
@@ -166,7 +166,10 @@ modern stack.
user name scrubbed. Its helpers are in `main/client.py` (no module-level imports, so they work when startup
fails). Outside an install (e.g. `build/IMVUClient`) there's no `t5de-setup.exe`, so nothing is sent.
The `t5de-settings` patch adds a T5DE page to the client's Settings (`imvuContent/settings/t5de.js`, handlers
`handle_t5deGetDiagnostic`/`handle_t5deSetDiagnostic` on `SettingsGeckoListener`, via `_winreg`). IMVU's
`handle_t5deGetDiagnostic`/`handle_t5deSetDiagnostic` on `SettingsGeckoListener`, via `_winreg`). The page is
grouped into sections like IMVU's pages (a `subsection` with an `<h1>` each, Title Case): Diagnostics; the
`t5de-renderer` patch adds Graphics above it (Frame Rate, `t5de-graphics.js`, `HKCU\Software\T5DE\Graphics\FrameRate`:
30, the default, 60, 120, 240, 360, or 0 for uncapped; read live by the renderer's adapter). IMVU's
`PersistentPrefStore.deleteAllSettings` deletes every subkey of `Software\T5DE`, including `Diagnostics`, which
then means no (fail-safe). Still to do: native crashes (minidumps, `imvu/bugreport/windows.py`).
- Self-updates (`internal/update`, the `t5de-updates` patch): an install follows its channel (the user's choice):
@@ -21,7 +21,7 @@ T5de-Depends: t5de-diagnostics
create mode 100644 imvuContent/settings/t5de.js
diff --git a/imvuContent/settings/index.html b/imvuContent/settings/index.html
index 21b2f84cd7e99ba81d99bec8265e07e487271090..442fb306488f42ecbcf249683eb83b50c91a8264 100644
index 21b2f84cd7e99ba81d99bec8265e07e487271090..e51a47ddbac2080483a5c422fd9cd2ec67db1051 100644
--- a/imvuContent/settings/index.html
+++ b/imvuContent/settings/index.html
@@ -27,6 +27,7 @@
@@ -45,8 +45,8 @@ index 21b2f84cd7e99ba81d99bec8265e07e487271090..442fb306488f42ecbcf249683eb83b50
</div>
</div>
+ <div class="page" imvu:page="t5de" id="t5de-page">
+ <div class="subsection">
+ <h1>T5DE</h1>
+ <div class="subsection" id="t5de-diagnostics">
+ <h1>Diagnostics</h1>
+ <div><label><input type="checkbox" id="t5de-usage"> Send anonymous usage statistics</label></div>
+ <div><label><input type="checkbox" id="t5de-crashes"> Send crash reports</label></div>
+ <div class="info t5de-info">Sent to T5DE, never to IMVU. Usage statistics: versions, patches used, and when
@@ -4,7 +4,8 @@ Date: Wed, 28 Oct 2026 03:35:47 -0700
Subject: [PATCH] Draw with T5DE's renderer when Graphics is OpenGL
Installs T5DE's 3D renderer (in development, from the t5de-renderer repository; t5de.toml pins its release) and
uses it when Settings > Advanced > Graphics is OpenGL, in place of IMVU's OpenGL renderer.
uses it when Settings > Advanced > Graphics is OpenGL, in place of IMVU's OpenGL renderer. Adds a Graphics section
to T5DE's settings, with the renderer's frame rate.
The client picks the OpenGL renderer's file by name in SceneWindow.dll; the name is swapped in memory, after
checking the code is what's expected, when the first 3D window opens (only if the client's folder has
@@ -14,10 +15,72 @@ Co-Authored-By: Claude Opus 5.5 <[email protected]>
T5de-Id: t5de-renderer
T5de-Group: renderer
T5de-Name: T5DE Renderer
T5de-Depends: t5de-settings
---
imvuContent/settings/index.html | 16 ++++++++
imvuContent/settings/t5de-graphics.js | 9 +++++
library/imvu/avatarwindow/__init__.py | 55 +++++++++++++++++++++++++--
1 file changed, 51 insertions(+), 4 deletions(-)
library/imvu/mode/SettingsMode.py | 21 ++++++++++
4 files changed, 97 insertions(+), 4 deletions(-)
create mode 100644 imvuContent/settings/t5de-graphics.js
diff --git a/imvuContent/settings/index.html b/imvuContent/settings/index.html
index e51a47ddbac2080483a5c422fd9cd2ec67db1051..72afd50a1c2ac86ced5d3df19db690df0e82bad4 100644
--- a/imvuContent/settings/index.html
+++ b/imvuContent/settings/index.html
@@ -28,6 +28,7 @@
<script src="ToolBar.js"></script>
<script src="BlockActionSettings.js"></script>
<script src="t5de.js"></script>
+ <script src="t5de-graphics.js"></script>
<script src="../widgets/button/imvuButton.js"></script>
</head><body class="yui-skin-sam">
@@ -120,6 +121,20 @@
</div>
</div>
<div class="page" imvu:page="t5de" id="t5de-page">
+ <div class="subsection" id="t5de-graphics">
+ <h1>Graphics</h1>
+ <div><span class="choice_desc">Frame Rate</span>
+ <select id="t5de-frame-rate">
+ <option value="30">30 (IMVU)</option>
+ <option value="60">60</option>
+ <option value="120">120</option>
+ <option value="240">240</option>
+ <option value="360">360</option>
+ <option value="0">Uncapped</option>
+ </select>
+ </div>
+ <div class="info t5de-info">With T5DE's renderer: Graphics set to OpenGL in Advanced.</div>
+ </div>
<div class="subsection" id="t5de-diagnostics">
<h1>Diagnostics</h1>
<div><label><input type="checkbox" id="t5de-usage"> Send anonymous usage statistics</label></div>
@@ -233,6 +248,7 @@
settingsController = settingsSetupController(document.querySelector('#settings_mode'), imvu);
var tb = new ToolBar(imvu.call);
t5deSettings(imvu);
+ t5deGraphicsSettings(imvu);
}
</script>
</body></html>
\ No newline at end of file
diff --git a/imvuContent/settings/t5de-graphics.js b/imvuContent/settings/t5de-graphics.js
new file mode 100644
index 0000000000000000000000000000000000000000..904786fc84047ab0c7461ed6dfe942175622849b
--- /dev/null
+++ b/imvuContent/settings/t5de-graphics.js
@@ -0,0 +1,9 @@
+// T5DE's renderer's settings (the T5DE Renderer patch): the frame rate, kept in the registry, where the renderer reads
+// it while the client runs (SettingsMode.py: handle_t5deGetFrameRate, handle_t5deSetFrameRate).
+function t5deGraphicsSettings(imvu) {
+ var select = document.getElementById('t5de-frame-rate');
+ select.value = String(imvu.call('t5deGetFrameRate'));
+ select.addEventListener('change', function () {
+ imvu.call('t5deSetFrameRate', parseInt(select.value, 10));
+ }, false);
+}
diff --git a/library/imvu/avatarwindow/__init__.py b/library/imvu/avatarwindow/__init__.py
index 6425a08f5a0345971f6342819efcc439bb2b1baf..a21fc86b24022b6f32ef6ae1b7f5b74f8b392641 100644
--- a/library/imvu/avatarwindow/__init__.py
@@ -83,3 +146,35 @@ index 6425a08f5a0345971f6342819efcc439bb2b1baf..a21fc86b24022b6f32ef6ae1b7f5b74f
+ return
diff --git a/library/imvu/mode/SettingsMode.py b/library/imvu/mode/SettingsMode.py
index a19ffb09cfd55d99acbec82df6fb278ebd010a94..69a1ca1d6ca6ca2818c3d96cdd11c63939243c9f 100644
--- a/library/imvu/mode/SettingsMode.py
+++ b/library/imvu/mode/SettingsMode.py
@@ -44,6 +44,27 @@ class SettingsGeckoListener(object):
_winreg.SetValueEx(key, {'usage': 'UsageStatistics', 'crashes': 'CrashReports'}[name], 0, _winreg.REG_DWORD, 1 if value else 0)
finally:
key.Close()
+
+ def handle_t5deGetFrameRate(self, context):
+ """The frame rate T5DE's renderer draws at, in HKCU\Software\T5DE\Graphics (FrameRate): 30 (the client's
+ own, the default), 60, 120, 240, 360, or 0 for uncapped. The renderer reads it while the client runs."""
+ import _winreg
+ try:
+ key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Software\\T5DE\\Graphics')
+ try:
+ return int(_winreg.QueryValueEx(key, 'FrameRate')[0])
+ finally:
+ key.Close()
+ except WindowsError:
+ return 30
+
+ def handle_t5deSetFrameRate(self, context, rate):
+ import _winreg
+ key = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, 'Software\\T5DE\\Graphics')
+ try:
+ _winreg.SetValueEx(key, 'FrameRate', 0, _winreg.REG_DWORD, int(rate))
+ finally:
+ key.Close()
def handle_registerSettingsListeners(self, context, prefList):
for pref in prefList:
self.__serviceProvider.eventBus.register(self.__serviceProvider.prefService, 'PrefChanged-%s' % (pref,), self.__prefListener)