Mercurial > hg > Members > e105711
changeset 0:9285dae61395 draft
1st commit,just play sounds.
author | e105711 <yomitan.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 25 Apr 2012 23:45:59 +0900 |
parents | |
children | 4fd71be3fb0b |
files | webGL/img/mainmode.png webGL/img/mainmode.txt webGL/img/press.png webGL/img/press.txt webGL/img/press_.png webGL/img/press_.txt webGL/img/title.png webGL/img/title.txt webGL/img/title_.png webGL/img/title_.txt webGL/sound/BGM.wav webGL/sound/cymbal.wav webGL/sound/ftom.wav webGL/sound/hclose.wav webGL/sound/hopen.wav webGL/sound/kick.wav webGL/sound/snare.wav webGL/src/J3DI.js webGL/src/J3DIMath.js webGL/src/const.js webGL/src/f4xml.js webGL/src/jkl-parsexml.js webGL/src/keybord.js webGL/src/mainfunc.js webGL/src/sound.js webGL/test2.html webGL/xml/font_pushstart.xml webGL/xml/mainmode.xml webGL/xml/press.xml webGL/xml/title.xml |
diffstat | 30 files changed, 4957 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/img/mainmode.txt Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,197 @@ +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 +kADH/wN2bjbTsOrFbgAAAABJRU5ErkJggg==
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/img/press.txt Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,206 @@ +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 +AElFTkSuQmCC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/img/press_.txt Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,215 @@ +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/img/title.txt Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,275 @@ +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 +YbPZsHjxYjEq4n1qrVaLfv36oV+/fsID2MYvNuL7E99Dq9WKSjCZTMIrmSXBAkui +Ba1atUJSUhKSk5NhNBqRlJSEDRs2oKSkpN4bXALjS0xKRHJyckTxBXbIer1eXISg +0WhgsViQkJCAU6dOwWq1Ci87vnGlpaUhJycH7dq1E/7HrVYr9uzZg+PHj4tLEELl +h72yOZ1OtGnTBjk5OejQoYPw2FZWVoZt27bh3LlzcDgcfqP7poa9xCUnJwuvcADw +6quvYufOnSgtLY3YaxKn+5FHHsHs2bPFRRFA6I5Aq9WKTkmj0SApKQmpqalo27Yt +WrVqhY4dO9YrNy29ruOxfTU1fBsUK4Fu3bph5MiRGDJkCHJycmA2m+H1eqFSqVBT +U4PPP/8c+/btw9///necPHlSzKTrUxS+E4rL1YXRaAQRCS90gTNYl8sVdlvxHbQB +l9pAWloasrKycO211woFqFarYbfb8c033+DQoUOoqakR79Dr9REN6K6EHoiUqFiC +NZU1dahgMpnom2++ISL/c5xERNXV1ZSenk6AvwUsW8xOnTqVqqqq6Oy5s1RVVSUs +BEOll5+76aabaPfu3XXM/L1eL7311ltkMpnEu95/fxEREVVWVgb1axyuZSWX1fLl +yxscn69l5NNPP01/+9vfaPXq1bRv3z4qLS2liooKqqqqEn7Gp0+fLuLgZzMzM2nx +4sV+luy+uN1uKisroxdffJHatWtHAOpY/PL/U1JSaP78+X6epQLj2rt3L915553i +iFBTW2yyFf78+fOJiIRMsGzt3buXrr32WvHbSK32w7GcBi4dZSouLqbTp09TeXk5 +VVZW+pV5fXLT0uuav+Oz4PHQvsLtCxtjTe1rQZ+VlUWFhYV+6WQHM4F9IdElvwxv +vvlm2P7Mk5KSqG/fvnTvvffSc889F1QOvF4vlZWV1QkVFRX0448/EhHRb37zm7Dy +qdVqRZo6depEjz76KO3bt6+Ow5zA91utVlq7di3dfffdlJycLOKq79RDU+qBt99+ +208PRBii05ldSWXM7yooKCAif3eB/PdDDz1URxC4MOfMmVPnOXa3yekuKSkhg8Eg +KnbixInid16vl2w2m3BzyJXIXpG0Wm0dRyXcWJxOJ7lcLnFcYObMmfUKrEajoa1b +tzY4Ps5Du3btRP6CEdhZsFBNnTpVNHKXy0WVlZVUXl5O5eXlVF1dTQ6Hw69jcLlc +NGzYMFEWvv/27NmTTp48SUSXjg1VVVVRWVmZiIsbPr9v48aNlJaW5pePpggsG2PH +jiUiCtowbTYbjR8/3u/CkkiUMju3CdUhAaAuXboE7YRY7liJhpKbq6Wu165dK97P +5ROr9hVuX9hQZcxlYTabae7cuSJ9wRQvw/2Sw+EQedq9eze1bds2aB/M/09KSqKz +5876yX2kRJJPbj8prVLo5Zdf9lP89b3f9/vKykq6//77xbsud/TvSuqBSPqgZrdM +DdQaxnz55ZcAave4gNo9vxtuuAGA/1Ig/f/ehtFoFL/l4yZsqMNLk99++61Ymhgz +Zgw++OAD2O12cXGF7zVpHO/UqVPx/PPPo7q6Oug1ar77L3q9HkBdo4dgqFQqER8v +BTUkPp1O53ctIBGJsvNdYuL8OBwOPPHEE5g7dy7sdrson8TExDp5Y/hChc2bN2PQ +oEHYtWuXWNrt2rUrNm3ahPT0dLG86Vt3gXHZbDYMHz4cn332GUaOHImKioomc1DP +F5OsX78eBw4cQFZWlrCA5j04jUaDFStWoKioCAUFBdi9ezcURYFWqw1673Ag4aTb +9/5bj8cjlsu5fvhoSX1y09LrOvD4Yjy0r6aAl+1TUlKwYsUKDBs2TNjJKIqCkpIS +LFu2DDabDUQEk8mEyZMno1evXn5Lx1arFf369cOCBQtwxx13hHwfEcHtcqOqqgo1 +NTVQK2qktUmrswRNRCgvL6/zvKIoqKmpgdForPeqW76QZeDAgVi+fDnat28PIoLN +ZoNOp4OiKLhw4QIWLFiAU6dOibLo1KkTpk6dipSUFLGvbLFYsGDBAtx7772YPHky +SktLQ24lXEk9EGl/FZWZxZWcGfPzFotFjFj5PcHcb/LveaSSnZ1Ne/fuJavVWmf0 +xaObP//5zwSAevToQZWVlcIvNo80fWcvHMfPP/8s3nnLLbfQG2+8QWfPnQ26zBPp +Mtq//uu/0ptvvknnz59vcHwmk4nmz59PlZWVQWdfHMfDDz9MAGjSpElEVOtk5bvv +vqM//OEPlJeXR7NmzaKCggJxNaDvKJ1/v2PnDlHmvq4diYiOHD0i4srPz6c//OEP +dOjQISIiv7Rxmt54440GjTYjCTxKZzeWgUurvr6mvV4vLVu2jHr16iWej8bVnmaz +mV5++WWqqKholNy01Lrm9pCTkxN37au+vjDSmbHvbHX79u1+cfzjH/+gW265Jehq +i0ajoSlTptTJA8vzL3/5SwKCu3ZVFEVc5mM2m6lNmzaij/Xlchf/cAhnRjxmzBgi +qm1b3JeePn2acnNzyWQy1Vkl0Wg0ZDKZ6I477qDTp08LmeR6O3/+PGVnZ/u9xzdc +ST0Qoa5rfsrY952h9o1ramqC7htzMBqNZLFYhDAECux//Md/EABauXKl+HzkyJHU +pk0bOnHie1FhvExBRLRq1ao6+UtISKC2bduKeLjyGrJkpSgKJSQkUHp6eqPis1gs +1LlzZ/rss8+CxjFjxgxKTEyk6upqIiI6fvw43XHHHXUEmzuCX//61351TVTbSefm +5hIAevzxx4mI6Ntvvw0aFzecP/7xj3Xq0+v1ksPhaJAnrEgDN9S3337br0x84aVL +TueHH35IPXv2FGUSzr5VOPWckZFBq1atapTctOS65nKKt/YVLWXMef+f//kfIiK/ +LYIRI0YQcEmhsk9/vlWJy5vrIXA7YPPmzfXKZzAPXL40pj/n9I0YMSJo+rZv306p +qakibt/8cR75nampqVRcXCye5zisVitlZmb6telg4UrpgTBDdDqxK62MWZiWLFni +V6G+lZqTk+NX+Rx8ZzC+s2vfdD/00EPUq1cvUQGDBw8Wz2dlZYmRPb9r165dwpiF +Bcj3BpfGNky9Xt/o+LhDDRUHX4zw61//Wty+9cknnwjjCEVR/G4r8m3477zzjhBM +X2GePXs2JSYmktvtpk2bNlFKq5Sgcen1eiEXq1evJqK6HSH7iG5qN4JcRh999JFf +XgJxOp2i/t1uNy1cuNBPiTTENSu7wGys3LT0uo5Ge2iq+KIRB/dPffr08Ssf/nfD +hg2k0WiC9qXcN6ampvrd+MVUVFT41c3l+tfA/pEJ5+Kfy8XbpUuXOquaRJf2fjMy +MsKqM/6+Xbt2YobM7ZLoklJnnROqjJtSD0Q6IG+2rlV4b7i0tBQA/Jwp8N5dnz59 +/H7LuFwuse8cyjmIx+PBpEmTAACjR4/Gjh07xP7AgQMH8Itf/AKjR4/G008/jdzc +XAwfPhznzp0TewROp9Nvv4L3IBrqzcnhcDQ6vsDjLoFx8J7eyJEj8cwzz2Dnrp2Y +NGkSKioqoNfr4fF44HA4YLfbYbfb4XQ6xbPLly8HULunxmX16GOP4siRIzhy5Aju +uusuXCi/AIPBUCcuPkMOAEuWLAFQaxvA6czKyhL5aGrcbjcmT56MZcuWCZerge8N +dE05ZcoUHD16FK+88gpatWoljkBE4g0u8DhJQ+Wmpdd1NNpDU8bXWLhsb775ZgC1 +R+Q4XYMHD0br1q3r7G3zbxVFQVlZGTZu3Oj3PBEhKSkJ3TK7+b0nEAo4QxzOb1jm +wjnT/uqrryI5ORkulwsqlUqkb/Lkyfjhhx/COkLIe7elpaV45JFHAEDsp9vtdgwe +PBhPPPEEgLo2BvzbptQDkR7HbPbK+OeffwZQ13NSuAQKDVfamDFj8Oijj+Ldd9/F +li1b/IRDq9XC7XZj3bp1mDt3LtasWSM6q1BC6NsYokE04guMgzvICRMmIDExEZPv +mwyr1QqdThfSGIPjOHToEC5evCgcDzCtU1ujXbt2yM/PR1lZ2WUbGce1a9cu2O12 +URecrvHjxyMhIQEul6tJDWnYcMrr9eK+++7DvffeKww7gjki8FXKiqKgoKAAJ0+e +xK9+9SsQkZ/xVKRES25ael3HY/uKBlwXvukgIuj1erRu3RpA8AEDK+ivvvoKQG1+ +uD769esH4Mq6utTpdHC73Rg2bBjGjRsHt9stzuRqNBrs3LUT69atg6IoYZ9P5t+t +WbMGBw4cEPGxgdUTTzyBLl26iIFxKK6UHrgczVYZM9H000tEouHffvvt8Hg8ePnl +lwHArwNmz0R6vR4GgwF6vT5s7zbxDpfnnDlz8P2J78WssD4cDkcdAeQR+oYN67Ft +2zZoNJrLNjLucCoqKuq1xGxq2OWjoihYunQpMjMz8fnnnwvL5vqUsk6nw/Lly7F8 ++XJYLBbxWTwh6zp+YdnasGEDbDYbjEYjbDab6Oyrqqpw5swZAMEnIqyga2pqAMR+ +UAHUKrz8/Hy/z1nmPlz6Yb1KMxisIBctWgQAYoWDZ8kPPvgggPBXOWKlB5qtMmbh +slgsUY+bK3Px4sU4ceKEGAEFwktvwTqn5grfELRw4UIACFuwgjV27iTee+9SXOHO +ZnlmGmt4u0Gn0+HkyZPIzc3F7bffjqNHj/q54bucUh47diy+/vprZGdnw+l0iiMy +8YCs6/iFZ41nzpwRysRgMIiZH28p1OftKV76JY1GA4/Hg2uvvRajR48WnwGXjhg5 +nU6sXr0aQPhyyHAet2zZAqD2GBor9WnTpsFisYijeOFypfVAi1HG0Vxu4bg3bdoU +9bjjGRa0vXv34vz5836fRYLvmdiamhps3bq1wXHFA76j9fXr1yM7Oxt33nknDh48 +6Kd4fRuiSqUSjbdDhw7YuXMnhg4dKq5qjDWyruMfntnxykxBQQEmTJiAtm3bYu3a +tWFdpRnrve/AdAwfPtxvqZf72urqarHlGOngjAeC33//PSoqKqBSqcQZa7fbjdTU +VAwZMsQvHeFwpfVAs9UyXAFt2rQB4C9s3Nnxfkm4+8m+HYvVakVxcTGA+BldNjXc +gRYWFsLpdNZxXNIQXC6XWCprzrBTft5TXbFiBfr164dx48bh8OHDwpe00+n060x8 +L2vYsmULBg4cGBd3bsu6bh6wQj527Bhee+01fPzxx6ioqBAzTYadzwTWY7zsfXNa +2TCPFRun7+9//zuqq6vr5CuSuB0OB44ePer3Gcf/L//yLwDCG5TESg80W2XMa/WB +lQvUeoH55z//CaBhxl1OpxMXL14EEHtBvlJwPqPtAD/Wo/Jowvtber0eLpcLhYWF +6NevHyZMmIATJ04II5XAjpLLYPHixUhLS4t4ySzayLpuPrBC5n1Jtrjniy34bnff +ixl0Oh169+6N4cOHA0CDDQijhcvlgsFgQE5ODoDabQxuJ4cPHwYQ2czVF77AIXAC +xu+5/vrrAUS+YnMl9UCzVMZcwHq9Hp06dQJQq4x9Oxmr1er3WaRcLUo4kIZapoei +pZUjH9UBal36ffTRR+jbty+effZZ4UYz8IgSu4l89tlnAcTH9oes6+YBK1qHwyFu +4HK73eLYmclkQu/evTFt2jQsXLgQR44cwb59+zB27FgADVdy0YD7a41GE7K/bqwR +H8f3008/Aah7VG7MmDFISEgQhoaRcKVkuln6pmZfounp6UhKSgJQOyJnw4c1a9bg +4sWLV+z6PcnVB5+nVBRF3HX8/PPPY+3atXjvvffQu3dvMYMBII5bTJs2DW+88QaO +HTsWk6v4JM0P9pfscDiE4kpPT8fw4cMxaNAg5Obm4pprron5DLihNHZQyP1/dXV1 +0O/jYeBbH/GfwiDwyMb3LkmGlz34EolYjgibErkc2DQYDAYRwoWtrr1eL/R6Pb76 +6isMGjQI69atqzMY5Ht72aI0lkvVktDEU/vii0gcDgcSEhIwbtw4FBYW4tSpU1iy +ZAkeeughdOzYUVhWW61W7N69GzNmzGiwhXJTEe2VmEBCzWKbg91Ps9RUXLADBgyo +853BYIDL5cLnn3/u99uWhlwObBrCdTYQDJ4p6/V6XLx4Effeey82btyIvn37ihk0 +Dw7vvPNO/PnPf27U+yRNR7y0L145MZlMmDRpEp555ml07tyljhOQsrIyLFmyBEVF +RSguLobNZkNNTQ10Oh1yc3PhcrniYmISaoba2MEPl0dCQkLQ75vDoDf2tRMhbM6f +nJyMu+++G0CtcQIvCe7cuRMnTpwAEH0DlXjBZDIBiK8RfHPHYDBg7NixSE1Nhcvl +wvvvv98gZelwOGAwGFBeXo6CggJs2rRJdBbcKfTq1UsYgTXVtZCShhMP7YvPsXft +2hVLlizBgAEDQETibLvRaMSXX36J559/Htu3b4fVahVyxNcDsrzFQz9BRKipqUFy +crL4jNPV2IECt69WrVoBqFX67Ljn5MmTQhfEa1trdsqYTd+HDRuGNm3aCEtDoHYJ +5I033hDW1i3Nuw/nMS0tDUDz2AuJd1gZarVa/Od//idSUlJQUVGBjz76SNztG2kD +ZiW+c+dOcT8yn30E4rdDuNqJl/bFM+IePXqgqKgIrVu3Fufd+Rjd1KlTsWTJEqFk +dDqd8Mvs6y8aiO1Mn91d1tTUYPPmTZg0abKw7WF4RtvQdPJWZc+ePQDU1hsPdlev +Xi2M3+JVJzS7npxnv7NmzQLgfxm4TqfDnj17sH79egCNt9CLR/hIzI033ghAKuNo +QkRwuS+dJzabzcjMzATQ8CUuvV4Pu92OTz75BID/Kk1zWDa7GomH9sWrf2azGR98 +8IFQxDqdTgwWfvnLX+K9996DWq2GTqcTtjOBKznxstzOM989ey4dPeJBAivk3Nzc +BitKbktmsxnXX9/H7zOGHdvEwwpBKJpVT85n7EaNGoVhw4b57YNw5T799NOw2+1x +5XYwWnBeU1JS0L9/fwCyU482RoNReM8aOHAggIZ3yNzw+Ygd4O/Vp7q6Wi5RxxHx +0r5YQY0bNw433ngjbDabOEKnKApee+01rFu3DkajEQ6HI+iNYky8DNY5fdu3bwdQ +67KS03fdddcJRziRljm3s7Zt29ZxAsU2RGvXrvVLRzwSHzUVBmzW37p1a7z22mvi +MwBi1Pjpp5/i888/h6IoLXJWzPm97bbbYDab/a61k0QHIhLlPH78eOG/uSEEeolT +q9XCqpWt/ZvrUZSWSLy0L15B+dWvfgWgVkbYucff/vY3AOFZSDflzDiSsuE8HT58 +GPv27RM3G7HLypSUFGGQG6ky5nobOnSoWKYHahXvrl27cOrUKb90xCPNQhkriiJG +UG+++SYyMzP97sHU6XQ4ePAgpk2bFuOURk4kI1e73Q6z2YyCggIAclbcFPje0Tpk +yBB07doVQMOUJl8MMSTnkl9cXzn++uuv/d4naRqaW/vilZKEhAQMHjwYgL9xU2Vl +pbjD/XLHhPi76667TsTbUBpyHElRFBgMBr/38jL0/PnzAdQqRo6fvYVFOgDieMaP +Hw8AdVZLX3/9dfcr/5wAAA8WSURBVGFDFM/EvTLW6XRQqVRwOp145ZVXMHHiRGG0 +5WucMHXqVJSVlYnRY7zDAhduI+Fzr7/97W+RlZUlbtoJjE8SHXiwl5eXByDyzoyV +d6dOndA/+9KSJ1t2lpSUoKioCEDLtGuIB1pq+wpncMGuIdu3b48HHngAAOr1hX65 +cgr2Tp1OJy7pCSwbPhdtt9vFPeBArawXFhZi//79MBgMwtYHuHS1Yvv27cVZ/HDg +rctBgwZh9OjRwliMJ2l8R7Lv++OVuFTGGo1GuHxjJ/YLFixAQUGBUMQulwtqtRoq +lQo5OTnYs2eP2FeJJ3jm89133wGo7aRZ2MaOHXvZa9C0Wq0wBBo9ejT+9Kc/Yc+e +PXjkkUdQUVFxBXJwdcJ1kpeXh+HDh8Nut4vjIvWhKIrogGbPni1cY/IM4MUXX2yx +dg1XmpbavlQqVdABgMFgqON10Be2tAaAZ599FmazOejSrO+zvu4qGS4vm82GvXv3 +AqhdFmf3m3wTEvfVfK+vy+VCSkoKZs2aJZQlv4MvX3j44YcB+N89bDab8dRTT9VJ +Syj4ZI3BYMDzzz8PoFYeuK09+cSTcXNTWn1EXRlfbuSm0Wig1Wqh0+n8PB1x4AJz +u91wOBwgIgwdOhS7d+/G/fffD4/HI27G0Wq1KCkpQffu3bF9+/YGK+LLjXijMRpm +Ad6zZw8uXLgghIwFKScnBzfddBNcLhf0er0oG9/jWg6HA5MnT0ZhYSEAYN68eaio +qAiqHDj+cEbQofLXkHxHsxybuk7CTQMr0Q0bNmDw4MGw2WxCfrkD0mg0wpmHTqeD +TqeDWq2G3W7HlClT8MADD4CIQETQarVYt24dPvnkk7DtGqJVRy21rlta+2IlaLVa +sX//fr882u12GAwGTJkyRaQlVH6eeuop/OY3v0FNTU3QLRZWWuxamF21+sIz1zVr +1vilg/Oen58Ps9mMmpoa0Wfb7XZ07dIVH3/8Md566y3MnTvX7xnuu7dt24annnoK +BoMBVqtVDJhmzpyJe+65B3a7XQyU2Fo8sJ0REdxuN1566SUMHz5cnLSxWq3Q6XR4 +9NFHUVxcLFYKGlJX9X0XTRqtjANH95fbX3C73XC5XMIEPzA4nU5oNBqkp6fjrrvu +wubNm7FlyxZ0794dNpsNQO1VYW+99RaGDh2K48ePR6SI+fYTFtDL7dnxdywUDdl3 +4WWT8vJyceSKR4MsoAsXLkSfPn3E5dR2u11c19e7d2+sWrUKixYtgk6nQ1FRET7+ ++GMkJiYGzTM3mGD1wLe+cD5C5d3XQQUrnUD4xpholGND4wrck2osKpVKlFtNTQ3O +nj0rHC9s2bIFU6ZMEas1DocDbrdb3NDkdrvhdDrFPvFzzz0nljr5TOXRb4+KZcNg +DZz32cKpI0atVkOv19dph1dLXcdb++LBWH154/SFqjuPx4NFixb55YeX0ufMmYMx +Y8bAbrfXyc/111+P5cuX44UXXkBBQQEee+wxALUW/VyG3bt3F58PGDAAhw4dQkZG +hihvLlsAWL16tZ+PdR7o3Hzzzfjss88wYcIEZGdnY+TIkXj99ddRsr8Et9xyCwCg +pKSkTr55dfNPf/oTli5dCpPJBLvdLspt6dKleOyxx6BWq/2sxQPbWXJyMt5/fxEe +fvhhIQd2ux0mkwlLly7F66+/HtL3+5XWA+HQaKcfPLrXarXwer1o27YtgNrOhv/V +6/WYOXOmKHTOIF8ErSgKMjIyMHDgQGRlZYlRqc1mEzNnlUqFHTt24PHHH8eXX34J +rVYrOsdw4XtpfZdmgnWMKpUKer0e1dXVdS6OjxQWsr/+9a+YOHGi6Jw57127dsXe +vXtRVFSEjRs3wul04pprrsGIESOEswgigt1ux/Tp0wFc8rDjKxQsVLfffjvKyspw +8uRJHD16FOXl5eI3bGXI+eVnAuuKG73v7USBsCKKRjlGM67GwnJptVqRm5uLd955 +BwMGDIDdbsfChQvx5O+fxOL3F+PAgQM4ePAgqqur4fF4YDKZcN1112Hw4MGYPn06 +OnXqJORSp9Ph0KFDGD16NP73f/83ZAfBHQ7nFai/jngmFMjVVNfx1r44PaxkG1p3 +K1asQF5eHrKzs8WsmFm5ciVKSkrw0UcfweVyoUOHDrj11lvRvXt3aDQa2Gw2/Nd/ +/Zfwge57Ry8AzJgxAxcuXECrVq0wadIkJCUlITs7GydPnhTnnFnBHzt2DPPmzcOT +Tz6JmpoamM1mKIoCIsKwYcMwbNgwv/RzG5o+fToWLFggBrS+sP3EAw88gB9//BEF +BQUgItFm5s2bh8mTJ2PBggXYsWMHjh8/Dq/XC5PJhB49emD48OGYMWMGUlNTxTNq +tRoGgwEvv/wynnvuOfGeYMRCD9SHCkCDzTn1ej2mT5+O/v37o0+fPmiT1gYJ5gRR +UX4vUqkicr7v663IarXi008/xX//939jx44dorHxMkU48KZ+165dceutt4pKvf76 +69GnTx/RcH3//fHHH7Ft2zYcOHAA58+fx4YNG1BeXt6gs6E8e587dy6eeOIJsTTD +yzO8/x0Iny1Uq9XIyckR5/Tat2+PY8eOwWg0ivRymljAjh07hhtvvFH4qB01ahQy +MjJwzTXXoEePHujXrx/S09Phdrv98u1wOPDll7uwefMWVFRUYO3atThz5ozfHaTp +6ekYPXo0kpKS0K1bN2TdkIUbb7gxaDmeOXMGW7ZswTfffIOzZ89iw4YNqKqqEkop +IyMDo0aNQkJCAjIzM9Enq89l4+I6KSsrw/p163Gh/EKjzuvysxaLBUeOHEH79u1R +XFyMYcOGwWQy4aWXXkJeXp6fTAKXBooul0tcEMEDSC5PjruwsBD3338/KisrL3uL +mMlkwm233Yb09HSkp6ejV69e6N+/f9A6stvt+Prrr1FUVITS0lIcOXIEW7duBXBJ +cYwePRodOnS4auo6HtrX6NGjkZGRgY4dOyIrKwt9svqgVXIrcYSH43E6nfjhhx+w +fv16nD59GgcPHsTmzZv98uXbX23evBkdO3b0G6yp1eqQ+6oulwsjRoxAUVER0tPT +ceTIESQlJQk3rdxvarVaMeP94IMPcN999wUtW16NXLRoEe666y54PB4RBytZNuYi +IjgcDowbNw7r1q2r15EHfz9s2DC8++67wvqbbYI4PbwUbjAYhKtSfjcPlI4dO4Zp +06Zh69atId8baz1QHxRpUBSFAFBCQgKVl5cTEZHX66Vo4HQ6qby8nMrLy+nVV1+l +8ePHU+vWrcW7NRoN6XS6iNNsMBgIAE2aNImIiBwOR9hpcrlcREQ0cuRIAkB6vT7i +93O5GY1GevHFF0WcjM1mo6qqKiovL6fKykpyuVzkdruJiKi4uJi6dOnil4/u3buH +LHP+vKysjCwWCwEgk8lE3333HRGRiLc+bDYbERE9+uijIt8ajYYAUHZ2tt+7woHf +O3ToUJEmADRixAi/cg4Hq9VKRET5+fl+5dIYebZYLFRaWkpERLNmzfJLY3Z2Nm3a +tIlcLle9eebvt27dSjfffDNpNBpSFEWUXaj3JyUlUUVFRUTlKus6PtqXwWCgAwcO ++OW9PjiN27ZtCyobLBetW7emlStXBo3b7XaT1+sVafriiy+oc+fOfv3U+PHjQ6ar +qqqKpk+fXm+fpigK6fV6evDBB6mysrJO2bjdbjp8+DAVFBRQWloaASCtVhtW2+P+ +PCkpifLz86mkpMSvnEPB3+/bt4/y8/MpKSlJ5JvLLh71QKjQqJmxwWDAhAkTYDab +QURieYZHFb5/s3VgsNEp/b+jhdLSUuzduxfnzp0TeyG+btN4D6Eh8CgmNTUV48aN +EyNlRVHqpIvT6/V64fV6xehx1apVKC0tbdQdyTyCz87OxsyZM/Fv//ZvSEpKCroP +8dVXX+HFF1/E+vXrYbfbxUjY7XYjMzMTu3btglqtFjOzf/7zn/jqq69w/vx5lJeX +o7y8HIsWLRLLXjk5ObjhhhuEIRKXAQWMBMln2S4xMRFbt25FSUmJ3/KqyWTC3Xff +LZbiIinHwsJCnD17VsRnsVhw5513iqXF+uKi/x99JyUlYcuWLXXS1lAMBgPuu+8+ +JCcno/DTQnx/4nvhgpBnEunp6Rg7dizS0tKQm5uLbt26wWazwWg04uTJk1izZg3O +nDmDNWvW4IcffhD7YxTGKo7BYMA999wDvV4v2hOXRbA68nq9on24XC4sXbr0qq/r +WLav/v37Y8CAAcKAiPMVqsx5Gfi7774TzooCZ1oajUY8l5mZiVGjRqF///4YOXKk +OI984MABrF69GsXFxdiyZYuY6bOHQrfbjUGDBiEvLw+jRo2Coij44osvUFxcjMLC +Qvzwww/iSGiomZ6vHBqNRgwZMgQ9evSA2+3G+fPnUVRUhLKyMjgcDmFsFcn2oe/7 +tVotevbsieHDh6Njx4647bbb0KFDB+Fb+syZM9iwYQNOnz6NzZs34/Dhw2LJub73 +xoseCEajlHFTo9froVKpmnyt/kriKzBssNOlSxdh8KDRaHDu3DkUFxfj559/Fp0E +l4NvPEaj0a+Ru1wueSVfE8HWm763LLEBSGD5+1480ZgBpCRyWmL7Ckwfpw1AnXTx +kq1vXlhp+D5ns9lEn1qfImbYmrm+ZWc2tIoUXg4P7O9DtbP6nmtuNFoZR7IPHA4e +j0dsujdFwXLFNQQ2PokGbEhR3yiuPuEPRKPRQK1Wi1UKX6H1tfSMBK/XWyed0SzH +xsQVLG2NgeU5VF3zcSaesQXCZdxQWWlMe5J1XUtzal+hZCkQrVYrjtsFK9PLxeM7 +mOR8sJKOVE653HxnkdHsG4HavHo8npDW0Jf7vj7iRQ/4Etcz46sBXlIKXEYLp8ID +n2nOo8Lmim8dyPKPP1pq+2qo3Pka5jUnroZ2JpWxRCKRSCQxJi7dYUokEolEcjUh +lbFEIpFIJDFGKmOJRCKRSGKMVMYSiUQikcQYqYwlEolEIokxUhlLJBKJRBJjpDKW +SCQSiSTGSGUskUgkEkmMkcpYIpFIJJIYI5WxRCKRSCQxRipjiUQikUhijFTGEolE +IpHEGKmMJRKJRCKJMVIZSyQSiUQSY6QylkgkEokkxkhlLJFIJBJJjJHKWCKRSCSS +GCOVsUQikUgkMUYqY4lEIpFIYoxUxhKJRCKRxBipjCUSiUQiiTH/B6C5my8RdwIz +AAAAAElFTkSuQmCC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/img/title_.txt Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,320 @@ +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/J3DI.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,583 @@ +/* + * Copyright (C) 2009 Apple Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// +// initWebGL +// +// Initialize the Canvas element with the passed name as a WebGL object and return the +// WebGLRenderingContext. +// +// Load shaders with the passed names and create a program with them. Return this program +// in the 'program' property of the returned context. +// +// For each string in the passed attribs array, bind an attrib with that name at that index. +// Once the attribs are bound, link the program and then use it. +// +// Set the clear color to the passed array (4 values) and set the clear depth to the passed value. +// Enable depth testing and blending with a blend func of (SRC_ALPHA, ONE_MINUS_SRC_ALPHA) +// +// A console function is added to the context: console(string). This can be replaced +// by the caller. By default, it maps to the window.console() function on WebKit and to +// an empty function on other browsers. +// +function initWebGL(canvasName, vshader, fshader, attribs, clearColor, clearDepth) +{ + var canvas = document.getElementById(canvasName); + var gl = canvas.getContext("experimental-webgl"); + if (!gl) { + alert("No WebGL context found"); + return null; + } + + // Add a console + gl.console = ("console" in window) ? window.console : { log: function() { } }; + + // create our shaders + var vertexShader = loadShader(gl, vshader); + var fragmentShader = loadShader(gl, fshader); + + if (!vertexShader || !fragmentShader) + return null; + + // Create the program object + gl.program = gl.createProgram(); + + if (!gl.program) + return null; + + // Attach our two shaders to the program + gl.attachShader (gl.program, vertexShader); + gl.attachShader (gl.program, fragmentShader); + + // Bind attributes + for (var i = 0; i < attribs.length; ++i) + gl.bindAttribLocation (gl.program, i, attribs[i]); + + // Link the program + gl.linkProgram(gl.program); + + // Check the link status + var linked = gl.getProgramParameter(gl.program, gl.LINK_STATUS); + if (!linked) { + // something went wrong with the link + var error = gl.getProgramInfoLog (gl.program); + gl.console.log("Error in program linking:"+error); + + gl.deleteProgram(gl.program); + gl.deleteProgram(fragmentShader); + gl.deleteProgram(vertexShader); + + return null; + } + + gl.useProgram(gl.program); + + gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); + gl.clearDepth(clearDepth); + + gl.enable(gl.DEPTH_TEST); + gl.enable(gl.BLEND); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + + return gl; +} + +// +// loadShader +// +// 'shaderId' is the id of a <script> element containing the shader source string. +// Load this shader and return the WebGLShader object corresponding to it. +// +function loadShader(ctx, shaderId) +{ + var shaderScript = document.getElementById(shaderId); + if (!shaderScript) { + ctx.console.log("*** Error: shader script '"+shaderId+"' not found"); + return null; + } + + if (shaderScript.type == "x-shader/x-vertex") + var shaderType = ctx.VERTEX_SHADER; + else if (shaderScript.type == "x-shader/x-fragment") + var shaderType = ctx.FRAGMENT_SHADER; + else { + ctx.console.log("*** Error: shader script '"+shaderId+"' of undefined type '"+shaderScript.type+"'"); + return null; + } + + // Create the shader object + var shader = ctx.createShader(shaderType); + if (shader == null) { + ctx.console.log("*** Error: unable to create shader '"+shaderId+"'"); + return null; + } + + // Load the shader source + ctx.shaderSource(shader, shaderScript.text); + + // Compile the shader + ctx.compileShader(shader); + + // Check the compile status + var compiled = ctx.getShaderParameter(shader, ctx.COMPILE_STATUS); + if (!compiled) { + // Something went wrong during compilation; get the error + var error = ctx.getShaderInfoLog(shader); + ctx.console.log("*** Error compiling shader '"+shaderId+"':"+error); + ctx.deleteShader(shader); + return null; + } + + return shader; +} + +// +// makeBox +// +// Create a box with vertices, normals and texCoords. Create VBOs for each as well as the index array. +// Return an object with the following properties: +// +// normalObject WebGLBuffer object for normals +// texCoordObject WebGLBuffer object for texCoords +// vertexObject WebGLBuffer object for vertices +// indexObject WebGLBuffer object for indices +// numIndices The number of indices in the indexObject +// +function makeBox(ctx) +{ + // box + // v6----- v5 + // /| /| + // v1------v0| + // | | | | + // | |v7---|-|v4 + // |/ |/ + // v2------v3 + // + // vertex coords array + var vertices = new Float32Array( + [ 1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, // v0-v1-v2-v3 front + 1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, // v0-v3-v4-v5 right + 1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, // v0-v5-v6-v1 top + -1, 1, 1, -1, 1,-1, -1,-1,-1, -1,-1, 1, // v1-v6-v7-v2 left + -1,-1,-1, 1,-1,-1, 1,-1, 1, -1,-1, 1, // v7-v4-v3-v2 bottom + 1,-1,-1, -1,-1,-1, -1, 1,-1, 1, 1,-1 ] // v4-v7-v6-v5 back + ); + + // normal array + var normals = new Float32Array( + [ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // v0-v1-v2-v3 front + 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // v0-v3-v4-v5 right + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // v0-v5-v6-v1 top + -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // v1-v6-v7-v2 left + 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, // v7-v4-v3-v2 bottom + 0, 0,-1, 0, 0,-1, 0, 0,-1, 0, 0,-1 ] // v4-v7-v6-v5 back + ); + + + // texCoord array + var texCoords = new Float32Array( + [ 1, 1, 0, 1, 0, 0, 1, 0, // v0-v1-v2-v3 front + 0, 1, 0, 0, 1, 0, 1, 1, // v0-v3-v4-v5 right + 1, 0, 1, 1, 0, 1, 0, 0, // v0-v5-v6-v1 top + 1, 1, 0, 1, 0, 0, 1, 0, // v1-v6-v7-v2 left + 0, 0, 1, 0, 1, 1, 0, 1, // v7-v4-v3-v2 bottom + 0, 0, 1, 0, 1, 1, 0, 1 ] // v4-v7-v6-v5 back + ); + + // index array + var indices = new Uint8Array( + [ 0, 1, 2, 0, 2, 3, // front + 4, 5, 6, 4, 6, 7, // right + 8, 9,10, 8,10,11, // top + 12,13,14, 12,14,15, // left + 16,17,18, 16,18,19, // bottom + 20,21,22, 20,22,23 ] // back + ); + + var retval = { }; + + retval.normalObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject); + ctx.bufferData(ctx.ARRAY_BUFFER, normals, ctx.STATIC_DRAW); + + retval.texCoordObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject); + ctx.bufferData(ctx.ARRAY_BUFFER, texCoords, ctx.STATIC_DRAW); + + retval.vertexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject); + ctx.bufferData(ctx.ARRAY_BUFFER, vertices, ctx.STATIC_DRAW); + + ctx.bindBuffer(ctx.ARRAY_BUFFER, null); + + retval.indexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject); + ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, indices, ctx.STATIC_DRAW); + ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, null); + + retval.numIndices = indices.length; + + return retval; +} + +// +// makeSphere +// +// Create a sphere with the passed number of latitude and longitude bands and the passed radius. +// Sphere has vertices, normals and texCoords. Create VBOs for each as well as the index array. +// Return an object with the following properties: +// +// normalObject WebGLBuffer object for normals +// texCoordObject WebGLBuffer object for texCoords +// vertexObject WebGLBuffer object for vertices +// indexObject WebGLBuffer object for indices +// numIndices The number of indices in the indexObject +// +function makeSphere(ctx, radius, lats, longs) +{ + var geometryData = [ ]; + var normalData = [ ]; + var texCoordData = [ ]; + var indexData = [ ]; + + for (var latNumber = 0; latNumber <= lats; ++latNumber) { + for (var longNumber = 0; longNumber <= longs; ++longNumber) { + var theta = latNumber * Math.PI / lats; + var phi = longNumber * 2 * Math.PI / longs; + var sinTheta = Math.sin(theta); + var sinPhi = Math.sin(phi); + var cosTheta = Math.cos(theta); + var cosPhi = Math.cos(phi); + + var x = cosPhi * sinTheta; + var y = cosTheta; + var z = sinPhi * sinTheta; + var u = 1-(longNumber/longs); + var v = latNumber/lats; + + normalData.push(x); + normalData.push(y); + normalData.push(z); + texCoordData.push(u); + texCoordData.push(v); + geometryData.push(radius * x); + geometryData.push(radius * y); + geometryData.push(radius * z); + } + } + + for (var latNumber = 0; latNumber < lats; ++latNumber) { + for (var longNumber = 0; longNumber < longs; ++longNumber) { + var first = (latNumber * (longs+1)) + longNumber; + var second = first + longs + 1; + indexData.push(first); + indexData.push(second); + indexData.push(first+1); + + indexData.push(second); + indexData.push(second+1); + indexData.push(first+1); + } + } + + var retval = { }; + + retval.normalObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW); + + retval.texCoordObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW); + + retval.vertexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW); + + retval.numIndices = indexData.length; + retval.indexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject); + ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW); + + return retval; +} + +// +// loadObj +// +// Load a .obj file from the passed URL. Return an object with a 'loaded' property set to false. +// When the object load is complete, the 'loaded' property becomes true and the following +// properties are set: +// +// normalObject WebGLBuffer object for normals +// texCoordObject WebGLBuffer object for texCoords +// vertexObject WebGLBuffer object for vertices +// indexObject WebGLBuffer object for indices +// numIndices The number of indices in the indexObject +// +function loadObj(ctx, url) +{ + var obj = { loaded : false }; + obj.ctx = ctx; + var req = new XMLHttpRequest(); + req.obj = obj; + req.onreadystatechange = function () { processLoadObj(req) }; + req.open("GET", url, true); + req.send(null); + return obj; +} + +function processLoadObj(req) +{ + req.obj.ctx.console.log("req="+req) + // only if req shows "complete" + if (req.readyState == 4) { + doLoadObj(req.obj, req.responseText); + } +} + +function doLoadObj(obj, text) +{ + vertexArray = [ ]; + normalArray = [ ]; + textureArray = [ ]; + indexArray = [ ]; + + var vertex = [ ]; + var normal = [ ]; + var texture = [ ]; + var facemap = { }; + var index = 0; + + // This is a map which associates a range of indices with a name + // The name comes from the 'g' tag (of the form "g NAME"). Indices + // are part of one group until another 'g' tag is seen. If any indices + // come before a 'g' tag, it is given the group name "_unnamed" + // 'group' is an object whose property names are the group name and + // whose value is a 2 element array with [<first index>, <num indices>] + var groups = { }; + var currentGroup = [-1, 0]; + groups["_unnamed"] = currentGroup; + + var lines = text.split("\n"); + for (var lineIndex in lines) { + var line = lines[lineIndex].replace(/[ \t]+/g, " ").replace(/\s\s*$/, ""); + + // ignore comments + if (line[0] == "#") + continue; + + var array = line.split(" "); + if (array[0] == "g") { + // new group + currentGroup = [indexArray.length, 0]; + groups[array[1]] = currentGroup; + } + else if (array[0] == "v") { + // vertex + vertex.push(parseFloat(array[1])); + vertex.push(parseFloat(array[2])); + vertex.push(parseFloat(array[3])); + } + else if (array[0] == "vt") { + // normal + texture.push(parseFloat(array[1])); + texture.push(parseFloat(array[2])); + } + else if (array[0] == "vn") { + // normal + normal.push(parseFloat(array[1])); + normal.push(parseFloat(array[2])); + normal.push(parseFloat(array[3])); + } + else if (array[0] == "f") { + // face + if (array.length != 4) { + obj.ctx.console.log("*** Error: face '"+line+"' not handled"); + continue; + } + + for (var i = 1; i < 4; ++i) { + if (!(array[i] in facemap)) { + // add a new entry to the map and arrays + var f = array[i].split("/"); + var vtx, nor, tex; + + if (f.length == 1) { + vtx = parseInt(f[0]) - 1; + nor = vtx; + tex = vtx; + } + else if (f.length = 3) { + vtx = parseInt(f[0]) - 1; + tex = parseInt(f[1]) - 1; + nor = parseInt(f[2]) - 1; + } + else { + obj.ctx.console.log("*** Error: did not understand face '"+array[i]+"'"); + return null; + } + + // do the vertices + var x = 0; + var y = 0; + var z = 0; + if (vtx * 3 + 2 < vertex.length) { + x = vertex[vtx*3]; + y = vertex[vtx*3+1]; + z = vertex[vtx*3+2]; + } + vertexArray.push(x); + vertexArray.push(y); + vertexArray.push(z); + + // do the textures + x = 0; + y = 0; + if (tex * 2 + 1 < texture.length) { + x = texture[tex*2]; + y = texture[tex*2+1]; + } + textureArray.push(x); + textureArray.push(y); + + // do the normals + x = 0; + y = 0; + z = 1; + if (nor * 3 + 2 < normal.length) { + x = normal[nor*3]; + y = normal[nor*3+1]; + z = normal[nor*3+2]; + } + normalArray.push(x); + normalArray.push(y); + normalArray.push(z); + + facemap[array[i]] = index++; + } + + indexArray.push(facemap[array[i]]); + currentGroup[1]++; + } + } + } + + // set the VBOs + obj.normalObject = obj.ctx.createBuffer(); + obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.normalObject); + obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(normalArray), obj.ctx.STATIC_DRAW); + + obj.texCoordObject = obj.ctx.createBuffer(); + obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.texCoordObject); + obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(textureArray), obj.ctx.STATIC_DRAW); + + obj.vertexObject = obj.ctx.createBuffer(); + obj.ctx.bindBuffer(obj.ctx.ARRAY_BUFFER, obj.vertexObject); + obj.ctx.bufferData(obj.ctx.ARRAY_BUFFER, new Float32Array(vertexArray), obj.ctx.STATIC_DRAW); + + obj.numIndices = indexArray.length; + obj.indexObject = obj.ctx.createBuffer(); + obj.ctx.bindBuffer(obj.ctx.ELEMENT_ARRAY_BUFFER, obj.indexObject); + obj.ctx.bufferData(obj.ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexArray), obj.ctx.STREAM_DRAW); + + obj.groups = groups; + + obj.loaded = true; +} + +// +// loadImageTexture +// +// Load the image at the passed url, place it in a new WebGLTexture object and return the WebGLTexture. +// +function loadImageTexture(ctx, url) +{ + var texture = ctx.createTexture(); + texture.image = new Image(); + texture.image.onload = function() { doLoadImageTexture(ctx, texture.image, texture) } + texture.image.src = url; + return texture; +} + +function doLoadImageTexture(ctx, image, texture) +{ + ctx.bindTexture(ctx.TEXTURE_2D, texture); + ctx.texImage2D( + ctx.TEXTURE_2D, 0, ctx.RGBA, ctx.RGBA, ctx.UNSIGNED_BYTE, image); + ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR); + ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR); + ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, ctx.CLAMP_TO_EDGE); + ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, ctx.CLAMP_TO_EDGE); + //ctx.generateMipmap(ctx.TEXTURE_2D) + ctx.bindTexture(ctx.TEXTURE_2D, null); +} + +// +// Framerate object +// +// This object keeps track of framerate and displays it as the innerHTML text of the +// HTML element with the passed id. Once created you call snapshot at the end +// of every rendering cycle. Every 500ms the framerate is updated in the HTML element. +// +Framerate = function(id) +{ + this.numFramerates = 10; + this.framerateUpdateInterval = 500; + this.id = id; + + this.renderTime = -1; + this.framerates = [ ]; + self = this; + var fr = function() { self.updateFramerate() } + setInterval(fr, this.framerateUpdateInterval); +} + +Framerate.prototype.updateFramerate = function() +{ + var tot = 0; + for (var i = 0; i < this.framerates.length; ++i) + tot += this.framerates[i]; + + var framerate = tot / this.framerates.length; + framerate = Math.round(framerate); + document.getElementById(this.id).innerHTML = "Framerate:"+framerate+"fps"; +} + +Framerate.prototype.snapshot = function() +{ + if (this.renderTime < 0) + this.renderTime = new Date().getTime(); + else { + var newTime = new Date().getTime(); + var t = newTime - this.renderTime; + var framerate = 1000/t; + this.framerates.push(framerate); + while (this.framerates.length > this.numFramerates) + this.framerates.shift(); + this.renderTime = newTime; + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/J3DIMath.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,1065 @@ +/* + * Copyright (C) 2009 Apple Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + // J3DI (Jedi) - A support library for WebGL. + +/* + J3DI Math Classes. Currently includes: + + J3DIMatrix4 - A 4x4 Matrix +*/ + +/* + J3DIMatrix4 class + + This class implements a 4x4 matrix. It has functions which duplicate the + functionality of the OpenGL matrix stack and glut functions. On browsers + that support it, CSSMatrix is used to accelerate operations. + + IDL: + + [ + Constructor(in J3DIMatrix4 matrix), // copy passed matrix into new J3DIMatrix4 + Constructor(in sequence<float> array) // create new J3DIMatrix4 with 16 floats (row major) + Constructor() // create new J3DIMatrix4 with identity matrix + ] + interface J3DIMatrix4 { + void load(in J3DIMatrix4 matrix); // copy the values from the passed matrix + void load(in sequence<float> array); // copy 16 floats into the matrix + sequence<float> getAsArray(); // return the matrix as an array of 16 floats + Float32Array getAsFloat32Array(); // return the matrix as a Float32Array with 16 values + void setUniform(in WebGLRenderingContext ctx, // Send the matrix to the passed uniform location in the passed context + in WebGLUniformLocation loc, + in boolean transpose); + void makeIdentity(); // replace the matrix with identity + void transpose(); // replace the matrix with its transpose + void invert(); // replace the matrix with its inverse + + void translate(in float x, in float y, in float z); // multiply the matrix by passed translation values on the right + void translate(in J3DVector3 v); // multiply the matrix by passed translation values on the right + void scale(in float x, in float y, in float z); // multiply the matrix by passed scale values on the right + void scale(in J3DVector3 v); // multiply the matrix by passed scale values on the right + void rotate(in float angle, // multiply the matrix by passed rotation values on the right + in float x, in float y, in float z); // (angle is in degrees) + void rotate(in float angle, in J3DVector3 v); // multiply the matrix by passed rotation values on the right + // (angle is in degrees) + void multiply(in CanvasMatrix matrix); // multiply the matrix by the passed matrix on the right + void divide(in float divisor); // divide the matrix by the passed divisor + void ortho(in float left, in float right, // multiply the matrix by the passed ortho values on the right + in float bottom, in float top, + in float near, in float far); + void frustum(in float left, in float right, // multiply the matrix by the passed frustum values on the right + in float bottom, in float top, + in float near, in float far); + void perspective(in float fovy, in float aspect, // multiply the matrix by the passed perspective values on the right + in float zNear, in float zFar); + void lookat(in J3DVector3 eye, // multiply the matrix by the passed lookat + in J3DVector3 center, in J3DVector3 up); // values on the right + bool decompose(in J3DVector3 translate, // decompose the matrix into the passed vector + in J3DVector3 rotate, + in J3DVector3 scale, + in J3DVector3 skew, + in sequence<float> perspective); + } + + [ + Constructor(in J3DVector3 vector), // copy passed vector into new J3DVector3 + Constructor(in sequence<float> array) // create new J3DVector3 with 3 floats from array + Constructor(in float x, in float y, in float z) // create new J3DVector3 with 3 floats + Constructor() // create new J3DVector3 with (0,0,0) + ] + interface J3DVector3 { + void load(in J3DVector3 vector); // copy the values from the passed vector + void load(in sequence<float> array); // copy 3 floats into the vector from array + void load(in float x, in float y, in float z); // copy 3 floats into the vector + sequence<float> getAsArray(); // return the vector as an array of 3 floats + Float32Array getAsFloat32Array(); // return the matrix as a Float32Array with 16 values + void multMatrix(in J3DIMatrix4 matrix); // multiply the vector by the passed matrix (on the right) + float vectorLength(); // return the length of the vector + float dot(); // return the dot product of the vector + void cross(in J3DVector3 v); // replace the vector with vector x v + void divide(in float divisor); // divide the vector by the passed divisor + } +*/ + +J3DIHasCSSMatrix = false; +J3DIHasCSSMatrixCopy = false; +/* +if ("WebKitCSSMatrix" in window && ("media" in window && window.media.matchMedium("(-webkit-transform-3d)")) || + ("styleMedia" in window && window.styleMedia.matchMedium("(-webkit-transform-3d)"))) { + J3DIHasCSSMatrix = true; + if ("copy" in WebKitCSSMatrix.prototype) + J3DIHasCSSMatrixCopy = true; +} +*/ + +// console.log("J3DIHasCSSMatrix="+J3DIHasCSSMatrix); +// console.log("J3DIHasCSSMatrixCopy="+J3DIHasCSSMatrixCopy); + +// +// J3DIMatrix4 +// +J3DIMatrix4 = function(m) +{ + if (J3DIHasCSSMatrix) + this.$matrix = new WebKitCSSMatrix; + else + this.$matrix = new Object; + + if (typeof m == 'object') { + if ("length" in m && m.length >= 16) { + this.load(m); + return; + } + else if (m instanceof J3DIMatrix4) { + this.load(m); + return; + } + } + this.makeIdentity(); +} + +J3DIMatrix4.prototype.load = function() +{ + if (arguments.length == 1 && typeof arguments[0] == 'object') { + var matrix; + + if (arguments[0] instanceof J3DIMatrix4) { + matrix = arguments[0].$matrix; + + this.$matrix.m11 = matrix.m11; + this.$matrix.m12 = matrix.m12; + this.$matrix.m13 = matrix.m13; + this.$matrix.m14 = matrix.m14; + + this.$matrix.m21 = matrix.m21; + this.$matrix.m22 = matrix.m22; + this.$matrix.m23 = matrix.m23; + this.$matrix.m24 = matrix.m24; + + this.$matrix.m31 = matrix.m31; + this.$matrix.m32 = matrix.m32; + this.$matrix.m33 = matrix.m33; + this.$matrix.m34 = matrix.m34; + + this.$matrix.m41 = matrix.m41; + this.$matrix.m42 = matrix.m42; + this.$matrix.m43 = matrix.m43; + this.$matrix.m44 = matrix.m44; + return; + } + else + matrix = arguments[0]; + + if ("length" in matrix && matrix.length >= 16) { + this.$matrix.m11 = matrix[0]; + this.$matrix.m12 = matrix[1]; + this.$matrix.m13 = matrix[2]; + this.$matrix.m14 = matrix[3]; + + this.$matrix.m21 = matrix[4]; + this.$matrix.m22 = matrix[5]; + this.$matrix.m23 = matrix[6]; + this.$matrix.m24 = matrix[7]; + + this.$matrix.m31 = matrix[8]; + this.$matrix.m32 = matrix[9]; + this.$matrix.m33 = matrix[10]; + this.$matrix.m34 = matrix[11]; + + this.$matrix.m41 = matrix[12]; + this.$matrix.m42 = matrix[13]; + this.$matrix.m43 = matrix[14]; + this.$matrix.m44 = matrix[15]; + return; + } + } + + this.makeIdentity(); +} + +J3DIMatrix4.prototype.getAsArray = function() +{ + return [ + this.$matrix.m11, this.$matrix.m12, this.$matrix.m13, this.$matrix.m14, + this.$matrix.m21, this.$matrix.m22, this.$matrix.m23, this.$matrix.m24, + this.$matrix.m31, this.$matrix.m32, this.$matrix.m33, this.$matrix.m34, + this.$matrix.m41, this.$matrix.m42, this.$matrix.m43, this.$matrix.m44 + ]; +} + +J3DIMatrix4.prototype.getAsFloat32Array = function() +{ + if (J3DIHasCSSMatrixCopy) { + var array = new Float32Array(16); + this.$matrix.copy(array); + return array; + } + return new Float32Array(this.getAsArray()); +} + +J3DIMatrix4.prototype.setUniform = function(ctx, loc, transpose) +{ + if (J3DIMatrix4.setUniformArray == undefined) { + J3DIMatrix4.setUniformWebGLArray = new Float32Array(16); + J3DIMatrix4.setUniformArray = new Array(16); + } + + if (J3DIHasCSSMatrixCopy) + this.$matrix.copy(J3DIMatrix4.setUniformWebGLArray); + else { + J3DIMatrix4.setUniformArray[0] = this.$matrix.m11; + J3DIMatrix4.setUniformArray[1] = this.$matrix.m12; + J3DIMatrix4.setUniformArray[2] = this.$matrix.m13; + J3DIMatrix4.setUniformArray[3] = this.$matrix.m14; + J3DIMatrix4.setUniformArray[4] = this.$matrix.m21; + J3DIMatrix4.setUniformArray[5] = this.$matrix.m22; + J3DIMatrix4.setUniformArray[6] = this.$matrix.m23; + J3DIMatrix4.setUniformArray[7] = this.$matrix.m24; + J3DIMatrix4.setUniformArray[8] = this.$matrix.m31; + J3DIMatrix4.setUniformArray[9] = this.$matrix.m32; + J3DIMatrix4.setUniformArray[10] = this.$matrix.m33; + J3DIMatrix4.setUniformArray[11] = this.$matrix.m34; + J3DIMatrix4.setUniformArray[12] = this.$matrix.m41; + J3DIMatrix4.setUniformArray[13] = this.$matrix.m42; + J3DIMatrix4.setUniformArray[14] = this.$matrix.m43; + J3DIMatrix4.setUniformArray[15] = this.$matrix.m44; + + J3DIMatrix4.setUniformWebGLArray.set(J3DIMatrix4.setUniformArray); + } + + ctx.uniformMatrix4fv(loc, transpose, J3DIMatrix4.setUniformWebGLArray); +} + +J3DIMatrix4.prototype.makeIdentity = function() +{ + this.$matrix.m11 = 1; + this.$matrix.m12 = 0; + this.$matrix.m13 = 0; + this.$matrix.m14 = 0; + + this.$matrix.m21 = 0; + this.$matrix.m22 = 1; + this.$matrix.m23 = 0; + this.$matrix.m24 = 0; + + this.$matrix.m31 = 0; + this.$matrix.m32 = 0; + this.$matrix.m33 = 1; + this.$matrix.m34 = 0; + + this.$matrix.m41 = 0; + this.$matrix.m42 = 0; + this.$matrix.m43 = 0; + this.$matrix.m44 = 1; +} + +J3DIMatrix4.prototype.transpose = function() +{ + var tmp = this.$matrix.m12; + this.$matrix.m12 = this.$matrix.m21; + this.$matrix.m21 = tmp; + + tmp = this.$matrix.m13; + this.$matrix.m13 = this.$matrix.m31; + this.$matrix.m31 = tmp; + + tmp = this.$matrix.m14; + this.$matrix.m14 = this.$matrix.m41; + this.$matrix.m41 = tmp; + + tmp = this.$matrix.m23; + this.$matrix.m23 = this.$matrix.m32; + this.$matrix.m32 = tmp; + + tmp = this.$matrix.m24; + this.$matrix.m24 = this.$matrix.m42; + this.$matrix.m42 = tmp; + + tmp = this.$matrix.m34; + this.$matrix.m34 = this.$matrix.m43; + this.$matrix.m43 = tmp; +} + +J3DIMatrix4.prototype.invert = function() +{ + if (J3DIHasCSSMatrix) { + this.$matrix = this.$matrix.inverse(); + return; + } + + // Calculate the 4x4 determinant + // If the determinant is zero, + // then the inverse matrix is not unique. + var det = this._determinant4x4(); + + if (Math.abs(det) < 1e-8) + return null; + + this._makeAdjoint(); + + // Scale the adjoint matrix to get the inverse + this.$matrix.m11 /= det; + this.$matrix.m12 /= det; + this.$matrix.m13 /= det; + this.$matrix.m14 /= det; + + this.$matrix.m21 /= det; + this.$matrix.m22 /= det; + this.$matrix.m23 /= det; + this.$matrix.m24 /= det; + + this.$matrix.m31 /= det; + this.$matrix.m32 /= det; + this.$matrix.m33 /= det; + this.$matrix.m34 /= det; + + this.$matrix.m41 /= det; + this.$matrix.m42 /= det; + this.$matrix.m43 /= det; + this.$matrix.m44 /= det; +} + +J3DIMatrix4.prototype.translate = function(x,y,z) +{ + if (typeof x == 'object' && "length" in x) { + var t = x; + x = t[0]; + y = t[1]; + z = t[2]; + } + else { + if (x == undefined) + x = 0; + if (y == undefined) + y = 0; + if (z == undefined) + z = 0; + } + + if (J3DIHasCSSMatrix) { + this.$matrix = this.$matrix.translate(x, y, z); + return; + } + + var matrix = new J3DIMatrix4(); + matrix.$matrix.m41 = x; + matrix.$matrix.m42 = y; + matrix.$matrix.m43 = z; + + this.multiply(matrix); +} + +J3DIMatrix4.prototype.scale = function(x,y,z) +{ + if (typeof x == 'object' && "length" in x) { + var t = x; + x = t[0]; + y = t[1]; + z = t[2]; + } + else { + if (x == undefined) + x = 1; + if (z == undefined) { + if (y == undefined) { + y = x; + z = x; + } + else + z = 1; + } + else if (y == undefined) + y = x; + } + + if (J3DIHasCSSMatrix) { + this.$matrix = this.$matrix.scale(x, y, z); + return; + } + + var matrix = new J3DIMatrix4(); + matrix.$matrix.m11 = x; + matrix.$matrix.m22 = y; + matrix.$matrix.m33 = z; + + this.multiply(matrix); +} + +J3DIMatrix4.prototype.rotate = function(angle,x,y,z) +{ + // Forms are (angle, x,y,z), (angle,vector), (angleX, angleY, angleZ), (angle) + if (typeof x == 'object' && "length" in x) { + var t = x; + x = t[0]; + y = t[1]; + z = t[2]; + } + else { + if (arguments.length == 1) { + x = 0; + y = 0; + z = 1; + } + else if (arguments.length == 3) { + this.rotate(angle, 1,0,0); // about X axis + this.rotate(x, 0,1,0); // about Y axis + this.rotate(y, 0,0,1); // about Z axis + return; + } + } + + if (J3DIHasCSSMatrix) { + this.$matrix = this.$matrix.rotateAxisAngle(x, y, z, angle); + return; + } + + // angles are in degrees. Switch to radians + angle = angle / 180 * Math.PI; + + angle /= 2; + var sinA = Math.sin(angle); + var cosA = Math.cos(angle); + var sinA2 = sinA * sinA; + + // normalize + var len = Math.sqrt(x * x + y * y + z * z); + if (len == 0) { + // bad vector, just use something reasonable + x = 0; + y = 0; + z = 1; + } else if (len != 1) { + x /= len; + y /= len; + z /= len; + } + + var mat = new J3DIMatrix4(); + + // optimize case where axis is along major axis + if (x == 1 && y == 0 && z == 0) { + mat.$matrix.m11 = 1; + mat.$matrix.m12 = 0; + mat.$matrix.m13 = 0; + mat.$matrix.m21 = 0; + mat.$matrix.m22 = 1 - 2 * sinA2; + mat.$matrix.m23 = 2 * sinA * cosA; + mat.$matrix.m31 = 0; + mat.$matrix.m32 = -2 * sinA * cosA; + mat.$matrix.m33 = 1 - 2 * sinA2; + mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0; + mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0; + mat.$matrix.m44 = 1; + } else if (x == 0 && y == 1 && z == 0) { + mat.$matrix.m11 = 1 - 2 * sinA2; + mat.$matrix.m12 = 0; + mat.$matrix.m13 = -2 * sinA * cosA; + mat.$matrix.m21 = 0; + mat.$matrix.m22 = 1; + mat.$matrix.m23 = 0; + mat.$matrix.m31 = 2 * sinA * cosA; + mat.$matrix.m32 = 0; + mat.$matrix.m33 = 1 - 2 * sinA2; + mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0; + mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0; + mat.$matrix.m44 = 1; + } else if (x == 0 && y == 0 && z == 1) { + mat.$matrix.m11 = 1 - 2 * sinA2; + mat.$matrix.m12 = 2 * sinA * cosA; + mat.$matrix.m13 = 0; + mat.$matrix.m21 = -2 * sinA * cosA; + mat.$matrix.m22 = 1 - 2 * sinA2; + mat.$matrix.m23 = 0; + mat.$matrix.m31 = 0; + mat.$matrix.m32 = 0; + mat.$matrix.m33 = 1; + mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0; + mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0; + mat.$matrix.m44 = 1; + } else { + var x2 = x*x; + var y2 = y*y; + var z2 = z*z; + + mat.$matrix.m11 = 1 - 2 * (y2 + z2) * sinA2; + mat.$matrix.m12 = 2 * (x * y * sinA2 + z * sinA * cosA); + mat.$matrix.m13 = 2 * (x * z * sinA2 - y * sinA * cosA); + mat.$matrix.m21 = 2 * (y * x * sinA2 - z * sinA * cosA); + mat.$matrix.m22 = 1 - 2 * (z2 + x2) * sinA2; + mat.$matrix.m23 = 2 * (y * z * sinA2 + x * sinA * cosA); + mat.$matrix.m31 = 2 * (z * x * sinA2 + y * sinA * cosA); + mat.$matrix.m32 = 2 * (z * y * sinA2 - x * sinA * cosA); + mat.$matrix.m33 = 1 - 2 * (x2 + y2) * sinA2; + mat.$matrix.m14 = mat.$matrix.m24 = mat.$matrix.m34 = 0; + mat.$matrix.m41 = mat.$matrix.m42 = mat.$matrix.m43 = 0; + mat.$matrix.m44 = 1; + } + this.multiply(mat); +} + +J3DIMatrix4.prototype.multiply = function(mat) +{ + if (J3DIHasCSSMatrix) { + this.$matrix = this.$matrix.multiply(mat.$matrix); + return; + } + + var m11 = (mat.$matrix.m11 * this.$matrix.m11 + mat.$matrix.m12 * this.$matrix.m21 + + mat.$matrix.m13 * this.$matrix.m31 + mat.$matrix.m14 * this.$matrix.m41); + var m12 = (mat.$matrix.m11 * this.$matrix.m12 + mat.$matrix.m12 * this.$matrix.m22 + + mat.$matrix.m13 * this.$matrix.m32 + mat.$matrix.m14 * this.$matrix.m42); + var m13 = (mat.$matrix.m11 * this.$matrix.m13 + mat.$matrix.m12 * this.$matrix.m23 + + mat.$matrix.m13 * this.$matrix.m33 + mat.$matrix.m14 * this.$matrix.m43); + var m14 = (mat.$matrix.m11 * this.$matrix.m14 + mat.$matrix.m12 * this.$matrix.m24 + + mat.$matrix.m13 * this.$matrix.m34 + mat.$matrix.m14 * this.$matrix.m44); + + var m21 = (mat.$matrix.m21 * this.$matrix.m11 + mat.$matrix.m22 * this.$matrix.m21 + + mat.$matrix.m23 * this.$matrix.m31 + mat.$matrix.m24 * this.$matrix.m41); + var m22 = (mat.$matrix.m21 * this.$matrix.m12 + mat.$matrix.m22 * this.$matrix.m22 + + mat.$matrix.m23 * this.$matrix.m32 + mat.$matrix.m24 * this.$matrix.m42); + var m23 = (mat.$matrix.m21 * this.$matrix.m13 + mat.$matrix.m22 * this.$matrix.m23 + + mat.$matrix.m23 * this.$matrix.m33 + mat.$matrix.m24 * this.$matrix.m43); + var m24 = (mat.$matrix.m21 * this.$matrix.m14 + mat.$matrix.m22 * this.$matrix.m24 + + mat.$matrix.m23 * this.$matrix.m34 + mat.$matrix.m24 * this.$matrix.m44); + + var m31 = (mat.$matrix.m31 * this.$matrix.m11 + mat.$matrix.m32 * this.$matrix.m21 + + mat.$matrix.m33 * this.$matrix.m31 + mat.$matrix.m34 * this.$matrix.m41); + var m32 = (mat.$matrix.m31 * this.$matrix.m12 + mat.$matrix.m32 * this.$matrix.m22 + + mat.$matrix.m33 * this.$matrix.m32 + mat.$matrix.m34 * this.$matrix.m42); + var m33 = (mat.$matrix.m31 * this.$matrix.m13 + mat.$matrix.m32 * this.$matrix.m23 + + mat.$matrix.m33 * this.$matrix.m33 + mat.$matrix.m34 * this.$matrix.m43); + var m34 = (mat.$matrix.m31 * this.$matrix.m14 + mat.$matrix.m32 * this.$matrix.m24 + + mat.$matrix.m33 * this.$matrix.m34 + mat.$matrix.m34 * this.$matrix.m44); + + var m41 = (mat.$matrix.m41 * this.$matrix.m11 + mat.$matrix.m42 * this.$matrix.m21 + + mat.$matrix.m43 * this.$matrix.m31 + mat.$matrix.m44 * this.$matrix.m41); + var m42 = (mat.$matrix.m41 * this.$matrix.m12 + mat.$matrix.m42 * this.$matrix.m22 + + mat.$matrix.m43 * this.$matrix.m32 + mat.$matrix.m44 * this.$matrix.m42); + var m43 = (mat.$matrix.m41 * this.$matrix.m13 + mat.$matrix.m42 * this.$matrix.m23 + + mat.$matrix.m43 * this.$matrix.m33 + mat.$matrix.m44 * this.$matrix.m43); + var m44 = (mat.$matrix.m41 * this.$matrix.m14 + mat.$matrix.m42 * this.$matrix.m24 + + mat.$matrix.m43 * this.$matrix.m34 + mat.$matrix.m44 * this.$matrix.m44); + + this.$matrix.m11 = m11; + this.$matrix.m12 = m12; + this.$matrix.m13 = m13; + this.$matrix.m14 = m14; + + this.$matrix.m21 = m21; + this.$matrix.m22 = m22; + this.$matrix.m23 = m23; + this.$matrix.m24 = m24; + + this.$matrix.m31 = m31; + this.$matrix.m32 = m32; + this.$matrix.m33 = m33; + this.$matrix.m34 = m34; + + this.$matrix.m41 = m41; + this.$matrix.m42 = m42; + this.$matrix.m43 = m43; + this.$matrix.m44 = m44; +} + +J3DIMatrix4.prototype.divide = function(divisor) +{ + this.$matrix.m11 /= divisor; + this.$matrix.m12 /= divisor; + this.$matrix.m13 /= divisor; + this.$matrix.m14 /= divisor; + + this.$matrix.m21 /= divisor; + this.$matrix.m22 /= divisor; + this.$matrix.m23 /= divisor; + this.$matrix.m24 /= divisor; + + this.$matrix.m31 /= divisor; + this.$matrix.m32 /= divisor; + this.$matrix.m33 /= divisor; + this.$matrix.m34 /= divisor; + + this.$matrix.m41 /= divisor; + this.$matrix.m42 /= divisor; + this.$matrix.m43 /= divisor; + this.$matrix.m44 /= divisor; + +} + +J3DIMatrix4.prototype.ortho = function(left, right, bottom, top, near, far) +{ + var tx = (left + right) / (left - right); + var ty = (top + bottom) / (top - bottom); + var tz = (far + near) / (far - near); + + var matrix = new J3DIMatrix4(); + matrix.$matrix.m11 = 2 / (left - right); + matrix.$matrix.m12 = 0; + matrix.$matrix.m13 = 0; + matrix.$matrix.m14 = 0; + matrix.$matrix.m21 = 0; + matrix.$matrix.m22 = 2 / (top - bottom); + matrix.$matrix.m23 = 0; + matrix.$matrix.m24 = 0; + matrix.$matrix.m31 = 0; + matrix.$matrix.m32 = 0; + matrix.$matrix.m33 = -2 / (far - near); + matrix.$matrix.m34 = 0; + matrix.$matrix.m41 = tx; + matrix.$matrix.m42 = ty; + matrix.$matrix.m43 = tz; + matrix.$matrix.m44 = 1; + + this.multiply(matrix); +} + +J3DIMatrix4.prototype.frustum = function(left, right, bottom, top, near, far) +{ + var matrix = new J3DIMatrix4(); + var A = (right + left) / (right - left); + var B = (top + bottom) / (top - bottom); + var C = -(far + near) / (far - near); + var D = -(2 * far * near) / (far - near); + + matrix.$matrix.m11 = (2 * near) / (right - left); + matrix.$matrix.m12 = 0; + matrix.$matrix.m13 = 0; + matrix.$matrix.m14 = 0; + + matrix.$matrix.m21 = 0; + matrix.$matrix.m22 = 2 * near / (top - bottom); + matrix.$matrix.m23 = 0; + matrix.$matrix.m24 = 0; + + matrix.$matrix.m31 = A; + matrix.$matrix.m32 = B; + matrix.$matrix.m33 = C; + matrix.$matrix.m34 = -1; + + matrix.$matrix.m41 = 0; + matrix.$matrix.m42 = 0; + matrix.$matrix.m43 = D; + matrix.$matrix.m44 = 0; + + this.multiply(matrix); +} + +J3DIMatrix4.prototype.perspective = function(fovy, aspect, zNear, zFar) +{ + var top = Math.tan(fovy * Math.PI / 360) * zNear; + var bottom = -top; + var left = aspect * bottom; + var right = aspect * top; + this.frustum(left, right, bottom, top, zNear, zFar); +} + +J3DIMatrix4.prototype.lookat = function(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz) +{ + if (typeof eyez == 'object' && "length" in eyez) { + var t = eyez; + upx = t[0]; + upy = t[1]; + upz = t[2]; + + t = eyey; + centerx = t[0]; + centery = t[1]; + centerz = t[2]; + + t = eyex; + eyex = t[0]; + eyey = t[1]; + eyez = t[2]; + } + + var matrix = new J3DIMatrix4(); + + // Make rotation matrix + + // Z vector + var zx = eyex - centerx; + var zy = eyey - centery; + var zz = eyez - centerz; + var mag = Math.sqrt(zx * zx + zy * zy + zz * zz); + if (mag) { + zx /= mag; + zy /= mag; + zz /= mag; + } + + // Y vector + var yx = upx; + var yy = upy; + var yz = upz; + + // X vector = Y cross Z + xx = yy * zz - yz * zy; + xy = -yx * zz + yz * zx; + xz = yx * zy - yy * zx; + + // Recompute Y = Z cross X + yx = zy * xz - zz * xy; + yy = -zx * xz + zz * xx; + yx = zx * xy - zy * xx; + + // cross product gives area of parallelogram, which is < 1.0 for + // non-perpendicular unit-length vectors; so normalize x, y here + + mag = Math.sqrt(xx * xx + xy * xy + xz * xz); + if (mag) { + xx /= mag; + xy /= mag; + xz /= mag; + } + + mag = Math.sqrt(yx * yx + yy * yy + yz * yz); + if (mag) { + yx /= mag; + yy /= mag; + yz /= mag; + } + + matrix.$matrix.m11 = xx; + matrix.$matrix.m12 = xy; + matrix.$matrix.m13 = xz; + matrix.$matrix.m14 = 0; + + matrix.$matrix.m21 = yx; + matrix.$matrix.m22 = yy; + matrix.$matrix.m23 = yz; + matrix.$matrix.m24 = 0; + + matrix.$matrix.m31 = zx; + matrix.$matrix.m32 = zy; + matrix.$matrix.m33 = zz; + matrix.$matrix.m34 = 0; + + matrix.$matrix.m41 = 0; + matrix.$matrix.m42 = 0; + matrix.$matrix.m43 = 0; + matrix.$matrix.m44 = 1; + matrix.translate(-eyex, -eyey, -eyez); + + this.multiply(matrix); +} + +// Returns true on success, false otherwise. All params are Array objects +J3DIMatrix4.prototype.decompose = function(_translate, _rotate, _scale, _skew, _perspective) +{ + // Normalize the matrix. + if (this.$matrix.m44 == 0) + return false; + + // Gather the params + var translate, rotate, scale, skew, perspective; + + var translate = (_translate == undefined || !("length" in _translate)) ? new J3DIVector3 : _translate; + var rotate = (_rotate == undefined || !("length" in _rotate)) ? new J3DIVector3 : _rotate; + var scale = (_scale == undefined || !("length" in _scale)) ? new J3DIVector3 : _scale; + var skew = (_skew == undefined || !("length" in _skew)) ? new J3DIVector3 : _skew; + var perspective = (_perspective == undefined || !("length" in _perspective)) ? new Array(4) : _perspective; + + var matrix = new J3DIMatrix4(this); + + matrix.divide(matrix.$matrix.m44); + + // perspectiveMatrix is used to solve for perspective, but it also provides + // an easy way to test for singularity of the upper 3x3 component. + var perspectiveMatrix = new J3DIMatrix4(matrix); + + perspectiveMatrix.$matrix.m14 = 0; + perspectiveMatrix.$matrix.m24 = 0; + perspectiveMatrix.$matrix.m34 = 0; + perspectiveMatrix.$matrix.m44 = 1; + + if (perspectiveMatrix._determinant4x4() == 0) + return false; + + // First, isolate perspective. + if (matrix.$matrix.m14 != 0 || matrix.$matrix.m24 != 0 || matrix.$matrix.m34 != 0) { + // rightHandSide is the right hand side of the equation. + var rightHandSide = [ matrix.$matrix.m14, matrix.$matrix.m24, matrix.$matrix.m34, matrix.$matrix.m44 ]; + + // Solve the equation by inverting perspectiveMatrix and multiplying + // rightHandSide by the inverse. + var inversePerspectiveMatrix = new J3DIMatrix4(perspectiveMatrix); + inversePerspectiveMatrix.invert(); + var transposedInversePerspectiveMatrix = new J3DIMatrix4(inversePerspectiveMatrix); + transposedInversePerspectiveMatrix.transpose(); + transposedInversePerspectiveMatrix.multVecMatrix(perspective, rightHandSide); + + // Clear the perspective partition + matrix.$matrix.m14 = matrix.$matrix.m24 = matrix.$matrix.m34 = 0 + matrix.$matrix.m44 = 1; + } + else { + // No perspective. + perspective[0] = perspective[1] = perspective[2] = 0; + perspective[3] = 1; + } + + // Next take care of translation + translate[0] = matrix.$matrix.m41 + matrix.$matrix.m41 = 0 + translate[1] = matrix.$matrix.m42 + matrix.$matrix.m42 = 0 + translate[2] = matrix.$matrix.m43 + matrix.$matrix.m43 = 0 + + // Now get scale and shear. 'row' is a 3 element array of 3 component vectors + var row0 = new J3DIVector3(matrix.$matrix.m11, matrix.$matrix.m12, matrix.$matrix.m13); + var row1 = new J3DIVector3(matrix.$matrix.m21, matrix.$matrix.m22, matrix.$matrix.m23); + var row2 = new J3DIVector3(matrix.$matrix.m31, matrix.$matrix.m32, matrix.$matrix.m33); + + // Compute X scale factor and normalize first row. + scale[0] = row0.vectorLength(); + row0.divide(scale[0]); + + // Compute XY shear factor and make 2nd row orthogonal to 1st. + skew[0] = row0.dot(row1); + row1.combine(row0, 1.0, -skew[0]); + + // Now, compute Y scale and normalize 2nd row. + scale[1] = row1.vectorLength(); + row1.divide(scale[1]); + skew[0] /= scale[1]; + + // Compute XZ and YZ shears, orthogonalize 3rd row + skew[1] = row1.dot(row2); + row2.combine(row0, 1.0, -skew[1]); + skew[2] = row1.dot(row2); + row2.combine(row1, 1.0, -skew[2]); + + // Next, get Z scale and normalize 3rd row. + scale[2] = row2.vectorLength(); + row2.divide(scale[2]); + skew[1] /= scale[2]; + skew[2] /= scale[2]; + + // At this point, the matrix (in rows) is orthonormal. + // Check for a coordinate system flip. If the determinant + // is -1, then negate the matrix and the scaling factors. + var pdum3 = new J3DIVector3(row1); + pdum3.cross(row2); + if (row0.dot(pdum3) < 0) { + for (i = 0; i < 3; i++) { + scale[i] *= -1; + row[0][i] *= -1; + row[1][i] *= -1; + row[2][i] *= -1; + } + } + + // Now, get the rotations out + rotate[1] = Math.asin(-row0[2]); + if (Math.cos(rotate[1]) != 0) { + rotate[0] = Math.atan2(row1[2], row2[2]); + rotate[2] = Math.atan2(row0[1], row0[0]); + } + else { + rotate[0] = Math.atan2(-row2[0], row1[1]); + rotate[2] = 0; + } + + // Convert rotations to degrees + var rad2deg = 180 / Math.PI; + rotate[0] *= rad2deg; + rotate[1] *= rad2deg; + rotate[2] *= rad2deg; + + return true; +} + +J3DIMatrix4.prototype._determinant2x2 = function(a, b, c, d) +{ + return a * d - b * c; +} + +J3DIMatrix4.prototype._determinant3x3 = function(a1, a2, a3, b1, b2, b3, c1, c2, c3) +{ + return a1 * this._determinant2x2(b2, b3, c2, c3) + - b1 * this._determinant2x2(a2, a3, c2, c3) + + c1 * this._determinant2x2(a2, a3, b2, b3); +} + +J3DIMatrix4.prototype._determinant4x4 = function() +{ + var a1 = this.$matrix.m11; + var b1 = this.$matrix.m12; + var c1 = this.$matrix.m13; + var d1 = this.$matrix.m14; + + var a2 = this.$matrix.m21; + var b2 = this.$matrix.m22; + var c2 = this.$matrix.m23; + var d2 = this.$matrix.m24; + + var a3 = this.$matrix.m31; + var b3 = this.$matrix.m32; + var c3 = this.$matrix.m33; + var d3 = this.$matrix.m34; + + var a4 = this.$matrix.m41; + var b4 = this.$matrix.m42; + var c4 = this.$matrix.m43; + var d4 = this.$matrix.m44; + + return a1 * this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4) + - b1 * this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4) + + c1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) + - d1 * this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4); +} + +J3DIMatrix4.prototype._makeAdjoint = function() +{ + var a1 = this.$matrix.m11; + var b1 = this.$matrix.m12; + var c1 = this.$matrix.m13; + var d1 = this.$matrix.m14; + + var a2 = this.$matrix.m21; + var b2 = this.$matrix.m22; + var c2 = this.$matrix.m23; + var d2 = this.$matrix.m24; + + var a3 = this.$matrix.m31; + var b3 = this.$matrix.m32; + var c3 = this.$matrix.m33; + var d3 = this.$matrix.m34; + + var a4 = this.$matrix.m41; + var b4 = this.$matrix.m42; + var c4 = this.$matrix.m43; + var d4 = this.$matrix.m44; + + // Row column labeling reversed since we transpose rows & columns + this.$matrix.m11 = this._determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4); + this.$matrix.m21 = - this._determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4); + this.$matrix.m31 = this._determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4); + this.$matrix.m41 = - this._determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4); + + this.$matrix.m12 = - this._determinant3x3(b1, b3, b4, c1, c3, c4, d1, d3, d4); + this.$matrix.m22 = this._determinant3x3(a1, a3, a4, c1, c3, c4, d1, d3, d4); + this.$matrix.m32 = - this._determinant3x3(a1, a3, a4, b1, b3, b4, d1, d3, d4); + this.$matrix.m42 = this._determinant3x3(a1, a3, a4, b1, b3, b4, c1, c3, c4); + + this.$matrix.m13 = this._determinant3x3(b1, b2, b4, c1, c2, c4, d1, d2, d4); + this.$matrix.m23 = - this._determinant3x3(a1, a2, a4, c1, c2, c4, d1, d2, d4); + this.$matrix.m33 = this._determinant3x3(a1, a2, a4, b1, b2, b4, d1, d2, d4); + this.$matrix.m43 = - this._determinant3x3(a1, a2, a4, b1, b2, b4, c1, c2, c4); + + this.$matrix.m14 = - this._determinant3x3(b1, b2, b3, c1, c2, c3, d1, d2, d3); + this.$matrix.m24 = this._determinant3x3(a1, a2, a3, c1, c2, c3, d1, d2, d3); + this.$matrix.m34 = - this._determinant3x3(a1, a2, a3, b1, b2, b3, d1, d2, d3); + this.$matrix.m44 = this._determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3); +} + +// +// J3DIVector3 +// +J3DIVector3 = function(x,y,z) +{ + this.load(x,y,z); +} + +J3DIVector3.prototype.load = function(x,y,z) +{ + if (typeof x == 'object' && "length" in x) { + this[0] = x[0]; + this[1] = x[1]; + this[2] = x[2]; + } + else if (typeof x == 'number') { + this[0] = x; + this[1] = y; + this[2] = z; + } + else { + this[0] = 0; + this[1] = 0; + this[2] = 0; + } +} + +J3DIVector3.prototype.getAsArray = function() +{ + return [ this[0], this[1], this[2] ]; +} + +J3DIVector3.prototype.getAsFloat32Array = function() +{ + return new Float32Array(this.getAsArray()); +} + +J3DIVector3.prototype.vectorLength = function() +{ + return Math.sqrt(this[0] * this[0] + this[1] * this[1] + this[2] * this[2]); +} + +J3DIVector3.prototype.divide = function(divisor) +{ + this[0] /= divisor; this[1] /= divisor; this[2] /= divisor; +} + +J3DIVector3.prototype.cross = function(v) +{ + this[0] = this[1] * v[2] - this[2] * v[1]; + this[1] = -this[0] * v[2] + this[2] * v[0]; + this[2] = this[0] * v[1] - this[1] * v[0]; +} + +J3DIVector3.prototype.dot = function(v) +{ + return this[0] * v[0] + this[1] * v[1] + this[2] * v[2]; +} + +J3DIVector3.prototype.combine = function(v, ascl, bscl) +{ + this[0] = (ascl * this[0]) + (bscl * v[0]); + this[1] = (ascl * this[1]) + (bscl * v[1]); + this[2] = (ascl * this[2]) + (bscl * v[2]); +} + +J3DIVector3.prototype.multVecMatrix = function(matrix) +{ + var x = this[0]; + var y = this[1]; + var z = this[2]; + + this[0] = matrix.$matrix.m41 + x * matrix.$matrix.m11 + y * matrix.$matrix.m21 + z * matrix.$matrix.m31; + this[1] = matrix.$matrix.m42 + x * matrix.$matrix.m12 + y * matrix.$matrix.m22 + z * matrix.$matrix.m32; + this[2] = matrix.$matrix.m43 + x * matrix.$matrix.m13 + y * matrix.$matrix.m23 + z * matrix.$matrix.m33; + var w = matrix.$matrix.m44 + x * matrix.$matrix.m14 + y * matrix.$matrix.m24 + z * matrix.$matrix.m34; + if (w != 1 && w != 0) { + this[0] /= w; + this[1] /= w; + this[2] /= w; + } +} + +J3DIVector3.prototype.toString = function() +{ + return "["+this[0]+","+this[1]+","+this[2]+"]"; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/const.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,3 @@ +const TITLE = 0; +const MENU = 1; +const MAIN = 2; \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/f4xml.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,170 @@ +function parseXml(gl){ + imgs = []; + loadObjXml(gl,"./xml/title.xml"); + loadObjXml(gl,"./xml/press.xml"); + loadObjXml(gl,"./xml/mainmode.xml"); + imgs.push(gl.obj["title"]); + imgs.push(gl.obj["press"]); + imgs.push(gl.obj["mainmode"]); +} + +function loadObjXml(gl,url) +{ + if(gl.obj == undefined) gl.obj = new Object(); + var xmlChara = new Object(); + xmlChara = parsePanel(url); + for (var name in xmlChara) + { + gl.obj[name] = makeXmlObj(gl, xmlChara[name]); + gl.obj[name].texture = loadImageTexture(gl, xmlChara[name].image); + } +} + + +function PutSpriteF(ctx,x,y,scale,glObj){ + ctx.enableVertexAttribArray(0); + ctx.enableVertexAttribArray(1); + ctx.enableVertexAttribArray(2); + + ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.vertexObject); + ctx.vertexAttribPointer(2, 3, ctx.FLOAT, false, 0, 0); + ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.normalObject); + ctx.vertexAttribPointer(0, 3, ctx.FLOAT, false, 0, 0); + + ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.texCoordObject); + ctx.vertexAttribPointer(1, 2, ctx.FLOAT, false, 0, 0); + + ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, glObj.indexObject); + + + // generate the model-view matrix + var mvMatrix = new J3DIMatrix4(); + mvMatrix.scale(scale, scale, scale); + mvMatrix.translate( x, y, 10); + + // construct the normal matrix from the model-view matrix + var normalMatrix = new J3DIMatrix4(mvMatrix); + normalMatrix.invert(); + normalMatrix.transpose(); + normalMatrix.setUniform(ctx, ctx.getUniformLocation(ctx.program, "u_normalMatrix"), false); + + // construct the model-view * projection matrix + var mvpMatrix = new J3DIMatrix4(ctx.perspectiveMatrix); + mvpMatrix.multiply(mvMatrix); + mvpMatrix.setUniform(ctx, ctx.getUniformLocation(ctx.program, "u_modelViewProjMatrix"), false); + + + ctx.bindTexture(ctx.TEXTURE_2D, glObj.texture); + ctx.drawElements(ctx.TRIANGLES, glObj.numIndices, ctx.UNSIGNED_SHORT, 0); + + +} + +function parsePanel( url ) { + var http = new JKL.ParseXML( url ); + var data = http.parse()["OBJECT-3D"]; + var xmlObj = new Object(); + + if (data["surface"][0]) { + for (var i in data["surface"]) { + var obj = xmlObj[data["surface"][i]["name"]] = new Object(); + obj.vertex = splitVector(data["surface"][i]["coordinate"]); + obj.normal = splitVector(data["surface"][i]["normal"]); + obj.texCoords = splitVector(data["surface"][i]["texture"]); + obj.model = splitVector(data["surface"][i]["model"]); + var xmlObjImage = data["surface"][i]["image"]; + obj.image = 'data:image/png;base64,'+xmlObjImage["#text"]; + } + } else { + var obj = xmlObj[data["surface"]["name"]] = new Object(); + obj.vertex = splitVector(data["surface"]["coordinate"]); + obj.normal = splitVector(data["surface"]["normal"]); + obj.texCoords = splitVector(data["surface"]["texture"]); + obj.model = splitVector(data["surface"]["model"]); + var xmlObjImage = data["surface"]["image"]; + obj.image = 'data:image/png;base64,'+xmlObjImage["#text"]; + } + + return xmlObj; +} + +function splitVector(str) { + // return str.replace(/^\s+/g, "").replace(/\s+/g, " ").split(" "); + return str.replace(/^\s+/g, "").replace(/\s+/g, " ").replace(/\s$/g, "").split(" "); +} + +function makeXmlObj(ctx, xmlObj) +{ + + var model = new Object(); + model.x = parseFloat(xmlObj.model[0]); + model.y = parseFloat(xmlObj.model[1]); + model.z = parseFloat(xmlObj.model[2]); + + var geometryData = [ ]; + var normalData = [ ]; + var texCoordData = [ ]; + var indexData = [ ]; + var index = 0; + var xmax = 0; + var xmin = 0; + var ymax = 0; + var ymin = 0; + + + for(var i=0; xmlObj.vertex[i]; i+=3){ + geometryData.push(parseFloat(xmlObj.vertex[i]) - model.x); + geometryData.push(parseFloat(xmlObj.vertex[i+1]) - model.y); + geometryData.push(parseFloat(xmlObj.vertex[i+2]) - model.z); + if ( (i % 3) == 0) { + indexData.push(index); + index++; + } + //オブジェクトの最大・最小のx,y座標を求める + if ( i == 0) { + xmax = geometryData[0]; + xmin = geometryData[0]; + ymax = geometryData[1]; + ymin = geometryData[1]; + } + if ( i > 0 ){ + xmax = Math.max( xmax, geometryData[i]); + xmin = Math.min( xmin, geometryData[i]); + ymax = Math.max( ymax, geometryData[i+1]); + ymin = Math.min( ymin, geometryData[i+1]); + } + } + for(i=0; xmlObj.texCoords[i]; i++){ + texCoordData.push(parseFloat(xmlObj.texCoords[i])); + + } + for(i=0; xmlObj.normal[i]; i+=3){ + normalData.push(parseFloat(xmlObj.normal[i])); + normalData.push(parseFloat(xmlObj.normal[i+1])); + normalData.push(parseFloat(xmlObj.normal[i+2])); + } + + var retval = { }; + //オブジェクトの横幅,縦幅を求める + retval.w = xmax - xmin; + retval.h = ymax - ymin; + + retval.normalObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW); + + retval.texCoordObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW); + + retval.vertexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW); + + retval.numIndices = indexData.length; + retval.indexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject); + ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW); + + return retval; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/jkl-parsexml.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,676 @@ +// ================================================================ +// jkl-parsexml.js ---- JavaScript Kantan Library for Parsing XML +// Copyright 2005-2007 Kawasaki Yusuke <u-suke@kawa.net> +// http://www.kawa.net/works/js/jkl/parsexml.html +// ================================================================ +// v0.01 2005/05/18 first release +// v0.02 2005/05/20 Opera 8.0beta may be abailable but somtimes crashed +// v0.03 2005/05/20 overrideMimeType( "text/xml" ); +// v0.04 2005/05/21 class variables: REQUEST_TYPE, RESPONSE_TYPE +// v0.05 2005/05/22 use Msxml2.DOMDocument.5.0 for GET method on IE6 +// v0.06 2005/05/22 CDATA_SECTION_NODE +// v0.07 2005/05/23 use Microsoft.XMLDOM for GET method on IE6 +// v0.10 2005/10/11 new function: JKL.ParseXML.HTTP.responseText() +// v0.11 2005/10/13 new sub class: JKL.ParseXML.Text, JSON and DOM. +// v0.12 2005/10/14 new sub class: JKL.ParseXML.CSV and CSVmap. +// v0.13 2005/10/28 bug fixed: TEXT_NODE regexp for white spaces +// v0.14 2005/11/06 bug fixed: TEXT_NODE regexp at Safari +// v0.15 2005/11/08 bug fixed: JKL.ParseXML.CSV.async() method +// v0.16 2005/11/15 new sub class: LoadVars, and UTF-8 text on Safari +// v0.18 2005/11/16 improve: UTF-8 text file on Safari +// v0.19 2006/02/03 use XMLHTTPRequest instead of ActiveX on IE7,iCab +// v0.20 2006/03/22 (skipped) +// v0.21 2006/11/30 use ActiveX again on IE7 +// v0.22 2007/01/04 JKL.ParseXML.JSON.parseResponse() updated +// ================================================================ + +if ( typeof(JKL) == 'undefined' ) JKL = function() {}; + +// ================================================================ +// class: JKL.ParseXML + +JKL.ParseXML = function ( url, query, method ) { + // debug.print( "new JKL.ParseXML( '"+url+"', '"+query+"', '"+method+"' );" ); + this.http = new JKL.ParseXML.HTTP( url, query, method, false ); + return this; +}; + +// ================================================================ +// class variables + +JKL.ParseXML.VERSION = "0.22"; +JKL.ParseXML.MIME_TYPE_XML = "text/xml"; +JKL.ParseXML.MAP_NODETYPE = [ + "", + "ELEMENT_NODE", // 1 + "ATTRIBUTE_NODE", // 2 + "TEXT_NODE", // 3 + "CDATA_SECTION_NODE", // 4 + "ENTITY_REFERENCE_NODE", // 5 + "ENTITY_NODE", // 6 + "PROCESSING_INSTRUCTION_NODE", // 7 + "COMMENT_NODE", // 8 + "DOCUMENT_NODE", // 9 + "DOCUMENT_TYPE_NODE", // 10 + "DOCUMENT_FRAGMENT_NODE", // 11 + "NOTATION_NODE" // 12 +]; + +// ================================================================ +// define callback function (ajax) + +JKL.ParseXML.prototype.async = function ( func, args ) { + this.callback_func = func; // callback function + this.callback_arg = args; // first argument +}; + +JKL.ParseXML.prototype.onerror = function ( func, args ) { + this.onerror_func = func; // callback function +}; + +// ================================================================ +// method: parse() +// return: parsed object +// Download a file from remote server and parse it. + +JKL.ParseXML.prototype.parse = function () { + if ( ! this.http ) return; + + // set onerror call back + if ( this.onerror_func ) { + this.http.onerror( this.onerror_func ); + } + + if ( this.callback_func ) { // async mode + var copy = this; + var proc = function() { + if ( ! copy.http ) return; + var data = copy.parseResponse(); + copy.callback_func( data, copy.callback_arg ); // call back + }; + this.http.async( proc ); + } + + this.http.load(); + + if ( ! this.callback_func ) { // sync mode + var data = this.parseResponse(); + return data; + } +}; + +// ================================================================ +// every child/children into array +JKL.ParseXML.prototype.setOutputArrayAll = function () { + this.setOutputArray( true ); +} +// a child into scalar, children into array +JKL.ParseXML.prototype.setOutputArrayAuto = function () { + this.setOutputArray( null ); +} +// every child/children into scalar (first sibiling only) +JKL.ParseXML.prototype.setOutputArrayNever = function () { + this.setOutputArray( false ); +} +// specified child/children into array, other child/children into scalar +JKL.ParseXML.prototype.setOutputArrayElements = function ( list ) { + this.setOutputArray( list ); +} +// specify how to treate child/children into scalar/array +JKL.ParseXML.prototype.setOutputArray = function ( mode ) { + if ( typeof(mode) == "string" ) { + mode = [ mode ]; // string into array + } + if ( mode && typeof(mode) == "object" ) { + if ( mode.length < 0 ) { + mode = false; // false when array == [] + } else { + var hash = {}; + for( var i=0; i<mode.length; i++ ) { + hash[mode[i]] = true; + } + mode = hash; // array into hashed array + if ( mode["*"] ) { + mode = true; // true when includes "*" + } + } + } + this.usearray = mode; +} + +// ================================================================ +// method: parseResponse() + +JKL.ParseXML.prototype.parseResponse = function () { + var root = this.http.documentElement(); + var data = this.parseDocument( root ); + return data; +} + +// ================================================================ +// convert from DOM root node to JavaScript Object +// method: parseElement( rootElement ) + +JKL.ParseXML.prototype.parseDocument = function ( root ) { + // debug.print( "parseDocument: "+root ); + if ( ! root ) return; + + var ret = this.parseElement( root ); // parse root node + // debug.print( "parsed: "+ret ); + + if ( this.usearray == true ) { // always into array + ret = [ ret ]; + } else if ( this.usearray == false ) { // always into scalar + // + } else if ( this.usearray == null ) { // automatic + // + } else if ( this.usearray[root.nodeName] ) { // specified tag + ret = [ ret ]; + } + + var json = {}; + json[root.nodeName] = ret; // root nodeName + return json; +}; + +// ================================================================ +// convert from DOM Element to JavaScript Object +// method: parseElement( element ) + +JKL.ParseXML.prototype.parseElement = function ( elem ) { + // debug.print( "nodeType: "+JKL.ParseXML.MAP_NODETYPE[elem.nodeType]+" <"+elem.nodeName+">" ); + + // COMMENT_NODE + + if ( elem.nodeType == 7 ) { + return; + } + + // TEXT_NODE CDATA_SECTION_NODE + + if ( elem.nodeType == 3 || elem.nodeType == 4 ) { + // var bool = elem.nodeValue.match( /[^\u0000-\u0020]/ ); + var bool = elem.nodeValue.match( /[^\x00-\x20]/ ); // for Safari + if ( bool == null ) return; // ignore white spaces + // debug.print( "TEXT_NODE: "+elem.nodeValue.length+ " "+bool ); + return elem.nodeValue; + } + + var retval; + var cnt = {}; + + // parse attributes + + if ( elem.attributes && elem.attributes.length ) { + retval = {}; + for ( var i=0; i<elem.attributes.length; i++ ) { + var key = elem.attributes[i].nodeName; + if ( typeof(key) != "string" ) continue; + var val = elem.attributes[i].nodeValue; + if ( ! val ) continue; + if ( typeof(cnt[key]) == "undefined" ) cnt[key] = 0; + cnt[key] ++; + this.addNode( retval, key, cnt[key], val ); + } + } + + // parse child nodes (recursive) + + if ( elem.childNodes && elem.childNodes.length ) { + var textonly = true; + if ( retval ) textonly = false; // some attributes exists + for ( var i=0; i<elem.childNodes.length && textonly; i++ ) { + var ntype = elem.childNodes[i].nodeType; + if ( ntype == 3 || ntype == 4 ) continue; + textonly = false; + } + if ( textonly ) { + if ( ! retval ) retval = ""; + for ( var i=0; i<elem.childNodes.length; i++ ) { + retval += elem.childNodes[i].nodeValue; + } + } else { + if ( ! retval ) retval = {}; + for ( var i=0; i<elem.childNodes.length; i++ ) { + var key = elem.childNodes[i].nodeName; + if ( typeof(key) != "string" ) continue; + var val = this.parseElement( elem.childNodes[i] ); + if ( ! val ) continue; + if ( typeof(cnt[key]) == "undefined" ) cnt[key] = 0; + cnt[key] ++; + this.addNode( retval, key, cnt[key], val ); + } + } + } + return retval; +}; + +// ================================================================ +// method: addNode( hash, key, count, value ) + +JKL.ParseXML.prototype.addNode = function ( hash, key, cnts, val ) { + if ( this.usearray == true ) { // into array + if ( cnts == 1 ) hash[key] = []; + hash[key][hash[key].length] = val; // push + } else if ( this.usearray == false ) { // into scalar + if ( cnts == 1 ) hash[key] = val; // only 1st sibling + } else if ( this.usearray == null ) { + if ( cnts == 1 ) { // 1st sibling + hash[key] = val; + } else if ( cnts == 2 ) { // 2nd sibling + hash[key] = [ hash[key], val ]; + } else { // 3rd sibling and more + hash[key][hash[key].length] = val; + } + } else if ( this.usearray[key] ) { + if ( cnts == 1 ) hash[key] = []; + hash[key][hash[key].length] = val; // push + } else { + if ( cnts == 1 ) hash[key] = val; // only 1st sibling + } +}; + +// ================================================================ +// class: JKL.ParseXML.Text + +JKL.ParseXML.Text = function ( url, query, method ) { + // debug.print( "new JKL.ParseXML.Text( '"+url+"', '"+query+"', '"+method+"' );" ); + this.http = new JKL.ParseXML.HTTP( url, query, method, true ); + return this; +}; + +JKL.ParseXML.Text.prototype.parse = JKL.ParseXML.prototype.parse; +JKL.ParseXML.Text.prototype.async = JKL.ParseXML.prototype.async; +JKL.ParseXML.Text.prototype.onerror = JKL.ParseXML.prototype.onerror; + +JKL.ParseXML.Text.prototype.parseResponse = function () { + var data = this.http.responseText(); + return data; +} + +// ================================================================ +// class: JKL.ParseXML.JSON + +JKL.ParseXML.JSON = function ( url, query, method ) { + // debug.print( "new JKL.ParseXML.JSON( '"+url+"', '"+query+"', '"+method+"' );" ); + this.http = new JKL.ParseXML.HTTP( url, query, method, true ); + return this; +}; + +JKL.ParseXML.JSON.prototype.parse = JKL.ParseXML.prototype.parse; +JKL.ParseXML.JSON.prototype.async = JKL.ParseXML.prototype.async; +JKL.ParseXML.JSON.prototype.onerror = JKL.ParseXML.prototype.onerror; + +JKL.ParseXML.JSON.prototype.parseResponse = function () { + var text = this.http.responseText(); + // http://www.antimon2.atnifty.com/2007/01/jklparsexmljson.html + if ( typeof(text) == 'undefined' ) return; + if ( ! text.length ) return; + var data = eval( "("+text+")" ); + return data; +} + +// ================================================================ +// class: JKL.ParseXML.DOM + +JKL.ParseXML.DOM = function ( url, query, method ) { + // debug.print( "new JKL.ParseXML.DOM( '"+url+"', '"+query+"', '"+method+"' );" ); + this.http = new JKL.ParseXML.HTTP( url, query, method, false ); + return this; +}; + +JKL.ParseXML.DOM.prototype.parse = JKL.ParseXML.prototype.parse; +JKL.ParseXML.DOM.prototype.async = JKL.ParseXML.prototype.async; +JKL.ParseXML.DOM.prototype.onerror = JKL.ParseXML.prototype.onerror; + +JKL.ParseXML.DOM.prototype.parseResponse = function () { + var data = this.http.documentElement(); + return data; +} + +// ================================================================ +// class: JKL.ParseXML.CSV + +JKL.ParseXML.CSV = function ( url, query, method ) { + // debug.print( "new JKL.ParseXML.CSV( '"+url+"', '"+query+"', '"+method+"' );" ); + this.http = new JKL.ParseXML.HTTP( url, query, method, true ); + return this; +}; + +JKL.ParseXML.CSV.prototype.parse = JKL.ParseXML.prototype.parse; +JKL.ParseXML.CSV.prototype.async = JKL.ParseXML.prototype.async; +JKL.ParseXML.CSV.prototype.onerror = JKL.ParseXML.prototype.onerror; + +JKL.ParseXML.CSV.prototype.parseResponse = function () { + var text = this.http.responseText(); + var data = this.parseCSV( text ); + return data; +} + +JKL.ParseXML.CSV.prototype.parseCSV = function ( text ) { + text = text.replace( /\r\n?/g, "\n" ); // new line character + var pos = 0; + var len = text.length; + var table = []; + while( pos<len ) { + var line = []; + while( pos<len ) { + if ( text.charAt(pos) == '"' ) { // "..." quoted column + var nextquote = text.indexOf( '"', pos+1 ); + while ( nextquote<len && nextquote > -1 ) { + if ( text.charAt(nextquote+1) != '"' ) { + break; // end of column + } + nextquote = text.indexOf( '"', nextquote+2 ); + } + if ( nextquote < 0 ) { + // unclosed quote + } else if ( text.charAt(nextquote+1) == "," ) { // end of column + var quoted = text.substr( pos+1, nextquote-pos-1 ); + quoted = quoted.replace(/""/g,'"'); + line[line.length] = quoted; + pos = nextquote+2; + continue; + } else if ( text.charAt(nextquote+1) == "\n" || // end of line + len==nextquote+1 ) { // end of file + var quoted = text.substr( pos+1, nextquote-pos-1 ); + quoted = quoted.replace(/""/g,'"'); + line[line.length] = quoted; + pos = nextquote+2; + break; + } else { + // invalid column + } + } + var nextcomma = text.indexOf( ",", pos ); + var nextnline = text.indexOf( "\n", pos ); + if ( nextnline < 0 ) nextnline = len; + if ( nextcomma > -1 && nextcomma < nextnline ) { + line[line.length] = text.substr( pos, nextcomma-pos ); + pos = nextcomma+1; + } else { // end of line + line[line.length] = text.substr( pos, nextnline-pos ); + pos = nextnline+1; + break; + } + } + if ( line.length >= 0 ) { + table[table.length] = line; // push line + } + } + if ( table.length < 0 ) return; // null data + return table; +}; + +// ================================================================ +// class: JKL.ParseXML.CSVmap + +JKL.ParseXML.CSVmap = function ( url, query, method ) { + // debug.print( "new JKL.ParseXML.CSVmap( '"+url+"', '"+query+"', '"+method+"' );" ); + this.http = new JKL.ParseXML.HTTP( url, query, method, true ); + return this; +}; + +JKL.ParseXML.CSVmap.prototype.parse = JKL.ParseXML.prototype.parse; +JKL.ParseXML.CSVmap.prototype.async = JKL.ParseXML.prototype.async; +JKL.ParseXML.CSVmap.prototype.onerror = JKL.ParseXML.prototype.onerror; +JKL.ParseXML.CSVmap.prototype.parseCSV = JKL.ParseXML.CSV.prototype.parseCSV; + +JKL.ParseXML.CSVmap.prototype.parseResponse = function () { + var text = this.http.responseText(); + var source = this.parseCSV( text ); + if ( ! source ) return; + if ( source.length < 0 ) return; + + var title = source.shift(); // first line as title + var data = []; + for( var i=0; i<source.length; i++ ) { + var hash = {}; + for( var j=0; j<title.length && j<source[i].length; j++ ) { + hash[title[j]] = source[i][j]; // array to map + } + data[data.length] = hash; // push line + } + return data; +} + +// ================================================================ +// class: JKL.ParseXML.LoadVars + +JKL.ParseXML.LoadVars = function ( url, query, method ) { + // debug.print( "new JKL.ParseXML.LoadVars( '"+url+"', '"+query+"', '"+method+"' );" ); + this.http = new JKL.ParseXML.HTTP( url, query, method, true ); + return this; +}; + +JKL.ParseXML.LoadVars.prototype.parse = JKL.ParseXML.prototype.parse; +JKL.ParseXML.LoadVars.prototype.async = JKL.ParseXML.prototype.async; +JKL.ParseXML.LoadVars.prototype.onerror = JKL.ParseXML.prototype.onerror; + +JKL.ParseXML.LoadVars.prototype.parseResponse = function () { + var text = this.http.responseText(); + text = text.replace( /\r\n?/g, "\n" ); // new line character + var hash = {}; + var list = text.split( "&" ); + for( var i=0; i<list.length; i++ ) { + var eq = list[i].indexOf( "=" ); + if ( eq > -1 ) { + var key = decodeURIComponent(list[i].substr(0,eq).replace("+","%20")); + var val = decodeURIComponent(list[i].substr(eq+1).replace("+","%20")); + hash[key] = val; + } else { + hash[list[i]] = ""; + } + } + return hash; +}; + +// ================================================================ +// class: JKL.ParseXML.HTTP +// constructer: new JKL.ParseXML.HTTP() + +JKL.ParseXML.HTTP = function( url, query, method, textmode ) { + // debug.print( "new JKL.ParseXML.HTTP( '"+url+"', '"+query+"', '"+method+"', '"+textmode+"' );" ); + this.url = url; + if ( typeof(query) == "string" ) { + this.query = query; + } else { + this.query = ""; + } + if ( method ) { + this.method = method; + } else if ( typeof(query) == "string" ) { + this.method = "POST"; + } else { + this.method = "GET"; + } + this.textmode = textmode ? true : false; + this.req = null; + this.xmldom_flag = false; + this.onerror_func = null; + this.callback_func = null; + this.already_done = null; + return this; +}; + +// ================================================================ +// class variables + +JKL.ParseXML.HTTP.REQUEST_TYPE = "application/x-www-form-urlencoded"; +JKL.ParseXML.HTTP.ACTIVEX_XMLDOM = "Microsoft.XMLDOM"; // Msxml2.DOMDocument.5.0 +JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP = "Microsoft.XMLHTTP"; // Msxml2.XMLHTTP.3.0 +JKL.ParseXML.HTTP.EPOCH_TIMESTAMP = "Thu, 01 Jun 1970 00:00:00 GMT" + +// ================================================================ + +JKL.ParseXML.HTTP.prototype.onerror = JKL.ParseXML.prototype.onerror; +JKL.ParseXML.HTTP.prototype.async = function( func ) { + this.async_func = func; +} + +// ================================================================ +// [IE+IXMLDOMElement] +// XML text/xml OK +// XML application/rdf+xml OK +// TEXT text/plain NG +// TEXT others NG +// [IE+IXMLHttpRequest] +// XML text/xml OK +// XML application/rdf+xml NG +// TEXT text/plain OK +// TEXT others OK +// [Firefox+XMLHttpRequest] +// XML text/xml OK +// XML application/rdf+xml OK (overrideMimeType) +// TEXT text/plain OK +// TEXT others OK (overrideMimeType) +// [Opera+XMLHttpRequest] +// XML text/xml OK +// XML application/rdf+xml OK +// TEXT text/plain OK +// TEXT others OK +// ================================================================ + +JKL.ParseXML.HTTP.prototype.load = function() { + // create XMLHttpRequest object + if ( window.ActiveXObject ) { // IE5.5,6,7 + var activex = JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP; // IXMLHttpRequest + if ( this.method == "GET" && ! this.textmode ) { + // use IXMLDOMElement to accept any mime types + // because overrideMimeType() is not available on IE6 + activex = JKL.ParseXML.HTTP.ACTIVEX_XMLDOM; // IXMLDOMElement + } + // debug.print( "new ActiveXObject( '"+activex+"' )" ); + this.req = new ActiveXObject( activex ); + } else if ( window.XMLHttpRequest ) { // Firefox, Opera, iCab + // debug.print( "new XMLHttpRequest()" ); + this.req = new XMLHttpRequest(); + } + + // async mode when call back function is specified + var async_flag = this.async_func ? true : false; + // debug.print( "async: "+ async_flag ); + + // open for XMLHTTPRequest (not for IXMLDOMElement) + if ( typeof(this.req.send) != "undefined" ) { + // debug.print( "open( '"+this.method+"', '"+this.url+"', "+async_flag+" );" ); + this.req.open( this.method, this.url, async_flag ); + } + +// // If-Modified-Since: Thu, 01 Jun 1970 00:00:00 GMT +// if ( typeof(this.req.setRequestHeader) != "undefined" ) { +// // debug.print( "If-Modified-Since"+JKL.ParseXML.HTTP.EPOCH_TIMESTAMP ); +// this.req.setRequestHeader( "If-Modified-Since", JKL.ParseXML.HTTP.EPOCH_TIMESTAMP ); +// } + + // Content-Type: application/x-www-form-urlencoded (request header) + // Some server does not accept without request content-type. + if ( typeof(this.req.setRequestHeader) != "undefined" ) { + // debug.print( "Content-Type: "+JKL.ParseXML.HTTP.REQUEST_TYPE+" (request)" ); + this.req.setRequestHeader( "Content-Type", JKL.ParseXML.HTTP.REQUEST_TYPE ); + } + + // Content-Type: text/xml (response header) + // FireFox does not accept other mime types like application/rdf+xml etc. + if ( typeof(this.req.overrideMimeType) != "undefined" && ! this.textmode ) { + // debug.print( "Content-Type: "+JKL.ParseXML.MIME_TYPE_XML+" (response)" ); + this.req.overrideMimeType( JKL.ParseXML.MIME_TYPE_XML ); + } + + // set call back handler when async mode + if ( async_flag ) { + var copy = this; + copy.already_done = false; // not parsed yet + var check_func = function () { + if ( copy.req.readyState != 4 ) return; + // debug.print( "readyState(async): "+copy.req.readyState ); + var succeed = copy.checkResponse(); + // debug.print( "checkResponse(async): "+succeed ); + if ( ! succeed ) return; // failed + if ( copy.already_done ) return; // parse only once + copy.already_done = true; // already parsed + copy.async_func(); // call back async + }; + this.req.onreadystatechange = check_func; + // for document.implementation.createDocument + // this.req.onload = check_func; + } + + // send the request and query string + if ( typeof(this.req.send) != "undefined" ) { + // debug.print( "XMLHTTPRequest: send( '"+this.query+"' );" ); + this.req.send( this.query ); // XMLHTTPRequest + } else if ( typeof(this.req.load) != "undefined" ) { + // debug.print( "IXMLDOMElement: load( '"+this.url+"' );" ); + this.req.async = async_flag; + this.req.load( this.url ); // IXMLDOMElement + } + + // just return when async mode + if ( async_flag ) return; + + var succeed = this.checkResponse(); + // debug.print( "checkResponse(sync): "+succeed ); +} + +// ================================================================ +// method: checkResponse() + +JKL.ParseXML.HTTP.prototype.checkResponse = function() { + // parseError on IXMLDOMElement + if ( this.req.parseError && this.req.parseError.errorCode != 0 ) { + // debug.print( "parseError: "+this.req.parseError.reason ); + if ( this.onerror_func ) this.onerror_func( this.req.parseError.reason ); + return false; // failed + } + + // HTTP response code + if ( this.req.status-0 > 0 && + this.req.status != 200 && // OK + this.req.status != 206 && // Partial Content + this.req.status != 304 ) { // Not Modified + // debug.print( "status: "+this.req.status ); + if ( this.onerror_func ) this.onerror_func( this.req.status ); + return false; // failed + } + + return true; // succeed +} + +// ================================================================ +// method: documentElement() +// return: XML DOM in response body + +JKL.ParseXML.HTTP.prototype.documentElement = function() { + // debug.print( "documentElement: "+this.req ); + if ( ! this.req ) return; + if ( this.req.responseXML ) { + return this.req.responseXML.documentElement; // XMLHTTPRequest + } else { + return this.req.documentElement; // IXMLDOMDocument + } +} + +// ================================================================ +// method: responseText() +// return: text string in response body + +JKL.ParseXML.HTTP.prototype.responseText = function() { + // debug.print( "responseText: "+this.req ); + if ( ! this.req ) return; + + // Safari and Konqueror cannot understand the encoding of text files. + if ( navigator.appVersion.match( "KHTML" ) ) { + var esc = escape( this.req.responseText ); +// debug.print( "escape: "+esc ); + if ( ! esc.match("%u") && esc.match("%") ) { + return decodeURIComponent(esc); + } + } + + return this.req.responseText; +} + +// ================================================================ +// http://msdn.microsoft.com/library/en-us/xmlsdk/html/d051f7c5-e882-42e8-a5b6-d1ce67af275c.asp +// ================================================================
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/keybord.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,127 @@ +SPressed = false; +DPressed = false; +FPressed = false; +JPressed = false; +KPressed = false; +QPressed = false; +APressed = false; +SpacePressed = false; +PlayingBGM = false; +AUTO = false; + +function keybordDown() +{ + + var keyChar = String.fromCharCode(event.keyCode); + if(keyChar == "S" && !SPressed && MODE==MAIN) { + SPressed = true; + if(HCloseCnt%2==0){ + audioStop(audioHClose2); + audioHClose.play(); + } + else{ + audioStop(audioHClose); + audioHClose2.play(); + } + HCloseCnt++; + } + if(keyChar == "D" && !DPressed && MODE==MAIN) { + DPressed = true; + if(SnareCnt%2==0){ + audioStop(audioSnare2); + audioSnare.play(); + } + else{ + audioStop(audioSnare); + audioSnare2.play(); + } + SnareCnt++; + } + if(keyChar == "F" && !FPressed && MODE==MAIN) { + FPressed = true; + if(KickCnt%2==0){ + audioStop(audioKick2); + audioKick.play(); + } + else{ + audioStop(audioKick); + audioKick2.play(); + } + KickCnt++; + } + if(keyChar == "J" && !JPressed && MODE==MAIN) { + JPressed = true; + if(FtomCnt%2==0){ + audioStop(audioFtom2); + audioFtom.play(); + } + else{ + audioStop(audioFtom); + audioFtom2.play(); + } + FtomCnt++; + } + if(keyChar == "K" && !KPressed && MODE==MAIN) { + KPressed = true; + if(CymbalCnt%2==0){ + audioStop(audioCymbal2); + audioCymbal.play(); + } + else{ + audioStop(audioCymbal); + audioCymbal2.play(); + } + CymbalCnt++; + } + + if(keyChar == " " && !SpacePressed){ + SpacePressed = true; + if(MODE==TITLE){ + MODE = MAIN; + } + else{ + if(!PlayingBGM){ + PlayingBGM = true; + console.log("play"); + audioBGM.play(); + } + else{ + console.log("stop"); + audioStop(audioBGM); + PlayingBGM = false; + } + } + } + console.log("Key: Pushed '"+keyChar+"'"); + +} +function keybordPress(){} + +function keybordUp() +{ + var keyChar = String.fromCharCode(event.keyCode); + if(keyChar == "S"){ + SPressed = false; + } + if(keyChar == "D"){ + DPressed = false; + } + if(keyChar == "F"){ + FPressed = false; + } + if(keyChar == "J"){ + JPressed = false; + } + if(keyChar == "K"){ + KPressed = false; + } + if(keyChar == "Q"){ + JPressed = false; + } + if(keyChar == "A"){ + KPressed = false; + } + if(keyChar == " "){ + SpacePressed = false; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/mainfunc.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,29 @@ +function gameRender(ctx,MODE){ + switch(MODE){ + case TITLE: + titleRender(ctx); + break; + case MAIN: + mainRender(ctx); + break; + } +} + +function titleRender(ctx){ + reshape(ctx); + ctx.clearColor(0,0,0,1); + ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT); + PutSpriteF(ctx,100,30,1,imgs[0]); + PutSpriteF(ctx,98,90,1,imgs[1]); + ctx.flush(); +} + +function mainRender(ctx){ + reshape(ctx); + ctx.clearColor(0,0,0,1); + ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT); + if(!AUTO){ + PutSpriteF(ctx,100,30,1,imgs[2]); + } + ctx.flush(); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/src/sound.js Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,32 @@ +var audioHClose = window.Audio && new Audio("sound/hclose.wav"); +var audioHClose2 = window.Audio && new Audio("sound/hclose.wav"); +var audioHOpen = window.Audio && new Audio("sound/hopen.wav"); +var audioHOpen2 = window.Audio && new Audio("sound/hopen.wav"); +var audioFtom = window.Audio && new Audio("sound/ftom.wav"); +var audioFtom2 = window.Audio && new Audio("sound/ftom.wav"); +var audioCymbal = window.Audio && new Audio("sound/cymbal.wav"); +var audioCymbal2 = window.Audio && new Audio("sound/cymbal.wav"); +var audioKick = window.Audio && new Audio("sound/kick.wav"); +var audioKick2 = window.Audio && new Audio("sound/kick.wav"); +var audioSnare = window.Audio && new Audio("sound/snare.wav"); +var audioSnare2 = window.Audio && new Audio("sound/snare.wav"); +var audioBGM = window.Audio && new Audio("sound/BGM.wav"); + +var CymbalCnt = 0; +var HCloseCnt = 0; +var HOpenCnt = 0; +var FtomCnt = 0; +var KickCnt = 0; +var SnareCnt = 0; + +function audioStop(audioFile){ + if(!audioFile.ended){ + audioFile.pause(); + audioFile.load(); + } +} + +function audioStart(audioFile){ + audioFile.load(); + audioFile.play(); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/test2.html Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,125 @@ +<!DOCTYPE html> + +<html> + <head> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> + <title>WebGL test2</title> + <script src="src/keybord.js"></script> + <script src="src/sound.js"></script> + <script src="src/J3DI.js"></script> + <script src="src/J3DIMath.js"></script> + <script src="src/f4xml.js"></script> + <script src="src/const.js"></script> + <script src="src/mainfunc.js"></script> + <script src="src/jkl-parsexml.js"></script> + </head> + <script id="vshader" type="x-shader/x-vertex"> + uniform mat4 u_modelViewProjMatrix; + uniform mat4 u_normalMatrix; + uniform vec3 lightDir; + + attribute vec3 vNormal; + attribute vec4 vTexCoord; + attribute vec4 vPosition; + + varying float v_Dot; + varying vec2 v_texCoord; + + void main() + { + gl_Position = u_modelViewProjMatrix * vPosition; + v_texCoord = vTexCoord.st; + vec4 transNormal = u_normalMatrix * vec4(vNormal,1); + v_Dot = max(dot(transNormal.xyz, lightDir), 0.0); + } + </script> + + <script id="fshader" type="x-shader/x-fragment"> + #ifdef GL_ES + precision mediump float; + #endif + + uniform sampler2D sampler2d; + + varying float v_Dot; + varying vec2 v_texCoord; + + void main() + { + vec4 color = texture2D(sampler2d,v_texCoord); + color += vec4(0.1,0.1,0.1,1); + // if(color.a == 1.0)color=vec4(1,0,0,1); + // else color=vec4(0,1,1,1); + gl_FragColor = vec4(color.xyz * v_Dot, color.a); + // gl_FragColor = vec4(color.xyz * v_Dot, 0.5); + } + </script> + <script> + + var WIDTH = 1024; + var HEIGHT = 640; + var MODE = TITLE; + function start(){ + var c = document.getElementById("example"); + c.width = WIDTH; + c.height = HEIGHT; + var ctx = init(); + l = function(){loop(ctx)}; + setInterval(l,10); + } + + function init(){ + var gl = initWebGL("example","vshader","fshader",["vNormal","vTexCoord","vPosition"],[0,0,0,1],10000); + gl.uniform3f(gl.getUniformLocation(gl.program,"lightDir"),0,0,1); + gl.uniform1i(gl.getUniformLocation(gl.program,"sampler2d"),0); + gl.enable(gl.TEXTURE_2D); + parseXml(gl); + + return gl; + } + + function loop(ctx){ //main loop + gameRender(ctx,MODE); + } + + width = -1; + height = -1; + + function reshape(ctx) + { + var canvas = document.getElementById('example'); + if (canvas.width == width && canvas.width == height) + return; + + width = canvas.width; + height = canvas.height; + + ctx.viewport(0, 0, width, height); + + ctx.perspectiveMatrix = new J3DIMatrix4(); + ctx.perspectiveMatrix.ortho(0, -200, 0, -140, 0, 10000); + } + + + + + </script> + <style type="text/css"> + canvas { + border: 2px solid black; + } + </style> + <body onload="start()" onkeydown="keybordDown()" onkeypress="keybordPress()" onkeyup="keybordUp()" style='overflow:scroll'> + <font size="4"> + TITLE) SPACE:Go to MAIN MODE<br> + MAIN MODE)S:High-hat D:Snare F:Kick J:Tom K:Cymbal SPACE:Play/Stop <!--A:AUTO PLAY<br>--> +<!-- AUTO PLAY)Q:Quit(Back to MAIN MODE)--> + </font> + <canvas id="example"> + There is supposed to be an example drawing here, but it's not important. + </canvas> + <div id="framerate"></div> + <div id="console"></div> + </body> +</html> +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/xml/font_pushstart.xml Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,154 @@ +<?xml version="1.0"?> +<OBJECT-3D> + <surface name="font_pushstart" size="6" prim="Triangle" parent="NULL"> + <coordinate> + -29.999996 -3.000000 0.000000 + 29.999994 -3.000000 0.000000 + 30.000006 3.000000 0.000000 + 30.000006 3.000000 0.000000 + -30.000004 3.000000 0.000000 + -29.999996 -3.000000 0.000000 + </coordinate> + <normal> + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + </normal> + <model> + 0.000000 0.000000 0.000000 + </model> + <texture> + 0.000000 0.000000 + 1.000000 0.000000 + 1.000000 1.000000 + 1.000000 1.000000 + 0.000000 1.000000 + 0.000000 0.000000 + </texture> + <image name="font_pushstart.png"> + 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 + </image> + </surface> +</OBJECT-3D> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/xml/mainmode.xml Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,231 @@ +<?xml version="1.0"?> +<OBJECT-3D> + <surface name="mainmode" size="6" prim="Triangle" parent="NULL"> + <coordinate> + -44.999996 -10.000000 0.000000 + 44.999994 -10.000000 0.000000 + 45.000006 10.000000 0.000000 + 45.000006 10.000000 0.000000 + -45.000004 10.000000 0.000000 + -44.999996 -10.000000 0.000000 + </coordinate> + <normal> + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + </normal> + <model> + 0.000000 0.000000 0.000000 + </model> + <texture> + 0.000000 0.000000 + 1.000000 0.000000 + 1.000000 1.000000 + 1.000000 1.000000 + 0.000000 1.000000 + 0.000000 0.000000 + </texture> + <image name="mainmode.png"> + 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 + kADH/wN2bjbTsOrFbgAAAABJRU5ErkJggg== + </image> + </surface> + </OBJECT-3D> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/xml/press.xml Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,240 @@ +<?xml version="1.0"?> +<OBJECT-3D> + <surface name="press" size="6" prim="Triangle" parent="NULL"> + <coordinate> + -34.999996 -6.500000 0.000000 + 34.999994 -6.500000 0.000000 + 35.000006 6.500000 0.000000 + 35.000006 6.500000 0.000000 + -35.000004 6.500000 0.000000 + -34.999996 -6.500000 0.000000 + </coordinate> + <normal> + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + </normal> + <model> + 0.000000 0.000000 0.000000 + </model> + <texture> + 0.000000 0.000000 + 1.000000 0.000000 + 1.000000 1.000000 + 1.000000 1.000000 + 0.000000 1.000000 + 0.000000 0.000000 + </texture> + <image name="press.png"> + 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 + AElFTkSuQmCC + </image> + </surface> + </OBJECT-3D> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webGL/xml/title.xml Wed Apr 25 23:45:59 2012 +0900 @@ -0,0 +1,309 @@ +<?xml version="1.0"?> +<OBJECT-3D> + <surface name="title" size="6" prim="Triangle" parent="NULL"> + <coordinate> + -44.999996 -10.000000 0.000000 + 44.999994 -10.000000 0.000000 + 45.000006 10.000000 0.000000 + 45.000006 10.000000 0.000000 + -45.000004 10.000000 0.000000 + -44.999996 -10.000000 0.000000 + </coordinate> + <normal> + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + 0.000000 0.000000 1.000000 + </normal> + <model> + 0.000000 0.000000 0.000000 + </model> + <texture> + 0.000000 0.000000 + 1.000000 0.000000 + 1.000000 1.000000 + 1.000000 1.000000 + 0.000000 1.000000 + 0.000000 0.000000 + </texture> + <image name="title.png"> + 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 + vvlm2P7Mk5KSqG/fvnTvvffSc889F1QOvF4vlZWV1QkVFRX0448/EhHRb37zm7Dy + qdVqRZo6depEjz76KO3bt6+Ow5zA91utVlq7di3dfffdlJycLOKq79RDU+qBt99+ + 208PRBii05ldSWXM7yooKCAif3eB/PdDDz1URxC4MOfMmVPnOXa3yekuKSkhg8Eg + KnbixInid16vl2w2m3BzyJXIXpG0Wm0dRyXcWJxOJ7lcLnFcYObMmfUKrEajoa1b + tzY4Ps5Du3btRP6CEdhZsFBNnTpVNHKXy0WVlZVUXl5O5eXlVF1dTQ6Hw69jcLlc + NGzYMFEWvv/27NmTTp48SUSXjg1VVVVRWVmZiIsbPr9v48aNlJaW5pePpggsG2PH + jiUiCtowbTYbjR8/3u/CkkiUMju3CdUhAaAuXboE7YRY7liJhpKbq6Wu165dK97P + 5ROr9hVuX9hQZcxlYTabae7cuSJ9wRQvw/2Sw+EQedq9eze1bds2aB/M/09KSqKz + 5876yX2kRJJPbj8prVLo5Zdf9lP89b3f9/vKykq6//77xbsud/TvSuqBSPqgZrdM + DdQaxnz55ZcAave4gNo9vxtuuAGA/1Ig/f/ehtFoFL/l4yZsqMNLk99++61Ymhgz + Zgw++OAD2O12cXGF7zVpHO/UqVPx/PPPo7q6Oug1ar77L3q9HkBdo4dgqFQqER8v + BTUkPp1O53ctIBGJsvNdYuL8OBwOPPHEE5g7dy7sdrson8TExDp5Y/hChc2bN2PQ + oEHYtWuXWNrt2rUrNm3ahPT0dLG86Vt3gXHZbDYMHz4cn332GUaOHImKioomc1DP + F5OsX78eBw4cQFZWlrCA5j04jUaDFStWoKioCAUFBdi9ezcURYFWqw1673Ag4aTb + 9/5bj8cjlsu5fvhoSX1y09LrOvD4Yjy0r6aAl+1TUlKwYsUKDBs2TNjJKIqCkpIS + LFu2DDabDUQEk8mEyZMno1evXn5Lx1arFf369cOCBQtwxx13hHwfEcHtcqOqqgo1 + NTVQK2qktUmrswRNRCgvL6/zvKIoqKmpgdForPeqW76QZeDAgVi+fDnat28PIoLN + ZoNOp4OiKLhw4QIWLFiAU6dOibLo1KkTpk6dipSUFLGvbLFYsGDBAtx7772YPHky + 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 + AAAAAElFTkSuQmCC + </image> + </surface> + </OBJECT-3D> \ No newline at end of file