Newer
Older
AegisforEcosystem / next / AR.js-3.4.0 / three.js / examples / marker-training / examples / generator.html
@KAOKA Daisuke KAOKA Daisuke on 31 May 2022 12 KB into AR.js
<!DOCTYPE html>
<title>AR.js Marker Training</title>
<!-- include mdl -->
<link rel='stylesheet' href='https://fonts.googleapis.com/icon?family=Material+Icons'>
<link rel='stylesheet' href='https://code.getmdl.io/1.3.0/material.indigo-pink.min.css'>
<script defer src='https://code.getmdl.io/1.3.0/material.min.js'></script>
<script src='https://unpkg.com/dialog-polyfill@0.5.6/dist/dialog-polyfill.js'></script>
<link href='https://fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet'>

<!-- Include pdfMake - http://pdfmake.org/ -->
<script src='../../vendor/pdfMake/pdfmake.min.js'></script>
<script src='../../vendor/pdfMake/vfs_fonts.js'></script>

<!-- include THREEx.ArPatternFile -->
<script src='../threex-arpatternfile.js'></script>

<style media='screen'>
	body {
		font-family: arial;
		background-color: #eee;
	}
	h1 {
		text-align: center;
		font-size: 500%;
	}
	div.mdl-cell {
		text-align: center;
	}

	h1 a {
		text-decoration: none;
	}
	h1 a:hover {
		text-decoration: underline;
	}

	#imageContainer img {
		width: 100%;
		max-width: 512px;
	}

	#topRightButtons {
		position: fixed;
		top: 1em;
		right: 1em;
	}
</style>
<body>

<h1><a href='https://github.com/jeromeetienne/ar.js' target='_blank'>AR.js</a> Marker Training</h1>



<!-- *********************************************************************** -->
<!-- *********************************************************************** -->
<!-- *********************************************************************** -->
<div id='topRightButtons'>
	<button id="show-info" class="mdl-button mdl-js-button mdl-button--fab mdl-button--colored">
		<i class="material-icons">info_outline</i>
	</button>
</div>
<dialog style='width:400px' id='dialog-info' class="mdl-dialog">
	<h4 class="mdl-dialog__title">Welcome!</h4>
	<div class="mdl-dialog__content">
		Details on how to pick the inner image can be found <a target='_blank' href='https://kalwalt.github.io/artoolkit-docs/3_Marker_Training/marker_training.html'>here</a>
	</div>
	<div class="mdl-dialog__actions">
		<button type="button" class="mdl-button">OK</button>
	</div>
</dialog>
<script>
	var dialogElement = document.querySelector('#dialog-info')
	if (! dialogElement.showModal) {
		dialogPolyfill.registerDialog(dialogElement)
	}
	dialogElement.querySelector('.mdl-dialog__actions button').addEventListener('click', function() {
		dialogElement.close()
	})

	var showDialogButton = document.querySelector('#show-info')
	showDialogButton.addEventListener('click', function() {
		dialogElement.showModal()
	})
</script>

<!-- *********************************************************************** -->
<!-- *********************************************************************** -->
<!-- *********************************************************************** -->
<div class='mdl-grid'>
	<div class='mdl-cell mdl-cell--4-col'>
		<label id='buttonUpload' for='fileinput' class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'>
			<input type='file' id='fileinput' style='display: none'>
			Upload
		</label>
		<div class='mdl-tooltip' for='buttonUpload'>
			Upload the image to put inside the marker
		</div>

		<div style="justify-content: center" class='mdl-grid'>
				<div class='mdl-cell mdl-cell--12-col'>
				<label class="mdl-js-ripple-effect" for="patternRatioSlider">
					<span class="">Pattern Ratio 0.50</span>
					<input id='patternRatioSlider' class="mdl-slider mdl-js-slider" type="range" min="10" max="90" value="50" >
				</label>
				<div class='mdl-tooltip' for='patternRatioSlider'>
					Set size of inner image vs black border
				</div>
			</div>
		</div>

		<div style="justify-content: center" class='mdl-grid'>
			<div class='mdl-cell mdl-cell--12-col'>
				<label class="mdl-js-ripple-effect" for="imageSize">
					<span class="">Image size 512px</span>
					<input id='imageSize' class="mdl-slider mdl-js-slider" type="range" min="150" max="2500" value="512" >
				</label>
				<div class='mdl-tooltip' for='patternRatioSlider'>
					Set the pixel width/height of the image.
				</div>
			</div>
		</div>

		<div style="justify-content: center" class='mdl-grid'>
				<div class='mdl-cell mdl-cell--12-col'>
				<label class="mdl-js-ripple-effect" for="borderColor">
					<span class="">Border color. Please choose a dark one.</span>
					<input id='borderColor' type="text" value="black">
				</label>
				<div class='mdl-tooltip' for='borderColor'>
					Set the marker border color, using hexa code or color name.
				</div>
			</div>
		</div>

	</div>
	<div class='mdl-cell mdl-cell--4-col'>
		<button id='buttonDownloadEncoded' class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'>
			Download Marker
		</button>
		<div class='mdl-tooltip' for='buttonDownloadEncoded'>
			Download marker encoded from the uploaded image
		</div>
		<br/>
		<br/>
		<button id='buttonDownloadFullImage' class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'>
			Download Image
		</button>
		<div class='mdl-tooltip' for='buttonDownloadFullImage'>
			Download marker image
		</div>
	</div>
	<div class='mdl-cell mdl-cell--4-col'>
		<button id='buttonDownloadPDFOnePerPage' class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'>
			PDF One per Page
		</button>
		<div class='mdl-tooltip' for='buttonDownloadPDFOnePerPage'>
			Download markers as PDF
			<br/>
			One marker per page
		</div>
		<br/>
		<br/>
		<button id='buttonDownloadPDFTwoPerPage' class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'>
			PDF Two per Page
		</button>
		<div class='mdl-tooltip' for='buttonDownloadPDFTwoPerPage'>
			Download markers as PDF
			<br/>
			Two marker per page
		</div>
		<br/>
		<br/>
		<button id='buttonDownloadPDFSixPerPage' class='mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'>
			PDF Six per Page
		</button>
		<div class='mdl-tooltip' for='buttonDownloadPDFSixPerPage'>
			Download markers as PDF.
			<br/>
			Six marker per page
		</div>
	</div>
</div>

<div class='mdl-grid'>

	<div class='mdl-cell mdl-cell--3-col'></div>
	<div class='mdl-cell mdl-cell--6-col'>
		<div id='imageContainer'></div>
	</div>
	<div class='mdl-cell mdl-cell--3-col'></div>
</div>



<script>
	var innerImageURL = null
	var fullMarkerURL = null
	var imageName = null

	innerImageURL = 'inner-images/inner-arjs.png'
	updateFullMarkerImage()

	document.querySelector('#buttonDownloadEncoded').addEventListener('click', function(){
		if( innerImageURL === null ){
			alert('upload a file first')
			return
		}
		console.assert(innerImageURL)
		THREEx.ArPatternFile.encodeImageURL(innerImageURL, function onComplete(patternFileString){
			THREEx.ArPatternFile.triggerDownload(patternFileString, "pattern-" + (imageName || "marker") + ".patt")
		})
	})


	document.querySelector('#buttonDownloadFullImage').addEventListener('click', function(){
		// debugger
		if( innerImageURL === null ){
			alert('upload a file first')
			return
		}

		// tech from https://stackoverflow.com/questions/3665115/create-a-file-in-memory-for-user-to-download-not-through-server
		var domElement = window.document.createElement('a');
		domElement.href = fullMarkerURL;
		domElement.download = "pattern-" + (imageName || 'marker') + '.png';
		document.body.appendChild(domElement)
		domElement.click();
		document.body.removeChild(domElement)
	})



	document.querySelector('#patternRatioSlider').addEventListener('input', function(){
		// update the patternRatio number
		var patternRatio = document.querySelector('#patternRatioSlider').value/100
		var domElement = document.querySelector('[for=patternRatioSlider] span')
		domElement.innerHTML = `Pattern Ratio ${patternRatio.toFixed(2)}`

		// update fullMarkerImage
		updateFullMarkerImage()
	})

	document.querySelector('#imageSize').addEventListener('input', function(){
		// update the patternRatio number
		var imageSize = document.querySelector('#imageSize').value
		var domElement = document.querySelector('[for=imageSize] span')
		domElement.innerHTML = `Image size ${imageSize}px`

		// update fullMarkerImage
		updateFullMarkerImage()
	})

	document.querySelector('#borderColor').addEventListener('input', function(){
		var imageSize = document.querySelector('#borderColor').value
		var domElement = document.querySelector('[for=borderColor] span')

		// update fullMarkerImage
		updateFullMarkerImage()
	})


	document.querySelector('#fileinput').addEventListener('change', function(){
		var file = this.files[0];
		imageName = file.name
		// remove file extension
		imageName = imageName.substring(0, imageName.lastIndexOf('.')) || imageName
		
		// debugger

		var reader = new FileReader();
		reader.onload = function(event){
			innerImageURL = event.target.result
			updateFullMarkerImage()
		};
		reader.readAsDataURL(file);
	})

	function updateFullMarkerImage(){
		// get patternRatio
		var patternRatio = document.querySelector('#patternRatioSlider').value/100
		var imageSize = document.querySelector('#imageSize').value
		var borderColor = document.querySelector('#borderColor').value

		function hexaColor(color) {
			return /^#[0-9A-F]{6}$/i.test(color);
		};

		var s = new Option().style;
		s.color = borderColor;
  		if (borderColor === '' || (s.color != borderColor && !hexaColor(borderColor))) {
			// if color not valid, use black
			borderColor = 'black';
		}

		THREEx.ArPatternFile.buildFullMarker(innerImageURL, patternRatio, imageSize, borderColor, function onComplete(markerUrl){
			fullMarkerURL = markerUrl

			var fullMarkerImage = document.createElement('img')
			fullMarkerImage.src = fullMarkerURL

			// put fullMarkerImage into #imageContainer
			var container = document.querySelector('#imageContainer')
			while (container.firstChild) container.removeChild(container.firstChild);
			container.appendChild(fullMarkerImage)
		})
	}

	//////////////////////////////////////////////////////////////////////////////
	//		Handle PDF
	//////////////////////////////////////////////////////////////////////////////
	document.querySelector('#buttonDownloadPDFOnePerPage').addEventListener('click', generatePdfOnePerPage)
	document.querySelector('#buttonDownloadPDFTwoPerPage').addEventListener('click', generatePdfTwoPerPage)
	document.querySelector('#buttonDownloadPDFSixPerPage').addEventListener('click', generatePdfSixPerPage)

	function generatePdfOnePerPage(){
	        var docDefinition = {
			content: [
				{
					image: fullMarkerURL,
					width: 600,
					alignment: 'center',
				},
			]
	        }
	        pdfMake.createPdf(docDefinition).open();
	}
	function generatePdfTwoPerPage(){
	        var docDefinition = {
			content: [
				{
					image: fullMarkerURL,
					width: 300,
					alignment: 'center',
				},
				{
					image: fullMarkerURL,
					width: 300,
					alignment: 'center',
				},
			]
	        }
	        pdfMake.createPdf(docDefinition).open();
	}
	function generatePdfSixPerPage(){
	        var docDefinition = {
	                content: [
				{
					columns: [
			                        {
			                                image: fullMarkerURL,
			                                width: 250,
			                        },
			                        {
			                                image: fullMarkerURL,
			                                width: 250,
			                        },
					]
				},
				{
					columns: [
			                        {
			                                image: fullMarkerURL,
			                                width: 250,
			                        },
			                        {
			                                image: fullMarkerURL,
			                                width: 250,
			                        },
					]
				},
				{
					columns: [
			                        {
			                                image: fullMarkerURL,
			                                width: 250,
			                        },
			                        {
			                                image: fullMarkerURL,
			                                width: 250,
			                        },
					]
				},
	                ],
	        }
	        pdfMake.createPdf(docDefinition).open();
	}
</script>

</body>