Test: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
Line 20: | Line 20: | ||
<div style="margin-bottom: 10px; font-family: sans-serif;"> | <div style="margin-bottom: 10px; font-family: sans-serif;"> | ||
<label for="bearTexture" style="font-weight: bold; margin-right: 10px;">Bear Type:</label> | <label for="bearTexture" style="font-weight: bold; margin-right: 10px;">Bear Type:</label> | ||
<select id="bearTexture" style="padding: 5px; border: 1px solid #ccc; border-radius: 4px;"> | <select id="bearTexture-{{PAGENAME}}" style="padding: 5px; border: 1px solid #ccc; border-radius: 4px;"> | ||
<option value="brown">Brown Bear</option> | <option value="brown">Brown Bear</option> | ||
<option value="black">Black Bear</option> | <option value="black">Black Bear</option> | ||
Line 27: | Line 27: | ||
<model-viewer | <model-viewer | ||
id="bearModelViewer" | id="bearModelViewer-{{PAGENAME}}" | ||
src="https://survivalcraft.wiki/content/Models/Bear.glb" | src="https://survivalcraft.wiki/content/Models/Bear.glb" | ||
alt="3D Bear Model from Survivalcraft" | alt="3D Bear Model from Survivalcraft" | ||
Line 44: | Line 44: | ||
</model-viewer> | </model-viewer> | ||
<div id="statusMessage" style="margin-top: 10px; font-size: 12px; color: #666; font-family: sans-serif;"> | <div id="statusMessage-{{PAGENAME}}" style="margin-top: 10px; font-size: 12px; color: #666; font-family: sans-serif;"> | ||
Loading model... | Loading model... | ||
</div> | </div> | ||
<div id="controlsInfo" style="margin-top: 10px; font-size: 12px; color: #666; font-family: sans-serif; display: none;"> | <div id="controlsInfo-{{PAGENAME}}" style="margin-top: 10px; font-size: 12px; color: #666; font-family: sans-serif; display: none;"> | ||
<strong>Controls:</strong> Click and drag to rotate • Scroll to zoom • Right-click and drag to pan | <strong>Controls:</strong> Click and drag to rotate • Scroll to zoom • Right-click and drag to pan | ||
</div> | </div> | ||
<script type="module"> | |||
(async () => { | |||
const jsCodeBase64 = ` | |||
const modelViewer = document.getElementById('bearModelViewer-{{PAGENAME}}'); | |||
const bearTextureSelector = document.getElementById('bearTexture-{{PAGENAME}}'); | |||
const statusMessage = document.getElementById('statusMessage-{{PAGENAME}}'); | |||
const controlsInfo = document.getElementById('controlsInfo-{{PAGENAME}}'); | |||
const textures = { | |||
brown: 'https://survivalcraft.wiki/content/Textures/Creatures/Bear_Brown.png', | |||
black: 'https://survivalcraft.wiki/content/Textures/Creatures/Bear_Black.png' | |||
}; | |||
let mainModelMaterial = null; | |||
modelViewer.addEventListener('load', async () => { | |||
console.log('3D model loaded successfully!'); | |||
statusMessage.textContent = 'Model loaded successfully!'; | |||
controlsInfo.style.display = 'block'; | |||
if (modelViewer.model && modelViewer.model.materials.length > 0) { | |||
mainModelMaterial = modelViewer.model.materials[0]; | |||
console.log('Identified main model material:', mainModelMaterial); | |||
await applyBearTexture(); | |||
} else { | |||
console.warn('Could not find any materials in the loaded model. Texture changing might not work.'); | |||
statusMessage.textContent = 'Model loaded, but materials not found for texture swap.'; | |||
statusMessage.style.color = '#d63031'; | |||
} | |||
}); | |||
modelViewer.addEventListener('error', (event) => { | |||
console.error('Error loading 3D model:', event); | |||
statusMessage.textContent = 'Error loading model. Check your browser console.'; | |||
console. | |||
statusMessage.textContent = ' | |||
statusMessage.style.color = '#d63031'; | statusMessage.style.color = '#d63031'; | ||
}); | |||
modelViewer.addEventListener('progress', (event) => { | |||
const progress = event.detail.totalProgress; | |||
statusMessage.textContent = \`Loading model... \${Math.round(progress * 100)}%\`; | |||
}); | |||
bearTextureSelector.addEventListener('change', applyBearTexture); | |||
async function applyBearTexture() { | |||
if (!mainModelMaterial) { | |||
console.warn('Model material not yet available. Cannot change texture.'); | |||
return; | |||
} | |||
const selectedTextureKey = bearTextureSelector.value; | |||
const textureUrl = textures[selectedTextureKey]; | |||
if (!textureUrl) { | |||
console.warn(\`No texture URL defined for "\${selectedTextureKey}".\`); | |||
return; | |||
} | |||
console.log(\`Attempting to apply "\${selectedTextureKey}" texture from: \${textureUrl}\`); | |||
try { | |||
console. | const newTexture = await modelViewer.createTexture(textureUrl); | ||
mainModelMaterial.pbrMetallicRoughness.baseColorTexture.setTexture(newTexture); | |||
console.log(\`Successfully applied \${selectedTextureKey} texture.\`); | |||
} catch (error) { | |||
console.error(\`Failed to apply \${selectedTextureKey} texture:\`, error); | |||
statusMessage.textContent = \`Error applying \${selectedTextureKey} texture.\`; | |||
statusMessage.style.color = '#d63031'; | |||
} | |||
} | } | ||
console.log( | document.addEventListener('DOMContentLoaded', () => { | ||
console.log('DOM fully loaded and parsed.'); | |||
if (typeof customElements.get('model-viewer') === 'undefined') { | |||
console.error('The <model-viewer> component failed to load or register.'); | |||
statusMessage.textContent = 'Error: 3D viewer component not available.'; | |||
statusMessage.style.color = '#d63031'; | |||
} | |||
}); | |||
`; | |||
// Decode and execute the JavaScript | |||
const decodedJsCode = atob(jsCodeBase64.trim()); | |||
const scriptElement = document.createElement('script'); | |||
scriptElement.type = 'module'; | |||
scriptElement.textContent = decodedJsCode; | |||
document.head.appendChild(scriptElement); | |||
})(); | |||
</script> | |||
</html> | |||
Revision as of 18:38, 28 July 2025
This is a notice message |
This is a content issue |
This is a style issue |
⚠️ Unable to load 3D model.
Check your browser console for details.
Loading model...
Cell 1 | Cell 2 |
Cell 3 | Cell 4 |