2019-06-29 14:43:39 +02:00
//download.js v4.2, by dandavis; 2008-2017. [MIT] see http://danml.com/download.html for tests/usage
( function ( r , l ) { "function" == typeof define && define . amd ? define ( [ ] , l ) : "object" == typeof exports ? module . exports = l ( ) : r . download = l ( ) } ) ( this , function ( ) { return function l ( a , e , k ) { function q ( a ) { var h = a . split ( /[:;,]/ ) ; a = h [ 1 ] ; var h = ( "base64" == h [ 2 ] ? atob : decodeURIComponent ) ( h . pop ( ) ) , d = h . length , b = 0 , c = new Uint8Array ( d ) ; for ( b ; b < d ; ++ b ) c [ b ] = h . charCodeAt ( b ) ; return new f ( [ c ] , { type : a } ) } function m ( a , b ) { if ( "download" in d ) return d . href = a , d . setAttribute ( "download" , n ) , d . className = "download-js-link" , d . innerHTML = "downloading..." , d . style . display = "none" , document . body . appendChild ( d ) , setTimeout ( function ( ) { d . click ( ) , document . body . removeChild ( d ) , ! 0 === b && setTimeout ( function ( ) { g . URL . revokeObjectURL ( d . href ) } , 250 ) } , 66 ) , ! 0 ; if ( /(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\// . test ( navigator . userAgent ) ) return /^data:/ . test ( a ) && ( a = "data:" + a . replace ( /^data:([\w\/\-\+]+)/ , "application/octet-stream" ) ) , ! window . open ( a ) && confirm ( "Displaying New Document\n\nUse Save As... to download, then click back to return to this page." ) && ( location . href = a ) , ! 0 ; var c = document . createElement ( "iframe" ) ; document . body . appendChild ( c ) , ! b && /^data:/ . test ( a ) && ( a = "data:" + a . replace ( /^data:([\w\/\-\+]+)/ , "application/octet-stream" ) ) , c . src = a , setTimeout ( function ( ) { document . body . removeChild ( c ) } , 333 ) } var g = window , b = k || "application/octet-stream" , c = ! e && ! k && a , d = document . createElement ( "a" ) ; k = function ( a ) { return String ( a ) } ; var f = g . Blob || g . MozBlob || g . WebKitBlob || k , n = e || "download" , f = f . call ? f . bind ( g ) : Blob ; "true" === String ( this ) && ( a = [ a , b ] , b = a [ 0 ] , a = a [ 1 ] ) ; if ( c && 2048 > c . length && ( n = c . split ( "/" ) . pop ( ) . split ( "?" ) [ 0 ] , d . href = c , - 1 !== d . href . indexOf ( c ) ) ) { var p = new XMLHttpRequest ; return p . open ( "GET" , c , ! 0 ) , p . responseType = "blob" , p . onload = function ( a ) { l ( a . target . response , n , "application/octet-stream" ) } , setTimeout ( function ( ) { p . send ( ) } , 0 ) , p } if ( /^data:([\w+-]+\/[\w+.-]+)?[,;]/ . test ( a ) ) { if ( ! ( 2096103.424 < a . length && f !== k ) ) return navigator . msSaveBlob ? navigator . msSaveBlob ( q ( a ) , n ) : m ( a ) ; a = q ( a ) , b = a . type || "application/octet-stream" } else if ( /([\x80-\xff])/ . test ( a ) ) { e = 0 ; var c = new Uint8Array ( a . length ) , t = c . length ; for ( e ; e < t ; ++ e ) c [ e ] = a . charCodeAt ( e ) ; a = new f ( [ c ] , { type : b } ) } a = a instanceof f ? a : new f ( [ a ] , { type : b } ) ; if ( navigator . msSaveBlob ) return navigator . msSaveBlob ( a , n ) ; if ( g . URL ) m ( g . URL . createObjectURL ( a ) , ! 0 ) ; else { if ( "string" == typeof a || a . constructor === k ) try { return m ( "data:" + b + ";base64," + g . btoa ( a ) ) } catch ( h ) { return m ( "data:" + b + "," + encodeURIComponent ( a ) ) } b = new FileReader , b . onload = function ( a ) { m ( this . result ) } , b . readAsDataURL ( a ) } return ! 0 } } ) ;
function init ( ) {
( function ( ) {
RK . STLExporter = function ( ) { } ;
RK . STLExporter . prototype = {
2019-09-08 15:25:59 +02:00
constructor : RK . STLExporter ,
2019-06-29 14:43:39 +02:00
parse : ( function ( ) {
var vector = new THREE . Vector3 ( ) ;
var normalMatrixWorld = new THREE . Matrix3 ( ) ;
return function ( scenes ) {
2019-09-08 15:25:59 +02:00
2019-06-29 14:43:39 +02:00
console . log ( scenes ) ;
2019-09-08 15:25:59 +02:00
2019-06-29 14:43:39 +02:00
var output = '' ;
2019-09-08 15:25:59 +02:00
2019-06-29 14:43:39 +02:00
output += 'solid exported\n' ;
2019-09-08 15:25:59 +02:00
2019-06-29 14:43:39 +02:00
for ( var scene _nr in scenes ) {
2019-09-08 15:25:59 +02:00
2019-06-29 14:43:39 +02:00
scenes [ scene _nr ] . traverse ( function ( object ) {
2019-09-08 15:25:59 +02:00
2019-06-29 14:43:39 +02:00
if ( object instanceof RK . Mesh ) {
// if object is hidden - exit
if ( object . visible == false ) return ;
var geometry = object . geometry ;
var matrixWorld = object . matrixWorld ;
var skeleton = object . skeleton ;
var mesh = object ;
if ( geometry instanceof RK . BufferGeometry ) {
2019-09-08 15:25:59 +02:00
//Get pose from skeleton
var bufferGeometry = geometry . clone ( ) ;
2019-06-29 14:43:39 +02:00
geometry = new RK . Geometry ( ) . fromBufferGeometry ( geometry ) ;
2019-10-17 11:07:15 +02:00
var skinIndex = bufferGeometry . getAttribute ( 'skinIndex0' ) ;
var skinWeight = bufferGeometry . getAttribute ( 'skinWeight0' ) ;
2019-09-08 15:25:59 +02:00
var morphTarget = bufferGeometry . getAttribute ( 'morphTarget0' ) ;
2019-06-29 14:43:39 +02:00
var mtcount = 0 ;
while ( typeof morphTarget !== 'undefined' ) {
mtcount ++ ;
2019-09-08 15:25:59 +02:00
morphTarget = bufferGeometry . getAttribute ( 'morphTarget' + mtcount ) ;
2019-06-29 14:43:39 +02:00
}
if ( typeof skinIndex !== 'undefined' ) {
geometry . skinIndices = [ ] ;
geometry . skinWeights = [ ] ;
geometry . morphTargets = [ ] ;
for ( var j = 0 ; j < mtcount ; j ++ ) {
geometry . morphTargets [ j ] = { } ;
geometry . morphTargets [ j ] . vertices = [ ] ;
}
for ( var i = 0 ; i < geometry . vertices . length ; i ++ ) {
geometry . skinIndices . push ( ( new THREE . Vector4 ( ) ) . fromBufferAttribute ( skinIndex , i ) ) ;
geometry . skinWeights . push ( ( new THREE . Vector4 ( ) ) . fromBufferAttribute ( skinWeight , i ) ) ;
for ( var j = 0 ; j < mtcount ; j ++ ) {
2019-09-08 12:56:54 +02:00
geometry . morphTargets [ j ] . vertices . push ( (
new THREE . Vector3 (
2019-09-08 15:25:59 +02:00
bufferGeometry . getAttribute ( 'morphTarget' + j ) . getX ( i ) ,
bufferGeometry . getAttribute ( 'morphTarget' + j ) . getY ( i ) ,
bufferGeometry . getAttribute ( 'morphTarget' + j ) . getZ ( i )
2019-09-08 12:56:54 +02:00
)
) ) ;
2019-06-29 14:43:39 +02:00
}
}
}
}
2019-10-18 10:39:20 +02:00
if ( geometry instanceof RK . Geometry ) {
2019-06-29 14:43:39 +02:00
var vertices = geometry . vertices ;
var faces = geometry . faces ;
normalMatrixWorld . getNormalMatrix ( matrixWorld ) ;
if ( typeof faces != 'undefined' ) {
for ( var i = 0 , l = faces . length ; i < l ; i ++ ) {
var face = faces [ i ] ;
vector . copy ( face . normal ) . applyMatrix3 ( normalMatrixWorld ) . normalize ( ) ;
output += '\tfacet normal ' + vector . x + ' ' + vector . y + ' ' + vector . z + '\n' ;
output += '\t\touter loop\n' ;
var indices = [ face . a , face . b , face . c ] ;
for ( var j = 0 ; j < 3 ; j ++ ) {
var vertexIndex = indices [ j ] ;
if ( typeof geometry . skinIndices !== 'undefined' && geometry . skinIndices . length == 0 ) {
vector . copy ( vertices [ vertexIndex ] ) . applyMatrix4 ( matrixWorld ) ;
output += '\t\t\tvertex ' + vector . x + ' ' + vector . y + ' ' + vector . z + '\n' ;
} else {
vector . copy ( vertices [ vertexIndex ] ) ; //.applyMatrix4( matrixWorld );
// see https://github.com/mrdoob/three.js/issues/3187
var boneIndices = [
geometry . skinIndices [ vertexIndex ] . x ,
geometry . skinIndices [ vertexIndex ] . y ,
geometry . skinIndices [ vertexIndex ] . z ,
geometry . skinIndices [ vertexIndex ] . w
] ;
var weights = [
geometry . skinWeights [ vertexIndex ] . x ,
geometry . skinWeights [ vertexIndex ] . y ,
geometry . skinWeights [ vertexIndex ] . z ,
geometry . skinWeights [ vertexIndex ] . w
] ;
var inverses = [
skeleton . boneInverses [ boneIndices [ 0 ] ] ,
skeleton . boneInverses [ boneIndices [ 1 ] ] ,
skeleton . boneInverses [ boneIndices [ 2 ] ] ,
skeleton . boneInverses [ boneIndices [ 3 ] ]
] ;
var skinMatrices = [
skeleton . bones [ boneIndices [ 0 ] ] . matrixWorld ,
skeleton . bones [ boneIndices [ 1 ] ] . matrixWorld ,
skeleton . bones [ boneIndices [ 2 ] ] . matrixWorld ,
skeleton . bones [ boneIndices [ 3 ] ] . matrixWorld
] ;
//this checks to see if the mesh has any morphTargets - jc
if ( geometry . morphTargets !== 'undefined' ) {
var morphMatricesX = [ ] ;
var morphMatricesY = [ ] ;
var morphMatricesZ = [ ] ;
var morphMatricesInfluence = [ ] ;
for ( var mt = 0 ; mt < geometry . morphTargets . length ; mt ++ ) {
//collect the needed vertex info - jc
morphMatricesX [ mt ] = geometry . morphTargets [ mt ] . vertices [ vertexIndex ] . x ;
morphMatricesY [ mt ] = geometry . morphTargets [ mt ] . vertices [ vertexIndex ] . y ;
morphMatricesZ [ mt ] = geometry . morphTargets [ mt ] . vertices [ vertexIndex ] . z ;
morphMatricesInfluence [ mt ] = mesh . morphTargetInfluences [ mt ] ;
}
}
var finalVector = new THREE . Vector4 ( ) ;
2019-09-08 15:25:59 +02:00
if ( geometry . morphTargets !== 'undefined' ) {
2019-06-29 14:43:39 +02:00
var morphVector = new THREE . Vector4 ( vector . x , vector . y , vector . z ) ;
for ( var mt = 0 ; mt < geometry . morphTargets . length ; mt ++ ) {
//not pretty, but it gets the job done - jc
morphVector . lerp ( new THREE . Vector4 ( morphMatricesX [ mt ] , morphMatricesY [ mt ] , morphMatricesZ [ mt ] , 1 ) , morphMatricesInfluence [ mt ] ) ;
}
}
for ( var k = 0 ; k < 4 ; k ++ ) {
2019-09-08 15:25:59 +02:00
if ( geometry . morphTargets !== 'undefined' ) {
2019-09-08 12:56:54 +02:00
var tempVector = new THREE . Vector4 ( morphVector . x , morphVector . y , morphVector . z ) ;
} else {
var tempVector = new THREE . Vector4 ( vector . x , vector . y , vector . z ) ;
}
2019-06-29 14:43:39 +02:00
tempVector . multiplyScalar ( weights [ k ] ) ;
//the inverse takes the vector into local bone space
2019-09-08 15:25:59 +02:00
//which is then transformed to the appropriate world space
tempVector . applyMatrix4 ( inverses [ k ] ) . applyMatrix4 ( skinMatrices [ k ] ) ;
2019-06-29 14:43:39 +02:00
finalVector . add ( tempVector ) ;
}
output += '\t\t\tvertex ' + finalVector . x + ' ' + finalVector . y + ' ' + finalVector . z + '\n' ;
}
}
output += '\t\tendloop\n' ;
output += '\tendfacet\n' ;
}
}
}
}
} ) ;
}
output += 'endsolid exported\n' ;
return output ;
} ;
} ( ) )
} ;
if ( typeof module !== "undefined" && module . exports ) {
module . exports = RK . STLExporter
}
else if ( ( typeof define !== "undefined" && define !== null ) && ( define . amd !== null ) ) {
define ( [ ] , function ( ) {
return saveAs ;
} ) ;
}
var model = CK . character ;
2019-10-17 11:07:15 +02:00
var characterArea _hook = ".content-side:first" ;
var menu _style = { "margin-left" : "20px" , "font-size" : "1.2em" , "cursor" : "pointer" } ;
2019-06-29 14:43:39 +02:00
var character _area , stl , stl _base , sjson , ljson , labeljson ;
stl = jQuery ( "<a />" ) . css ( menu _style ) . text ( "Export Figure" ) ;
2019-10-17 11:07:15 +02:00
stl _base = jQuery ( "<a />" ) . css ( menu _style ) . css ( { "margin-left" : "125px" } ) . text ( "Export Model (STL)" ) ;
2019-06-29 14:43:39 +02:00
sjson = jQuery ( "<a />" ) . css ( menu _style ) . text ( "Export (JSON)" ) ;
ljson = jQuery ( "<input/>" ) . attr ( { "type" : "file" , "id" : "ljson" } ) . css ( { "display" : "none" } ) . text ( "Import (JSON)" ) ;
labeljson = jQuery ( "<label/>" ) . attr ( { "for" : "ljson" } ) . css ( menu _style ) . text ( "Import (JSON)" ) ;
enlarge = jQuery ( "<a />" ) . css ( menu _style ) . text ( "Enlarge" ) ;
reset _scale = jQuery ( "<a />" ) . css ( menu _style ) . text ( "Reset Scale" ) ;
character _area = jQuery ( characterArea _hook ) ;
//character_area.append(stl);
character _area . append ( stl _base ) ;
character _area . append ( sjson ) ;
character _area . append ( ljson ) ;
character _area . append ( labeljson ) ;
character _area . append ( enlarge ) ;
character _area . append ( reset _scale ) ;
character _area . css ( "right" , 0 ) ;
/ * s t l . c l i c k ( f u n c t i o n ( e ) {
e . preventDefault ( ) ;
var exporter = new RK . STLExporter ( ) ;
var objs = CK . character . children ;
var character = objs [ 0 ] ;
var figure = [ ] ;
var max _objs = 0 ;
var i ;
for ( i in objs ) { // find character
if ( objs [ i ] . children . length > objs [ max _objs ] . children . length ) {
console . log ( "Id " + max _objs + " is not the character" ) ;
character = objs [ i ] ;
max _objs = i ;
}
}
if ( character . children . length > 9 ) { // There is an option to hide the character. Since I do not know where this option is saved
// we use the following heuristic: If there is no object with 10 or more children, the character
// must be hidden...
console . log ( "Found Character, id=" + max _objs ) ;
console . log ( character ) ;
figure . push ( character ) ;
}
if ( CK . data . parts . mount !== undefined ) {
console . log ( "Exporting Mount" ) ;
var mount = undefined ;
for ( i in objs ) { // find mount
var j ;
for ( j in objs [ i ] . children ) {
if ( objs [ i ] . children [ j ] . name == "mount" && objs [ i ] . children . length < 10 ) {
console . log ( "Found mount, id=" + i + "," + j )
mount = objs [ i ] ;
}
}
}
console . log ( mount ) ;
figure . push ( mount ) ;
console . log ( figure ) ;
}
console . log ( figure ) ;
var stlString = exporter . parse ( figure )
var name = get _name ( ) ;
download ( stlString , name + '.stl' , 'application/sla' ) ;
} ) ; * /
stl _base . click ( function ( e ) {
e . preventDefault ( ) ;
download _stl ( model ) ;
} ) ;
enlarge . click ( function ( e ) {
e . preventDefault ( ) ;
set _object _props ( model , [ 10 , 10 , 10 ] , [ Math . PI / 2 , 0 , 0 ] ) ;
} ) ;
reset _scale . click ( function ( e ) {
e . preventDefault ( ) ;
set _object _props ( model , [ 1 , 1 , 1 ] , [ 0 , 0 , 0 ] ) ;
} ) ;
sjson . click ( function ( e ) {
e . preventDefault ( ) ;
var char _json = JSON . stringify ( CK . data ) ;
var name = get _name ( ) ;
download ( char _json , name + ".json" , "text/plain" ) ;
} ) ;
ljson . on ( 'change' , function ( e ) {
e . preventDefault ( ) ;
var file = e . target . files [ 0 ] ;
var reader = new FileReader ( ) ;
reader . onload = ( function ( theFile ) {
return function ( e ) {
e . preventDefault ( ) ;
CK . change ( JSON . parse ( e . target . result ) ) ;
} ;
} ) ( file ) ;
reader . readAsText ( file ) ;
} ) ;
} ) ( ) } ;
function inject _script ( url , callback ) {
var head = document . getElementsByTagName ( "head" ) [ 0 ] ;
var script = document . createElement ( "script" ) ;
script . src = url ;
script . onload = function ( e ) {
callback ( ) } ;
head . appendChild ( script ) ;
}
2019-09-08 15:25:59 +02:00
inject _script ( "//code.jquery.com/jquery-3.3.1.js" , function ( ) {
inject _script ( "//cdnjs.cloudflare.com/ajax/libs/three.js/108/three.js" , function ( ) { init ( ) } )
2019-06-29 14:43:39 +02:00
} ) ;
function download _stl ( object ) {
var exporter = new RK . STLExporter ( ) ;
var stlString = exporter . parse ( [ object ] )
var name = get _name ( ) ;
download ( stlString , name + '.stl' , 'application/sla' ) ;
}
function set _object _props ( object , scale , rot ) {
object . scale . set ( ... scale ) ;
object . rotation . set ( ... rot ) ;
object . refresh ( ) ;
}
function get _name ( ) {
var timestamp = new Date ( ) . getUTCMilliseconds ( ) ;
var uqID = timestamp . toString ( 36 ) ;
var name = "Character " + uqID ;
try {
var getName = CK . character . data . meta . character _name
name = getName === "" ? name : getName ;
} catch ( e ) {
if ( e instanceof ReferenceError ) {
console . log ( "Name of character data location has changed" ) ;
console . log ( e ) ;
} else {
console . log ( "Other Error" ) ;
console . log ( e ) ;
}
}
return name ;
2019-09-08 12:56:54 +02:00
}