update to use .md's instead of static generated html
13
Exporter.code-workspace
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "../Documentation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"liveServer.settings.multiRootWorkspaceName": "Exporter"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,800 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<title>Blueprint Penetration Trace Documentation</title>
|
|
||||||
<base href="https://lit.ruv.wtf/docs/">
|
|
||||||
<meta id="root-path" root-path="https://lit.ruv.wtf/docs/">
|
|
||||||
<meta name="viewport"
|
|
||||||
content="width=device-width, initial-scale=1.0, user-scalable=yes, minimum-scale=1.0, maximum-scale=5.0">
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="description" content="lit.ruv.wtf - Docs - Blueprint Penetration Trace Documentation">
|
|
||||||
<meta property="og:title" content="Blueprint Penetration Trace Documentation">
|
|
||||||
<meta property="og:description" content="lit.ruv.wtf - Docs - Blueprint Penetration Trace Documentation">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:url" content="https://lit.ruv.wtf/docs/blueprint-penetration-trace.html">
|
|
||||||
<meta property="og:image" content="https://lit.ruv.wtf/docs/images/depthtracebychannel.png">
|
|
||||||
<meta property="og:site_name" content="lit.ruv.wtf - Docs">
|
|
||||||
<meta name="author" content="Litruv">
|
|
||||||
<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="https://lit.ruv.wtf/docs/lib/rss.xml">
|
|
||||||
<script async="" id="webpage-script" src="https://lit.ruv.wtf/docs/lib/scripts/webpage.js"
|
|
||||||
onload='this.onload=null;this.setAttribute("loaded", "true")'></script>
|
|
||||||
<script async="" id="minisearch-script" src="https://cdn.jsdelivr.net/npm/minisearch@6.3.0/dist/umd/index.min.js"
|
|
||||||
onload="this.onload=null;this.setAttribute('loaded', 'true')"></script>
|
|
||||||
<link rel="icon" href="https://lit.ruv.wtf/docs/lib/media/favicon.png">
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
--line-width: 40em;
|
|
||||||
--line-width-adaptive: 40em;
|
|
||||||
--file-line-width: 40em;
|
|
||||||
--sidebar-width: min(20em, 80vw);
|
|
||||||
--collapse-arrow-size: 11px;
|
|
||||||
--tree-horizontal-spacing: 0.6em;
|
|
||||||
--tree-vertical-spacing: 0.6em;
|
|
||||||
--sidebar-margin: 12px
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar {
|
|
||||||
height: 100%;
|
|
||||||
min-width: calc(var(--sidebar-width) + var(--divider-width-hover));
|
|
||||||
max-width: calc(var(--sidebar-width) + var(--divider-width-hover));
|
|
||||||
font-size: 14px;
|
|
||||||
z-index: 10;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
transition: min-width ease-in-out, max-width ease-in-out;
|
|
||||||
transition-duration: .2s;
|
|
||||||
contain: size
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left {
|
|
||||||
left: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right {
|
|
||||||
right: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar.is-collapsed {
|
|
||||||
min-width: 0;
|
|
||||||
max-width: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
body.floating-sidebars .sidebar {
|
|
||||||
position: absolute
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-content {
|
|
||||||
height: 100%;
|
|
||||||
min-width: calc(var(--sidebar-width) - var(--divider-width-hover));
|
|
||||||
top: 0;
|
|
||||||
padding: var(--sidebar-margin);
|
|
||||||
padding-top: 4em;
|
|
||||||
line-height: var(--line-height-tight);
|
|
||||||
background-color: var(--background-secondary);
|
|
||||||
transition: background-color, border-right, border-left, box-shadow;
|
|
||||||
transition-duration: var(--color-fade-speed);
|
|
||||||
transition-timing-function: ease-in-out;
|
|
||||||
position: absolute;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar:not(.is-collapsed) .sidebar-content {
|
|
||||||
min-width: calc(max(100%, var(--sidebar-width)) - 3px);
|
|
||||||
max-width: calc(max(100%, var(--sidebar-width)) - 3px)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left .sidebar-content {
|
|
||||||
left: 0;
|
|
||||||
border-top-right-radius: var(--radius-l);
|
|
||||||
border-bottom-right-radius: var(--radius-l)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right .sidebar-content {
|
|
||||||
right: 0;
|
|
||||||
border-top-left-radius: var(--radius-l);
|
|
||||||
border-bottom-left-radius: var(--radius-l)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar:has(.sidebar-content:empty):has(.topbar-content:empty) {
|
|
||||||
display: none
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-topbar {
|
|
||||||
height: 2em;
|
|
||||||
width: var(--sidebar-width);
|
|
||||||
top: var(--sidebar-margin);
|
|
||||||
padding-inline: var(--sidebar-margin);
|
|
||||||
z-index: 1;
|
|
||||||
position: fixed;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
transition: width ease-in-out;
|
|
||||||
transition-duration: inherit
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar.is-collapsed .sidebar-topbar {
|
|
||||||
width: calc(2.3em + var(--sidebar-margin) * 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar .sidebar-topbar.is-collapsed {
|
|
||||||
width: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left .sidebar-topbar {
|
|
||||||
left: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right .sidebar-topbar {
|
|
||||||
right: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.topbar-content {
|
|
||||||
overflow: hidden;
|
|
||||||
overflow: clip;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
transition: inherit
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar.is-collapsed .topbar-content {
|
|
||||||
width: 0;
|
|
||||||
transition: inherit
|
|
||||||
}
|
|
||||||
|
|
||||||
.clickable-icon.sidebar-collapse-icon {
|
|
||||||
background-color: transparent;
|
|
||||||
color: var(--icon-color-focused);
|
|
||||||
padding: 0 !important;
|
|
||||||
margin: 0 !important;
|
|
||||||
height: 100% !important;
|
|
||||||
width: 2.3em !important;
|
|
||||||
margin-inline: 0.14em !important;
|
|
||||||
position: absolute
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left .clickable-icon.sidebar-collapse-icon {
|
|
||||||
transform: rotateY(180deg);
|
|
||||||
right: var(--sidebar-margin)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right .clickable-icon.sidebar-collapse-icon {
|
|
||||||
transform: rotateY(180deg);
|
|
||||||
left: var(--sidebar-margin)
|
|
||||||
}
|
|
||||||
|
|
||||||
.clickable-icon.sidebar-collapse-icon svg.svg-icon {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-section-header {
|
|
||||||
margin: 0 0 1em 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: .06em;
|
|
||||||
font-weight: 600
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
transition: background-color var(--color-fade-speed) ease-in-out
|
|
||||||
}
|
|
||||||
|
|
||||||
.webpage-container {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
align-items: stretch;
|
|
||||||
justify-content: center
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container {
|
|
||||||
opacity: 1;
|
|
||||||
flex-basis: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
transition: opacity .2s ease-in-out;
|
|
||||||
contain: inline-size
|
|
||||||
}
|
|
||||||
|
|
||||||
.hide {
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity .2s ease-in-out
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.markdown-preview-view {
|
|
||||||
margin: var(--sidebar-margin);
|
|
||||||
margin-bottom: 0;
|
|
||||||
width: 100%;
|
|
||||||
width: -webkit-fill-available;
|
|
||||||
width: -moz-available;
|
|
||||||
width: fill-available;
|
|
||||||
background-color: var(--background-primary);
|
|
||||||
transition: background-color var(--color-fade-speed) ease-in-out;
|
|
||||||
border-top-right-radius: var(--window-radius, var(--radius-m));
|
|
||||||
border-top-left-radius: var(--window-radius, var(--radius-m));
|
|
||||||
overflow-x: hidden !important;
|
|
||||||
overflow-y: auto !important;
|
|
||||||
display: flex !important;
|
|
||||||
flex-direction: column !important;
|
|
||||||
align-items: center !important;
|
|
||||||
contain: inline-size
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.markdown-preview-view>.markdown-preview-sizer {
|
|
||||||
padding-bottom: 80vh !important;
|
|
||||||
width: 100% !important;
|
|
||||||
max-width: var(--line-width) !important;
|
|
||||||
flex-basis: var(--line-width) !important;
|
|
||||||
transition: background-color var(--color-fade-speed) ease-in-out;
|
|
||||||
contain: inline-size
|
|
||||||
}
|
|
||||||
|
|
||||||
.markdown-rendered img:not([width]),
|
|
||||||
.view-content img:not([width]) {
|
|
||||||
max-width: 100%;
|
|
||||||
outline: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.view-content.embed {
|
|
||||||
display: flex;
|
|
||||||
padding: 1em;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.view-content.embed>* {
|
|
||||||
max-width: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
object-fit: contain
|
|
||||||
}
|
|
||||||
|
|
||||||
:has(> :is(.math, table)) {
|
|
||||||
overflow-x: auto !important
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.view-content {
|
|
||||||
overflow-x: auto;
|
|
||||||
contain: content;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
height: 100%
|
|
||||||
}
|
|
||||||
|
|
||||||
.scroll-highlight {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 1000;
|
|
||||||
background-color: hsla(var(--color-accent-hsl), .25);
|
|
||||||
opacity: 0;
|
|
||||||
padding: 1em;
|
|
||||||
inset: 50%;
|
|
||||||
translate: -50% -50%;
|
|
||||||
border-radius: var(--radius-s)
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script
|
|
||||||
defer="">async function loadIncludes() { if ("file:" != location.protocol) { let e = document.querySelectorAll("include"); for (let t = 0; t < e.length; t++) { let o = e[t], l = o.getAttribute("src"); try { const e = await fetch(l); if (!e.ok) { console.log("Could not include file: " + l), o?.remove(); continue } let t = await e.text(), n = document.createRange().createContextualFragment(t), i = Array.from(n.children); for (let e of i) e.classList.add("hide"), e.style.transition = "opacity 0.5s ease-in-out", setTimeout((() => { e.classList.remove("hide") }), 10); o.before(n), o.remove(), console.log("Included file: " + l) } catch (e) { o?.remove(), console.log("Could not include file: " + l, e); continue } } } else { if (document.querySelectorAll("include").length > 0) { var e = document.createElement("div"); e.id = "error", e.textContent = "Web server exports must be hosted on an http / web server to be viewed correctly.", e.style.position = "fixed", e.style.top = "50%", e.style.left = "50%", e.style.transform = "translate(-50%, -50%)", e.style.fontSize = "1.5em", e.style.fontWeight = "bold", e.style.textAlign = "center", document.body.appendChild(e), document.querySelector(".document-container")?.classList.remove("hide") } } } document.addEventListener("DOMContentLoaded", (() => { loadIncludes() })); let isFileProtocol = "file:" == location.protocol; function waitLoadScripts(e, t) { let o = e.map((e => document.getElementById(e + "-script"))), l = 0; !function e() { let n = o[l]; l++, n && "true" != n.getAttribute("loaded") || l < o.length && e(), l < o.length ? n.addEventListener("load", e) : t() }() }</script>
|
|
||||||
<link rel="stylesheet" href="lib/styles/obsidian.css">
|
|
||||||
<link rel="preload" href="lib/styles/global-variable-styles.css" as="style"
|
|
||||||
onload="this.onload=null;this.rel='stylesheet'"><noscript>
|
|
||||||
<link rel="stylesheet" href="lib/styles/global-variable-styles.css">
|
|
||||||
</noscript>
|
|
||||||
<link rel="preload" href="lib/styles/main-styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
|
||||||
<noscript>
|
|
||||||
<link rel="stylesheet" href="lib/styles/main-styles.css">
|
|
||||||
</noscript>
|
|
||||||
<link rel="preload" href="lib/styles/snippets.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
|
||||||
<noscript>
|
|
||||||
<link rel="stylesheet" href="lib/styles/snippets.css">
|
|
||||||
</noscript>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body class="publish css-settings-manager theme-dark show-inline-title show-ribbon">
|
|
||||||
<script
|
|
||||||
defer="">let theme = localStorage.getItem("theme") || (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"); "dark" == theme ? (document.body.classList.add("theme-dark"), document.body.classList.remove("theme-light")) : (document.body.classList.add("theme-light"), document.body.classList.remove("theme-dark")), window.innerWidth < 480 ? document.body.classList.add("is-phone") : window.innerWidth < 768 ? document.body.classList.add("is-tablet") : window.innerWidth < 1024 ? document.body.classList.add("is-small-screen") : document.body.classList.add("is-large-screen")</script>
|
|
||||||
<div class="webpage-container workspace">
|
|
||||||
<div class="sidebar-left sidebar">
|
|
||||||
<div class="sidebar-topbar">
|
|
||||||
<div class="topbar-content"></div>
|
|
||||||
<div class="clickable-icon sidebar-collapse-icon"><svg xmlns="http://www.w3.org/2000/svg" width="100%"
|
|
||||||
height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round" class="svg-icon">
|
|
||||||
<path
|
|
||||||
d="M21 3H3C1.89543 3 1 3.89543 1 5V19C1 20.1046 1.89543 21 3 21H21C22.1046 21 23 20.1046 23 19V5C23 3.89543 22.1046 3 21 3Z">
|
|
||||||
</path>
|
|
||||||
<path d="M10 4V20"></path>
|
|
||||||
<path d="M4 7H7"></path>
|
|
||||||
<path d="M4 10H7"></path>
|
|
||||||
<path d="M4 13H7"></path>
|
|
||||||
</svg></div>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-content">
|
|
||||||
<div class="search-input-container"><input enterkeyhint="search" type="search" spellcheck="false"
|
|
||||||
placeholder="Search...">
|
|
||||||
<div class="search-input-clear-button" aria-label="Clear search"></div>
|
|
||||||
</div>
|
|
||||||
<include src="lib/html/file-tree.html"></include>
|
|
||||||
</div>
|
|
||||||
<script
|
|
||||||
defer="">let ls = document.querySelector(".sidebar-left"); ls.classList.add("is-collapsed"); if (window.innerWidth > 768) ls.classList.remove("is-collapsed"); ls.style.setProperty("--sidebar-width", localStorage.getItem("sidebar-left-width"));</script>
|
|
||||||
</div>
|
|
||||||
<div class="document-container markdown-reading-view hide">
|
|
||||||
<div class="markdown-preview-view markdown-rendered is-readable-line-width">
|
|
||||||
<style id="MJX-CHTML-styles"></style>
|
|
||||||
<pre class="frontmatter language-yaml" tabindex="0"
|
|
||||||
style="display: none;"><code class="language-yaml is-loaded"><span class="token key atrule">title</span><span class="token punctuation">:</span> Blueprint Penetration Trace Documentation</code><button class="copy-code-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-copy"><rect x="8" y="8" width="14" height="14" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg></button></pre>
|
|
||||||
<div class="markdown-preview-sizer markdown-preview-section">
|
|
||||||
<h1 class="page-title heading inline-title" id="Blueprint Penetration Trace Documentation">Blueprint
|
|
||||||
Penetration Trace Documentation</h1>
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">This is a <code>Blueprint Function Library</code> with a few functions that are
|
|
||||||
callable in <code>AActors</code> to do depth trace results, for use in things like
|
|
||||||
projectiles and tools.</p>
|
|
||||||
</div>
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto"><span alt="TraceExample.mp4" src="TraceExample.mp4"
|
|
||||||
class="internal-embed media-embed video-embed is-loaded"><video controls=""
|
|
||||||
preload="metadata" src="images/traceexample.mp4" style=""></video></span></p>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="Features" dir="auto" class="heading" id="Features">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Features
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-ul">
|
|
||||||
<ul>
|
|
||||||
<li data-line="0" dir="auto">Depth-based trace</li>
|
|
||||||
<li data-line="1" dir="auto">Forward and backward trace results for bullet holes
|
|
||||||
</li>
|
|
||||||
<li data-line="2" dir="auto">Simple to implement into existing systems</li>
|
|
||||||
<li data-line="3" dir="auto">Easy debug options</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="el-hr">
|
|
||||||
<hr>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="How it works" dir="auto" class="heading" id="How_it_works">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>How it works
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">This node works by simulating depth using two line traces—one forward and
|
|
||||||
one backward from the point of impact. These traces scan for objects in their paths
|
|
||||||
and gather information about the hit results. The distance travelled through each
|
|
||||||
material is multiplied by its density (defined in the material's physical
|
|
||||||
properties), which determines how much the projectile is slowed down or whether it
|
|
||||||
stops entirely. Finally, the node returns a list of hit results, including the total
|
|
||||||
depth.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="Variants" dir="auto" class="heading" id="Variants">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Variants
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">Depth Trace by Channel<br>
|
|
||||||
<span alt="DepthTraceByChannel.png" src="DepthTraceByChannel.png"
|
|
||||||
class="internal-embed media-embed image-embed is-loaded"><img
|
|
||||||
alt="DepthTraceByChannel.png"
|
|
||||||
src="images/depthtracebychannel.png"></span><br>
|
|
||||||
Depth Trace for Objects<br>
|
|
||||||
<span alt="DepthTraceForObjects.png" src="DepthTraceForObjects.png"
|
|
||||||
class="internal-embed media-embed image-embed is-loaded"><img
|
|
||||||
alt="DepthTraceForObjects.png"
|
|
||||||
src="images/depthtraceforobjects.png"></span><br>
|
|
||||||
Depth Trace by Profile<br>
|
|
||||||
<span alt="DepthTraceByProfile.png" src="DepthTraceByProfile.png"
|
|
||||||
class="internal-embed media-embed image-embed is-loaded"><img
|
|
||||||
alt="DepthTraceByProfile.png" src="images/depthtracebyprofile.png"></span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="el-h3 heading-wrapper">
|
|
||||||
<h3 data-heading="Input" dir="auto" class="heading" id="Input">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24"
|
|
||||||
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round"
|
|
||||||
class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Input
|
|
||||||
</h3>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-table" dir="ltr" style="overflow-x: auto;">
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th dir="ltr"><strong>Member</strong></th>
|
|
||||||
<th dir="ltr"><strong>Definition</strong></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Start</strong></td>
|
|
||||||
<td dir="ltr">Start of the Trace</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>End</strong></td>
|
|
||||||
<td dir="ltr">End of the Trace</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Trace Complex</strong></td>
|
|
||||||
<td dir="ltr">If the trace will use <a data-tooltip-position="top"
|
|
||||||
aria-label="https://dev.epicgames.com/documentation/en-us/unreal-engine/simple-versus-complex-collision-in-unreal-engine"
|
|
||||||
rel="noopener nofollow" class="external-link"
|
|
||||||
href="https://dev.epicgames.com/documentation/en-us/unreal-engine/simple-versus-complex-collision-in-unreal-engine"
|
|
||||||
target="_blank">Complex Collision</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Actors To Ignore</strong></td>
|
|
||||||
<td dir="ltr">Array of Actors, to ignore while tracing</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Draw Debug Type</strong></td>
|
|
||||||
<td dir="ltr">Draw Debug Arrows over Time, or Persistently</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Ignore Self</strong></td>
|
|
||||||
<td dir="ltr">If the traces should ignore the Current actor (Self)
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Trace Color</strong></td>
|
|
||||||
<td dir="ltr">The color of the trace, when it's not going through
|
|
||||||
anything.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Trace Hit Color</strong></td>
|
|
||||||
<td dir="ltr">The color of the trace, when it's going through
|
|
||||||
something.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Draw Time</strong></td>
|
|
||||||
<td dir="ltr">Amount of time to draw debug lines (if not persistent)
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr"><strong>Max Depth</strong></td>
|
|
||||||
<td dir="ltr">Maximum depth for the trace to go</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="Implementing into existing systems" dir="auto" class="heading"
|
|
||||||
id="Implementing_into_existing_systems">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Implementing into existing systems
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">This can be seamlessly integrated with existing systems with minimal
|
|
||||||
changes to your current blueprint setup.</p>
|
|
||||||
</div>
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">By simply replacing your current line trace nodes with the Depth Trace
|
|
||||||
node, you’ll get the added benefit of depth effects.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="Adding Trace Collision Channel (optional)" dir="auto" class="heading"
|
|
||||||
id="Adding_Trace_Collision_Channel_(optional)">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Adding Trace Collision Channel (optional)
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">While adding a custom collision channel is optional, it can be a bit more
|
|
||||||
time-consuming and may cause other systems in your project to break if not set up
|
|
||||||
correctly. By default, your existing channels might not be set to overlap, so
|
|
||||||
setting up a new custom trace channel helps ensure compatibility.</p>
|
|
||||||
</div>
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">To set up a custom trace channel in Unreal Engine, follow these steps:</p>
|
|
||||||
</div>
|
|
||||||
<div class="el-ol">
|
|
||||||
<ol>
|
|
||||||
<li data-line="0" dir="auto">Go to <strong>Project Settings → Engine →
|
|
||||||
Collision</strong>.</li>
|
|
||||||
<li data-line="1" dir="auto">In the <strong>Collision Channels</strong> section,
|
|
||||||
click <strong>Add New</strong>.</li>
|
|
||||||
<li data-line="2" dir="auto">
|
|
||||||
<div class="list-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24"
|
|
||||||
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round"
|
|
||||||
class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Set the following properties for the new channel:
|
|
||||||
<ul>
|
|
||||||
<li data-line="3" dir="auto"><strong>Name</strong>: <code>Projectile</code>
|
|
||||||
(or a name of your choice)</li>
|
|
||||||
<li data-line="4" dir="auto"><strong>Default Response</strong>:
|
|
||||||
<code>Overlap</code></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">For more detailed instructions on adding a custom object type to your
|
|
||||||
project, you can refer to the <a data-tooltip-position="top"
|
|
||||||
aria-label="https://dev.epicgames.com/documentation/en-us/unreal-engine/add-a-custom-object-type-to-your-project-in-unreal-engine"
|
|
||||||
rel="noopener nofollow" class="external-link"
|
|
||||||
href="https://dev.epicgames.com/documentation/en-us/unreal-engine/add-a-custom-object-type-to-your-project-in-unreal-engine"
|
|
||||||
target="_blank">Unreal Engine Wiki on Custom Object Types</a>.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="Physical materials (optional)" dir="auto" class="heading"
|
|
||||||
id="Physical_materials_(optional)">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Physical materials (optional)
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">Default <a data-tooltip-position="top"
|
|
||||||
aria-label="https://dev.epicgames.com/documentation/en-us/unreal-engine/physical-materials-user-guide-for-unreal-engine"
|
|
||||||
rel="noopener nofollow" class="external-link"
|
|
||||||
href="https://dev.epicgames.com/documentation/en-us/unreal-engine/physical-materials-user-guide-for-unreal-engine"
|
|
||||||
target="_blank">Physical Material</a> properties are at <strong>1 g/cm</strong>,
|
|
||||||
but adding more physical properties into your game can add extra depth. </p>
|
|
||||||
</div>
|
|
||||||
<div class="el-h3 heading-wrapper">
|
|
||||||
<h3 data-heading="Example Material Densities" dir="auto" class="heading"
|
|
||||||
id="Example_Material_Densities">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24"
|
|
||||||
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round"
|
|
||||||
class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Example Material Densities
|
|
||||||
</h3>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-table" dir="ltr" style="overflow-x: auto;">
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th dir="ltr">Material</th>
|
|
||||||
<th dir="ltr">Density (g/cm³)</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Styrofoam</td>
|
|
||||||
<td dir="auto">0.1</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Pine Wood</td>
|
|
||||||
<td dir="auto">0.5</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Water</td>
|
|
||||||
<td dir="auto">0.5</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Glass</td>
|
|
||||||
<td dir="auto">1</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Concrete</td>
|
|
||||||
<td dir="auto">2.4</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Aluminum</td>
|
|
||||||
<td dir="auto">2.7</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Iron/Steel</td>
|
|
||||||
<td dir="auto">7.8</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Copper</td>
|
|
||||||
<td dir="auto">8.9</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td dir="ltr">Lead</td>
|
|
||||||
<td dir="auto">11.3</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="el-hr">
|
|
||||||
<hr>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="Acknowledgements" dir="auto" class="heading" id="Acknowledgements">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div>Acknowledgements
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-ul">
|
|
||||||
<ul>
|
|
||||||
<li data-line="0" dir="auto"><a data-tooltip-position="top"
|
|
||||||
aria-label="https://opengameart.org/users/loafbrr1" rel="noopener nofollow"
|
|
||||||
class="external-link" href="https://opengameart.org/users/loafbrr1"
|
|
||||||
target="_blank">loafbrr_1</a> for the pistol model</li>
|
|
||||||
<li data-line="1" dir="auto"><a data-tooltip-position="top"
|
|
||||||
aria-label="https://commons.wikimedia.org/wiki/File:B1_full_size_1500_target.jpg"
|
|
||||||
rel="noopener nofollow" class="external-link"
|
|
||||||
href="https://commons.wikimedia.org/wiki/File:B1_full_size_1500_target.jpg"
|
|
||||||
target="_blank">Neil Francis</a> for the target image</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="mod-footer mod-ui"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-right sidebar">
|
|
||||||
<div class="sidebar-topbar">
|
|
||||||
<div class="topbar-content"></div>
|
|
||||||
<div class="clickable-icon sidebar-collapse-icon"><svg xmlns="http://www.w3.org/2000/svg" width="100%"
|
|
||||||
height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round" class="svg-icon">
|
|
||||||
<path
|
|
||||||
d="M21 3H3C1.89543 3 1 3.89543 1 5V19C1 20.1046 1.89543 21 3 21H21C22.1046 21 23 20.1046 23 19V5C23 3.89543 22.1046 3 21 3Z">
|
|
||||||
</path>
|
|
||||||
<path d="M10 4V20"></path>
|
|
||||||
<path d="M4 7H7"></path>
|
|
||||||
<path d="M4 10H7"></path>
|
|
||||||
<path d="M4 13H7"></path>
|
|
||||||
</svg></div>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-content">
|
|
||||||
<div class="tree-container mod-root nav-folder tree-item outline-tree" data-depth="0">
|
|
||||||
<div class="tree-header"><span class="sidebar-section-header">Table Of Contents</span><button
|
|
||||||
class="clickable-icon collapse-tree-button" aria-label="Collapse All"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"></svg></button></div>
|
|
||||||
<div class="tree-scroll-area tree-item-children nav-folder-children">
|
|
||||||
<div class="tree-item mod-tree-folder nav-folder mod-collapsible is-collapsed"
|
|
||||||
style="display: none;"></div>
|
|
||||||
<div class="tree-item" data-depth="1"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Blueprint Penetration Trace Documentation">
|
|
||||||
<div class="tree-item-contents heading-link"
|
|
||||||
heading-name="Blueprint Penetration Trace Documentation"><span
|
|
||||||
class="tree-item-title">Blueprint Penetration Trace Documentation</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children">
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Features">
|
|
||||||
<div class="tree-item-contents heading-link" heading-name="Features"><span
|
|
||||||
class="tree-item-title">Features</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#How_it_works">
|
|
||||||
<div class="tree-item-contents heading-link" heading-name="How it works"><span
|
|
||||||
class="tree-item-title">How it works</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Variants">
|
|
||||||
<div class="tree-item-contents heading-link" heading-name="Variants"><span
|
|
||||||
class="tree-item-title">Variants</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children">
|
|
||||||
<div class="tree-item" data-depth="3"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Input">
|
|
||||||
<div class="tree-item-contents heading-link" heading-name="Input"><span
|
|
||||||
class="tree-item-title">Input</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Implementing_into_existing_systems">
|
|
||||||
<div class="tree-item-contents heading-link"
|
|
||||||
heading-name="Implementing into existing systems"><span
|
|
||||||
class="tree-item-title">Implementing into existing systems</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Adding_Trace_Collision_Channel_(optional)">
|
|
||||||
<div class="tree-item-contents heading-link"
|
|
||||||
heading-name="Adding Trace Collision Channel (optional)"><span
|
|
||||||
class="tree-item-title">Adding Trace Collision Channel (optional)</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Physical_materials_(optional)">
|
|
||||||
<div class="tree-item-contents heading-link"
|
|
||||||
heading-name="Physical materials (optional)"><span
|
|
||||||
class="tree-item-title">Physical materials (optional)</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children">
|
|
||||||
<div class="tree-item" data-depth="3"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Example_Material_Densities">
|
|
||||||
<div class="tree-item-contents heading-link"
|
|
||||||
heading-name="Example Material Densities"><span
|
|
||||||
class="tree-item-title">Example Material Densities</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="blueprint-penetration-trace.html#Acknowledgements">
|
|
||||||
<div class="tree-item-contents heading-link" heading-name="Acknowledgements">
|
|
||||||
<span class="tree-item-title">Acknowledgements</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script
|
|
||||||
defer="">let rs = document.querySelector(".sidebar-right"); rs.classList.add("is-collapsed"); if (window.innerWidth > 768) rs.classList.remove("is-collapsed"); rs.style.setProperty("--sidebar-width", localStorage.getItem("sidebar-right-width"));</script>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
84
docs/Blueprint Penetration Trace.md
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
title: Blueprint Depth Trace
|
||||||
|
---
|
||||||
|
This is a `Blueprint Function Library` with a few functions that are callable in `AActors` to do depth trace results, for use in things like projectiles and tools.
|
||||||
|
|
||||||
|
![[TraceExample.mp4]]
|
||||||
|
## Features
|
||||||
|
- Depth-based trace
|
||||||
|
- Forward and backward trace results for bullet holes
|
||||||
|
- Physics material based density calculations
|
||||||
|
- Simple to implement into existing systems
|
||||||
|
- Easy debug options
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
This node works by simulating depth using two line traces—one forward and one backward from the point of impact. These traces scan for objects in their paths and gather information about the hit results. The distance travelled through each material is multiplied by its density (defined in the material's physical properties), which determines how much the projectile is slowed down or whether it stops entirely. Finally, the node returns a list of hit results, including the total depth.
|
||||||
|
|
||||||
|
## Variants
|
||||||
|
Depth Trace by Channel
|
||||||
|
![[DepthTraceByChannel.png]]
|
||||||
|
Depth Trace for Objects
|
||||||
|
![[DepthTraceForObjects.png]]
|
||||||
|
Depth Trace by Profile
|
||||||
|
![[DepthTraceByProfile.png]]
|
||||||
|
|
||||||
|
### Input
|
||||||
|
|
||||||
|
| **Member** | **Definition** |
|
||||||
|
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| **Start** | Start of the Trace |
|
||||||
|
| **End** | End of the Trace |
|
||||||
|
| **Trace Complex** | If the trace will use [Complex Collision](https://dev.epicgames.com/documentation/en-us/unreal-engine/simple-versus-complex-collision-in-unreal-engine) |
|
||||||
|
| **Actors To Ignore** | Array of Actors, to ignore while tracing |
|
||||||
|
| **Draw Debug Type** | Draw Debug Arrows over Time, or Persistently |
|
||||||
|
| **Ignore Self** | If the traces should ignore the Current actor (Self) |
|
||||||
|
| **Trace Color** | The color of the trace, when it's not going through anything. |
|
||||||
|
| **Trace Hit Color** | The color of the trace, when it's going through something. |
|
||||||
|
| **Draw Time** | Amount of time to draw debug lines (if not persistent) |
|
||||||
|
| **Max Depth** | Maximum depth for the trace to go |
|
||||||
|
|
||||||
|
## Implementing into existing systems
|
||||||
|
|
||||||
|
This can be seamlessly integrated with existing systems with minimal changes to your current blueprint setup.
|
||||||
|
|
||||||
|
By simply replacing your current line trace nodes with the Depth Trace node, you’ll get the added benefit of depth effects.
|
||||||
|
|
||||||
|
## Adding Trace Collision Channel (optional)
|
||||||
|
|
||||||
|
While adding a custom collision channel is optional, it can be a bit more time-consuming and may cause other systems in your project to break if not set up correctly. By default, your existing channels might not be set to overlap, so setting up a new custom trace channel helps ensure compatibility.
|
||||||
|
|
||||||
|
To set up a custom trace channel in Unreal Engine, follow these steps:
|
||||||
|
|
||||||
|
1. Go to **Project Settings → Engine → Collision**.
|
||||||
|
2. In the **Collision Channels** section, click **Add New**.
|
||||||
|
3. Set the following properties for the new channel:
|
||||||
|
- **Name**: `Projectile` (or a name of your choice)
|
||||||
|
- **Default Response**: `Overlap`
|
||||||
|
|
||||||
|
For more detailed instructions on adding a custom object type to your project, you can refer to the [Unreal Engine Wiki on Custom Object Types](https://dev.epicgames.com/documentation/en-us/unreal-engine/add-a-custom-object-type-to-your-project-in-unreal-engine).
|
||||||
|
|
||||||
|
## Physical materials (optional)
|
||||||
|
|
||||||
|
Default [Physical Material](https://dev.epicgames.com/documentation/en-us/unreal-engine/physical-materials-user-guide-for-unreal-engine) properties are at **1 g/cm**, but adding more physical properties into your game can add extra depth.
|
||||||
|
### Example Material Densities
|
||||||
|
|
||||||
|
| Material | Density (g/cm³) |
|
||||||
|
| ---------- | --------------- |
|
||||||
|
| Styrofoam | 0.1 |
|
||||||
|
| Pine Wood | 0.5 |
|
||||||
|
| Water | 0.5 |
|
||||||
|
| Glass | 1 |
|
||||||
|
| Concrete | 2.4 |
|
||||||
|
| Aluminum | 2.7 |
|
||||||
|
| Iron/Steel | 7.8 |
|
||||||
|
| Copper | 8.9 |
|
||||||
|
| Lead | 11.3 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Acknowledgements
|
||||||
|
|
||||||
|
- [loafbrr_1](https://opengameart.org/users/loafbrr1) for the pistol model
|
||||||
|
- [Neil Francis](https://commons.wikimedia.org/wiki/File:B1_full_size_1500_target.jpg) for the target image
|
||||||
BIN
docs/Images/DepthTraceByChannel.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/Images/DepthTraceByProfile.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/Images/DepthTraceForObjects.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/Images/Pasted image 20250106071324.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/Images/Pasted image 20250106071339.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/Images/Pasted image 20250106071350.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/Images/Pasted image 20250106071423.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
docs/Images/Pasted image 20250106071435.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
docs/Images/Pasted image 20250106071446.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
docs/Images/Pasted image 20250106071455.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
docs/Images/Pasted image 20250106071531.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/Images/Pasted image 20250106071558.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/Images/TraceExample.mp4
Normal file
BIN
docs/Images/penetrationtracebychannel.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
470
index.html
@@ -1,430 +1,48 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>Documentation Home</title>
|
<meta charset="UTF-8">
|
||||||
<base href="https://lit.ruv.wtf/docs/">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta id="root-path" root-path="https://lit.ruv.wtf/docs/">
|
<title>Documentation Viewer</title>
|
||||||
<meta name="viewport"
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.24.1/themes/prism-tomorrow.min.css">
|
||||||
content="width=device-width, initial-scale=1.0, user-scalable=yes, minimum-scale=1.0, maximum-scale=5.0">
|
<link rel="stylesheet" href="styles.css">
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="description" content="lit.ruv.wtf - Docs - Documentation Home">
|
|
||||||
<meta property="og:title" content="Documentation Home">
|
|
||||||
<meta property="og:description" content="lit.ruv.wtf - Docs - Documentation Home">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:url" content="https://lit.ruv.wtf/docs/index.html">
|
|
||||||
<meta property="og:image" content="undefined">
|
|
||||||
<meta property="og:site_name" content="lit.ruv.wtf - Docs">
|
|
||||||
<meta name="author" content="Litruv">
|
|
||||||
<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="https://lit.ruv.wtf/docs/lib/rss.xml">
|
|
||||||
<script async="" id="webpage-script" src="lib/scripts/webpage.js"
|
|
||||||
onload="this.onload=null;this.setAttribute('loaded', 'true')"></script>
|
|
||||||
<script async="" id="minisearch-script" src="https://cdn.jsdelivr.net/npm/minisearch@6.3.0/dist/umd/index.min.js"
|
|
||||||
onload="this.onload=null;this.setAttribute('loaded', 'true')"></script>
|
|
||||||
<link rel="icon" href="lib/media/favicon.png">
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
--line-width: 40em;
|
|
||||||
--line-width-adaptive: 40em;
|
|
||||||
--file-line-width: 40em;
|
|
||||||
--sidebar-width: min(20em, 80vw);
|
|
||||||
--collapse-arrow-size: 11px;
|
|
||||||
--tree-horizontal-spacing: 0.6em;
|
|
||||||
--tree-vertical-spacing: 0.6em;
|
|
||||||
--sidebar-margin: 12px
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar {
|
|
||||||
height: 100%;
|
|
||||||
min-width: calc(var(--sidebar-width) + var(--divider-width-hover));
|
|
||||||
max-width: calc(var(--sidebar-width) + var(--divider-width-hover));
|
|
||||||
font-size: 14px;
|
|
||||||
z-index: 10;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
transition: min-width ease-in-out, max-width ease-in-out;
|
|
||||||
transition-duration: .2s;
|
|
||||||
contain: size
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left {
|
|
||||||
left: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right {
|
|
||||||
right: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar.is-collapsed {
|
|
||||||
min-width: 0;
|
|
||||||
max-width: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
body.floating-sidebars .sidebar {
|
|
||||||
position: absolute
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-content {
|
|
||||||
height: 100%;
|
|
||||||
min-width: calc(var(--sidebar-width) - var(--divider-width-hover));
|
|
||||||
top: 0;
|
|
||||||
padding: var(--sidebar-margin);
|
|
||||||
padding-top: 4em;
|
|
||||||
line-height: var(--line-height-tight);
|
|
||||||
background-color: var(--background-secondary);
|
|
||||||
transition: background-color, border-right, border-left, box-shadow;
|
|
||||||
transition-duration: var(--color-fade-speed);
|
|
||||||
transition-timing-function: ease-in-out;
|
|
||||||
position: absolute;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar:not(.is-collapsed) .sidebar-content {
|
|
||||||
min-width: calc(max(100%, var(--sidebar-width)) - 3px);
|
|
||||||
max-width: calc(max(100%, var(--sidebar-width)) - 3px)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left .sidebar-content {
|
|
||||||
left: 0;
|
|
||||||
border-top-right-radius: var(--radius-l);
|
|
||||||
border-bottom-right-radius: var(--radius-l)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right .sidebar-content {
|
|
||||||
right: 0;
|
|
||||||
border-top-left-radius: var(--radius-l);
|
|
||||||
border-bottom-left-radius: var(--radius-l)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar:has(.sidebar-content:empty):has(.topbar-content:empty) {
|
|
||||||
display: none
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-topbar {
|
|
||||||
height: 2em;
|
|
||||||
width: var(--sidebar-width);
|
|
||||||
top: var(--sidebar-margin);
|
|
||||||
padding-inline: var(--sidebar-margin);
|
|
||||||
z-index: 1;
|
|
||||||
position: fixed;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
transition: width ease-in-out;
|
|
||||||
transition-duration: inherit
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar.is-collapsed .sidebar-topbar {
|
|
||||||
width: calc(2.3em + var(--sidebar-margin) * 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar .sidebar-topbar.is-collapsed {
|
|
||||||
width: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left .sidebar-topbar {
|
|
||||||
left: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right .sidebar-topbar {
|
|
||||||
right: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.topbar-content {
|
|
||||||
overflow: hidden;
|
|
||||||
overflow: clip;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
transition: inherit
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar.is-collapsed .topbar-content {
|
|
||||||
width: 0;
|
|
||||||
transition: inherit
|
|
||||||
}
|
|
||||||
|
|
||||||
.clickable-icon.sidebar-collapse-icon {
|
|
||||||
background-color: transparent;
|
|
||||||
color: var(--icon-color-focused);
|
|
||||||
padding: 0 !important;
|
|
||||||
margin: 0 !important;
|
|
||||||
height: 100% !important;
|
|
||||||
width: 2.3em !important;
|
|
||||||
margin-inline: 0.14em !important;
|
|
||||||
position: absolute
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-left .clickable-icon.sidebar-collapse-icon {
|
|
||||||
transform: rotateY(180deg);
|
|
||||||
right: var(--sidebar-margin)
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-right .clickable-icon.sidebar-collapse-icon {
|
|
||||||
transform: rotateY(180deg);
|
|
||||||
left: var(--sidebar-margin)
|
|
||||||
}
|
|
||||||
|
|
||||||
.clickable-icon.sidebar-collapse-icon svg.svg-icon {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-section-header {
|
|
||||||
margin: 0 0 1em 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: .06em;
|
|
||||||
font-weight: 600
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
transition: background-color var(--color-fade-speed) ease-in-out
|
|
||||||
}
|
|
||||||
|
|
||||||
.webpage-container {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
align-items: stretch;
|
|
||||||
justify-content: center
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container {
|
|
||||||
opacity: 1;
|
|
||||||
flex-basis: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
transition: opacity .2s ease-in-out;
|
|
||||||
contain: inline-size
|
|
||||||
}
|
|
||||||
|
|
||||||
.hide {
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity .2s ease-in-out
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.markdown-preview-view {
|
|
||||||
margin: var(--sidebar-margin);
|
|
||||||
margin-bottom: 0;
|
|
||||||
width: 100%;
|
|
||||||
width: -webkit-fill-available;
|
|
||||||
width: -moz-available;
|
|
||||||
width: fill-available;
|
|
||||||
background-color: var(--background-primary);
|
|
||||||
transition: background-color var(--color-fade-speed) ease-in-out;
|
|
||||||
border-top-right-radius: var(--window-radius, var(--radius-m));
|
|
||||||
border-top-left-radius: var(--window-radius, var(--radius-m));
|
|
||||||
overflow-x: hidden !important;
|
|
||||||
overflow-y: auto !important;
|
|
||||||
display: flex !important;
|
|
||||||
flex-direction: column !important;
|
|
||||||
align-items: center !important;
|
|
||||||
contain: inline-size
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.markdown-preview-view>.markdown-preview-sizer {
|
|
||||||
padding-bottom: 80vh !important;
|
|
||||||
width: 100% !important;
|
|
||||||
max-width: var(--line-width) !important;
|
|
||||||
flex-basis: var(--line-width) !important;
|
|
||||||
transition: background-color var(--color-fade-speed) ease-in-out;
|
|
||||||
contain: inline-size
|
|
||||||
}
|
|
||||||
|
|
||||||
.markdown-rendered img:not([width]),
|
|
||||||
.view-content img:not([width]) {
|
|
||||||
max-width: 100%;
|
|
||||||
outline: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.view-content.embed {
|
|
||||||
display: flex;
|
|
||||||
padding: 1em;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.view-content.embed>* {
|
|
||||||
max-width: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
object-fit: contain
|
|
||||||
}
|
|
||||||
|
|
||||||
:has(> :is(.math, table)) {
|
|
||||||
overflow-x: auto !important
|
|
||||||
}
|
|
||||||
|
|
||||||
.document-container>.view-content {
|
|
||||||
overflow-x: auto;
|
|
||||||
contain: content;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
height: 100%
|
|
||||||
}
|
|
||||||
|
|
||||||
.scroll-highlight {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 1000;
|
|
||||||
background-color: hsla(var(--color-accent-hsl), .25);
|
|
||||||
opacity: 0;
|
|
||||||
padding: 1em;
|
|
||||||
inset: 50%;
|
|
||||||
translate: -50% -50%;
|
|
||||||
border-radius: var(--radius-s)
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script
|
|
||||||
defer="">async function loadIncludes() { if ("file:" != location.protocol) { let e = document.querySelectorAll("include"); for (let t = 0; t < e.length; t++) { let o = e[t], l = o.getAttribute("src"); try { const e = await fetch(l); if (!e.ok) { console.log("Could not include file: " + l), o?.remove(); continue } let t = await e.text(), n = document.createRange().createContextualFragment(t), i = Array.from(n.children); for (let e of i) e.classList.add("hide"), e.style.transition = "opacity 0.5s ease-in-out", setTimeout((() => { e.classList.remove("hide") }), 10); o.before(n), o.remove(), console.log("Included file: " + l) } catch (e) { o?.remove(), console.log("Could not include file: " + l, e); continue } } } else { if (document.querySelectorAll("include").length > 0) { var e = document.createElement("div"); e.id = "error", e.textContent = "Web server exports must be hosted on an http / web server to be viewed correctly.", e.style.position = "fixed", e.style.top = "50%", e.style.left = "50%", e.style.transform = "translate(-50%, -50%)", e.style.fontSize = "1.5em", e.style.fontWeight = "bold", e.style.textAlign = "center", document.body.appendChild(e), document.querySelector(".document-container")?.classList.remove("hide") } } } document.addEventListener("DOMContentLoaded", (() => { loadIncludes() })); let isFileProtocol = "file:" == location.protocol; function waitLoadScripts(e, t) { let o = e.map((e => document.getElementById(e + "-script"))), l = 0; !function e() { let n = o[l]; l++, n && "true" != n.getAttribute("loaded") || l < o.length && e(), l < o.length ? n.addEventListener("load", e) : t() }() }</script>
|
|
||||||
<link rel="stylesheet" href="lib/styles/obsidian.css">
|
|
||||||
<link rel="preload" href="lib/styles/global-variable-styles.css" as="style"
|
|
||||||
onload="this.onload=null;this.rel='stylesheet'"><noscript>
|
|
||||||
<link rel="stylesheet" href="lib/styles/global-variable-styles.css">
|
|
||||||
</noscript>
|
|
||||||
<link rel="preload" href="lib/styles/main-styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
|
||||||
<noscript>
|
|
||||||
<link rel="stylesheet" href="lib/styles/main-styles.css">
|
|
||||||
</noscript>
|
|
||||||
<link rel="preload" href="lib/styles/snippets.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
|
||||||
<noscript>
|
|
||||||
<link rel="stylesheet" href="lib/styles/snippets.css">
|
|
||||||
</noscript>
|
|
||||||
</head>
|
</head>
|
||||||
|
<body>
|
||||||
<body class="publish css-settings-manager theme-dark show-inline-title show-ribbon">
|
<div class="container">
|
||||||
<script
|
<div class="title-bar">
|
||||||
defer="">let theme = localStorage.getItem("theme") || (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"); "dark" == theme ? (document.body.classList.add("theme-dark"), document.body.classList.remove("theme-light")) : (document.body.classList.add("theme-light"), document.body.classList.remove("theme-dark")), window.innerWidth < 480 ? document.body.classList.add("is-phone") : window.innerWidth < 768 ? document.body.classList.add("is-tablet") : window.innerWidth < 1024 ? document.body.classList.add("is-small-screen") : document.body.classList.add("is-large-screen")</script>
|
<button class="menu-button">☰</button>
|
||||||
<div class="webpage-container workspace">
|
<div class="title-text">
|
||||||
<div class="sidebar-left sidebar">
|
<span class="brand">Litruv</span>
|
||||||
<div class="sidebar-topbar">
|
<span class="divider">/</span>
|
||||||
<div class="topbar-content"></div>
|
<span class="page-title">Documentation</span>
|
||||||
<div class="clickable-icon sidebar-collapse-icon"><svg xmlns="http://www.w3.org/2000/svg" width="100%"
|
</div>
|
||||||
height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"
|
<span style="width: 24px;"></span><!-- Spacer for alignment -->
|
||||||
stroke-linecap="round" stroke-linejoin="round" class="svg-icon">
|
</div>
|
||||||
<path
|
<div class="content-container">
|
||||||
d="M21 3H3C1.89543 3 1 3.89543 1 5V19C1 20.1046 1.89543 21 3 21H21C22.1046 21 23 20.1046 23 19V5C23 3.89543 22.1046 3 21 3Z">
|
<nav class="sidebar left-sidebar">
|
||||||
</path>
|
<div id="file-index"></div>
|
||||||
<path d="M10 4V20"></path>
|
</nav>
|
||||||
<path d="M4 7H7"></path>
|
<main class="content">
|
||||||
<path d="M4 10H7"></path>
|
<div id="document-content"></div>
|
||||||
<path d="M4 13H7"></path>
|
</main>
|
||||||
</svg></div>
|
<nav class="sidebar right-sidebar">
|
||||||
</div>
|
<div id="document-outline"></div>
|
||||||
<div class="sidebar-content">
|
</nav>
|
||||||
<div class="search-input-container"><input enterkeyhint="search" type="search" spellcheck="false"
|
</div>
|
||||||
placeholder="Search...">
|
</div>
|
||||||
<div class="search-input-clear-button" aria-label="Clear search"></div>
|
<script src="https://cdn.jsdelivr.net/npm/marked@4.3.0/marked.min.js"></script>
|
||||||
</div>
|
<script>
|
||||||
<include src="lib/html/file-tree.html"></include>
|
// Fallback in case CDN fails
|
||||||
</div>
|
window.addEventListener('error', function(e) {
|
||||||
<script
|
if (e.target.src && e.target.src.includes('marked.min.js')) {
|
||||||
defer="">let ls = document.querySelector(".sidebar-left"); ls.classList.add("is-collapsed"); if (window.innerWidth > 768) ls.classList.remove("is-collapsed"); ls.style.setProperty("--sidebar-width", localStorage.getItem("sidebar-left-width"));</script>
|
const script = document.createElement('script');
|
||||||
</div>
|
script.src = 'https://cdnjs.cloudflare.com/ajax/libs/marked/4.3.0/marked.min.js';
|
||||||
<div class="document-container markdown-reading-view hide">
|
document.body.appendChild(script);
|
||||||
<div class="markdown-preview-view markdown-rendered is-readable-line-width">
|
}
|
||||||
<style id="MJX-CHTML-styles"></style>
|
}, true);
|
||||||
<pre class="frontmatter language-yaml" tabindex="0"
|
</script>
|
||||||
style="display: none;"><code class="language-yaml is-loaded"><span class="token key atrule">title</span><span class="token punctuation">:</span> Documentation Home</code><button class="copy-code-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-copy"><rect x="8" y="8" width="14" height="14" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg></button></pre>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.24.1/components/prism-core.min.js"></script>
|
||||||
<div class="markdown-preview-sizer markdown-preview-section">
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.24.1/plugins/autoloader/prism-autoloader.min.js"></script>
|
||||||
<h1 class="page-title heading inline-title" id="Documentation Home">Documentation Home</h1>
|
<script src="index.js"></script>
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">Welcome to the docs, I make blueprint plugins, many are in the works, but they'll
|
|
||||||
come out here as I go</p>
|
|
||||||
</div>
|
|
||||||
<div class="el-h2 heading-wrapper">
|
|
||||||
<h2 data-heading="[[Blueprint Penetration Trace]]" dir="auto" class="heading"
|
|
||||||
id="[[Blueprint_Penetration_Trace]]">
|
|
||||||
<div class="heading-collapse-indicator collapse-indicator collapse-icon"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round" class="svg-icon right-triangle">
|
|
||||||
<path d="M3 8L12 17L21 8"></path>
|
|
||||||
</svg></div><a data-href="Blueprint Penetration Trace"
|
|
||||||
href="blueprint-penetration-trace.html" class="internal-link" target="_self"
|
|
||||||
rel="noopener nofollow">Blueprint Penetration Trace</a>
|
|
||||||
</h2>
|
|
||||||
<div class="heading-children">
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto"><span alt="TraceExample.mp4" src="TraceExample.mp4"
|
|
||||||
class="internal-embed media-embed video-embed is-loaded"><video controls=""
|
|
||||||
preload="metadata" src="images/traceexample.mp4"></video></span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="el-p">
|
|
||||||
<p dir="auto">If you require more support, come say hi on my <a
|
|
||||||
data-tooltip-position="top" aria-label="https://discord.gg/b8ctQBaaax"
|
|
||||||
rel="noopener nofollow" class="external-link"
|
|
||||||
href="https://discord.gg/b8ctQBaaax" target="_blank">discord</a>. <a
|
|
||||||
rel="noopener nofollow" class="external-link"
|
|
||||||
href="https://discord.gg/b8ctQBaaax"
|
|
||||||
target="_blank">https://discord.gg/b8ctQBaaax</a></p>
|
|
||||||
</div>
|
|
||||||
<div class="mod-footer mod-ui"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-right sidebar">
|
|
||||||
<div class="sidebar-topbar">
|
|
||||||
<div class="topbar-content"></div>
|
|
||||||
<div class="clickable-icon sidebar-collapse-icon"><svg xmlns="http://www.w3.org/2000/svg" width="100%"
|
|
||||||
height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round" class="svg-icon">
|
|
||||||
<path
|
|
||||||
d="M21 3H3C1.89543 3 1 3.89543 1 5V19C1 20.1046 1.89543 21 3 21H21C22.1046 21 23 20.1046 23 19V5C23 3.89543 22.1046 3 21 3Z">
|
|
||||||
</path>
|
|
||||||
<path d="M10 4V20"></path>
|
|
||||||
<path d="M4 7H7"></path>
|
|
||||||
<path d="M4 10H7"></path>
|
|
||||||
<path d="M4 13H7"></path>
|
|
||||||
</svg></div>
|
|
||||||
</div>
|
|
||||||
<div class="sidebar-content">
|
|
||||||
<div class="tree-container mod-root nav-folder tree-item outline-tree" data-depth="0">
|
|
||||||
<div class="tree-header"><span class="sidebar-section-header">Table Of Contents</span><button
|
|
||||||
class="clickable-icon collapse-tree-button" aria-label="Collapse All"><svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
||||||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"></svg></button></div>
|
|
||||||
<div class="tree-scroll-area tree-item-children nav-folder-children">
|
|
||||||
<div class="tree-item mod-tree-folder nav-folder mod-collapsible is-collapsed"
|
|
||||||
style="display: none;"></div>
|
|
||||||
<div class="tree-item" data-depth="1"><a class="tree-link" href="index.html#Documentation Home">
|
|
||||||
<div class="tree-item-contents heading-link" heading-name="Documentation Home"><span
|
|
||||||
class="tree-item-title">Documentation Home</span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children">
|
|
||||||
<div class="tree-item" data-depth="2"><a class="tree-link"
|
|
||||||
href="index.html#[[Blueprint_Penetration_Trace]]">
|
|
||||||
<div class="tree-item-contents heading-link"
|
|
||||||
heading-name="[[Blueprint Penetration Trace]]"><span
|
|
||||||
class="tree-item-title"><a data-href="Blueprint Penetration Trace"
|
|
||||||
href="Blueprint Penetration Trace" class="internal-link"
|
|
||||||
target="_blank" rel="noopener nofollow">Blueprint Penetration
|
|
||||||
Trace</a></span></div>
|
|
||||||
</a>
|
|
||||||
<div class="tree-item-children nav-folder-children"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script
|
|
||||||
defer="">let rs = document.querySelector(".sidebar-right"); rs.classList.add("is-collapsed"); if (window.innerWidth > 768) rs.classList.remove("is-collapsed"); rs.style.setProperty("--sidebar-width", localStorage.getItem("sidebar-right-width"));</script>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
||||||
|
|||||||
264
index.js
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
// Initialize marked when it's available
|
||||||
|
let markedPromise = new Promise((resolve) => {
|
||||||
|
if (typeof marked !== 'undefined') {
|
||||||
|
resolve(marked);
|
||||||
|
} else {
|
||||||
|
window.addEventListener('load', () => resolve(marked));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Configure marked options
|
||||||
|
async function initializeMarked() {
|
||||||
|
const marked = await markedPromise;
|
||||||
|
marked.setOptions({
|
||||||
|
highlight: function(code, lang) {
|
||||||
|
if (Prism.languages[lang]) {
|
||||||
|
return Prism.highlight(code, Prism.languages[lang], lang);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
},
|
||||||
|
breaks: true,
|
||||||
|
gfm: true
|
||||||
|
});
|
||||||
|
return marked;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadIndex() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('index.json');
|
||||||
|
const data = await response.json();
|
||||||
|
const fileIndex = document.getElementById('file-index');
|
||||||
|
|
||||||
|
// Build file index
|
||||||
|
data.documents.forEach(doc => {
|
||||||
|
const link = document.createElement('a');
|
||||||
|
const fileName = doc.path.replace(/^docs\//, '')
|
||||||
|
.replace(/\.md$/, '')
|
||||||
|
.replace(/\s+/g, '-')
|
||||||
|
.toLowerCase();
|
||||||
|
|
||||||
|
link.href = `?${fileName}`;
|
||||||
|
link.textContent = doc.title;
|
||||||
|
link.onclick = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
loadDocument(doc.path);
|
||||||
|
history.pushState(null, '', link.href);
|
||||||
|
};
|
||||||
|
fileIndex.appendChild(link);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle initial URL load
|
||||||
|
const queryString = window.location.search;
|
||||||
|
if (queryString) {
|
||||||
|
const fileParam = queryString.substring(1); // Remove the leading '?'
|
||||||
|
console.log('Loading document for:', fileParam); // Debug log
|
||||||
|
|
||||||
|
const matchingDoc = data.documents.find(doc => {
|
||||||
|
const docFileName = doc.path.replace(/^docs\//, '')
|
||||||
|
.replace(/\.md$/, '')
|
||||||
|
.replace(/\s+/g, '-')
|
||||||
|
.toLowerCase();
|
||||||
|
return docFileName === fileParam;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (matchingDoc) {
|
||||||
|
console.log('Found matching document:', matchingDoc); // Debug log
|
||||||
|
await loadDocument(matchingDoc.path);
|
||||||
|
} else {
|
||||||
|
console.warn('No matching document found for:', fileParam); // Debug log
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to load index:', error);
|
||||||
|
document.getElementById('document-content').innerHTML =
|
||||||
|
'<div class="error">Failed to load documentation index.</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add popstate handler for browser back/forward buttons
|
||||||
|
window.addEventListener('popstate', async () => {
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
const fileParam = urlParams.toString().replace(/^=/, '').replace(/^\?/, '');
|
||||||
|
if (fileParam) {
|
||||||
|
const response = await fetch('index.json');
|
||||||
|
const data = await response.json();
|
||||||
|
const matchingDoc = data.documents.find(doc => {
|
||||||
|
const docFileName = doc.path.replace(/^docs\//, '')
|
||||||
|
.replace(/\.md$/, '')
|
||||||
|
.replace(/\s+/g, '-')
|
||||||
|
.toLowerCase();
|
||||||
|
return docFileName === fileParam;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (matchingDoc) {
|
||||||
|
await loadDocument(matchingDoc.path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function extractMetadata(content) {
|
||||||
|
const lines = content.split('\n');
|
||||||
|
let metadata = {};
|
||||||
|
let contentStart = 0;
|
||||||
|
|
||||||
|
// Check if the file starts with a metadata section
|
||||||
|
if (lines[0] === '---') {
|
||||||
|
let endMetadata = -1;
|
||||||
|
|
||||||
|
// Find the closing '---'
|
||||||
|
for (let i = 1; i < lines.length; i++) {
|
||||||
|
if (lines[i] === '---') {
|
||||||
|
endMetadata = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Parse key-value pairs
|
||||||
|
const match = lines[i].match(/^([\w-]+):\s*(.*)$/);
|
||||||
|
if (match) {
|
||||||
|
metadata[match[1]] = match[2].trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endMetadata !== -1) {
|
||||||
|
contentStart = endMetadata + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
metadata,
|
||||||
|
content: lines.slice(contentStart).join('\n').trim()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadDocument(path) {
|
||||||
|
try {
|
||||||
|
const [response, marked] = await Promise.all([
|
||||||
|
fetch(path),
|
||||||
|
initializeMarked()
|
||||||
|
]);
|
||||||
|
|
||||||
|
let rawContent = await response.text();
|
||||||
|
const { metadata, content } = extractMetadata(rawContent);
|
||||||
|
|
||||||
|
const basePath = path.substring(0, path.lastIndexOf('/'));
|
||||||
|
const documentContent = document.getElementById('document-content');
|
||||||
|
const documentOutline = document.getElementById('document-outline');
|
||||||
|
|
||||||
|
// Create title element
|
||||||
|
const titleContent = metadata.title || path.split('/').pop().replace('.md', '');
|
||||||
|
const processedContent = `# ${titleContent}\n\n${content}`;
|
||||||
|
|
||||||
|
// Convert Obsidian media links to HTML with proper spacing
|
||||||
|
const finalContent = processedContent.replace(/!\[\[(.*?)\]\]/g, (match, filename) => {
|
||||||
|
const mediaPath = `${basePath}/images/${filename}`;
|
||||||
|
|
||||||
|
// Check if it's a video file
|
||||||
|
if (filename.toLowerCase().endsWith('.mp4')) {
|
||||||
|
return `\n<video controls width="100%">
|
||||||
|
<source src="${mediaPath}" type="video/mp4">
|
||||||
|
Your browser does not support the video tag.
|
||||||
|
</video>\n\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default to image handling with added newlines
|
||||||
|
return `\n\n\n`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update page and title bar while preserving menu button and brand
|
||||||
|
document.title = `Litruv / ${titleContent}`;
|
||||||
|
document.querySelector('.title-text .page-title').textContent = titleContent;
|
||||||
|
|
||||||
|
// Parse markdown content
|
||||||
|
documentContent.className = 'markdown-content';
|
||||||
|
documentContent.innerHTML = marked.parse(finalContent);
|
||||||
|
|
||||||
|
// Generate outline
|
||||||
|
documentOutline.innerHTML = '';
|
||||||
|
const headings = documentContent.querySelectorAll('h1, h2, h3, h4, h5, h6');
|
||||||
|
|
||||||
|
headings.forEach(heading => {
|
||||||
|
if (!heading.id) {
|
||||||
|
heading.id = heading.textContent.toLowerCase()
|
||||||
|
.replace(/[^\w\s-]/g, '')
|
||||||
|
.replace(/\s+/g, '-');
|
||||||
|
}
|
||||||
|
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = `${window.location.pathname}${window.location.search}#${heading.id}`;
|
||||||
|
link.textContent = heading.textContent;
|
||||||
|
link.style.paddingLeft = (heading.tagName[1] - 1) * 15 + 'px';
|
||||||
|
|
||||||
|
link.onclick = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
// Update URL without triggering navigation
|
||||||
|
history.pushState(null, '', link.href);
|
||||||
|
|
||||||
|
// Remove existing highlights
|
||||||
|
document.querySelectorAll('.highlight').forEach(el => {
|
||||||
|
el.classList.remove('highlight');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add highlight class to trigger animation
|
||||||
|
heading.classList.add('highlight');
|
||||||
|
|
||||||
|
// Smooth scroll
|
||||||
|
heading.scrollIntoView({ behavior: 'smooth' });
|
||||||
|
};
|
||||||
|
|
||||||
|
documentOutline.appendChild(link);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check for hash in URL and highlight on load
|
||||||
|
if (window.location.hash) {
|
||||||
|
const id = window.location.hash.substring(1);
|
||||||
|
const heading = document.getElementById(id);
|
||||||
|
if (heading) {
|
||||||
|
heading.classList.add('highlight');
|
||||||
|
heading.scrollIntoView({ behavior: 'smooth' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Highlight code blocks
|
||||||
|
Prism.highlightAll();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error loading document:', error);
|
||||||
|
document.getElementById('document-content').innerHTML =
|
||||||
|
'<div class="error">Error loading document. Please try again.</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle image paths
|
||||||
|
function fixImagePaths(basePath, content) {
|
||||||
|
return content.replace(/!\[\[(.*?)\]\]/g, (match, filename) => {
|
||||||
|
const imagePath = basePath + '/images/' + filename;
|
||||||
|
return ``;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add menu toggle functionality
|
||||||
|
function setupMobileMenu() {
|
||||||
|
const menuButton = document.querySelector('.menu-button');
|
||||||
|
const leftSidebar = document.querySelector('.left-sidebar');
|
||||||
|
const content = document.querySelector('.content');
|
||||||
|
|
||||||
|
menuButton.addEventListener('click', () => {
|
||||||
|
leftSidebar.classList.toggle('show');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close menu when clicking outside
|
||||||
|
content.addEventListener('click', () => {
|
||||||
|
if (leftSidebar.classList.contains('show')) {
|
||||||
|
leftSidebar.classList.remove('show');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new initialization with proper order
|
||||||
|
window.addEventListener('load', () => {
|
||||||
|
console.log('Window loaded, initializing...'); // Debug log
|
||||||
|
setupMobileMenu();
|
||||||
|
loadIndex().catch(error => {
|
||||||
|
console.error('Failed to initialize:', error);
|
||||||
|
document.getElementById('document-content').innerHTML =
|
||||||
|
'<div class="error">Failed to load documentation. Please try refreshing the page.</div>';
|
||||||
|
});
|
||||||
|
});
|
||||||
8
index.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"documents": [
|
||||||
|
{
|
||||||
|
"title": "Blueprint Depth Trace",
|
||||||
|
"path": "docs/Blueprint Penetration Trace.md"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
<div class="tree-container mod-root nav-folder tree-item file-tree mod-nav-indicator" data-depth="0"><div class="tree-header"><span class="sidebar-section-header">lit.ruv.wtf - Docs</span><button class="clickable-icon collapse-tree-button is-collapsed" aria-label="Collapse All"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></svg></button></div><div class="tree-scroll-area tree-item-children nav-folder-children"><div class="tree-item mod-tree-folder nav-folder mod-collapsible is-collapsed" style="display: none;"></div><div class="tree-item mod-tree-file nav-file" data-depth="1"><a class="tree-link" href="blueprint-penetration-trace.html"><div class="tree-item-contents nav-file-title"><span class="tree-item-title nav-file-title-content tree-item-inner">Blueprint Penetration Trace Documentation</span></div></a><div class="tree-item-children nav-folder-children"></div></div><div class="tree-item mod-tree-file nav-file" data-depth="1"><a class="tree-link" href="index.html"><div class="tree-item-contents nav-file-title"><span class="tree-item-title nav-file-title-content tree-item-inner">Documentation Home</span></div></a><div class="tree-item-children nav-folder-children"></div></div></div></div>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<svg xmlns='http://www.w3.org/2000/svg' class='i-external' viewBox='0 0 32 32' width='14' height='14' fill='none' stroke='#888888' stroke-linecap='round' stroke-linejoin='round' stroke-width='9.38%'><path d='M14 9 L3 9 3 29 23 29 23 18 M18 4 L28 4 28 14 M28 4 L14 18'/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 317 B |
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1,281 +0,0 @@
|
|||||||
{
|
|
||||||
"vaultName": "lit.ruv.wtf - Docs",
|
|
||||||
"lastExport": 1738008923517,
|
|
||||||
"pluginVersion": "1.8.01",
|
|
||||||
"validBodyClasses": "publish css-settings-manager theme-dark show-inline-title show-ribbon",
|
|
||||||
"useCustomHeadContent": false,
|
|
||||||
"useCustomFavicon": false,
|
|
||||||
"files": [
|
|
||||||
"Blueprint Penetration Trace.md",
|
|
||||||
"index.md",
|
|
||||||
"images/traceexample.mp4",
|
|
||||||
"images/depthtracebychannel.png",
|
|
||||||
"images/depthtraceforobjects.png",
|
|
||||||
"images/depthtracebyprofile.png",
|
|
||||||
"lib/fonts/94f2f163d4b698242fef.otf",
|
|
||||||
"lib/fonts/72505e6a122c6acd5471.woff2",
|
|
||||||
"lib/fonts/2d5198822ab091ce4305.woff2",
|
|
||||||
"lib/fonts/c8ba52b05a9ef10f4758.woff2",
|
|
||||||
"lib/fonts/cb10ffd7684cd9836a05.woff2",
|
|
||||||
"lib/fonts/b5f0f109bc88052d4000.woff2",
|
|
||||||
"lib/fonts/cbe0ae49c52c920fd563.woff2",
|
|
||||||
"lib/fonts/535a6cf662596b3bd6a6.woff2",
|
|
||||||
"lib/fonts/70cc7ff27245e82ad414.ttf",
|
|
||||||
"lib/fonts/454577c22304619db035.ttf",
|
|
||||||
"lib/fonts/52ac8f3034507f1d9e53.ttf",
|
|
||||||
"lib/fonts/05b618077343fbbd92b7.ttf",
|
|
||||||
"lib/fonts/4bb6ac751d1c5478ff3a.woff2",
|
|
||||||
"lib/media/874d8b8e340f75575caa.svg",
|
|
||||||
"lib/html/file-tree.html",
|
|
||||||
"lib/scripts/webpage.js",
|
|
||||||
"lib/scripts/minisearch.js",
|
|
||||||
"lib/media/favicon.png",
|
|
||||||
"lib/styles/obsidian.css",
|
|
||||||
"lib/styles/global-variable-styles.css",
|
|
||||||
"lib/styles/main-styles.css",
|
|
||||||
"lib/styles/snippets.css"
|
|
||||||
],
|
|
||||||
"mainDependencies": [
|
|
||||||
"lib/fonts/94f2f163d4b698242fef.otf",
|
|
||||||
"lib/fonts/72505e6a122c6acd5471.woff2",
|
|
||||||
"lib/fonts/2d5198822ab091ce4305.woff2",
|
|
||||||
"lib/fonts/c8ba52b05a9ef10f4758.woff2",
|
|
||||||
"lib/fonts/cb10ffd7684cd9836a05.woff2",
|
|
||||||
"lib/fonts/b5f0f109bc88052d4000.woff2",
|
|
||||||
"lib/fonts/cbe0ae49c52c920fd563.woff2",
|
|
||||||
"lib/fonts/535a6cf662596b3bd6a6.woff2",
|
|
||||||
"lib/fonts/70cc7ff27245e82ad414.ttf",
|
|
||||||
"lib/fonts/454577c22304619db035.ttf",
|
|
||||||
"lib/fonts/52ac8f3034507f1d9e53.ttf",
|
|
||||||
"lib/fonts/05b618077343fbbd92b7.ttf",
|
|
||||||
"lib/fonts/4bb6ac751d1c5478ff3a.woff2",
|
|
||||||
"lib/media/874d8b8e340f75575caa.svg",
|
|
||||||
"lib/html/file-tree.html",
|
|
||||||
"lib/scripts/webpage.js",
|
|
||||||
"lib/scripts/minisearch.js",
|
|
||||||
"lib/media/favicon.png",
|
|
||||||
"lib/styles/obsidian.css",
|
|
||||||
"lib/styles/global-variable-styles.css",
|
|
||||||
"lib/styles/main-styles.css",
|
|
||||||
"lib/styles/snippets.css"
|
|
||||||
],
|
|
||||||
"fileInfo": {
|
|
||||||
"lib/scripts/graph-wasm.wasm": {
|
|
||||||
"modifiedTime": 1737999520855,
|
|
||||||
"sourceSize": 23377,
|
|
||||||
"exportedPath": "lib/scripts/graph-wasm.wasm",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/94f2f163d4b698242fef.otf": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 66800,
|
|
||||||
"exportedPath": "lib/fonts/94f2f163d4b698242fef.otf",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/72505e6a122c6acd5471.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 104232,
|
|
||||||
"exportedPath": "lib/fonts/72505e6a122c6acd5471.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/2d5198822ab091ce4305.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 104332,
|
|
||||||
"exportedPath": "lib/fonts/2d5198822ab091ce4305.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/c8ba52b05a9ef10f4758.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 98868,
|
|
||||||
"exportedPath": "lib/fonts/c8ba52b05a9ef10f4758.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/cb10ffd7684cd9836a05.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 106876,
|
|
||||||
"exportedPath": "lib/fonts/cb10ffd7684cd9836a05.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/b5f0f109bc88052d4000.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 105804,
|
|
||||||
"exportedPath": "lib/fonts/b5f0f109bc88052d4000.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/cbe0ae49c52c920fd563.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 106108,
|
|
||||||
"exportedPath": "lib/fonts/cbe0ae49c52c920fd563.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/535a6cf662596b3bd6a6.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 111708,
|
|
||||||
"exportedPath": "lib/fonts/535a6cf662596b3bd6a6.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/70cc7ff27245e82ad414.ttf": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 192740,
|
|
||||||
"exportedPath": "lib/fonts/70cc7ff27245e82ad414.ttf",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/454577c22304619db035.ttf": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 161376,
|
|
||||||
"exportedPath": "lib/fonts/454577c22304619db035.ttf",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/52ac8f3034507f1d9e53.ttf": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 191568,
|
|
||||||
"exportedPath": "lib/fonts/52ac8f3034507f1d9e53.ttf",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/05b618077343fbbd92b7.ttf": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 155288,
|
|
||||||
"exportedPath": "lib/fonts/05b618077343fbbd92b7.ttf",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/fonts/4bb6ac751d1c5478ff3a.woff2": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 7876,
|
|
||||||
"exportedPath": "lib/fonts/4bb6ac751d1c5478ff3a.woff2",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/media/874d8b8e340f75575caa.svg": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 317,
|
|
||||||
"exportedPath": "lib/media/874d8b8e340f75575caa.svg",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/html/file-tree.html": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 1345,
|
|
||||||
"exportedPath": "lib/html/file-tree.html",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/webpage.js": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 47290,
|
|
||||||
"exportedPath": "lib/scripts/webpage.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/graph-view.js": {
|
|
||||||
"modifiedTime": 1737999520855,
|
|
||||||
"sourceSize": 15519,
|
|
||||||
"exportedPath": "lib/scripts/graph-view.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/graph-wasm.js": {
|
|
||||||
"modifiedTime": 1737999520855,
|
|
||||||
"sourceSize": 14021,
|
|
||||||
"exportedPath": "lib/scripts/graph-wasm.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/graph-render-worker.js": {
|
|
||||||
"modifiedTime": 1737999520855,
|
|
||||||
"sourceSize": 5179,
|
|
||||||
"exportedPath": "lib/scripts/graph-render-worker.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/tinycolor.js": {
|
|
||||||
"modifiedTime": 1737999520855,
|
|
||||||
"sourceSize": 29832,
|
|
||||||
"exportedPath": "lib/scripts/tinycolor.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/pixi.js": {
|
|
||||||
"modifiedTime": 1737999520855,
|
|
||||||
"sourceSize": 449509,
|
|
||||||
"exportedPath": "lib/scripts/pixi.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/minisearch.js": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 29422,
|
|
||||||
"exportedPath": "lib/scripts/minisearch.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/media/favicon.png": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 1105,
|
|
||||||
"exportedPath": "lib/media/favicon.png",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/scripts/graph-data.js": {
|
|
||||||
"modifiedTime": 1737999520855,
|
|
||||||
"sourceSize": 310,
|
|
||||||
"exportedPath": "lib/scripts/graph-data.js",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/styles/obsidian.css": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 131021,
|
|
||||||
"exportedPath": "lib/styles/obsidian.css",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/styles/global-variable-styles.css": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 236,
|
|
||||||
"exportedPath": "lib/styles/global-variable-styles.css",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/styles/main-styles.css": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 23130,
|
|
||||||
"exportedPath": "lib/styles/main-styles.css",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"lib/styles/snippets.css": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 6368,
|
|
||||||
"exportedPath": "lib/styles/snippets.css",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"images/traceexample.mp4": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 754671,
|
|
||||||
"exportedPath": "images/traceexample.mp4",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"index.md": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 315,
|
|
||||||
"exportedPath": "index.html",
|
|
||||||
"dependencies": [
|
|
||||||
"images/traceexample.mp4"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Blueprint Penetration Trace.md": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 5345,
|
|
||||||
"exportedPath": "blueprint-penetration-trace.html",
|
|
||||||
"dependencies": [
|
|
||||||
"images/traceexample.mp4",
|
|
||||||
"images/depthtracebychannel.png",
|
|
||||||
"images/depthtraceforobjects.png",
|
|
||||||
"images/depthtracebyprofile.png"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"images/depthtracebychannel.png": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 40519,
|
|
||||||
"exportedPath": "images/depthtracebychannel.png",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"images/depthtraceforobjects.png": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 38839,
|
|
||||||
"exportedPath": "images/depthtraceforobjects.png",
|
|
||||||
"dependencies": []
|
|
||||||
},
|
|
||||||
"images/depthtracebyprofile.png": {
|
|
||||||
"modifiedTime": 1738008923517,
|
|
||||||
"sourceSize": 38746,
|
|
||||||
"exportedPath": "images/depthtracebyprofile.png",
|
|
||||||
"dependencies": []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
25
lib/rss.xml
@@ -1,25 +0,0 @@
|
|||||||
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[lit.ruv.wtf - Docs]]></title><description><![CDATA[Obsidian digital garden]]></description><link>https://lit.ruv.wtf/docs/</link><image><url>https://lit.ruv.wtf/docs/lib/media/favicon.png</url><title>lit.ruv.wtf - Docs</title><link>https://lit.ruv.wtf/docs/</link></image><generator>Webpage HTML Export plugin for Obsidian</generator><lastBuildDate>Mon, 27 Jan 2025 20:15:23 GMT</lastBuildDate><atom:link href="https://lit.ruv.wtf/docs/lib/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Jan 2025 20:15:23 GMT</pubDate><copyright><![CDATA[Litruv]]></copyright><ttl>60</ttl><dc:creator>Litruv</dc:creator><item><title><![CDATA[Blueprint Penetration Trace Documentation]]></title><description><![CDATA[
|
|
||||||
<br>This is a Blueprint Function Library with a few functions that are callable in AActors to do depth trace results, for use in things like projectiles and tools.<br><br><br>
|
|
||||||
<br>Depth-based trace
|
|
||||||
<br>Forward and backward trace results for bullet holes
|
|
||||||
<br>Simple to implement into existing systems
|
|
||||||
<br>Easy debug options
|
|
||||||
<br><br><br>This node works by simulating depth using two line traces—one forward and one backward from the point of impact. These traces scan for objects in their paths and gather information about the hit results. The distance travelled through each material is multiplied by its density (defined in the material's physical properties), which determines how much the projectile is slowed down or whether it stops entirely. Finally, the node returns a list of hit results, including the total depth.<br><br>Depth Trace by Channel<br>
|
|
||||||
<img alt="DepthTraceByChannel.png" src="https://lit.ruv.wtf/docs/images/depthtracebychannel.png"><br>
|
|
||||||
Depth Trace for Objects<br>
|
|
||||||
<img alt="DepthTraceForObjects.png" src="https://lit.ruv.wtf/docs/images/depthtraceforobjects.png"><br>
|
|
||||||
Depth Trace by Profile<br>
|
|
||||||
<img alt="DepthTraceByProfile.png" src="https://lit.ruv.wtf/docs/images/depthtracebyprofile.png"><br><br><br><br>This can be seamlessly integrated with existing systems with minimal changes to your current blueprint setup.<br>By simply replacing your current line trace nodes with the Depth Trace node, you’ll get the added benefit of depth effects.<br><br>While adding a custom collision channel is optional, it can be a bit more time-consuming and may cause other systems in your project to break if not set up correctly. By default, your existing channels might not be set to overlap, so setting up a new custom trace channel helps ensure compatibility.<br>To set up a custom trace channel in Unreal Engine, follow these steps:<br>
|
|
||||||
<br>Go to Project Settings → Engine → Collision.
|
|
||||||
<br>In the Collision Channels section, click Add New.
|
|
||||||
<br>Set the following properties for the new channel:
|
|
||||||
|
|
||||||
<br>Name: Projectile (or a name of your choice)
|
|
||||||
<br>Default Response: Overlap
|
|
||||||
|
|
||||||
|
|
||||||
<br>For more detailed instructions on adding a custom object type to your project, you can refer to the <a data-tooltip-position="top" aria-label="https://dev.epicgames.com/documentation/en-us/unreal-engine/add-a-custom-object-type-to-your-project-in-unreal-engine" rel="noopener nofollow" class="external-link" href="https://dev.epicgames.com/documentation/en-us/unreal-engine/add-a-custom-object-type-to-your-project-in-unreal-engine" target="_blank">Unreal Engine Wiki on Custom Object Types</a>.<br><br>Default <a data-tooltip-position="top" aria-label="https://dev.epicgames.com/documentation/en-us/unreal-engine/physical-materials-user-guide-for-unreal-engine" rel="noopener nofollow" class="external-link" href="https://dev.epicgames.com/documentation/en-us/unreal-engine/physical-materials-user-guide-for-unreal-engine" target="_blank">Physical Material</a> properties are at 1 g/cm, but adding more physical properties into your game can add extra depth. <br><br><br><br><br>
|
|
||||||
<br><a data-tooltip-position="top" aria-label="https://opengameart.org/users/loafbrr1" rel="noopener nofollow" class="external-link" href="https://opengameart.org/users/loafbrr1" target="_blank">loafbrr_1</a> for the pistol model
|
|
||||||
<br><a data-tooltip-position="top" aria-label="https://commons.wikimedia.org/wiki/File:B1_full_size_1500_target.jpg" rel="noopener nofollow" class="external-link" href="https://commons.wikimedia.org/wiki/File:B1_full_size_1500_target.jpg" target="_blank">Neil Francis</a> for the target image
|
|
||||||
]]></description><link>https://lit.ruv.wtf/docs/blueprint-penetration-trace.html</link><guid isPermaLink="false">Blueprint Penetration Trace.md</guid><dc:creator><![CDATA[Litruv]]></dc:creator><pubDate>Mon, 27 Jan 2025 20:13:15 GMT</pubDate><enclosure url="https://lit.ruv.wtf/docs/images/depthtracebychannel.png" length="0" type="image/png"/><content:encoded><figure><img src="https://lit.ruv.wtf/docs/images/depthtracebychannel.png"></figure></content:encoded></item><item><title><![CDATA[Documentation Home]]></title><description><![CDATA[
|
|
||||||
<br>Welcome to the docs, I make blueprint plugins, many are in the works, but they'll come out here as I go<br><br><br>If you require more support, come say hi on my <a data-tooltip-position="top" aria-label="https://discord.gg/b8ctQBaaax" rel="noopener nofollow" class="external-link" href="https://discord.gg/b8ctQBaaax" target="_blank">discord</a>. <a rel="noopener nofollow" class="external-link" href="https://discord.gg/b8ctQBaaax" target="_blank">https://discord.gg/b8ctQBaaax</a>]]></description><link>https://lit.ruv.wtf/docs/index.html</link><guid isPermaLink="false">index.md</guid><dc:creator><![CDATA[Litruv]]></dc:creator><pubDate>Mon, 27 Jan 2025 20:13:31 GMT</pubDate></item></channel></rss>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
let graphData={graphOptions:{attractionForce:1,linkLength:10,repulsionForce:150,centralForce:3,edgePruning:100,minNodeRadius:3,maxNodeRadius:7},isInitialized:!0,paths:["blueprint-penetration-trace.html"],nodeCount:1,linkSources:[],linkTargets:[],labels:["Blueprint Penetration Trace"],radii:[null],linkCount:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
:root body{--line-width:min(40em, calc(100vw - 2em));--line-width-adaptive:min(40em, calc(100vw - 2em));--file-line-width:min(40em, calc(100vw - 2em));--sidebar-width:min(20em, 80vw)}body{--zoom-factor:1!important;--font-text-size:16px}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
:root{--pen-white:#edf1fc;--pen-gray:#5f5d58;--pen-black:#26241f;--pen-red:#e14a49;--pen-green:#15b64f;--pen-blue:#3f76ed;--pen-light-blue:#54b6f8;--pen-purple:#9b4ff0;--neutral-pen-black:#272727;--neutral-pen-black-trans:#27272722;--page-white:#ffffff;--page-manila:#f3deaf;--page-blue:#3f76ed;--grid-size:32px}.recolor-images img{filter:var(--image-effect)}.page-blueprint,.page-manila,.page-white{--text-normal:var(--accent-color);--text-muted:var(--accent-color);--text-faint:var(--accent-color-trans);--h1-color:var(--accent-color);--h2-color:var(--accent-color);--h3-color:var(--accent-color);--h4-color:var(--accent-color);--h5-color:var(--accent-color);--h6-color:var(--accent-color);--link-color:var(--pen-blue);--link-color-hover:var(--pen-light-blue);--link-unresolved-color:var(--pen-red);--hr-color:var(--accent-color);--blockquote-border-color:var(--accent-color);--embed-border-left:2px solid var(--accent-color);--collapse-icon-color-collapsed:var(--accent-color);--checkbox-color:var(--accent-color);--checkbox-marker-color:var(--page-color);--checkbox-color-hover:var(--accent-color-trans);--checkbox-border-color:var(--accent-color);--checklist-done-color:var(--accent-color);--list-marker-color:var(--accent-color);--interactive-accent:var(--accent-color);--metadata-label-text-color:var(--accent-color);--metadata-input-text-color:var(--accent-color);--tag-color:var(--accent-color);--tag-background:var(--accent-color-trans);--pill-cover-hover:color-mix(in srgb, var(--accent-color) 60%, transparent);--background-modifier-border-focus:var(--accent-color);--background-modifier-border:var(--accent-color-trans);--background-modifier-hover:color-mix(
|
|
||||||
in srgb,
|
|
||||||
var(--accent-color) 60%,
|
|
||||||
transparent
|
|
||||||
);color:var(--accent-color);background-color:var(--page-color);font-weight:700}.page-manila{--page-color:var(--page-manila);--accent-color:var(--pen-black);--accent-color-trans:color-mix(
|
|
||||||
in srgb,
|
|
||||||
var(--accent-color) 15%,
|
|
||||||
transparent
|
|
||||||
);--image-effect:brightness(0) saturate(100%) invert(14%) sepia(19%) saturate(296%) hue-rotate(5deg) brightness(90%) contrast(96%);color-scheme:light}.embed-manila img{background-color:var(--page-manila)}.page-white{--page-color:var(--page-white);--accent-color:var(--neutral-pen-black);--accent-color-trans:color-mix(
|
|
||||||
in srgb,
|
|
||||||
var(--accent-color) 15%,
|
|
||||||
transparent
|
|
||||||
);--image-effect:brightness(0) saturate(100%) invert(14%) sepia(19%) saturate(296%) hue-rotate(5deg) brightness(90%) contrast(96%);color-scheme:light}.embed-white img{background-color:var(--page-white)}.page-blueprint{--page-color:var(--page-blue);--accent-color:var(--pen-white);--accent-color-trans:color-mix(
|
|
||||||
in srgb,
|
|
||||||
var(--accent-color) 15%,
|
|
||||||
transparent
|
|
||||||
);--image-effect:brightness(0) saturate(100%) invert(89%) sepia(1%) saturate(2714%) hue-rotate(196deg) brightness(107%) contrast(98%);color-scheme:dark;--link-color:color-mix(in srgb, var(--pen-light-blue) 60%, var(--pen-white));--link-color-hover:color-mix(
|
|
||||||
in srgb,
|
|
||||||
var(--pen-light-blue) 20%,
|
|
||||||
var(--pen-white)
|
|
||||||
)}.embed-blueprint img{background-color:var(--page-blue)}.page-grid{background-image:linear-gradient(0deg,transparent 0,var(--accent-color-trans) 1px,var(--accent-color-trans) 2px,transparent 3px),linear-gradient(90deg,transparent calc(var(--grid-size) - 3px),var(--accent-color-trans) calc(var(--grid-size) - 2px),var(--accent-color-trans) calc(var(--grid-size) - 1px),transparent var(--grid-size));background-size:var(--grid-size) var(--grid-size)}:is(
|
|
||||||
.page-white,.page-manila,.page-blueprint,.pen-white,.pen-blue,.pen-red,.pen-green,.pen-black,.pen-gray,.pen-purple
|
|
||||||
) svg{color:color-mix(in srgb,var(--accent-color) 60%,transparent)}:is(.page-white,.page-manila,.page-blueprint) :is(code,.HyperMD-codeblock,.cm-inline-code){--code-normal:var(--accent-color);--code-background:color-mix(
|
|
||||||
in srgb,
|
|
||||||
var(--page-color) 80%,
|
|
||||||
black
|
|
||||||
)!important}div>pre{--code-background:color-mix(
|
|
||||||
in srgb,
|
|
||||||
var(--page-color) 80%,
|
|
||||||
black
|
|
||||||
)!important}:is(.page-white,.page-manila,.page-blueprint){--metadata-input-background-active:var(--accent-color-trans)}.pen-white{--accent-color:var(--pen-white);--accent-color-trans:color-mix(in srgb, var(--pen-white) 15%, transparent);color:var(--accent-color);--hr-color:var(--accent-color);--image-effect:brightness(0) saturate(100%) invert(89%) sepia(1%) saturate(2714%) hue-rotate(196deg) brightness(107%) contrast(98%)}.pen-blue{--accent-color:var(--pen-blue);--accent-color-trans:color-mix(in srgb, var(--pen-blue) 15%, transparent);color:var(--accent-color);--hr-color:var(--accent-color);--image-effect:brightness(0) saturate(100%) invert(36%) sepia(95%) saturate(945%) hue-rotate(199deg) brightness(95%) contrast(95%)}.pen-red{--accent-color:var(--pen-red);--accent-color-trans:color-mix(in srgb, var(--pen-red) 15%, transparent);color:var(--accent-color);--hr-color:var(--accent-color);--image-effect:brightness(0) saturate(100%) invert(40%) sepia(41%) saturate(1024%) hue-rotate(316deg) brightness(99%) contrast(94%)}.pen-green{--accent-color:var(--pen-green);--accent-color-trans:color-mix(in srgb, var(--pen-green) 15%, transparent);color:var(--accent-color);--hr-color:var(--accent-color);--image-effect:brightness(0) saturate(100%) invert(52%) sepia(60%) saturate(2521%) hue-rotate(105deg) brightness(96%) contrast(84%)}.pen-black{--accent-color:var(--pen-black);--accent-color-trans:color-mix(in srgb, var(--pen-black) 15%, transparent);color:var(--accent-color);--hr-color:var(--accent-color);--image-effect:brightness(0) saturate(100%) invert(14%) sepia(19%) saturate(296%) hue-rotate(5deg) brightness(90%) contrast(96%)}.pen-gray{--accent-color:var(--pen-gray);--accent-color-trans:color-mix(in srgb, var(--pen-gray) 15%, transparent);color:var(--accent-color);--hr-color:var(--accent-color);--image-effect:brightness(0) saturate(100%) invert(35%) sepia(13%) saturate(189%) hue-rotate(5deg) brightness(96%) contrast(86%)}.pen-purple{--accent-color:var(--pen-purple);--accent-color-trans:color-mix(in srgb, var(--pen-purple) 15%, transparent);color:var(--accent-color);--hr-color:var(--accent-color);--image-effect:brightness(0) saturate(100%) invert(33%) sepia(59%) saturate(2620%) hue-rotate(249deg) brightness(98%) contrast(93%)}img[alt=left]{float:left;margin-right:10px;max-width:65%}img[alt=right]{float:right;margin-left:10px;max-width:65%}
|
|
||||||
319
styles.css
Normal file
@@ -0,0 +1,319 @@
|
|||||||
|
:root {
|
||||||
|
--doc-sidebar-width: 300px;
|
||||||
|
--doc-outline-width: 240px;
|
||||||
|
--ifm-color-primary: #2196f3;
|
||||||
|
--ifm-color-primary-dark: #1976d2;
|
||||||
|
--ifm-background-color: #1a1a1a;
|
||||||
|
--ifm-background-surface-color: #252526;
|
||||||
|
--ifm-color-content: #e0e0e0;
|
||||||
|
--ifm-color-content-secondary: #a0a0a0;
|
||||||
|
--ifm-link-color: #2196f3;
|
||||||
|
--ifm-border-color: #404040;
|
||||||
|
--title-bar-height: 48px;
|
||||||
|
--sidebar-transition: transform 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif;
|
||||||
|
background: var(--ifm-background-color);
|
||||||
|
color: var(--ifm-color-content);
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-bar {
|
||||||
|
height: var(--title-bar-height);
|
||||||
|
background-color: var(--ifm-background-surface-color);
|
||||||
|
border-bottom: 1px solid var(--ifm-border-color);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 1rem;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--ifm-color-content);
|
||||||
|
flex-shrink: 0;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-button {
|
||||||
|
display: none;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: var(--ifm-color-content);
|
||||||
|
padding: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-button:hover {
|
||||||
|
color: var(--ifm-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-container {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
background-color: var(--ifm-background-surface-color);
|
||||||
|
color: var(--ifm-color-content);
|
||||||
|
overflow-y: auto;
|
||||||
|
border-color: var(--ifm-border-color);
|
||||||
|
height: calc(100vh - var(--title-bar-height));
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-sidebar {
|
||||||
|
width: var(--doc-sidebar-width);
|
||||||
|
border-right: 1px solid var(--ifm-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-sidebar {
|
||||||
|
width: var(--doc-outline-width);
|
||||||
|
border-left: none;
|
||||||
|
background-color: var(--ifm-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
flex: 1;
|
||||||
|
background-color: var(--ifm-background-color);
|
||||||
|
padding: 2rem 3rem;
|
||||||
|
overflow-y: auto;
|
||||||
|
min-width: 0; /* Fix flexbox content overflow */
|
||||||
|
color: var(--ifm-color-content);
|
||||||
|
}
|
||||||
|
|
||||||
|
#file-index a, #document-outline a {
|
||||||
|
color: var(--ifm-color-content);
|
||||||
|
text-decoration: none;
|
||||||
|
display: block;
|
||||||
|
padding: 0.4rem 0.8rem;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file-index a:hover, #document-outline a:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
color: var(--ifm-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
#document-outline a {
|
||||||
|
color: var(--ifm-color-content-secondary);
|
||||||
|
border-left: 2px solid transparent;
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#document-outline a:hover {
|
||||||
|
background-color: transparent;
|
||||||
|
color: var(--ifm-color-primary);
|
||||||
|
border-left: 2px solid var(--ifm-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Markdown content styling */
|
||||||
|
.markdown-content {
|
||||||
|
line-height: 1.7;
|
||||||
|
font-size: 1rem;
|
||||||
|
max-width: 75ch;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content h1 {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content h2 {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
margin-top: 2.5rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content h3 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
margin-top: 2rem;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content a {
|
||||||
|
color: var(--ifm-link-color);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content p {
|
||||||
|
margin: 1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
margin: 1em 0;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
border-color: var(--ifm-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content th,
|
||||||
|
.markdown-content td {
|
||||||
|
border: 1px solid var(--ifm-border-color);
|
||||||
|
padding: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content th {
|
||||||
|
background-color: var(--ifm-background-surface-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content code:not([class*="language-"]) {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
padding: 0.2em 0.4em;
|
||||||
|
border-radius: 1px;
|
||||||
|
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
||||||
|
font-size: 0.9em;
|
||||||
|
color: #e0e0e0;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content blockquote {
|
||||||
|
border-left: 4px solid var(--ifm-color-primary);
|
||||||
|
margin: 1rem 0;
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
background-color: var(--ifm-background-surface-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
color: var(--ifm-color-content-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content video {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
margin: 1rem 0;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content hr {
|
||||||
|
margin: 3rem 0;
|
||||||
|
border: none;
|
||||||
|
border-bottom: 1px solid var(--ifm-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
color: #ff6b6b;
|
||||||
|
padding: 20px;
|
||||||
|
border: 1px solid #ff6b6b;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Custom Scrollbar */
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 7px;
|
||||||
|
height: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background: var(--ifm-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background-color: #505050;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background-color: #606060;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Completely remove scrollbar buttons */
|
||||||
|
::-webkit-scrollbar-button {
|
||||||
|
display: none !important;
|
||||||
|
width: 0 !important;
|
||||||
|
height: 0 !important;
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-corner {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Firefox scrollbar - hide buttons */
|
||||||
|
* {
|
||||||
|
scrollbar-width: thin;
|
||||||
|
scrollbar-color: #505050 var(--ifm-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Highlight animation */
|
||||||
|
@keyframes highlight {
|
||||||
|
0% { background-color: rgba(33, 150, 243, 0.2); }
|
||||||
|
100% { background-color: transparent; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-content h1.highlight,
|
||||||
|
.markdown-content h2.highlight,
|
||||||
|
.markdown-content h3.highlight,
|
||||||
|
.markdown-content h4.highlight,
|
||||||
|
.markdown-content h5.highlight,
|
||||||
|
.markdown-content h6.highlight {
|
||||||
|
animation: highlight 2s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1000px) {
|
||||||
|
.menu-button {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: -100%;
|
||||||
|
top: var(--title-bar-height);
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 100;
|
||||||
|
transition: var(--sidebar-transition);
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-sidebar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-sidebar.show {
|
||||||
|
left: 0;
|
||||||
|
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 1.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-text {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-text .brand {
|
||||||
|
color: var(--ifm-color-primary);
|
||||||
|
font-weight: 800;
|
||||||
|
letter-spacing: -0.01em;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-text .divider,
|
||||||
|
.title-text .page-title {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||