automata_scratch/Scratch.ipynb

917 lines
126 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 230,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<module 'examples' from '/home/hodapp/dev/automata_scratch/examples.py'>"
]
},
"execution_count": 230,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import stl.mesh\n",
"import numpy\n",
"import trimesh\n",
"import random\n",
"import itertools\n",
"\n",
"import meshutil\n",
"import meshgen\n",
"import examples\n",
"import cage\n",
"\n",
"import importlib\n",
"importlib.reload(examples)"
]
},
{
"cell_type": "code",
"execution_count": 231,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0, 2]"
]
},
"execution_count": 231,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"importlib.reload(cage)\n",
"c = cage.Cage.from_arrays([[0,0,0], [1,1,1]], [[2,2,2]])\n",
"c.splits"
]
},
{
"cell_type": "code",
"execution_count": 232,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1., 1., 1.]])"
]
},
"execution_count": 232,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c.verts[1:-1,:]"
]
},
{
"cell_type": "code",
"execution_count": 233,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0. 0. 0.]\n",
" [1. 1. 1.]]\n",
"[[2. 2. 2.]]\n"
]
}
],
"source": [
"for i in c.polys():\n",
" print(i)"
]
},
{
"cell_type": "code",
"execution_count": 234,
"metadata": {},
"outputs": [],
"source": [
"center = meshutil.Transform().translate(-0.5, -0.5, 0)\n",
"cage0 = cage.Cage.from_arrays([\n",
" [0, 0, 0],\n",
" [1, 0, 0],\n",
" [1, 1, 0],\n",
" [0, 1, 0],\n",
"])#.transform(center)"
]
},
{
"cell_type": "code",
"execution_count": 235,
"metadata": {},
"outputs": [],
"source": [
"cs,_,_ = cage0.subdivide_deprecated()\n",
"c1,c2,c3,c4 = cs"
]
},
{
"cell_type": "code",
"execution_count": 236,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0. , 0. , 0. ],\n",
" [0.5, 0. , 0. ],\n",
" [0.5, 0.5, 0. ],\n",
" [0. , 0.5, 0. ]])"
]
},
"execution_count": 236,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c1.verts"
]
},
{
"cell_type": "code",
"execution_count": 237,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.5, 0. , 0. ],\n",
" [1. , 0. , 0. ],\n",
" [1. , 0.5, 0. ],\n",
" [0.5, 0.5, 0. ]])"
]
},
"execution_count": 237,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c2.verts"
]
},
{
"cell_type": "code",
"execution_count": 238,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.5, 0.5, 0. ],\n",
" [1. , 0.5, 0. ],\n",
" [1. , 1. , 0. ],\n",
" [0.5, 1. , 0. ]])"
]
},
"execution_count": 238,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c3.verts"
]
},
{
"cell_type": "code",
"execution_count": 239,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0. , 0.5, 0. ],\n",
" [0.5, 0.5, 0. ],\n",
" [0.5, 1. , 0. ],\n",
" [0. , 1. , 0. ]])"
]
},
"execution_count": 239,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c4.verts"
]
},
{
"cell_type": "code",
"execution_count": 240,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[array([3, 1, 2, 1], dtype=uint8),\n",
" array([1, 3, 1, 2], dtype=uint8),\n",
" array([2, 1, 3, 1], dtype=uint8),\n",
" array([1, 2, 1, 3], dtype=uint8)]"
]
},
"execution_count": 240,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"overlap = cage0.classify_overlap(cs)\n",
"overlap"
]
},
{
"cell_type": "code",
"execution_count": 241,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cage 0:\n",
" Vertex 0: type=3 for position [0. 0. 0.]\n",
" Vertex 1: type=1 for position [0.5 0. 0. ]\n",
" Vertex 2: type=2 for position [0.5 0.5 0. ]\n",
" Vertex 3: type=1 for position [0. 0.5 0. ]\n",
"Cage 1:\n",
" Vertex 0: type=1 for position [0.5 0. 0. ]\n",
" Vertex 1: type=3 for position [1. 0. 0.]\n",
" Vertex 2: type=1 for position [1. 0.5 0. ]\n",
" Vertex 3: type=2 for position [0.5 0.5 0. ]\n",
"Cage 2:\n",
" Vertex 0: type=2 for position [0.5 0.5 0. ]\n",
" Vertex 1: type=1 for position [1. 0.5 0. ]\n",
" Vertex 2: type=3 for position [1. 1. 0.]\n",
" Vertex 3: type=1 for position [0.5 1. 0. ]\n",
"Cage 3:\n",
" Vertex 0: type=1 for position [0. 0.5 0. ]\n",
" Vertex 1: type=2 for position [0.5 0.5 0. ]\n",
" Vertex 2: type=1 for position [0.5 1. 0. ]\n",
" Vertex 3: type=3 for position [0. 1. 0.]\n"
]
}
],
"source": [
"# Pretty-print a little:\n",
"for i,(c,ols) in enumerate(zip(cs, overlap)):\n",
" print(\"Cage {}:\".format(i))\n",
" for j,(vert,ol) in enumerate(zip(c.verts, ols)):\n",
" print(\" Vertex {}: type={} for position {}\".format(j, ol, vert))"
]
},
{
"cell_type": "code",
"execution_count": 242,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DEBUG: Transition from [[0. 0. 0.]\n",
" [1. 0. 0.]\n",
" [1. 1. 0.]\n",
" [0. 1. 0.]] to [[0. 0. 2. ]\n",
" [0.5 0. 2. ]\n",
" [1. 0. 2. ]\n",
" [1. 0.5 2. ]\n",
" [1. 1. 2. ]\n",
" [0.5 1. 2. ]\n",
" [0. 1. 2. ]\n",
" [0. 0.5 2. ]]\n"
]
}
],
"source": [
"cf = cage.CageFork(None,\n",
" numpy.array([[0, 0, 0], [0.5, 0, 0], [1, 0, 0], [1, 0.5, 0],\n",
" [1, 1, 0], [0.5, 1, 0], [0, 1, 0], [0, 0.5, 0]]) + [0, 0, 2],\n",
" [[7, 0, 1], [1, 2, 3], [3, 4, 5], [5, 6, 7]]\n",
" )\n",
"mesh2 = cf.transition_from(cage0)"
]
},
{
"cell_type": "code",
"execution_count": 243,
"metadata": {},
"outputs": [],
"source": [
"import cProfile, pstats"
]
},
{
"cell_type": "code",
"execution_count": 244,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DEBUG: Transition from [[-0.12779038 0.21102174 2.40470962]\n",
" [ 0.33806165 0.70938821 2.14156165]\n",
" [-0.16030482 0.91209228 1.64319518]\n",
" [-0.62615685 0.41372581 1.90634315]] to [[-0.2626621 0.77854269 2.8165879 ]\n",
" [-0.12337756 1.0097311 2.62782244]\n",
" [ 0.01590698 1.24091952 2.43905698]\n",
" [-0.21528143 1.19143859 2.20786857]\n",
" [-0.44646984 1.14195767 1.97668016]\n",
" [-0.58575438 0.91076926 2.16544562]\n",
" [-0.72503892 0.67958085 2.35421108]\n",
" [-0.49385051 0.72906177 2.58539949]]\n",
"DEBUG: Transition from [[-0.74347748 0.58794149 3.71597464]\n",
" [-0.79727882 0.82750482 3.5970103 ]\n",
" [-0.90111397 0.6973509 3.38269929]\n",
" [-0.84731263 0.45778757 3.50166363]] to [[-1.21682916 0.70882435 3.91083553]\n",
" [-1.24891256 0.79437337 3.82882192]\n",
" [-1.28099597 0.87992239 3.7468083 ]\n",
" [-1.28427431 0.79385876 3.65911734]\n",
" [-1.28755265 0.70779513 3.57142638]\n",
" [-1.25546925 0.62224611 3.65344 ]\n",
" [-1.22338584 0.53669709 3.73545361]\n",
" [-1.2201075 0.62276072 3.82314457]]\n",
"DEBUG: Transition from [[-1.41904679 0.33918003 4.55662312]\n",
" [-1.49259832 0.36362409 4.49218395]\n",
" [-1.45056812 0.30486275 4.42174767]\n",
" [-1.37701659 0.28041868 4.48618684]] to [[-1.68933192 0.07584281 4.64352898]\n",
" [-1.71429045 0.08008304 4.605789 ]\n",
" [-1.73924898 0.08432327 4.56804903]\n",
" [-1.70515054 0.06722139 4.54331646]\n",
" [-1.67105211 0.05011951 4.5185839 ]\n",
" [-1.64609358 0.04587928 4.55632388]\n",
" [-1.62113504 0.04163905 4.59406386]\n",
" [-1.65523348 0.05874093 4.61879642]]\n",
"DEBUG: Transition from [[-1.75879046 1.52828884 3.91826404]\n",
" [-1.77907869 1.52756421 3.82068411]\n",
" [-1.77835406 1.42593032 3.82036248]\n",
" [-1.75806582 1.42665495 3.91794241]] to [[-2.14044268 1.51937802 3.93105781]\n",
" [-2.14710704 1.50554435 3.8886475 ]\n",
" [-2.1537714 1.49171067 3.84623719]\n",
" [-2.13779985 1.45011441 3.85631764]\n",
" [-2.1218283 1.40851814 3.86639808]\n",
" [-2.11516394 1.42235182 3.90880839]\n",
" [-2.10849958 1.4361855 3.9512187 ]\n",
" [-2.12447113 1.47778176 3.94113825]]\n",
"DEBUG: Transition from [[-2.02774586 0.78613143 2.88671916]\n",
" [-1.96411549 0.79303302 2.80926343]\n",
" [-1.91850973 0.70797367 2.83931112]\n",
" [-1.9821401 0.70107208 2.91676685]] to [[-2.22196111 0.61317392 2.64885197]\n",
" [-2.18730239 0.60587863 2.62071796]\n",
" [-2.15264368 0.59858334 2.59258396]\n",
" [-2.13421759 0.56975042 2.6229292 ]\n",
" [-2.1157915 0.5409175 2.65327443]\n",
" [-2.15045022 0.54821278 2.68140843]\n",
" [-2.18510894 0.55550807 2.70954244]\n",
" [-2.20353502 0.58434099 2.6791972 ]]\n",
"DEBUG: Transition from [[-1.71761816 -0.26532979 3.45944306]\n",
" [-1.72739674 -0.21751538 3.37249066]\n",
" [-1.62954178 -0.22931009 3.35458064]\n",
" [-1.6197632 -0.27712451 3.44153304]] to [[-1.81861384 -0.54813442 3.25391516]\n",
" [-1.80945737 -0.52737313 3.2150837 ]\n",
" [-1.80030089 -0.50661184 3.17625223]\n",
" [-1.75660235 -0.506064 3.1866376 ]\n",
" [-1.71290381 -0.50551615 3.19702297]\n",
" [-1.72206028 -0.52627744 3.23585444]\n",
" [-1.73121675 -0.54703873 3.2746859 ]\n",
" [-1.7749153 -0.54758657 3.26430053]]\n",
"DEBUG: Transition from [[0.33273772 1.97512805 2.90337296]\n",
" [0.27893637 2.07896319 2.66184879]\n",
" [0.03937304 1.94880928 2.65532115]\n",
" [0.09317438 1.84497413 2.89684532]] to [[ 5.32287262e-02 2.37916340e+00 3.05805689e+00]\n",
" [ 6.32353561e-04 2.40218653e+00 2.95098652e+00]\n",
" [-5.19640191e-02 2.42520966e+00 2.84391614e+00]\n",
" [-1.27162666e-01 2.32956383e+00 2.85767391e+00]\n",
" [-2.02361313e-01 2.23391801e+00 2.87143167e+00]\n",
" [-1.49764941e-01 2.21089488e+00 2.97850205e+00]\n",
" [-9.71685681e-02 2.18787175e+00 3.08557242e+00]\n",
" [-2.19699209e-02 2.28351757e+00 3.07181466e+00]]\n",
"DEBUG: Transition from [[ 1.09481578e-01 2.64523322e+00 3.90073134e+00]\n",
" [ 1.96852406e-02 2.66797393e+00 3.85962291e+00]\n",
" [-3.05547260e-03 2.57017380e+00 3.85309179e+00]\n",
" [ 8.67408646e-02 2.54743309e+00 3.89420022e+00]] to [[-0.09990301 2.64641837 4.21237531]\n",
" [-0.14070451 2.64305751 4.19202537]\n",
" [-0.18150602 2.63969665 4.17167542]\n",
" [-0.17341697 2.59572519 4.1624974 ]\n",
" [-0.16532793 2.55175374 4.15331937]\n",
" [-0.12452643 2.5551146 4.17366931]\n",
" [-0.08372492 2.55847546 4.19401926]\n",
" [-0.09181396 2.60244692 4.20319729]]\n",
"DEBUG: Transition from [[-0.21041681 3.04847733 2.66462288]\n",
" [-0.28396834 3.00644713 2.61128449]\n",
" [-0.3084124 2.94768578 2.68820614]\n",
" [-0.23486087 2.98971598 2.74154453]] to [[-0.49244292 3.25521577 2.81511259]\n",
" [-0.52601836 3.22791694 2.80174112]\n",
" [-0.55959381 3.2006181 2.78836964]\n",
" [-0.55126049 3.17275998 2.82254855]\n",
" [-0.54292716 3.14490185 2.85672746]\n",
" [-0.50935172 3.17220069 2.87009893]\n",
" [-0.47577628 3.19949953 2.88347041]\n",
" [-0.4841096 3.22735765 2.8492915 ]]\n",
"DEBUG: Transition from [[-1.05079225 2.1465857 2.64703003]\n",
" [-1.04463562 2.06946796 2.58169183]\n",
" [-1.01186141 2.00990788 2.65440841]\n",
" [-1.01801805 2.08702562 2.71974661]] to [[-1.36237651 2.02532775 2.73412604]\n",
" [-1.35345292 1.98475271 2.71533844]\n",
" [-1.34452933 1.94417767 2.69655084]\n",
" [-1.31922385 1.93332377 2.73259927]\n",
" [-1.29391837 1.92246987 2.76864769]\n",
" [-1.30284196 1.96304492 2.78743529]\n",
" [-1.31176555 2.00361996 2.80622289]\n",
" [-1.33707103 2.01447385 2.77017447]]\n",
"DEBUG: Transition from [[-0.83336259 1.79896047 3.67957252]\n",
" [-0.88053865 1.78423304 3.59339709]\n",
" [-0.81699274 1.70865428 3.57041434]\n",
" [-0.76981668 1.72338171 3.65658978]] to [[-1.05076267 1.55381209 3.80219963]\n",
" [-1.06133874 1.53874977 3.7612283 ]\n",
" [-1.07191482 1.52368746 3.72025698]\n",
" [-1.03130013 1.50340616 3.71655505]\n",
" [-0.99068544 1.48312485 3.71285311]\n",
" [-0.98010937 1.49818717 3.75382444]\n",
" [-0.96953329 1.51324948 3.79479576]\n",
" [-1.01014798 1.53353079 3.79849769]]\n",
"DEBUG: Transition from [[-0.85705489 1.90821162 1.64693271]\n",
" [-0.77971211 1.81526522 1.40357228]\n",
" [-0.91434668 1.5840904 1.44788536]\n",
" [-0.99168946 1.67703679 1.6912458 ]] to [[-1.20609328 2.08615194 1.46419576]\n",
" [-1.18636328 2.01321636 1.36776317]\n",
" [-1.16663329 1.94028078 1.27133058]\n",
" [-1.20308193 1.84311555 1.33704146]\n",
" [-1.23953057 1.74595032 1.40275235]\n",
" [-1.25926057 1.8188859 1.49918494]\n",
" [-1.27899057 1.89182148 1.59561753]\n",
" [-1.24254193 1.98898671 1.52990664]]\n",
"DEBUG: Transition from [[-1.64569584 2.74360496 1.80582132]\n",
" [-1.69287189 2.68005904 1.74340988]\n",
" [-1.67814447 2.60448028 1.8090762 ]\n",
" [-1.63096841 2.66802619 1.87148763]] to [[-1.92145722 2.81714973 1.9440273 ]\n",
" [-1.93804776 2.77931856 1.92506107]\n",
" [-1.95463829 2.74148739 1.90609483]\n",
" [-1.93086932 2.71590925 1.9355613 ]\n",
" [-1.90710036 2.69033112 1.96502778]\n",
" [-1.89050982 2.72816229 1.98399401]\n",
" [-1.87391929 2.76599346 2.00296025]\n",
" [-1.89768825 2.79157159 1.97349378]]\n",
"DEBUG: Transition from [[-1.37157745 2.29142615 0.69388887]\n",
" [-1.38135603 2.19357118 0.67661684]\n",
" [-1.42917044 2.18177647 0.76489743]\n",
" [-1.41939186 2.27963143 0.78216946]] to [[-1.65767608 2.35860025 0.57338448]\n",
" [-1.66649084 2.31460379 0.57863037]\n",
" [-1.6753056 2.27060732 0.58387626]\n",
" [-1.6820364 2.27640522 0.62851246]\n",
" [-1.6887672 2.28220312 0.67314866]\n",
" [-1.67995244 2.32619958 0.66790277]\n",
" [-1.67113768 2.37019604 0.66265689]\n",
" [-1.66440688 2.36439815 0.61802069]]\n",
"DEBUG: Transition from [[-1.633161 1.28583927 1.21268628]\n",
" [-1.5676273 1.21132261 1.23152628]\n",
" [-1.57087294 1.23295012 1.32990797]\n",
" [-1.63640665 1.30746679 1.31106797]] to [[-1.87380601 1.12814033 1.24313882]\n",
" [-1.84458004 1.10029995 1.26411518]\n",
" [-1.81535407 1.07245958 1.28509155]\n",
" [-1.81557636 1.09995498 1.32153904]\n",
" [-1.81579866 1.12745037 1.35798652]\n",
" [-1.84502463 1.15529075 1.33701016]\n",
" [-1.87425061 1.18313112 1.31603379]\n",
" [-1.87402831 1.15563572 1.2795863 ]]\n",
"DEBUG: Transition from [[-1.83053344 1.65646669 2.09344297]\n",
" [-1.80887482 1.57499098 2.04017734]\n",
" [-1.72739911 1.5586565 2.09680935]\n",
" [-1.74905773 1.64013221 2.15007499]] to [[-2.00727477 1.51492315 2.2856394 ]\n",
" [-1.98605816 1.47886262 2.26898208]\n",
" [-1.96484155 1.4428021 2.25232475]\n",
" [-1.92724935 1.45447431 2.27408402]\n",
" [-1.88965714 1.46614652 2.29584329]\n",
" [-1.91087375 1.50220705 2.31250062]\n",
" [-1.93209036 1.53826757 2.32915795]\n",
" [-1.96968257 1.52659536 2.30739867]]\n",
"DEBUG: Transition from [[-1.75002234 0.76028326 2.31021592]\n",
" [-1.67267956 0.89491783 2.09206692]\n",
" [-1.57973317 0.663743 1.98085422]\n",
" [-1.65707594 0.52910843 2.19900322]] to [[-2.16305897 0.7679616 2.12188319]\n",
" [-2.11255761 0.79598925 2.01560658]\n",
" [-2.06205625 0.8240169 1.90932997]\n",
" [-2.00188885 0.71726948 1.90795323]\n",
" [-1.94172144 0.61052205 1.90657649]\n",
" [-1.99222281 0.5824944 2.0128531 ]\n",
" [-2.04272417 0.55446675 2.11912971]\n",
" [-2.10289157 0.66121418 2.12050645]]\n",
"DEBUG: Transition from [[-2.78934158 0.71842309 2.5382463 ]\n",
" [-2.78318495 0.68564889 2.44279691]\n",
" [-2.7060672 0.62608881 2.46760108]\n",
" [-2.71222384 0.65886302 2.56305047]] to [[-3.04297206 0.50237651 2.55847696]\n",
" [-3.02875668 0.48182779 2.52037292]\n",
" [-3.0145413 0.46127907 2.48226888]\n",
" [-2.97506802 0.45089977 2.50268697]\n",
" [-2.93559475 0.44052048 2.52310506]\n",
" [-2.94981013 0.4610692 2.5612091 ]\n",
" [-2.96402551 0.48161792 2.59931313]\n",
" [-3.00349879 0.49199721 2.57889504]]\n",
"DEBUG: Transition from [[-2.5815931 1.2890641 1.43598402]\n",
" [-2.51796273 1.24345834 1.37433346]\n",
" [-2.52486432 1.15839899 1.42653852]\n",
" [-2.58849469 1.20400476 1.48818907]] to [[-2.82180853 1.20793295 1.22508229]\n",
" [-2.7938148 1.17761934 1.20668953]\n",
" [-2.76582106 1.14730573 1.18829677]\n",
" [-2.7668108 1.12250887 1.22562032]\n",
" [-2.76780054 1.09771202 1.26294387]\n",
" [-2.79579428 1.12802562 1.28133662]\n",
" [-2.82378801 1.15833923 1.29972938]\n",
" [-2.82279827 1.18313609 1.26240583]]\n",
"DEBUG: Transition from [[-1.98687247 0.25574474 1.19653439]\n",
" [-1.88579515 0.25703647 1.19948241]\n",
" [-1.88708688 0.21498175 1.2894741 ]\n",
" [-1.9881642 0.21369002 1.28652607]] to [[-1.99024039e+00 6.69804091e-03 1.02234241e+00]\n",
" [-1.94701814e+00 3.46945314e-03 1.03648040e+00]\n",
" [-1.90379589e+00 2.40865375e-04 1.05061839e+00]\n",
" [-1.91815896e+00 -5.19759389e-03 1.09308108e+00]\n",
" [-1.93252203e+00 -1.06360532e-02 1.13554376e+00]\n",
" [-1.97574428e+00 -7.40746539e-03 1.12140577e+00]\n",
" [-2.01896654e+00 -4.17887763e-03 1.10726779e+00]\n",
" [-2.00460347e+00 1.25958164e-03 1.06480510e+00]]\n",
"DEBUG: Transition from [[-2.16791904 -0.15963204 2.18169731]\n",
" [-2.10238534 -0.15638639 2.10783346]\n",
" [-2.02786868 -0.13475887 2.17342663]\n",
" [-2.09340238 -0.13800452 2.24729047]] to [[-2.16326236 -0.4715555 2.16483056]\n",
" [-2.12555846 -0.46530675 2.14159306]\n",
" [-2.08785455 -0.45905799 2.11835556]\n",
" [-2.06853777 -0.43754339 2.15369435]\n",
" [-2.04922099 -0.41602879 2.18903315]\n",
" [-2.0869249 -0.42227755 2.21227065]\n",
" [-2.12462881 -0.4285263 2.23550815]\n",
" [-2.14394559 -0.4500409 2.20016935]]\n"
]
}
],
"source": [
"#mesh = examples.ram_horn()\n",
"#mesh = examples.twist()\n",
"#mesh = examples.twist_nonlinear()\n",
"#mesh = examples.twist_from_gen()\n",
"#mesh = examples.twisty_torus(1000)\n",
"#mesh = examples.ram_horn2()\n",
"#mesh = examples.branch_test()\n",
"mesh = examples.ram_horn_branch()"
]
},
{
"cell_type": "code",
"execution_count": 245,
"metadata": {},
"outputs": [],
"source": [
"def gen_wave(freq=2.0, a=2.0, d_ph=0.05, count=80):\n",
" ph = 0.0\n",
" while True:\n",
" xs = numpy.linspace(-10, 10, count)\n",
" ys = numpy.zeros(count)\n",
" zs = (numpy.sin(xs*freq + a*numpy.sin(ph)*numpy.pi) + 2)/2\n",
" b1 = numpy.stack((xs,ys,zs), axis=-1)\n",
" b2 = numpy.stack((xs,ys,zs - 2), axis=-1)\n",
" yield [numpy.vstack((b1, b2[::-1,:]))]\n",
" ph += d_ph\n",
"\n",
"#gen = meshgen.gen_inc_y(gen_wave())\n",
"#mesh = meshgen.gen2mesh(gen, 200, False, False, True, True)\n",
"# The closing method in gen2mesh is inappropriate because\n",
"# my boundary is not convex!"
]
},
{
"cell_type": "code",
"execution_count": 246,
"metadata": {},
"outputs": [],
"source": [
"def spiral3():\n",
" b = numpy.array([\n",
" [0, 0, 0],\n",
" [1, 0, 0],\n",
" [1, 0, 1],\n",
" [0, 0, 1],\n",
" ], dtype=numpy.float64) - [0.5, 0, 0.5]\n",
" b *= 0.3\n",
" b = meshutil.subdivide_boundary(b)\n",
" b = meshutil.subdivide_boundary(b)\n",
" bs = [b]\n",
" # since it needs a generator:\n",
" gen1 = itertools.repeat(bs)\n",
" gen2 = meshgen.gen_twisted_boundary(gen1, ang=-0.2, dx0=0.5)\n",
" gen3 = meshgen.gen_twisted_boundary(gen2, ang=0.07, dx0=1)\n",
" gen4 = meshgen.gen_twisted_boundary(gen3, ang=-0.03, dx0=3)\n",
" gen = meshgen.gen_inc_y(gen4, dy=0.1)\n",
" mesh = meshgen.gen2mesh(\n",
" gen, count=500, flip_order=True, close_first=True, close_last=True)\n",
" return mesh\n",
"\n",
"def profile():\n",
" pr = cProfile.Profile()\n",
" pr.enable()\n",
" spiral3()\n",
" pr.disable()\n",
" ps = pstats.Stats(pr)\n",
" return ps\n",
"\n",
"#ps = profile()\n",
"#ps.sort_stats('tottime').print_stats()"
]
},
{
"cell_type": "code",
"execution_count": 247,
"metadata": {},
"outputs": [],
"source": [
"# Work around some annoying-ass trimesh/threejs bug:\n",
"wtf = meshutil.Transform().scale(0.1).translate(15,0,0)\n",
"center = meshutil.Transform().translate(-0.5, -0.5, -0.5)\n",
"base = meshutil.cube(open_xz=False).transform(center)\n",
"base = base.transform(wtf)\n",
"mesh_out = mesh\n",
"# to enable:\n",
"#mesh_out = mesh_out.concat(base)\n",
"\n",
"mesh_fname = \"branch.stl\"\n",
"mesh_out.to_stl_mesh().save(mesh_fname)"
]
},
{
"cell_type": "code",
"execution_count": 248,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<iframe srcdoc=\"<!DOCTYPE html>\n",
"<html lang=&quot;en&quot;>\n",
" <head>\n",
" <title>trimesh: threejs viewer</title>\n",
" <meta charset=&quot;utf-8&quot;>\n",
" <meta name=&quot;viewport&quot; content=&quot;width=device-width, \n",
"\t\t user-scalable=no, \n",
"\t\t minimum-scale=1.0, \n",
"\t\t maximum-scale=1.0&quot;>\n",
" <style>\n",
" body {\n",
" margin: 0px;\n",
" overflow: hidden;\n",
" }\n",
" </style>\n",
" </head>\n",
" <body>\n",
" <div id=&quot;container&quot;></div>\n",
" <script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/three.js/106/three.min.js&quot;></script>\n",
" <script>THREE.TrackballControls=function(object,domElement){var _this=this;var STATE={NONE:-1,ROTATE:0,ZOOM:1,PAN:2,TOUCH_ROTATE:3,TOUCH_ZOOM_PAN:4};this.object=object;this.domElement=(domElement!==undefined)?domElement:document;this.enabled=true;this.screen={left:0,top:0,width:0,height:0};this.rotateSpeed=1.0;this.zoomSpeed=1.2;this.panSpeed=0.3;this.noRotate=false;this.noZoom=false;this.noPan=false;this.staticMoving=false;this.dynamicDampingFactor=0.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65 ,83 ,68 ];this.target=new THREE.Vector3();var EPS=0.000001;var lastPosition=new THREE.Vector3();var _state=STATE.NONE,_prevState=STATE.NONE,_eye=new THREE.Vector3(),_movePrev=new THREE.Vector2(),_moveCurr=new THREE.Vector2(),_lastAxis=new THREE.Vector3(),_lastAngle=0,_zoomStart=new THREE.Vector2(),_zoomEnd=new THREE.Vector2(),_touchZoomDistanceStart=0,_touchZoomDistanceEnd=0,_panStart=new THREE.Vector2(),_panEnd=new THREE.Vector2();this.target0=this.target.clone();this.position0=this.object.position.clone();this.up0=this.object.up.clone();var changeEvent={type:'change'};var startEvent={type:'start'};var endEvent={type:'end'};this.handleResize=function(){if(this.domElement===document){this.screen.left=0;this.screen.top=0;this.screen.width=window.innerWidth;this.screen.height=window.innerHeight;}else{var box=this.domElement.getBoundingClientRect();var d=this.domElement.ownerDocument.documentElement;this.screen.left=box.left+window.pageXOffset-d.clientLeft;this.screen.top=box.top+window.pageYOffset-d.clientTop;this.screen.width=box.width;this.screen.height=box.height;}};var getMouseOnScreen=(function(){var vector=new THREE.Vector2();return function getMouseOnScreen(pageX,pageY){vector.set((pageX-_this.screen.left)/_this.screen.width,(pageY-_this.screen.top)/_this.screen.height);return vector;};}());var getMouseOnCircle=(function(){var vector=new THREE.Vector2();return function getMouseOnCircle(pageX,pageY){vector.set(((pageX-_this.screen.width*0.5-_this.screen.left)/(_this.screen.width*0.5)),((_this.screen.height+2*(_this.screen.top-pageY))/_this.screen.width));return vector;};}());this.rotateCamera=(function(){var axis=new THREE.Vector3(),quaternion=new THREE.Quaternion(),eyeDirection=new THREE.Vector3(),objectUpDirection=new THREE.Vector3(),objectSidewaysDirection=new THREE.Vector3(),moveDirection=new THREE.Vector3(),angle;return function rotateCamera(){moveDirection.set(_moveCurr.x-_movePrev.x,_moveCurr.y-_movePrev.y,0);angle=moveDirection.length();if(angle){_eye.copy(_this.object.position).sub(_this.target);eyeDirection.copy(_eye).normalize();objectUpDirection.copy(_this.object.up).normalize();objectSidewaysDirection.crossVectors(objectUpDirection,eyeDirection).normalize();objectUpDirection.setLength(_moveCurr.y-_movePrev.y);objectSidewaysDirection.setLength(_moveCurr.x-_movePrev.x);moveDirection.copy(objectUpDirection.add(objectSidewaysDirection));axis.crossVectors(moveDirection,_eye).normalize();angle*=_this.rotateSpeed;quaternion.setFromAxisAngle(axis,angle);_eye.applyQuaternion(quaternion);_this.object.up.applyQuaternion(quaternion);_lastAxis.copy(axis);_lastAngle=angle;}else if(!_this.staticMoving&&_lastAngle){_lastAngle*=Math.sqrt(1.0-_this.dynamicDampingFactor);_eye.copy(_this.object.position).sub(_this.target);quaternion.setFromAxisAngle(_lastAxis,_lastAngle);_eye.applyQuaternion(quaternion);_this.object.up.applyQuaternion(quaternion);}\n",
"_movePrev.copy(_moveCurr);};}());this.zoomCamera=function(){var factor;if(_state===STATE.TOUCH_ZOOM_PAN){factor=_touchZoomDistanceStart/_touchZoomDistanceEnd;_touchZoomDistanceStart=_touchZoomDistanceEnd;_eye.multiplyScalar(factor);}else{factor=1.0+(_zoomEnd.y-_zoomStart.y)*_this.zoomSpeed;if(factor!==1.0&&factor>0.0){_eye.multiplyScalar(factor);}\n",
"if(_this.staticMoving){_zoomStart.copy(_zoomEnd);}else{_zoomStart.y+=(_zoomEnd.y-_zoomStart.y)*this.dynamicDampingFactor;}}};this.panCamera=(function(){var mouseChange=new THREE.Vector2(),objectUp=new THREE.Vector3(),pan=new THREE.Vector3();return function panCamera(){mouseChange.copy(_panEnd).sub(_panStart);if(mouseChange.lengthSq()){mouseChange.multiplyScalar(_eye.length()*_this.panSpeed);pan.copy(_eye).cross(_this.object.up).setLength(mouseChange.x);pan.add(objectUp.copy(_this.object.up).setLength(mouseChange.y));_this.object.position.add(pan);_this.target.add(pan);if(_this.staticMoving){_panStart.copy(_panEnd);}else{_panStart.add(mouseChange.subVectors(_panEnd,_panStart).multiplyScalar(_this.dynamicDampingFactor));}}};}());this.checkDistances=function(){if(!_this.noZoom||!_this.noPan){if(_eye.lengthSq()>_this.maxDistance*_this.maxDistance){_this.object.position.addVectors(_this.target,_eye.setLength(_this.maxDistance));_zoomStart.copy(_zoomEnd);}\n",
"if(_eye.lengthSq()<_this.minDistance*_this.minDistance){_this.object.position.addVectors(_this.target,_eye.setLength(_this.minDistance));_zoomStart.copy(_zoomEnd);}}};this.update=function(){_eye.subVectors(_this.object.position,_this.target);if(!_this.noRotate){_this.rotateCamera();}\n",
"if(!_this.noZoom){_this.zoomCamera();}\n",
"if(!_this.noPan){_this.panCamera();}\n",
"_this.object.position.addVectors(_this.target,_eye);_this.checkDistances();_this.object.lookAt(_this.target);if(lastPosition.distanceToSquared(_this.object.position)>EPS){_this.dispatchEvent(changeEvent);lastPosition.copy(_this.object.position);}};this.reset=function(){_state=STATE.NONE;_prevState=STATE.NONE;_this.target.copy(_this.target0);_this.object.position.copy(_this.position0);_this.object.up.copy(_this.up0);_eye.subVectors(_this.object.position,_this.target);_this.object.lookAt(_this.target);_this.dispatchEvent(changeEvent);lastPosition.copy(_this.object.position);};function keydown(event){if(_this.enabled===false)return;window.removeEventListener('keydown',keydown);_prevState=_state;if(_state!==STATE.NONE){return;}else if(event.keyCode===_this.keys[STATE.ROTATE]&&!_this.noRotate){_state=STATE.ROTATE;}else if(event.keyCode===_this.keys[STATE.ZOOM]&&!_this.noZoom){_state=STATE.ZOOM;}else if(event.keyCode===_this.keys[STATE.PAN]&&!_this.noPan){_state=STATE.PAN;}}\n",
"function keyup(event){if(_this.enabled===false)return;_state=_prevState;window.addEventListener('keydown',keydown,false);}\n",
"function mousedown(event){if(_this.enabled===false)return;event.preventDefault();event.stopPropagation();if(_state===STATE.NONE){_state=event.button;}\n",
"if(_state===STATE.ROTATE&&!_this.noRotate){_moveCurr.copy(getMouseOnCircle(event.pageX,event.pageY));_movePrev.copy(_moveCurr);}else if(_state===STATE.ZOOM&&!_this.noZoom){_zoomStart.copy(getMouseOnScreen(event.pageX,event.pageY));_zoomEnd.copy(_zoomStart);}else if(_state===STATE.PAN&&!_this.noPan){_panStart.copy(getMouseOnScreen(event.pageX,event.pageY));_panEnd.copy(_panStart);}\n",
"document.addEventListener('mousemove',mousemove,false);document.addEventListener('mouseup',mouseup,false);_this.dispatchEvent(startEvent);}\n",
"function mousemove(event){if(_this.enabled===false)return;event.preventDefault();event.stopPropagation();if(_state===STATE.ROTATE&&!_this.noRotate){_movePrev.copy(_moveCurr);_moveCurr.copy(getMouseOnCircle(event.pageX,event.pageY));}else if(_state===STATE.ZOOM&&!_this.noZoom){_zoomEnd.copy(getMouseOnScreen(event.pageX,event.pageY));}else if(_state===STATE.PAN&&!_this.noPan){_panEnd.copy(getMouseOnScreen(event.pageX,event.pageY));}}\n",
"function mouseup(event){if(_this.enabled===false)return;event.preventDefault();event.stopPropagation();_state=STATE.NONE;document.removeEventListener('mousemove',mousemove);document.removeEventListener('mouseup',mouseup);_this.dispatchEvent(endEvent);}\n",
"function mousewheel(event){if(_this.enabled===false)return;if(_this.noZoom===true)return;event.preventDefault();event.stopPropagation();switch(event.deltaMode){case 2:_zoomStart.y-=event.deltaY*0.025;break;case 1:_zoomStart.y-=event.deltaY*0.01;break;default:_zoomStart.y-=event.deltaY*0.00025;break;}\n",
"_this.dispatchEvent(startEvent);_this.dispatchEvent(endEvent);}\n",
"function touchstart(event){if(_this.enabled===false)return;event.preventDefault();switch(event.touches.length){case 1:_state=STATE.TOUCH_ROTATE;_moveCurr.copy(getMouseOnCircle(event.touches[0].pageX,event.touches[0].pageY));_movePrev.copy(_moveCurr);break;default:_state=STATE.TOUCH_ZOOM_PAN;var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;_touchZoomDistanceEnd=_touchZoomDistanceStart=Math.sqrt(dx*dx+dy*dy);var x=(event.touches[0].pageX+event.touches[1].pageX)/2;var y=(event.touches[0].pageY+event.touches[1].pageY)/2;_panStart.copy(getMouseOnScreen(x,y));_panEnd.copy(_panStart);break;}\n",
"_this.dispatchEvent(startEvent);}\n",
"function touchmove(event){if(_this.enabled===false)return;event.preventDefault();event.stopPropagation();switch(event.touches.length){case 1:_movePrev.copy(_moveCurr);_moveCurr.copy(getMouseOnCircle(event.touches[0].pageX,event.touches[0].pageY));break;default:var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;_touchZoomDistanceEnd=Math.sqrt(dx*dx+dy*dy);var x=(event.touches[0].pageX+event.touches[1].pageX)/2;var y=(event.touches[0].pageY+event.touches[1].pageY)/2;_panEnd.copy(getMouseOnScreen(x,y));break;}}\n",
"function touchend(event){if(_this.enabled===false)return;switch(event.touches.length){case 0:_state=STATE.NONE;break;case 1:_state=STATE.TOUCH_ROTATE;_moveCurr.copy(getMouseOnCircle(event.touches[0].pageX,event.touches[0].pageY));_movePrev.copy(_moveCurr);break;}\n",
"_this.dispatchEvent(endEvent);}\n",
"function contextmenu(event){if(_this.enabled===false)return;event.preventDefault();}\n",
"this.dispose=function(){this.domElement.removeEventListener('contextmenu',contextmenu,false);this.domElement.removeEventListener('mousedown',mousedown,false);this.domElement.removeEventListener('wheel',mousewheel,false);this.domElement.removeEventListener('touchstart',touchstart,false);this.domElement.removeEventListener('touchend',touchend,false);this.domElement.removeEventListener('touchmove',touchmove,false);document.removeEventListener('mousemove',mousemove,false);document.removeEventListener('mouseup',mouseup,false);window.removeEventListener('keydown',keydown,false);window.removeEventListener('keyup',keyup,false);};this.domElement.addEventListener('contextmenu',contextmenu,false);this.domElement.addEventListener('mousedown',mousedown,false);this.domElement.addEventListener('wheel',mousewheel,false);this.domElement.addEventListener('touchstart',touchstart,false);this.domElement.addEventListener('touchend',touchend,false);this.domElement.addEventListener('touchmove',touchmove,false);window.addEventListener('keydown',keydown,false);window.addEventListener('keyup',keyup,false);this.handleResize();this.update();};THREE.TrackballControls.prototype=Object.create(THREE.EventDispatcher.prototype);THREE.TrackballControls.prototype.constructor=THREE.TrackballControls;THREE.GLTFLoader=(function(){function GLTFLoader(manager){this.manager=(manager!==undefined)?manager:THREE.DefaultLoadingManager;this.dracoLoader=null;this.ddsLoader=null;}\n",
"GLTFLoader.prototype={constructor:GLTFLoader,crossOrigin:'anonymous',load:function(url,onLoad,onProgress,onError){var scope=this;var resourcePath;if(this.resourcePath!==undefined){resourcePath=this.resourcePath;}else if(this.path!==undefined){resourcePath=this.path;}else{resourcePath=THREE.LoaderUtils.extractUrlBase(url);}\n",
"scope.manager.itemStart(url);var _onError=function(e){if(onError){onError(e);}else{console.error(e);}\n",
"scope.manager.itemError(url);scope.manager.itemEnd(url);};var loader=new THREE.FileLoader(scope.manager);loader.setPath(this.path);loader.setResponseType('arraybuffer');if(scope.crossOrigin==='use-credentials'){loader.setWithCredentials(true);}\n",
"loader.load(url,function(data){try{scope.parse(data,resourcePath,function(gltf){onLoad(gltf);scope.manager.itemEnd(url);},_onError);}catch(e){_onError(e);}},onProgress,_onError);},setCrossOrigin:function(value){this.crossOrigin=value;return this;},setPath:function(value){this.path=value;return this;},setResourcePath:function(value){this.resourcePath=value;return this;},setDRACOLoader:function(dracoLoader){this.dracoLoader=dracoLoader;return this;},setDDSLoader:function(ddsLoader){this.ddsLoader=ddsLoader;return this;},parse:function(data,path,onLoad,onError){var content;var extensions={};if(typeof data==='string'){content=data;}else{var magic=THREE.LoaderUtils.decodeText(new Uint8Array(data,0,4));if(magic===BINARY_EXTENSION_HEADER_MAGIC){try{extensions[EXTENSIONS.KHR_BINARY_GLTF]=new GLTFBinaryExtension(data);}catch(error){if(onError)onError(error);return;}\n",
"content=extensions[EXTENSIONS.KHR_BINARY_GLTF].content;}else{content=THREE.LoaderUtils.decodeText(new Uint8Array(data));}}\n",
"var json=JSON.parse(content);if(json.asset===undefined||json.asset.version[0]<2){if(onError)onError(new Error('THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported. Use LegacyGLTFLoader instead.'));return;}\n",
"if(json.extensionsUsed){for(var i=0;i<json.extensionsUsed.length;++i){var extensionName=json.extensionsUsed[i];var extensionsRequired=json.extensionsRequired||[];switch(extensionName){case EXTENSIONS.KHR_LIGHTS_PUNCTUAL:extensions[extensionName]=new GLTFLightsExtension(json);break;case EXTENSIONS.KHR_MATERIALS_UNLIT:extensions[extensionName]=new GLTFMaterialsUnlitExtension();break;case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:extensions[extensionName]=new GLTFMaterialsPbrSpecularGlossinessExtension();break;case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:extensions[extensionName]=new GLTFDracoMeshCompressionExtension(json,this.dracoLoader);break;case EXTENSIONS.MSFT_TEXTURE_DDS:extensions[EXTENSIONS.MSFT_TEXTURE_DDS]=new GLTFTextureDDSExtension(this.ddsLoader);break;case EXTENSIONS.KHR_TEXTURE_TRANSFORM:extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]=new GLTFTextureTransformExtension();break;default:if(extensionsRequired.indexOf(extensionName)>=0){console.warn('THREE.GLTFLoader: Unknown extension &quot;'+extensionName+'&quot;.');}}}}\n",
"var parser=new GLTFParser(json,extensions,{path:path||this.resourcePath||'',crossOrigin:this.crossOrigin,manager:this.manager});parser.parse(onLoad,onError);}};function GLTFRegistry(){var objects={};return{get:function(key){return objects[key];},add:function(key,object){objects[key]=object;},remove:function(key){delete objects[key];},removeAll:function(){objects={};}};}\n",
"var EXTENSIONS={KHR_BINARY_GLTF:'KHR_binary_glTF',KHR_DRACO_MESH_COMPRESSION:'KHR_draco_mesh_compression',KHR_LIGHTS_PUNCTUAL:'KHR_lights_punctual',KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:'KHR_materials_pbrSpecularGlossiness',KHR_MATERIALS_UNLIT:'KHR_materials_unlit',KHR_TEXTURE_TRANSFORM:'KHR_texture_transform',MSFT_TEXTURE_DDS:'MSFT_texture_dds'};function GLTFTextureDDSExtension(ddsLoader){if(!ddsLoader){throw new Error('THREE.GLTFLoader: Attempting to load .dds texture without importing THREE.DDSLoader');}\n",
"this.name=EXTENSIONS.MSFT_TEXTURE_DDS;this.ddsLoader=ddsLoader;}\n",
"function GLTFLightsExtension(json){this.name=EXTENSIONS.KHR_LIGHTS_PUNCTUAL;var extension=(json.extensions&&json.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL])||{};this.lightDefs=extension.lights||[];}\n",
"GLTFLightsExtension.prototype.loadLight=function(lightIndex){var lightDef=this.lightDefs[lightIndex];var lightNode;var color=new THREE.Color(0xffffff);if(lightDef.color!==undefined)color.fromArray(lightDef.color);var range=lightDef.range!==undefined?lightDef.range:0;switch(lightDef.type){case'directional':lightNode=new THREE.DirectionalLight(color);lightNode.target.position.set(0,0,-1);lightNode.add(lightNode.target);break;case'point':lightNode=new THREE.PointLight(color);lightNode.distance=range;break;case'spot':lightNode=new THREE.SpotLight(color);lightNode.distance=range;lightDef.spot=lightDef.spot||{};lightDef.spot.innerConeAngle=lightDef.spot.innerConeAngle!==undefined?lightDef.spot.innerConeAngle:0;lightDef.spot.outerConeAngle=lightDef.spot.outerConeAngle!==undefined?lightDef.spot.outerConeAngle:Math.PI/4.0;lightNode.angle=lightDef.spot.outerConeAngle;lightNode.penumbra=1.0-lightDef.spot.innerConeAngle/lightDef.spot.outerConeAngle;lightNode.target.position.set(0,0,-1);lightNode.add(lightNode.target);break;default:throw new Error('THREE.GLTFLoader: Unexpected light type, &quot;'+lightDef.type+'&quot;.');}\n",
"lightNode.position.set(0,0,0);lightNode.decay=2;if(lightDef.intensity!==undefined)lightNode.intensity=lightDef.intensity;lightNode.name=lightDef.name||('light_'+lightIndex);return Promise.resolve(lightNode);};function GLTFMaterialsUnlitExtension(){this.name=EXTENSIONS.KHR_MATERIALS_UNLIT;}\n",
"GLTFMaterialsUnlitExtension.prototype.getMaterialType=function(){return THREE.MeshBasicMaterial;};GLTFMaterialsUnlitExtension.prototype.extendParams=function(materialParams,materialDef,parser){var pending=[];materialParams.color=new THREE.Color(1.0,1.0,1.0);materialParams.opacity=1.0;var metallicRoughness=materialDef.pbrMetallicRoughness;if(metallicRoughness){if(Array.isArray(metallicRoughness.baseColorFactor)){var array=metallicRoughness.baseColorFactor;materialParams.color.fromArray(array);materialParams.opacity=array[3];}\n",
"if(metallicRoughness.baseColorTexture!==undefined){pending.push(parser.assignTexture(materialParams,'map',metallicRoughness.baseColorTexture));}}\n",
"return Promise.all(pending);};var BINARY_EXTENSION_HEADER_MAGIC='glTF';var BINARY_EXTENSION_HEADER_LENGTH=12;var BINARY_EXTENSION_CHUNK_TYPES={JSON:0x4E4F534A,BIN:0x004E4942};function GLTFBinaryExtension(data){this.name=EXTENSIONS.KHR_BINARY_GLTF;this.content=null;this.body=null;var headerView=new DataView(data,0,BINARY_EXTENSION_HEADER_LENGTH);this.header={magic:THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0,4))),version:headerView.getUint32(4,true),length:headerView.getUint32(8,true)};if(this.header.magic!==BINARY_EXTENSION_HEADER_MAGIC){throw new Error('THREE.GLTFLoader: Unsupported glTF-Binary header.');}else if(this.header.version<2.0){throw new Error('THREE.GLTFLoader: Legacy binary file detected. Use LegacyGLTFLoader instead.');}\n",
"var chunkView=new DataView(data,BINARY_EXTENSION_HEADER_LENGTH);var chunkIndex=0;while(chunkIndex<chunkView.byteLength){var chunkLength=chunkView.getUint32(chunkIndex,true);chunkIndex+=4;var chunkType=chunkView.getUint32(chunkIndex,true);chunkIndex+=4;if(chunkType===BINARY_EXTENSION_CHUNK_TYPES.JSON){var contentArray=new Uint8Array(data,BINARY_EXTENSION_HEADER_LENGTH+chunkIndex,chunkLength);this.content=THREE.LoaderUtils.decodeText(contentArray);}else if(chunkType===BINARY_EXTENSION_CHUNK_TYPES.BIN){var byteOffset=BINARY_EXTENSION_HEADER_LENGTH+chunkIndex;this.body=data.slice(byteOffset,byteOffset+chunkLength);}\n",
"chunkIndex+=chunkLength;}\n",
"if(this.content===null){throw new Error('THREE.GLTFLoader: JSON content not found.');}}\n",
"function GLTFDracoMeshCompressionExtension(json,dracoLoader){if(!dracoLoader){throw new Error('THREE.GLTFLoader: No DRACOLoader instance provided.');}\n",
"this.name=EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;this.json=json;this.dracoLoader=dracoLoader;}\n",
"GLTFDracoMeshCompressionExtension.prototype.decodePrimitive=function(primitive,parser){var json=this.json;var dracoLoader=this.dracoLoader;var bufferViewIndex=primitive.extensions[this.name].bufferView;var gltfAttributeMap=primitive.extensions[this.name].attributes;var threeAttributeMap={};var attributeNormalizedMap={};var attributeTypeMap={};for(var attributeName in gltfAttributeMap){var threeAttributeName=ATTRIBUTES[attributeName]||attributeName.toLowerCase();threeAttributeMap[threeAttributeName]=gltfAttributeMap[attributeName];}\n",
"for(attributeName in primitive.attributes){var threeAttributeName=ATTRIBUTES[attributeName]||attributeName.toLowerCase();if(gltfAttributeMap[attributeName]!==undefined){var accessorDef=json.accessors[primitive.attributes[attributeName]];var componentType=WEBGL_COMPONENT_TYPES[accessorDef.componentType];attributeTypeMap[threeAttributeName]=componentType;attributeNormalizedMap[threeAttributeName]=accessorDef.normalized===true;}}\n",
"return parser.getDependency('bufferView',bufferViewIndex).then(function(bufferView){return new Promise(function(resolve){dracoLoader.decodeDracoFile(bufferView,function(geometry){for(var attributeName in geometry.attributes){var attribute=geometry.attributes[attributeName];var normalized=attributeNormalizedMap[attributeName];if(normalized!==undefined)attribute.normalized=normalized;}\n",
"resolve(geometry);},threeAttributeMap,attributeTypeMap);});});};function GLTFTextureTransformExtension(){this.name=EXTENSIONS.KHR_TEXTURE_TRANSFORM;}\n",
"GLTFTextureTransformExtension.prototype.extendTexture=function(texture,transform){texture=texture.clone();if(transform.offset!==undefined){texture.offset.fromArray(transform.offset);}\n",
"if(transform.rotation!==undefined){texture.rotation=transform.rotation;}\n",
"if(transform.scale!==undefined){texture.repeat.fromArray(transform.scale);}\n",
"if(transform.texCoord!==undefined){console.warn('THREE.GLTFLoader: Custom UV sets in &quot;'+this.name+'&quot; extension not yet supported.');}\n",
"texture.needsUpdate=true;return texture;};function GLTFMaterialsPbrSpecularGlossinessExtension(){return{name:EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,specularGlossinessParams:['color','map','lightMap','lightMapIntensity','aoMap','aoMapIntensity','emissive','emissiveIntensity','emissiveMap','bumpMap','bumpScale','normalMap','displacementMap','displacementScale','displacementBias','specularMap','specular','glossinessMap','glossiness','alphaMap','envMap','envMapIntensity','refractionRatio',],getMaterialType:function(){return THREE.ShaderMaterial;},extendParams:function(materialParams,materialDef,parser){var pbrSpecularGlossiness=materialDef.extensions[this.name];var shader=THREE.ShaderLib['standard'];var uniforms=THREE.UniformsUtils.clone(shader.uniforms);var specularMapParsFragmentChunk=['#ifdef USE_SPECULARMAP','\tuniform sampler2D specularMap;','#endif'].join('\\n');var glossinessMapParsFragmentChunk=['#ifdef USE_GLOSSINESSMAP','\tuniform sampler2D glossinessMap;','#endif'].join('\\n');var specularMapFragmentChunk=['vec3 specularFactor = specular;','#ifdef USE_SPECULARMAP','\tvec4 texelSpecular = texture2D( specularMap, vUv );','\ttexelSpecular = sRGBToLinear( texelSpecular );','\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture','\tspecularFactor *= texelSpecular.rgb;','#endif'].join('\\n');var glossinessMapFragmentChunk=['float glossinessFactor = glossiness;','#ifdef USE_GLOSSINESSMAP','\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );','\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture','\tglossinessFactor *= texelGlossiness.a;','#endif'].join('\\n');var lightPhysicalFragmentChunk=['PhysicalMaterial material;','material.diffuseColor = diffuseColor.rgb;','material.specularRoughness = clamp( 1.0 - glossinessFactor, 0.04, 1.0 );','material.specularColor = specularFactor.rgb;',].join('\\n');var fragmentShader=shader.fragmentShader.replace('uniform float roughness;','uniform vec3 specular;').replace('uniform float metalness;','uniform float glossiness;').replace('#include <roughnessmap_pars_fragment>',specularMapParsFragmentChunk).replace('#include <metalnessmap_pars_fragment>',glossinessMapParsFragmentChunk).replace('#include <roughnessmap_fragment>',specularMapFragmentChunk).replace('#include <metalnessmap_fragment>',glossinessMapFragmentChunk).replace('#include <lights_physical_fragment>',lightPhysicalFragmentChunk);delete uniforms.roughness;delete uniforms.metalness;delete uniforms.roughnessMap;delete uniforms.metalnessMap;uniforms.specular={value:new THREE.Color().setHex(0x111111)};uniforms.glossiness={value:0.5};uniforms.specularMap={value:null};uniforms.glossinessMap={value:null};materialParams.vertexShader=shader.vertexShader;materialParams.fragmentShader=fragmentShader;materialParams.uniforms=uniforms;materialParams.defines={'STANDARD':''};materialParams.color=new THREE.Color(1.0,1.0,1.0);materialParams.opacity=1.0;var pending=[];if(Array.isArray(pbrSpecularGlossiness.diffuseFactor)){var array=pbrSpecularGlossiness.diffuseFactor;materialParams.color.fromArray(array);materialParams.opacity=array[3];}\n",
"if(pbrSpecularGlossiness.diffuseTexture!==undefined){pending.push(parser.assignTexture(materialParams,'map',pbrSpecularGlossiness.diffuseTexture));}\n",
"materialParams.emissive=new THREE.Color(0.0,0.0,0.0);materialParams.glossiness=pbrSpecularGlossiness.glossinessFactor!==undefined?pbrSpecularGlossiness.glossinessFactor:1.0;materialParams.specular=new THREE.Color(1.0,1.0,1.0);if(Array.isArray(pbrSpecularGlossiness.specularFactor)){materialParams.specular.fromArray(pbrSpecularGlossiness.specularFactor);}\n",
"if(pbrSpecularGlossiness.specularGlossinessTexture!==undefined){var specGlossMapDef=pbrSpecularGlossiness.specularGlossinessTexture;pending.push(parser.assignTexture(materialParams,'glossinessMap',specGlossMapDef));pending.push(parser.assignTexture(materialParams,'specularMap',specGlossMapDef));}\n",
"return Promise.all(pending);},createMaterial:function(params){var material=new THREE.ShaderMaterial({defines:params.defines,vertexShader:params.vertexShader,fragmentShader:params.fragmentShader,uniforms:params.uniforms,fog:true,lights:true,opacity:params.opacity,transparent:params.transparent});material.isGLTFSpecularGlossinessMaterial=true;material.color=params.color;material.map=params.map===undefined?null:params.map;material.lightMap=null;material.lightMapIntensity=1.0;material.aoMap=params.aoMap===undefined?null:params.aoMap;material.aoMapIntensity=1.0;material.emissive=params.emissive;material.emissiveIntensity=1.0;material.emissiveMap=params.emissiveMap===undefined?null:params.emissiveMap;material.bumpMap=params.bumpMap===undefined?null:params.bumpMap;material.bumpScale=1;material.normalMap=params.normalMap===undefined?null:params.normalMap;if(params.normalScale)material.normalScale=params.normalScale;material.displacementMap=null;material.displacementScale=1;material.displacementBias=0;material.specularMap=params.specularMap===undefined?null:params.specularMap;material.specular=params.specular;material.glossinessMap=params.glossinessMap===undefined?null:params.glossinessMap;material.glossiness=params.glossiness;material.alphaMap=null;material.envMap=params.envMap===undefined?null:params.envMap;material.envMapIntensity=1.0;material.refractionRatio=0.98;material.extensions.derivatives=true;return material;},cloneMaterial:function(source){var target=source.clone();target.isGLTFSpecularGlossinessMaterial=true;var params=this.specularGlossinessParams;for(var i=0,il=params.length;i<il;i++){var value=source[params[i]];target[params[i]]=(value&&value.isColor)?value.clone():value;}\n",
"return target;},refreshUniforms:function(renderer,scene,camera,geometry,material){if(material.isGLTFSpecularGlossinessMaterial!==true){return;}\n",
"var uniforms=material.uniforms;var defines=material.defines;uniforms.opacity.value=material.opacity;uniforms.diffuse.value.copy(material.color);uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity);uniforms.map.value=material.map;uniforms.specularMap.value=material.specularMap;uniforms.alphaMap.value=material.alphaMap;uniforms.lightMap.value=material.lightMap;uniforms.lightMapIntensity.value=material.lightMapIntensity;uniforms.aoMap.value=material.aoMap;uniforms.aoMapIntensity.value=material.aoMapIntensity;var uvScaleMap;if(material.map){uvScaleMap=material.map;}else if(material.specularMap){uvScaleMap=material.specularMap;}else if(material.displacementMap){uvScaleMap=material.displacementMap;}else if(material.normalMap){uvScaleMap=material.normalMap;}else if(material.bumpMap){uvScaleMap=material.bumpMap;}else if(material.glossinessMap){uvScaleMap=material.glossinessMap;}else if(material.alphaMap){uvScaleMap=material.alphaMap;}else if(material.emissiveMap){uvScaleMap=material.emissiveMap;}\n",
"if(uvScaleMap!==undefined){if(uvScaleMap.isWebGLRenderTarget){uvScaleMap=uvScaleMap.texture;}\n",
"if(uvScaleMap.matrixAutoUpdate===true){uvScaleMap.updateMatrix();}\n",
"uniforms.uvTransform.value.copy(uvScaleMap.matrix);}\n",
"if(material.envMap){uniforms.envMap.value=material.envMap;uniforms.envMapIntensity.value=material.envMapIntensity;uniforms.flipEnvMap.value=material.envMap.isCubeTexture?-1:1;uniforms.reflectivity.value=material.reflectivity;uniforms.refractionRatio.value=material.refractionRatio;uniforms.maxMipLevel.value=renderer.properties.get(material.envMap).__maxMipLevel;}\n",
"uniforms.specular.value.copy(material.specular);uniforms.glossiness.value=material.glossiness;uniforms.glossinessMap.value=material.glossinessMap;uniforms.emissiveMap.value=material.emissiveMap;uniforms.bumpMap.value=material.bumpMap;uniforms.normalMap.value=material.normalMap;uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;if(uniforms.glossinessMap.value!==null&&defines.USE_GLOSSINESSMAP===undefined){defines.USE_GLOSSINESSMAP='';defines.USE_ROUGHNESSMAP='';}\n",
"if(uniforms.glossinessMap.value===null&&defines.USE_GLOSSINESSMAP!==undefined){delete defines.USE_GLOSSINESSMAP;delete defines.USE_ROUGHNESSMAP;}}};}\n",
"function GLTFCubicSplineInterpolant(parameterPositions,sampleValues,sampleSize,resultBuffer){THREE.Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);}\n",
"GLTFCubicSplineInterpolant.prototype=Object.create(THREE.Interpolant.prototype);GLTFCubicSplineInterpolant.prototype.constructor=GLTFCubicSplineInterpolant;GLTFCubicSplineInterpolant.prototype.copySampleValue_=function(index){var result=this.resultBuffer,values=this.sampleValues,valueSize=this.valueSize,offset=index*valueSize*3+valueSize;for(var i=0;i!==valueSize;i++){result[i]=values[offset+i];}\n",
"return result;};GLTFCubicSplineInterpolant.prototype.beforeStart_=GLTFCubicSplineInterpolant.prototype.copySampleValue_;GLTFCubicSplineInterpolant.prototype.afterEnd_=GLTFCubicSplineInterpolant.prototype.copySampleValue_;GLTFCubicSplineInterpolant.prototype.interpolate_=function(i1,t0,t,t1){var result=this.resultBuffer;var values=this.sampleValues;var stride=this.valueSize;var stride2=stride*2;var stride3=stride*3;var td=t1-t0;var p=(t-t0)/td;var pp=p*p;var ppp=pp*p;var offset1=i1*stride3;var offset0=offset1-stride3;var s2=-2*ppp+3*pp;var s3=ppp-pp;var s0=1-s2;var s1=s3-pp+p;for(var i=0;i!==stride;i++){var p0=values[offset0+i+stride];var m0=values[offset0+i+stride2]*td;var p1=values[offset1+i+stride];var m1=values[offset1+i]*td;result[i]=s0*p0+s1*m0+s2*p1+s3*m1;}\n",
"return result;};var WEBGL_CONSTANTS={FLOAT:5126,FLOAT_MAT3:35675,FLOAT_MAT4:35676,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,LINEAR:9729,REPEAT:10497,SAMPLER_2D:35678,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,UNSIGNED_BYTE:5121,UNSIGNED_SHORT:5123};var WEBGL_COMPONENT_TYPES={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array};var WEBGL_FILTERS={9728:THREE.NearestFilter,9729:THREE.LinearFilter,9984:THREE.NearestMipMapNearestFilter,9985:THREE.LinearMipMapNearestFilter,9986:THREE.NearestMipMapLinearFilter,9987:THREE.LinearMipMapLinearFilter};var WEBGL_WRAPPINGS={33071:THREE.ClampToEdgeWrapping,33648:THREE.MirroredRepeatWrapping,10497:THREE.RepeatWrapping};var WEBGL_TYPE_SIZES={'SCALAR':1,'VEC2':2,'VEC3':3,'VEC4':4,'MAT2':4,'MAT3':9,'MAT4':16};var ATTRIBUTES={POSITION:'position',NORMAL:'normal',TANGENT:'tangent',TEXCOORD_0:'uv',TEXCOORD_1:'uv2',COLOR_0:'color',WEIGHTS_0:'skinWeight',JOINTS_0:'skinIndex',};var PATH_PROPERTIES={scale:'scale',translation:'position',rotation:'quaternion',weights:'morphTargetInfluences'};var INTERPOLATION={CUBICSPLINE:undefined,LINEAR:THREE.InterpolateLinear,STEP:THREE.InterpolateDiscrete};var ALPHA_MODES={OPAQUE:'OPAQUE',MASK:'MASK',BLEND:'BLEND'};var MIME_TYPE_FORMATS={'image/png':THREE.RGBAFormat,'image/jpeg':THREE.RGBFormat};function resolveURL(url,path){if(typeof url!=='string'||url==='')return'';if(/^(https?:)?\\/\\//i.test(url))return url;if(/^data:.*,.*$/i.test(url))return url;if(/^blob:.*$/i.test(url))return url;return path+url;}\n",
"var defaultMaterial;function createDefaultMaterial(){defaultMaterial=defaultMaterial||new THREE.MeshStandardMaterial({color:0xFFFFFF,emissive:0x000000,metalness:1,roughness:1,transparent:false,depthTest:true,side:THREE.FrontSide});return defaultMaterial;}\n",
"function addUnknownExtensionsToUserData(knownExtensions,object,objectDef){for(var name in objectDef.extensions){if(knownExtensions[name]===undefined){object.userData.gltfExtensions=object.userData.gltfExtensions||{};object.userData.gltfExtensions[name]=objectDef.extensions[name];}}}\n",
"function assignExtrasToUserData(object,gltfDef){if(gltfDef.extras!==undefined){if(typeof gltfDef.extras==='object'){Object.assign(object.userData,gltfDef.extras);}else{console.warn('THREE.GLTFLoader: Ignoring primitive type .extras, '+gltfDef.extras);}}}\n",
"function addMorphTargets(geometry,targets,parser){var hasMorphPosition=false;var hasMorphNormal=false;for(var i=0,il=targets.length;i<il;i++){var target=targets[i];if(target.POSITION!==undefined)hasMorphPosition=true;if(target.NORMAL!==undefined)hasMorphNormal=true;if(hasMorphPosition&&hasMorphNormal)break;}\n",
"if(!hasMorphPosition&&!hasMorphNormal)return Promise.resolve(geometry);var pendingPositionAccessors=[];var pendingNormalAccessors=[];for(var i=0,il=targets.length;i<il;i++){var target=targets[i];if(hasMorphPosition){var pendingAccessor=target.POSITION!==undefined?parser.getDependency('accessor',target.POSITION):geometry.attributes.position;pendingPositionAccessors.push(pendingAccessor);}\n",
"if(hasMorphNormal){var pendingAccessor=target.NORMAL!==undefined?parser.getDependency('accessor',target.NORMAL):geometry.attributes.normal;pendingNormalAccessors.push(pendingAccessor);}}\n",
"return Promise.all([Promise.all(pendingPositionAccessors),Promise.all(pendingNormalAccessors)]).then(function(accessors){var morphPositions=accessors[0];var morphNormals=accessors[1];for(var i=0,il=morphPositions.length;i<il;i++){if(geometry.attributes.position===morphPositions[i])continue;morphPositions[i]=cloneBufferAttribute(morphPositions[i]);}\n",
"for(var i=0,il=morphNormals.length;i<il;i++){if(geometry.attributes.normal===morphNormals[i])continue;morphNormals[i]=cloneBufferAttribute(morphNormals[i]);}\n",
"for(var i=0,il=targets.length;i<il;i++){var target=targets[i];var attributeName='morphTarget'+i;if(hasMorphPosition){if(target.POSITION!==undefined){var positionAttribute=morphPositions[i];positionAttribute.name=attributeName;var position=geometry.attributes.position;for(var j=0,jl=positionAttribute.count;j<jl;j++){positionAttribute.setXYZ(j,positionAttribute.getX(j)+position.getX(j),positionAttribute.getY(j)+position.getY(j),positionAttribute.getZ(j)+position.getZ(j));}}}\n",
"if(hasMorphNormal){if(target.NORMAL!==undefined){var normalAttribute=morphNormals[i];normalAttribute.name=attributeName;var normal=geometry.attributes.normal;for(var j=0,jl=normalAttribute.count;j<jl;j++){normalAttribute.setXYZ(j,normalAttribute.getX(j)+normal.getX(j),normalAttribute.getY(j)+normal.getY(j),normalAttribute.getZ(j)+normal.getZ(j));}}}}\n",
"if(hasMorphPosition)geometry.morphAttributes.position=morphPositions;if(hasMorphNormal)geometry.morphAttributes.normal=morphNormals;return geometry;});}\n",
"function updateMorphTargets(mesh,meshDef){mesh.updateMorphTargets();if(meshDef.weights!==undefined){for(var i=0,il=meshDef.weights.length;i<il;i++){mesh.morphTargetInfluences[i]=meshDef.weights[i];}}\n",
"if(meshDef.extras&&Array.isArray(meshDef.extras.targetNames)){var targetNames=meshDef.extras.targetNames;if(mesh.morphTargetInfluences.length===targetNames.length){mesh.morphTargetDictionary={};for(var i=0,il=targetNames.length;i<il;i++){mesh.morphTargetDictionary[targetNames[i]]=i;}}else{console.warn('THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.');}}}\n",
"function createPrimitiveKey(primitiveDef){var dracoExtension=primitiveDef.extensions&&primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];var geometryKey;if(dracoExtension){geometryKey='draco:'+dracoExtension.bufferView\n",
"+':'+dracoExtension.indices\n",
"+':'+createAttributesKey(dracoExtension.attributes);}else{geometryKey=primitiveDef.indices+':'+createAttributesKey(primitiveDef.attributes)+':'+primitiveDef.mode;}\n",
"return geometryKey;}\n",
"function createAttributesKey(attributes){var attributesKey='';var keys=Object.keys(attributes).sort();for(var i=0,il=keys.length;i<il;i++){attributesKey+=keys[i]+':'+attributes[keys[i]]+';';}\n",
"return attributesKey;}\n",
"function cloneBufferAttribute(attribute){if(attribute.isInterleavedBufferAttribute){var count=attribute.count;var itemSize=attribute.itemSize;var array=attribute.array.slice(0,count*itemSize);for(var i=0,j=0;i<count;++i){array[j++]=attribute.getX(i);if(itemSize>=2)array[j++]=attribute.getY(i);if(itemSize>=3)array[j++]=attribute.getZ(i);if(itemSize>=4)array[j++]=attribute.getW(i);}\n",
"return new THREE.BufferAttribute(array,itemSize,attribute.normalized);}\n",
"return attribute.clone();}\n",
"function GLTFParser(json,extensions,options){this.json=json||{};this.extensions=extensions||{};this.options=options||{};this.cache=new GLTFRegistry();this.primitiveCache={};this.textureLoader=new THREE.TextureLoader(this.options.manager);this.textureLoader.setCrossOrigin(this.options.crossOrigin);this.fileLoader=new THREE.FileLoader(this.options.manager);this.fileLoader.setResponseType('arraybuffer');if(this.options.crossOrigin==='use-credentials'){this.fileLoader.setWithCredentials(true);}}\n",
"GLTFParser.prototype.parse=function(onLoad,onError){var parser=this;var json=this.json;var extensions=this.extensions;this.cache.removeAll();this.markDefs();Promise.all([this.getDependencies('scene'),this.getDependencies('animation'),this.getDependencies('camera'),]).then(function(dependencies){var result={scene:dependencies[0][json.scene||0],scenes:dependencies[0],animations:dependencies[1],cameras:dependencies[2],asset:json.asset,parser:parser,userData:{}};addUnknownExtensionsToUserData(extensions,result,json);assignExtrasToUserData(result,json);onLoad(result);}).catch(onError);};GLTFParser.prototype.markDefs=function(){var nodeDefs=this.json.nodes||[];var skinDefs=this.json.skins||[];var meshDefs=this.json.meshes||[];var meshReferences={};var meshUses={};for(var skinIndex=0,skinLength=skinDefs.length;skinIndex<skinLength;skinIndex++){var joints=skinDefs[skinIndex].joints;for(var i=0,il=joints.length;i<il;i++){nodeDefs[joints[i]].isBone=true;}}\n",
"for(var nodeIndex=0,nodeLength=nodeDefs.length;nodeIndex<nodeLength;nodeIndex++){var nodeDef=nodeDefs[nodeIndex];if(nodeDef.mesh!==undefined){if(meshReferences[nodeDef.mesh]===undefined){meshReferences[nodeDef.mesh]=meshUses[nodeDef.mesh]=0;}\n",
"meshReferences[nodeDef.mesh]++;if(nodeDef.skin!==undefined){meshDefs[nodeDef.mesh].isSkinnedMesh=true;}}}\n",
"this.json.meshReferences=meshReferences;this.json.meshUses=meshUses;};GLTFParser.prototype.getDependency=function(type,index){var cacheKey=type+':'+index;var dependency=this.cache.get(cacheKey);if(!dependency){switch(type){case'scene':dependency=this.loadScene(index);break;case'node':dependency=this.loadNode(index);break;case'mesh':dependency=this.loadMesh(index);break;case'accessor':dependency=this.loadAccessor(index);break;case'bufferView':dependency=this.loadBufferView(index);break;case'buffer':dependency=this.loadBuffer(index);break;case'material':dependency=this.loadMaterial(index);break;case'texture':dependency=this.loadTexture(index);break;case'skin':dependency=this.loadSkin(index);break;case'animation':dependency=this.loadAnimation(index);break;case'camera':dependency=this.loadCamera(index);break;case'light':dependency=this.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].loadLight(index);break;default:throw new Error('Unknown type: '+type);}\n",
"this.cache.add(cacheKey,dependency);}\n",
"return dependency;};GLTFParser.prototype.getDependencies=function(type){var dependencies=this.cache.get(type);if(!dependencies){var parser=this;var defs=this.json[type+(type==='mesh'?'es':'s')]||[];dependencies=Promise.all(defs.map(function(def,index){return parser.getDependency(type,index);}));this.cache.add(type,dependencies);}\n",
"return dependencies;};GLTFParser.prototype.loadBuffer=function(bufferIndex){var bufferDef=this.json.buffers[bufferIndex];var loader=this.fileLoader;if(bufferDef.type&&bufferDef.type!=='arraybuffer'){throw new Error('THREE.GLTFLoader: '+bufferDef.type+' buffer type is not supported.');}\n",
"if(bufferDef.uri===undefined&&bufferIndex===0){return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body);}\n",
"var options=this.options;return new Promise(function(resolve,reject){loader.load(resolveURL(bufferDef.uri,options.path),resolve,undefined,function(){reject(new Error('THREE.GLTFLoader: Failed to load buffer &quot;'+bufferDef.uri+'&quot;.'));});});};GLTFParser.prototype.loadBufferView=function(bufferViewIndex){var bufferViewDef=this.json.bufferViews[bufferViewIndex];return this.getDependency('buffer',bufferViewDef.buffer).then(function(buffer){var byteLength=bufferViewDef.byteLength||0;var byteOffset=bufferViewDef.byteOffset||0;return buffer.slice(byteOffset,byteOffset+byteLength);});};GLTFParser.prototype.loadAccessor=function(accessorIndex){var parser=this;var json=this.json;var accessorDef=this.json.accessors[accessorIndex];if(accessorDef.bufferView===undefined&&accessorDef.sparse===undefined){return Promise.resolve(null);}\n",
"var pendingBufferViews=[];if(accessorDef.bufferView!==undefined){pendingBufferViews.push(this.getDependency('bufferView',accessorDef.bufferView));}else{pendingBufferViews.push(null);}\n",
"if(accessorDef.sparse!==undefined){pendingBufferViews.push(this.getDependency('bufferView',accessorDef.sparse.indices.bufferView));pendingBufferViews.push(this.getDependency('bufferView',accessorDef.sparse.values.bufferView));}\n",
"return Promise.all(pendingBufferViews).then(function(bufferViews){var bufferView=bufferViews[0];var itemSize=WEBGL_TYPE_SIZES[accessorDef.type];var TypedArray=WEBGL_COMPONENT_TYPES[accessorDef.componentType];var elementBytes=TypedArray.BYTES_PER_ELEMENT;var itemBytes=elementBytes*itemSize;var byteOffset=accessorDef.byteOffset||0;var byteStride=accessorDef.bufferView!==undefined?json.bufferViews[accessorDef.bufferView].byteStride:undefined;var normalized=accessorDef.normalized===true;var array,bufferAttribute;if(byteStride&&byteStride!==itemBytes){var ibCacheKey='InterleavedBuffer:'+accessorDef.bufferView+':'+accessorDef.componentType;var ib=parser.cache.get(ibCacheKey);if(!ib){array=new TypedArray(bufferView);ib=new THREE.InterleavedBuffer(array,byteStride/elementBytes);parser.cache.add(ibCacheKey,ib);}\n",
"bufferAttribute=new THREE.InterleavedBufferAttribute(ib,itemSize,byteOffset/elementBytes,normalized);}else{if(bufferView===null){array=new TypedArray(accessorDef.count*itemSize);}else{array=new TypedArray(bufferView,byteOffset,accessorDef.count*itemSize);}\n",
"bufferAttribute=new THREE.BufferAttribute(array,itemSize,normalized);}\n",
"if(accessorDef.sparse!==undefined){var itemSizeIndices=WEBGL_TYPE_SIZES.SCALAR;var TypedArrayIndices=WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType];var byteOffsetIndices=accessorDef.sparse.indices.byteOffset||0;var byteOffsetValues=accessorDef.sparse.values.byteOffset||0;var sparseIndices=new TypedArrayIndices(bufferViews[1],byteOffsetIndices,accessorDef.sparse.count*itemSizeIndices);var sparseValues=new TypedArray(bufferViews[2],byteOffsetValues,accessorDef.sparse.count*itemSize);if(bufferView!==null){bufferAttribute.setArray(bufferAttribute.array.slice());}\n",
"for(var i=0,il=sparseIndices.length;i<il;i++){var index=sparseIndices[i];bufferAttribute.setX(index,sparseValues[i*itemSize]);if(itemSize>=2)bufferAttribute.setY(index,sparseValues[i*itemSize+1]);if(itemSize>=3)bufferAttribute.setZ(index,sparseValues[i*itemSize+2]);if(itemSize>=4)bufferAttribute.setW(index,sparseValues[i*itemSize+3]);if(itemSize>=5)throw new Error('THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.');}}\n",
"return bufferAttribute;});};GLTFParser.prototype.loadTexture=function(textureIndex){var parser=this;var json=this.json;var options=this.options;var textureLoader=this.textureLoader;var URL=window.URL||window.webkitURL;var textureDef=json.textures[textureIndex];var textureExtensions=textureDef.extensions||{};var source;if(textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]){source=json.images[textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS].source];}else{source=json.images[textureDef.source];}\n",
"var sourceURI=source.uri;var isObjectURL=false;if(source.bufferView!==undefined){sourceURI=parser.getDependency('bufferView',source.bufferView).then(function(bufferView){isObjectURL=true;var blob=new Blob([bufferView],{type:source.mimeType});sourceURI=URL.createObjectURL(blob);return sourceURI;});}\n",
"return Promise.resolve(sourceURI).then(function(sourceURI){var loader=THREE.Loader.Handlers.get(sourceURI);if(!loader){loader=textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]?parser.extensions[EXTENSIONS.MSFT_TEXTURE_DDS].ddsLoader:textureLoader;}\n",
"return new Promise(function(resolve,reject){loader.load(resolveURL(sourceURI,options.path),resolve,undefined,reject);});}).then(function(texture){if(isObjectURL===true){URL.revokeObjectURL(sourceURI);}\n",
"texture.flipY=false;if(textureDef.name!==undefined)texture.name=textureDef.name;if(source.mimeType in MIME_TYPE_FORMATS){texture.format=MIME_TYPE_FORMATS[source.mimeType];}\n",
"var samplers=json.samplers||{};var sampler=samplers[textureDef.sampler]||{};texture.magFilter=WEBGL_FILTERS[sampler.magFilter]||THREE.LinearFilter;texture.minFilter=WEBGL_FILTERS[sampler.minFilter]||THREE.LinearMipMapLinearFilter;texture.wrapS=WEBGL_WRAPPINGS[sampler.wrapS]||THREE.RepeatWrapping;texture.wrapT=WEBGL_WRAPPINGS[sampler.wrapT]||THREE.RepeatWrapping;return texture;});};GLTFParser.prototype.assignTexture=function(materialParams,mapName,mapDef){var parser=this;return this.getDependency('texture',mapDef.index).then(function(texture){if(!texture.isCompressedTexture){switch(mapName){case'aoMap':case'emissiveMap':case'metalnessMap':case'normalMap':case'roughnessMap':texture.format=THREE.RGBFormat;break;}}\n",
"if(parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]){var transform=mapDef.extensions!==undefined?mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]:undefined;if(transform){texture=parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(texture,transform);}}\n",
"materialParams[mapName]=texture;});};GLTFParser.prototype.assignFinalMaterial=function(mesh){var geometry=mesh.geometry;var material=mesh.material;var extensions=this.extensions;var useVertexTangents=geometry.attributes.tangent!==undefined;var useVertexColors=geometry.attributes.color!==undefined;var useFlatShading=geometry.attributes.normal===undefined;var useSkinning=mesh.isSkinnedMesh===true;var useMorphTargets=Object.keys(geometry.morphAttributes).length>0;var useMorphNormals=useMorphTargets&&geometry.morphAttributes.normal!==undefined;if(mesh.isPoints){var cacheKey='PointsMaterial:'+material.uuid;var pointsMaterial=this.cache.get(cacheKey);if(!pointsMaterial){pointsMaterial=new THREE.PointsMaterial();THREE.Material.prototype.copy.call(pointsMaterial,material);pointsMaterial.color.copy(material.color);pointsMaterial.map=material.map;pointsMaterial.lights=false;this.cache.add(cacheKey,pointsMaterial);}\n",
"material=pointsMaterial;}else if(mesh.isLine){var cacheKey='LineBasicMaterial:'+material.uuid;var lineMaterial=this.cache.get(cacheKey);if(!lineMaterial){lineMaterial=new THREE.LineBasicMaterial();THREE.Material.prototype.copy.call(lineMaterial,material);lineMaterial.color.copy(material.color);lineMaterial.lights=false;this.cache.add(cacheKey,lineMaterial);}\n",
"material=lineMaterial;}\n",
"if(useVertexTangents||useVertexColors||useFlatShading||useSkinning||useMorphTargets){var cacheKey='ClonedMaterial:'+material.uuid+':';if(material.isGLTFSpecularGlossinessMaterial)cacheKey+='specular-glossiness:';if(useSkinning)cacheKey+='skinning:';if(useVertexTangents)cacheKey+='vertex-tangents:';if(useVertexColors)cacheKey+='vertex-colors:';if(useFlatShading)cacheKey+='flat-shading:';if(useMorphTargets)cacheKey+='morph-targets:';if(useMorphNormals)cacheKey+='morph-normals:';var cachedMaterial=this.cache.get(cacheKey);if(!cachedMaterial){cachedMaterial=material.isGLTFSpecularGlossinessMaterial?extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].cloneMaterial(material):material.clone();if(useSkinning)cachedMaterial.skinning=true;if(useVertexTangents)cachedMaterial.vertexTangents=true;if(useVertexColors)cachedMaterial.vertexColors=THREE.VertexColors;if(useFlatShading)cachedMaterial.flatShading=true;if(useMorphTargets)cachedMaterial.morphTargets=true;if(useMorphNormals)cachedMaterial.morphNormals=true;this.cache.add(cacheKey,cachedMaterial);}\n",
"material=cachedMaterial;}\n",
"if(material.aoMap&&geometry.attributes.uv2===undefined&&geometry.attributes.uv!==undefined){console.log('THREE.GLTFLoader: Duplicating UVs to support aoMap.');geometry.addAttribute('uv2',new THREE.BufferAttribute(geometry.attributes.uv.array,2));}\n",
"if(material.isGLTFSpecularGlossinessMaterial){mesh.onBeforeRender=extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].refreshUniforms;}\n",
"mesh.material=material;};GLTFParser.prototype.loadMaterial=function(materialIndex){var parser=this;var json=this.json;var extensions=this.extensions;var materialDef=json.materials[materialIndex];var materialType;var materialParams={};var materialExtensions=materialDef.extensions||{};var pending=[];if(materialExtensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]){var sgExtension=extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS];materialType=sgExtension.getMaterialType();pending.push(sgExtension.extendParams(materialParams,materialDef,parser));}else if(materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]){var kmuExtension=extensions[EXTENSIONS.KHR_MATERIALS_UNLIT];materialType=kmuExtension.getMaterialType();pending.push(kmuExtension.extendParams(materialParams,materialDef,parser));}else{materialType=THREE.MeshStandardMaterial;var metallicRoughness=materialDef.pbrMetallicRoughness||{};materialParams.color=new THREE.Color(1.0,1.0,1.0);materialParams.opacity=1.0;if(Array.isArray(metallicRoughness.baseColorFactor)){var array=metallicRoughness.baseColorFactor;materialParams.color.fromArray(array);materialParams.opacity=array[3];}\n",
"if(metallicRoughness.baseColorTexture!==undefined){pending.push(parser.assignTexture(materialParams,'map',metallicRoughness.baseColorTexture));}\n",
"materialParams.metalness=metallicRoughness.metallicFactor!==undefined?metallicRoughness.metallicFactor:1.0;materialParams.roughness=metallicRoughness.roughnessFactor!==undefined?metallicRoughness.roughnessFactor:1.0;if(metallicRoughness.metallicRoughnessTexture!==undefined){pending.push(parser.assignTexture(materialParams,'metalnessMap',metallicRoughness.metallicRoughnessTexture));pending.push(parser.assignTexture(materialParams,'roughnessMap',metallicRoughness.metallicRoughnessTexture));}}\n",
"if(materialDef.doubleSided===true){materialParams.side=THREE.DoubleSide;}\n",
"var alphaMode=materialDef.alphaMode||ALPHA_MODES.OPAQUE;if(alphaMode===ALPHA_MODES.BLEND){materialParams.transparent=true;}else{materialParams.transparent=false;if(alphaMode===ALPHA_MODES.MASK){materialParams.alphaTest=materialDef.alphaCutoff!==undefined?materialDef.alphaCutoff:0.5;}}\n",
"if(materialDef.normalTexture!==undefined&&materialType!==THREE.MeshBasicMaterial){pending.push(parser.assignTexture(materialParams,'normalMap',materialDef.normalTexture));materialParams.normalScale=new THREE.Vector2(1,1);if(materialDef.normalTexture.scale!==undefined){materialParams.normalScale.set(materialDef.normalTexture.scale,materialDef.normalTexture.scale);}}\n",
"if(materialDef.occlusionTexture!==undefined&&materialType!==THREE.MeshBasicMaterial){pending.push(parser.assignTexture(materialParams,'aoMap',materialDef.occlusionTexture));if(materialDef.occlusionTexture.strength!==undefined){materialParams.aoMapIntensity=materialDef.occlusionTexture.strength;}}\n",
"if(materialDef.emissiveFactor!==undefined&&materialType!==THREE.MeshBasicMaterial){materialParams.emissive=new THREE.Color().fromArray(materialDef.emissiveFactor);}\n",
"if(materialDef.emissiveTexture!==undefined&&materialType!==THREE.MeshBasicMaterial){pending.push(parser.assignTexture(materialParams,'emissiveMap',materialDef.emissiveTexture));}\n",
"return Promise.all(pending).then(function(){var material;if(materialType===THREE.ShaderMaterial){material=extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(materialParams);}else{material=new materialType(materialParams);}\n",
"if(materialDef.name!==undefined)material.name=materialDef.name;if(material.map)material.map.encoding=THREE.sRGBEncoding;if(material.emissiveMap)material.emissiveMap.encoding=THREE.sRGBEncoding;if(material.specularMap)material.specularMap.encoding=THREE.sRGBEncoding;assignExtrasToUserData(material,materialDef);if(materialDef.extensions)addUnknownExtensionsToUserData(extensions,material,materialDef);return material;});};function addPrimitiveAttributes(geometry,primitiveDef,parser){var attributes=primitiveDef.attributes;var pending=[];function assignAttributeAccessor(accessorIndex,attributeName){return parser.getDependency('accessor',accessorIndex).then(function(accessor){geometry.addAttribute(attributeName,accessor);});}\n",
"for(var gltfAttributeName in attributes){var threeAttributeName=ATTRIBUTES[gltfAttributeName]||gltfAttributeName.toLowerCase();if(threeAttributeName in geometry.attributes)continue;pending.push(assignAttributeAccessor(attributes[gltfAttributeName],threeAttributeName));}\n",
"if(primitiveDef.indices!==undefined&&!geometry.index){var accessor=parser.getDependency('accessor',primitiveDef.indices).then(function(accessor){geometry.setIndex(accessor);});pending.push(accessor);}\n",
"assignExtrasToUserData(geometry,primitiveDef);return Promise.all(pending).then(function(){return primitiveDef.targets!==undefined?addMorphTargets(geometry,primitiveDef.targets,parser):geometry;});}\n",
"GLTFParser.prototype.loadGeometries=function(primitives){var parser=this;var extensions=this.extensions;var cache=this.primitiveCache;function createDracoPrimitive(primitive){return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(primitive,parser).then(function(geometry){return addPrimitiveAttributes(geometry,primitive,parser);});}\n",
"var pending=[];for(var i=0,il=primitives.length;i<il;i++){var primitive=primitives[i];var cacheKey=createPrimitiveKey(primitive);var cached=cache[cacheKey];if(cached){pending.push(cached.promise);}else{var geometryPromise;if(primitive.extensions&&primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]){geometryPromise=createDracoPrimitive(primitive);}else{geometryPromise=addPrimitiveAttributes(new THREE.BufferGeometry(),primitive,parser);}\n",
"cache[cacheKey]={primitive:primitive,promise:geometryPromise};pending.push(geometryPromise);}}\n",
"return Promise.all(pending);};GLTFParser.prototype.loadMesh=function(meshIndex){var parser=this;var json=this.json;var meshDef=json.meshes[meshIndex];var primitives=meshDef.primitives;var pending=[];for(var i=0,il=primitives.length;i<il;i++){var material=primitives[i].material===undefined?createDefaultMaterial():this.getDependency('material',primitives[i].material);pending.push(material);}\n",
"return Promise.all(pending).then(function(originalMaterials){return parser.loadGeometries(primitives).then(function(geometries){var meshes=[];for(var i=0,il=geometries.length;i<il;i++){var geometry=geometries[i];var primitive=primitives[i];var mesh;var material=originalMaterials[i];if(primitive.mode===WEBGL_CONSTANTS.TRIANGLES||primitive.mode===WEBGL_CONSTANTS.TRIANGLE_STRIP||primitive.mode===WEBGL_CONSTANTS.TRIANGLE_FAN||primitive.mode===undefined){mesh=meshDef.isSkinnedMesh===true?new THREE.SkinnedMesh(geometry,material):new THREE.Mesh(geometry,material);if(mesh.isSkinnedMesh===true&&!mesh.geometry.attributes.skinWeight.normalized){mesh.normalizeSkinWeights();}\n",
"if(primitive.mode===WEBGL_CONSTANTS.TRIANGLE_STRIP){mesh.drawMode=THREE.TriangleStripDrawMode;}else if(primitive.mode===WEBGL_CONSTANTS.TRIANGLE_FAN){mesh.drawMode=THREE.TriangleFanDrawMode;}}else if(primitive.mode===WEBGL_CONSTANTS.LINES){mesh=new THREE.LineSegments(geometry,material);}else if(primitive.mode===WEBGL_CONSTANTS.LINE_STRIP){mesh=new THREE.Line(geometry,material);}else if(primitive.mode===WEBGL_CONSTANTS.LINE_LOOP){mesh=new THREE.LineLoop(geometry,material);}else if(primitive.mode===WEBGL_CONSTANTS.POINTS){mesh=new THREE.Points(geometry,material);}else{throw new Error('THREE.GLTFLoader: Primitive mode unsupported: '+primitive.mode);}\n",
"if(Object.keys(mesh.geometry.morphAttributes).length>0){updateMorphTargets(mesh,meshDef);}\n",
"mesh.name=meshDef.name||('mesh_'+meshIndex);if(geometries.length>1)mesh.name+='_'+i;assignExtrasToUserData(mesh,meshDef);parser.assignFinalMaterial(mesh);meshes.push(mesh);}\n",
"if(meshes.length===1){return meshes[0];}\n",
"var group=new THREE.Group();for(var i=0,il=meshes.length;i<il;i++){group.add(meshes[i]);}\n",
"return group;});});};GLTFParser.prototype.loadCamera=function(cameraIndex){var camera;var cameraDef=this.json.cameras[cameraIndex];var params=cameraDef[cameraDef.type];if(!params){console.warn('THREE.GLTFLoader: Missing camera parameters.');return;}\n",
"if(cameraDef.type==='perspective'){camera=new THREE.PerspectiveCamera(THREE.Math.radToDeg(params.yfov),params.aspectRatio||1,params.znear||1,params.zfar||2e6);}else if(cameraDef.type==='orthographic'){camera=new THREE.OrthographicCamera(params.xmag/-2,params.xmag/2,params.ymag/2,params.ymag/-2,params.znear,params.zfar);}\n",
"if(cameraDef.name!==undefined)camera.name=cameraDef.name;assignExtrasToUserData(camera,cameraDef);return Promise.resolve(camera);};GLTFParser.prototype.loadSkin=function(skinIndex){var skinDef=this.json.skins[skinIndex];var skinEntry={joints:skinDef.joints};if(skinDef.inverseBindMatrices===undefined){return Promise.resolve(skinEntry);}\n",
"return this.getDependency('accessor',skinDef.inverseBindMatrices).then(function(accessor){skinEntry.inverseBindMatrices=accessor;return skinEntry;});};GLTFParser.prototype.loadAnimation=function(animationIndex){var json=this.json;var animationDef=json.animations[animationIndex];var pendingNodes=[];var pendingInputAccessors=[];var pendingOutputAccessors=[];var pendingSamplers=[];var pendingTargets=[];for(var i=0,il=animationDef.channels.length;i<il;i++){var channel=animationDef.channels[i];var sampler=animationDef.samplers[channel.sampler];var target=channel.target;var name=target.node!==undefined?target.node:target.id;var input=animationDef.parameters!==undefined?animationDef.parameters[sampler.input]:sampler.input;var output=animationDef.parameters!==undefined?animationDef.parameters[sampler.output]:sampler.output;pendingNodes.push(this.getDependency('node',name));pendingInputAccessors.push(this.getDependency('accessor',input));pendingOutputAccessors.push(this.getDependency('accessor',output));pendingSamplers.push(sampler);pendingTargets.push(target);}\n",
"return Promise.all([Promise.all(pendingNodes),Promise.all(pendingInputAccessors),Promise.all(pendingOutputAccessors),Promise.all(pendingSamplers),Promise.all(pendingTargets)]).then(function(dependencies){var nodes=dependencies[0];var inputAccessors=dependencies[1];var outputAccessors=dependencies[2];var samplers=dependencies[3];var targets=dependencies[4];var tracks=[];for(var i=0,il=nodes.length;i<il;i++){var node=nodes[i];var inputAccessor=inputAccessors[i];var outputAccessor=outputAccessors[i];var sampler=samplers[i];var target=targets[i];if(node===undefined)continue;node.updateMatrix();node.matrixAutoUpdate=true;var TypedKeyframeTrack;switch(PATH_PROPERTIES[target.path]){case PATH_PROPERTIES.weights:TypedKeyframeTrack=THREE.NumberKeyframeTrack;break;case PATH_PROPERTIES.rotation:TypedKeyframeTrack=THREE.QuaternionKeyframeTrack;break;case PATH_PROPERTIES.position:case PATH_PROPERTIES.scale:default:TypedKeyframeTrack=THREE.VectorKeyframeTrack;break;}\n",
"var targetName=node.name?node.name:node.uuid;var interpolation=sampler.interpolation!==undefined?INTERPOLATION[sampler.interpolation]:THREE.InterpolateLinear;var targetNames=[];if(PATH_PROPERTIES[target.path]===PATH_PROPERTIES.weights){node.traverse(function(object){if(object.isMesh===true&&object.morphTargetInfluences){targetNames.push(object.name?object.name:object.uuid);}});}else{targetNames.push(targetName);}\n",
"var outputArray=outputAccessor.array;if(outputAccessor.normalized){var scale;if(outputArray.constructor===Int8Array){scale=1/127;}else if(outputArray.constructor===Uint8Array){scale=1/255;}else if(outputArray.constructor==Int16Array){scale=1/32767;}else if(outputArray.constructor===Uint16Array){scale=1/65535;}else{throw new Error('THREE.GLTFLoader: Unsupported output accessor component type.');}\n",
"var scaled=new Float32Array(outputArray.length);for(var j=0,jl=outputArray.length;j<jl;j++){scaled[j]=outputArray[j]*scale;}\n",
"outputArray=scaled;}\n",
"for(var j=0,jl=targetNames.length;j<jl;j++){var track=new TypedKeyframeTrack(targetNames[j]+'.'+PATH_PROPERTIES[target.path],inputAccessor.array,outputArray,interpolation);if(sampler.interpolation==='CUBICSPLINE'){track.createInterpolant=function InterpolantFactoryMethodGLTFCubicSpline(result){return new GLTFCubicSplineInterpolant(this.times,this.values,this.getValueSize()/3,result);};track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline=true;}\n",
"tracks.push(track);}}\n",
"var name=animationDef.name!==undefined?animationDef.name:'animation_'+animationIndex;return new THREE.AnimationClip(name,undefined,tracks);});};GLTFParser.prototype.loadNode=function(nodeIndex){var json=this.json;var extensions=this.extensions;var parser=this;var meshReferences=json.meshReferences;var meshUses=json.meshUses;var nodeDef=json.nodes[nodeIndex];return(function(){if(nodeDef.isBone===true){return Promise.resolve(new THREE.Bone());}else if(nodeDef.mesh!==undefined){return parser.getDependency('mesh',nodeDef.mesh).then(function(mesh){var node;if(meshReferences[nodeDef.mesh]>1){var instanceNum=meshUses[nodeDef.mesh]++;node=mesh.clone();node.name+='_instance_'+instanceNum;node.onBeforeRender=mesh.onBeforeRender;for(var i=0,il=node.children.length;i<il;i++){node.children[i].name+='_instance_'+instanceNum;node.children[i].onBeforeRender=mesh.children[i].onBeforeRender;}}else{node=mesh;}\n",
"if(nodeDef.weights!==undefined){node.traverse(function(o){if(!o.isMesh)return;for(var i=0,il=nodeDef.weights.length;i<il;i++){o.morphTargetInfluences[i]=nodeDef.weights[i];}});}\n",
"return node;});}else if(nodeDef.camera!==undefined){return parser.getDependency('camera',nodeDef.camera);}else if(nodeDef.extensions&&nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL]&&nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light!==undefined){return parser.getDependency('light',nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light);}else{return Promise.resolve(new THREE.Object3D());}}()).then(function(node){if(nodeDef.name!==undefined){node.userData.name=nodeDef.name;node.name=THREE.PropertyBinding.sanitizeNodeName(nodeDef.name);}\n",
"assignExtrasToUserData(node,nodeDef);if(nodeDef.extensions)addUnknownExtensionsToUserData(extensions,node,nodeDef);if(nodeDef.matrix!==undefined){var matrix=new THREE.Matrix4();matrix.fromArray(nodeDef.matrix);node.applyMatrix(matrix);}else{if(nodeDef.translation!==undefined){node.position.fromArray(nodeDef.translation);}\n",
"if(nodeDef.rotation!==undefined){node.quaternion.fromArray(nodeDef.rotation);}\n",
"if(nodeDef.scale!==undefined){node.scale.fromArray(nodeDef.scale);}}\n",
"return node;});};GLTFParser.prototype.loadScene=function(){function buildNodeHierachy(nodeId,parentObject,json,parser){var nodeDef=json.nodes[nodeId];return parser.getDependency('node',nodeId).then(function(node){if(nodeDef.skin===undefined)return node;var skinEntry;return parser.getDependency('skin',nodeDef.skin).then(function(skin){skinEntry=skin;var pendingJoints=[];for(var i=0,il=skinEntry.joints.length;i<il;i++){pendingJoints.push(parser.getDependency('node',skinEntry.joints[i]));}\n",
"return Promise.all(pendingJoints);}).then(function(jointNodes){var meshes=node.isGroup===true?node.children:[node];for(var i=0,il=meshes.length;i<il;i++){var mesh=meshes[i];var bones=[];var boneInverses=[];for(var j=0,jl=jointNodes.length;j<jl;j++){var jointNode=jointNodes[j];if(jointNode){bones.push(jointNode);var mat=new THREE.Matrix4();if(skinEntry.inverseBindMatrices!==undefined){mat.fromArray(skinEntry.inverseBindMatrices.array,j*16);}\n",
"boneInverses.push(mat);}else{console.warn('THREE.GLTFLoader: Joint &quot;%s&quot; could not be found.',skinEntry.joints[j]);}}\n",
"mesh.bind(new THREE.Skeleton(bones,boneInverses),mesh.matrixWorld);}\n",
"return node;});}).then(function(node){parentObject.add(node);var pending=[];if(nodeDef.children){var children=nodeDef.children;for(var i=0,il=children.length;i<il;i++){var child=children[i];pending.push(buildNodeHierachy(child,node,json,parser));}}\n",
"return Promise.all(pending);});}\n",
"return function loadScene(sceneIndex){var json=this.json;var extensions=this.extensions;var sceneDef=this.json.scenes[sceneIndex];var parser=this;var scene=new THREE.Scene();if(sceneDef.name!==undefined)scene.name=sceneDef.name;assignExtrasToUserData(scene,sceneDef);if(sceneDef.extensions)addUnknownExtensionsToUserData(extensions,scene,sceneDef);var nodeIds=sceneDef.nodes||[];var pending=[];for(var i=0,il=nodeIds.length;i<il;i++){pending.push(buildNodeHierachy(nodeIds[i],scene,json,parser));}\n",
"return Promise.all(pending).then(function(){return scene;});};}();return GLTFLoader;})();var camera,controls,scene,renderer,tracklight;function autoFit(obj,camera,controls){const boundingBox=new THREE.Box3().setFromObject(obj);const boundingSphere=new THREE.Sphere();boundingBox.getBoundingSphere((target=boundingSphere));const scale=1.0;const angularSize=camera.fov*Math.PI/180*scale;const distanceToCamera=boundingSphere.radius/Math.tan(angularSize);const len=Math.sqrt(Math.pow(distanceToCamera,2)+\n",
"Math.pow(distanceToCamera,2)+\n",
"Math.pow(distanceToCamera,2));camera.position.set(len,len,len);controls.update();camera.lookAt(boundingSphere.center);controls.target.set(boundingSphere.center.x,boundingSphere.center.y,boundingSphere.center.z);camera.updateProjectionMatrix();}\n",
"function centerControls(obj,camera,controls){const boundingBox=new THREE.Box3().setFromObject(obj);const boundingSphere=new THREE.Sphere();boundingBox.getBoundingSphere((target=boundingSphere));controls.update();controls.target.set(boundingSphere.center.x,boundingSphere.center.y,boundingSphere.center.z);}\n",
"function init(){scene=new THREE.Scene();scene.background=new THREE.Color(0xffffff);tracklight=new THREE.DirectionalLight(0xffffff,1.75);scene.add(tracklight);base64_data=&quot;Z2xURgIAAABQYgAAzAMAAEpTT057InNjZW5lIjogMCwgInNjZW5lcyI6IFt7Im5vZGVzIjogWzBdfV0sICJhc3NldCI6IHsidmVyc2lvbiI6ICIyLjAiLCAiZ2VuZXJhdG9yIjogImh0dHBzOi8vZ2l0aHViLmNvbS9taWtlZGgvdHJpbWVzaCJ9LCAiYWNjZXNzb3JzIjogW3siYnVmZmVyVmlldyI6IDAsICJjb21wb25lbnRUeXBlIjogNTEyNSwgImNvdW50IjogMzU0MywgIm1heCI6IFs4MzJdLCAibWluIjogWzBdLCAidHlwZSI6ICJTQ0FMQVIifSwgeyJidWZmZXJWaWV3IjogMSwgImNvbXBvbmVudFR5cGUiOiA1MTI2LCAiY291bnQiOiA4MzMsICJ0eXBlIjogIlZFQzMiLCAiYnl0ZU9mZnNldCI6IDAsICJtYXgiOiBbMC41NjI4ODU1MTMxMDQxMjU1LCAzLjY2MTYwNTk3Njc2OTAzMywgNC45OTU2ODUzODYxMjE5NjRdLCAibWluIjogWy0zLjMzODIzNjk0ODI3MzIxOSwgLTAuNzk2NjI2MTcwNDgxNjIzNCwgMC4wXX1dLCAibWVzaGVzIjogW3sibmFtZSI6ICJnZW9tZXRyeV8wIiwgInByaW1pdGl2ZXMiOiBbeyJhdHRyaWJ1dGVzIjogeyJQT1NJVElPTiI6IDF9LCAiaW5kaWNlcyI6IDAsICJtb2RlIjogNH1dfV0sICJjYW1lcmFzIjogW3sibmFtZSI6ICJjYW1lcmFfOTJKR0o1IiwgInR5cGUiOiAicGVyc3BlY3RpdmUiLCAicGVyc3BlY3RpdmUiOiB7ImFzcGVjdFJhdGlvIjogMS4zMzMzMzMzMzMzMzMzMzMzLCAieWZvdiI6IDAuNzg1Mzk4MTYzMzk3NDQ4MywgInpuZWFyIjogMC4wMX19XSwgIm5vZGVzIjogW3sibmFtZSI6ICJ3b3JsZCIsICJjaGlsZHJlbiI6IFsxXX0sIHsibmFtZSI6ICJnZW9tZXRyeV8wX0dHN1BKWFJVS1JNUCIsICJtZXNoIjogMH1dLCAiYnVmZmVycyI6IFt7ImJ5dGVMZW5ndGgiOiAyNDE2OH1dLCAiYnVmZmVyVmlld3MiOiBbeyJidWZmZXIiOiAwLCAiYnl0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&quot;;;renderer=new THREE.WebGLRenderer({antialias:true});renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);loader=new THREE.GLTFLoader();loader.load(&quot;data:text/plain;base64,&quot;+base64_data,function(gltf){scene.add(gltf.scene);camera=gltf.cameras[0];controls=new THREE.TrackballControls(camera);controls.rotateSpeed=1.0;controls.zoomSpeed=1.2;controls.panSpeed=0.8;controls.noZoom=false;controls.noPan=false;controls.staticMoving=true;controls.dynamicDampingFactor=0.3;controls.keys=[65,83,68];controls.addEventListener(&quot;change&quot;,render);centerControls(scene,camera,controls);render();window.addEventListener(&quot;resize&quot;,onWindowResize,false);animate();});}\n",
"function onWindowResize(){camera.aspect=window.innerWidth/window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth,window.innerHeight);controls.handleResize();render();}\n",
"function animate(){requestAnimationFrame(animate);controls.update();}\n",
"function render(){tracklight.position.copy(camera.position);renderer.render(scene,camera);}\n",
"init();</script></body>\n",
"</html>\" width=\"100%\" height=\"500px\" style=\"border:none;\"></iframe>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 248,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = trimesh.Trimesh(vertices=mesh_out.v, faces=mesh_out.f)\n",
"# Also acceptable:\n",
"#m = trimesh.load_mesh(mesh_fname)\n",
"\n",
"#m.show()\n",
"scene = trimesh.Scene([m])\n",
"scene.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 4
}