Difference between revisions of "Widget:RuneDisp"

From Official Runecraft Wiki
(Documentation)
Line 3: Line 3:
 
</noinclude>
 
</noinclude>
  
 +
// NOTE: Rune widgets should look like below -- see that the runefiles array START from the bottom, and grow to the top
 +
// {{#widget:RuneDisp|runefile=/images/b/b4/PegasusFull.glb|multilayer=true|activationlayer=2|runefiles=/images/3/3d/Pegasus_1.glb|runefiles=/images/6/6e/Pegasus_2_act.glb|runefiles=/images/5/56/Pegasus_3.glb}}
 +
 +
// This is what actually gets rendered
 
<includeonly>
 
<includeonly>
 +
// Import model-viewer JS shenanigans
 
<script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>
 
<script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>
  
 +
// Start the actual file
 
<script type="text/javascript">
 
<script type="text/javascript">
 +
 +
// Read in given arguments
 
var runefile = '<!--{$runefile}-->';
 
var runefile = '<!--{$runefile}-->';
 
var multilayer = '<!--{$multilayer}-->';
 
var multilayer = '<!--{$multilayer}-->';
 
var activationlayer = '<!--{$activationlayer}-->';
 
var activationlayer = '<!--{$activationlayer}-->';
  
 +
// Initialize & fill runefiles w/ smarty script
 
var runefiles = []
 
var runefiles = []
 
<!--{foreach from=$runefiles item=iter}-->
 
<!--{foreach from=$runefiles item=iter}-->
Line 16: Line 25:
 
<!--{/foreach}-->;
 
<!--{/foreach}-->;
  
 +
// Single rune case - very simple.
 
if (multilayer == "false") {
 
if (multilayer == "false") {
 
document.write('<model-viewer id="rune" bounds="tight" src="' + runefile + '" ar ar-modes="scene-viewer webxr quick-look" camera-controls poster="poster.webp" shadow-intensity="1" environment-image="neutral" exposure="1" camera-orbit="0deg 65deg auto"></model-viewer>');
 
document.write('<model-viewer id="rune" bounds="tight" src="' + runefile + '" ar ar-modes="scene-viewer webxr quick-look" camera-controls poster="poster.webp" shadow-intensity="1" environment-image="neutral" exposure="1" camera-orbit="0deg 65deg auto"></model-viewer>');
}
 
  
else {
+
} else {
 +
 
 +
// Not so simple case - render normally to start
 
document.write('<model-viewer id="MLrune" bounds="tight" src="' + runefile + '" ar ar-modes="scene-viewer webxr quick-look" camera-controls poster="poster.webp" shadow-intensity="1" environment-image="neutral" exposure="1" camera-orbit="0deg 65deg auto"><div class="controls"><div>Layer: <select id="layer"></select></div></div></model-viewer>');
 
document.write('<model-viewer id="MLrune" bounds="tight" src="' + runefile + '" ar ar-modes="scene-viewer webxr quick-look" camera-controls poster="poster.webp" shadow-intensity="1" environment-image="neutral" exposure="1" camera-orbit="0deg 65deg auto"><div class="controls"><div>Layer: <select id="layer"></select></div></div></model-viewer>');
  
 +
// Define DOM elements for later use
 
const modelViewerLayers = document.querySelector("model-viewer#MLrune");
 
const modelViewerLayers = document.querySelector("model-viewer#MLrune");
 
const select = document.querySelector('#layer');
 
const select = document.querySelector('#layer');
  
 +
// Create a listener for creating dropdown elements when loaded
 
modelViewerLayers.addEventListener('load', () => {
 
modelViewerLayers.addEventListener('load', () => {
  
Line 31: Line 44:
 
const option = document.createElement('option');
 
const option = document.createElement('option');
  
//brief break to clear the rest of it
+
//brief break to clear repeated options
 
const lyr = document.getElementById("layer");
 
const lyr = document.getElementById("layer");
 
while (lyr.firstChild) {
 
while (lyr.firstChild) {
Line 41: Line 54:
 
select.appendChild(option);
 
select.appendChild(option);
  
 +
// Internal variable manipulation to get the orders right
 
var reversedRunes = runefiles.reverse();
 
var reversedRunes = runefiles.reverse();
 
var length = reversedRunes.length;
 
var length = reversedRunes.length;
  
 +
// Auto fill all other variable options
 
for (const rne of reversedRunes) {
 
for (const rne of reversedRunes) {
 
const option = document.createElement('option');
 
const option = document.createElement('option');
Line 58: Line 73:
 
});
 
});
  
 +
// Create listener for element selection
 
select.addEventListener('input', (event) => {
 
select.addEventListener('input', (event) => {
 
modelViewerLayers.src = event.target.value === 'default' ? runefile : event.target.value;
 
modelViewerLayers.src = event.target.value === 'default' ? runefile : event.target.value;
 
});
 
});
 
  
 
}
 
}

Revision as of 18:34, 14 January 2022



// NOTE: Rune widgets should look like below -- see that the runefiles array START from the bottom, and grow to the top //

// This is what actually gets rendered