') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - FEZModding/IMGUI: FEZ mod for integrating the ImGui.NET wrapper of Dear ImGui · GitHub
Skip to content

Repository files navigation

IMGUI

After all, all game developers now use ImGui everywhere, right?

Overview

This is a FEZ mod for integrating the ImGui.NET wrapper of Dear ImGui.

Purpose

This mod is primarily intended for those who want to have some kind of UI for their mod (could be an editor, control panel, debugging tool, etc.).

Usage

Use ImGui static class from the ImGuiNET namespace.

Additionally, the ImGuiX static class is provided for more fluent usage with XNA types.

Installation

  1. Install HAT via the instructions there.
  2. Download IMGUI.zip from Releases page and extract it in the Mods directory as a folder.
  3. Run MONOMODDED_FEZ.exe and enjoy!

Referencing

To use this mod in your mod, you need to add references to IMGUI.dll in these files:

  • UserProperties.xml:
<Project>
<PropertyGroup>
...
<!--Insert path to where IMGUI mod is here-->
<ImGuiDir></ImGuiDir>
</PropertyGroup>
</Project>
  • YourMod.csproj:
<ProjectSdk="Microsoft.NET.Sdk">
...
<!-- To use ImGuiX helper class -->
<ReferenceInclude="IMGUI">
<HintPath>$(ImGuiDir)\IMGUI.dll</HintPath>
<Private>False</Private>
</Reference>
<!-- To use ImGuiNET namespace -->
<ReferenceInclude="ImGui.NET">
<HintPath>$(ImGuiDir)\ImGui.NET.dll</HintPath>
<Private>False</Private>
</Reference>
</Project>

Building

  1. Clone the repository.
  2. Copy UserProperties.xml.template to UserProperties.xml and set FezDir to your FEZ directory with HAT installed.
  3. Run dotnet build to build the mod and copy it into your FEZ Mods directory. Use dotnet build --configuration Release for a Release build, or create a release ZIP with ./scripts/publish scripts.

Versioning

The mod follows the versioning scheme: <UPSTREAM>.<REVISION>

  • UPSTREAM: the version of native Dear ImGui.
  • REVISION: in case of bug fixes or implementation improvements.

Contributing

Contributions are welcome! Whether it's bug fixes, implementation improvements or suggestions, your help will be greatly appreciated.

Special thanks

  • Krzyhau - for the method of loading native dependencies used in HEADSET mod.

See also

https://github.com/ImGuiNET/ImGui.NET

This is a .NET wrapper for the immediate mode GUI library, Dear ImGui (https://github.com/ocornut/imgui). ImGui.NET lets you build graphical interfaces using a simple immediate-mode style. ImGui.NET is a .NET Standard library, and can be used on all major .NET runtimes and operating systems.

https://github.com/ocornut/imgui

Dear ImGui is a bloat-free graphical user interface library for C++. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies).

Dear ImGui is designed to enable fast iterations and to empower programmers to create content creation tools and visualization / debug tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and lacks certain features normally found in more high-level libraries.

Dear ImGui is particularly suited to integration in games engine (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on consoles platforms where operating system features are non-standard.

See the official screenshot thread for examples of many different kinds of interfaces created with Dear ImGui.

https://github.com/cimgui/cimgui

This is a thin c-api wrapper for the excellent C++ intermediate gui imgui. This library is intended as an intermediate layer to be able to use imgui from other languages that can interface with C.

About

FEZ mod for integrating the ImGui.NET wrapper of Dear ImGui

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Contributors

Languages