{"id":272,"date":"2025-07-29T09:59:28","date_gmt":"2025-07-29T01:59:28","guid":{"rendered":"http:\/\/hhh3m.top\/?p=272"},"modified":"2026-04-09T10:19:26","modified_gmt":"2026-04-09T02:19:26","slug":"test","status":"publish","type":"post","link":"https:\/\/hhh3m.top\/index.php\/2025\/07\/29\/test\/","title":{"rendered":"TEST"},"content":{"rendered":"\n<img decoding=\"async\" src=\"https:\/\/tool.lu\/netcard\/\">\n\n\n\n<iframe loading=\"lazy\" \n        src=\"https:\/\/hhh3m.top\/index.php\/2025\/07\/29\/test\/\" \n        width=\"100%\" \n        height=\"500px\"\n        allowfullscreen>\n    <\/iframe>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http:\/\/hhh3m.top\/wp-content\/uploads\/2025\/06\/\u7d2f.gif'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"146\" height=\"116\" data-original=\"http:\/\/hhh3m.top\/wp-content\/uploads\/2025\/06\/\u7d2f.gif\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-18 size-full\"\/><\/div><\/figure><div class=\"wp-block-media-text__content\">\n<p>123456&lt;p&gt;111&lt;\/p&gt;<\/p>\n<\/div><\/div>\n\n\n<div class=\"logged-out wp-block-loginout\"><a href=\"https:\/\/hhh3m.top\/wp-login.php?redirect_to=https%3A%2F%2Fhhh3m.top%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F272\">\u767b\u5f55<\/a><\/div>\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-hhh-3-m-039-s-blog wp-block-embed-hhh-3-m-039-s-blog\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"PoJrSteGgA\"><a href=\"http:\/\/hhh3m.top\/index.php\/2025\/07\/29\/test\/\">TEST<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u300a TEST \u300b\u2014hhh3m&#039;s blog\" src=\"http:\/\/hhh3m.top\/index.php\/2025\/07\/29\/test\/embed\/#?secret=gS7b9nMOuq#?secret=PoJrSteGgA\" data-secret=\"PoJrSteGgA\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<iframe src=\"\/\/player.bilibili.com\/player.html?bvid=BV1RCgYztExv&#038;page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"> <\/iframe>\n\n\n\n<iframe loading=\"lazy\" \n    src=\"\/\/player.bilibili.com\/player.html?bvid=BV1RCgYztExv&#038;page=1\" \n    width=\"800\" \n    height=\"450\"\n    scrolling=\"no\" \n    border=\"0\" \n    frameborder=\"no\" \n    framespacing=\"0\" \n    allowfullscreen=\"true\">\n<\/iframe>\n\n\n\n<!--<iframe \nwidth=\"800\" \n    height=\"450\"\n    scrolling=\"no\" \n    border=\"0\" \n    frameborder=\"no\" \n    framespacing=\"0\" \n    allowfullscreen=\"true\"\nsrcdoc=\"\n        &lt;!DOCTYPE html PUBLIC &quot;-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN&quot; &quot;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd&quot;&gt;\n        &lt;html xmlns=&quot;http:\/\/www.w3.org\/1999\/xhtml&quot;&gt;\n        &lt;head&gt;\n        &lt;title&gt;JS1k: Breathing Galaxies (1013 bytes)&lt;\/title&gt;\n        &lt;script type=&quot;text\/javascript&quot;&gt;\n        window.onload = function () {\n            C = Math.cos; \/\/ cache Math objects\n            S = Math.sin;\n            U = 0;\n            w = window;\n            j = document;\n            d = j.getElementById(&quot;c&quot;);\n            c = d.getContext(&quot;2d&quot;);\n            W = d.width = w.innerWidth;\n            H = d.height = w.innerHeight;\n            c.fillRect(0, 0, W, H); \/\/ resize &lt;canvas&gt; and draw black rect (default)\n            c.globalCompositeOperation = &quot;lighter&quot;; \/\/ switch to additive color application\n            c.lineWidth = 0.2;\n            c.lineCap = &quot;round&quot;;\n            var bool = 0, \n                t = 0; \/\/ theta\n            d.onmousemove = function (e) {\n                if(window.T) {\n                    if(D==9) { D=Math.random()*15; f(1); }\n                    clearTimeout(T);\n                }\n                X = e.pageX; \/\/ grab mouse pixel coords\n                Y = e.pageY;\n                a=0; \/\/ previous coord.x\n                b=0; \/\/ previous coord.y \n                A = X, \/\/ original coord.x\n                B = Y; \/\/ original coord.y\n                R=(e.pageX\/W * 999&gt;&gt;0)\/999;\n                r=(e.pageY\/H * 999&gt;&gt;0)\/999;\n                U=e.pageX\/H * 360 &gt;&gt;0;\n                D=9;\n                g = 360 * Math.PI \/ 180;\n                T = setInterval(f = function (e) { \/\/ start looping spectrum\n                    c.save();\n                    c.globalCompositeOperation = &quot;source-over&quot;; \/\/ switch to additive color application\n                    if(e!=1) {\n                        c.fillStyle = &quot;rgba(0,0,0,0.02)&quot;;\n                        c.fillRect(0, 0, W, H); \/\/ resize &lt;canvas&gt; and draw black rect (default)\n                    }\n                    c.restore();\n                    i = 25; while(i --) {\n                        c.beginPath();\n                        if(D &gt; 450 || bool) { \/\/ decrease diameter\n                            if(!bool) { \/\/ has hit maximum\n                                bool = 1;\n                            }\n                            if(D &lt; 0.1) { \/\/ has hit minimum\n                                bool = 0;\n                            }\n                            t -= g; \/\/ decrease theta\n                            D -= 0.1; \/\/ decrease size\n                        }\n                        if(!bool) {\n                            t += g; \/\/ increase theta\n                            D += 0.1; \/\/ increase size\n                        }\n                        q = (R \/ r - 1) * t; \/\/ create hypotrochoid from current mouse position, and setup variables (see: http:\/\/en.wikipedia.org\/wiki\/Hypotrochoid)\n                        x = (R - r) * C(t) + D * C(q) + (A + (X - A) * (i \/ 25)) + (r - R); \/\/ center on xy coords\n                        y = (R - r) * S(t) - D * S(q) + (B + (Y - B) * (i \/ 25));\n                        if (a) { \/\/ draw once two points are set\n                            c.moveTo(a, b);\n                            c.lineTo(x, y)\n                        }\n                        c.strokeStyle = &quot;hsla(&quot; + (U % 360) + &quot;,100%,50%,0.75)&quot;; \/\/ draw rainbow hypotrochoid\n                        c.stroke();\n                        a = x; \/\/ set previous coord.x\n                        b = y; \/\/ set previous coord.y\n                    }\n                    U -= 0.5; \/\/ increment hue\n                    A = X; \/\/ set original coord.x\n                    B = Y; \/\/ set original coord.y\n                }, 16);\n            }\n            j.onkeydown = function(e) { a=b=0; R += 0.05 }\n            d.onmousemove({pageX:300, pageY:290})\n        }\n        &lt;\/script&gt;\n        &lt;\/head&gt;\n        &lt;body&gt;\n        &lt;canvas id=&quot;c&quot;&gt;&lt;\/canvas&gt;\n        &lt;\/body&gt;\n        &lt;\/html&gt;\n    \">\n<\/iframe>-->\n\n\n\nbody {\n    padding:0;\n    margin:0;\n    overflow:hidden;\n\theight: 600px;\n}\ncanvas {\n    padding:0;\n    margin:0;\n}\n\n.btnbg > div{\n    color: #fff;\n    left: 50%;\n    transform: translateX(-50%);\n    top: 50%;\n    position: absolute;\n    text-align: center;\n}\nspan{\n    font-size: 70px;\n}\np{\n    font-size: 40px;\n}\n<\/style>\n<body>\n    <canvas id=\"sakura\"><\/canvas>\n    <div class=\"btnbg\">\n        <div >\n            <span>\u6a31\u82b1\u98d8\u843d\u80cc\u666f\u56fe<\/span>\n            <p>\u653f\u51fd\u6570<\/p>\n        <\/div>\n    <!-- <button type=\"button\" onclick=\"toggleAnimation(this)\">Stop<\/button> -->\n    <\/div>\n\n<!-- sakura shader -->\n<script id=\"sakura_point_vsh\" type=\"x-shader\/x_vertex\">\nuniform mat4 uProjection;\nuniform mat4 uModelview;\nuniform vec3 uResolution;\nuniform vec3 uOffset;\nuniform vec3 uDOF;  \/\/x:focus distance, y:focus radius, z:max radius\nuniform vec3 uFade; \/\/x:start distance, y:half distance, z:near fade start\n\nattribute vec3 aPosition;\nattribute vec3 aEuler;\nattribute vec2 aMisc; \/\/x:size, y:fade\n\nvarying vec3 pposition;\nvarying float psize;\nvarying float palpha;\nvarying float pdist;\n\n\/\/varying mat3 rotMat;\nvarying vec3 normX;\nvarying vec3 normY;\nvarying vec3 normZ;\nvarying vec3 normal;\n\nvarying float diffuse;\nvarying float specular;\nvarying float rstop;\nvarying float distancefade;\n\nvoid main(void) {\n    \/\/ Projection is based on vertical angle\n    vec4 pos = uModelview * vec4(aPosition + uOffset, 1.0);\n    gl_Position = uProjection * pos;\n    gl_PointSize = aMisc.x * uProjection[1][1] \/ -pos.z * uResolution.y * 0.5;\n    \n    pposition = pos.xyz;\n    psize = aMisc.x;\n    pdist = length(pos.xyz);\n    palpha = smoothstep(0.0, 1.0, (pdist - 0.1) \/ uFade.z);\n    \n    vec3 elrsn = sin(aEuler);\n    vec3 elrcs = cos(aEuler);\n    mat3 rotx = mat3(\n        1.0, 0.0, 0.0,\n        0.0, elrcs.x, elrsn.x,\n        0.0, -elrsn.x, elrcs.x\n    );\n    mat3 roty = mat3(\n        elrcs.y, 0.0, -elrsn.y,\n        0.0, 1.0, 0.0,\n        elrsn.y, 0.0, elrcs.y\n    );\n    mat3 rotz = mat3(\n        elrcs.z, elrsn.z, 0.0, \n        -elrsn.z, elrcs.z, 0.0,\n        0.0, 0.0, 1.0\n    );\n    mat3 rotmat = rotx * roty * rotz;\n    normal = rotmat[2];\n    \n    mat3 trrotm = mat3(\n        rotmat[0][0], rotmat[1][0], rotmat[2][0],\n        rotmat[0][1], rotmat[1][1], rotmat[2][1],\n        rotmat[0][2], rotmat[1][2], rotmat[2][2]\n    );\n    normX = trrotm[0];\n    normY = trrotm[1];\n    normZ = trrotm[2];\n    \n    const vec3 lit = vec3(0.6917144638660746, 0.6917144638660746, -0.20751433915982237);\n    \n    float tmpdfs = dot(lit, normal);\n    if(tmpdfs < 0.0) {\n        normal = -normal;\n        tmpdfs = dot(lit, normal);\n    }\n    diffuse = 0.4 + tmpdfs;\n    \n    vec3 eyev = normalize(-pos.xyz);\n    if(dot(eyev, normal) > 0.0) {\n        vec3 hv = normalize(eyev + lit);\n        specular = pow(max(dot(hv, normal), 0.0), 20.0);\n    }\n    else {\n        specular = 0.0;\n    }\n    \n    rstop = clamp((abs(pdist - uDOF.x) - uDOF.y) \/ uDOF.z, 0.0, 1.0);\n    rstop = pow(rstop, 0.5);\n    \/\/-0.69315 = ln(0.5)\n    distancefade = min(1.0, exp((uFade.x - pdist) * 0.69315 \/ uFade.y));\n}\n<\/script>\n<script id=\"sakura_point_fsh\" type=\"x-shader\/x_fragment\">\n#ifdef GL_ES\n\/\/precision mediump float;\nprecision highp float;\n#endif\n\nuniform vec3 uDOF;  \/\/x:focus distance, y:focus radius, z:max radius\nuniform vec3 uFade; \/\/x:start distance, y:half distance, z:near fade start\n\nconst vec3 fadeCol = vec3(0.08, 0.03, 0.06);\n\nvarying vec3 pposition;\nvarying float psize;\nvarying float palpha;\nvarying float pdist;\n\n\/\/varying mat3 rotMat;\nvarying vec3 normX;\nvarying vec3 normY;\nvarying vec3 normZ;\nvarying vec3 normal;\n\nvarying float diffuse;\nvarying float specular;\nvarying float rstop;\nvarying float distancefade;\n\nfloat ellipse(vec2 p, vec2 o, vec2 r) {\n    vec2 lp = (p - o) \/ r;\n    return length(lp) - 1.0;\n}\n\nvoid main(void) {\n    vec3 p = vec3(gl_PointCoord - vec2(0.5, 0.5), 0.0) * 2.0;\n    vec3 d = vec3(0.0, 0.0, -1.0);\n    float nd = normZ.z; \/\/dot(-normZ, d);\n    if(abs(nd) < 0.0001) discard;\n    \n    float np = dot(normZ, p);\n    vec3 tp = p + d * np \/ nd;\n    vec2 coord = vec2(dot(normX, tp), dot(normY, tp));\n    \n    \/\/angle = 15 degree\n    const float flwrsn = 0.258819045102521;\n    const float flwrcs = 0.965925826289068;\n    mat2 flwrm = mat2(flwrcs, -flwrsn, flwrsn, flwrcs);\n    vec2 flwrp = vec2(abs(coord.x), coord.y) * flwrm;\n    \n    float r;\n    if(flwrp.x < 0.0) {\n        r = ellipse(flwrp, vec2(0.065, 0.024) * 0.5, vec2(0.36, 0.96) * 0.5);\n    }\n    else {\n        r = ellipse(flwrp, vec2(0.065, 0.024) * 0.5, vec2(0.58, 0.96) * 0.5);\n    }\n    \n    if(r > rstop) discard;\n    \n    vec3 col = mix(vec3(1.0, 0.8, 0.75), vec3(1.0, 0.9, 0.87), r);\n    float grady = mix(0.0, 1.0, pow(coord.y * 0.5 + 0.5, 0.35));\n    col *= vec3(1.0, grady, grady);\n    col *= mix(0.8, 1.0, pow(abs(coord.x), 0.3));\n    col = col * diffuse + specular;\n    \n    col = mix(fadeCol, col, distancefade);\n    \n    float alpha = (rstop > 0.001)? (0.5 - r \/ (rstop * 2.0)) : 1.0;\n    alpha = smoothstep(0.0, 1.0, alpha) * palpha;\n    \n    gl_FragColor = vec4(col * 0.5, alpha);\n}\n<\/script>\n<!-- effects -->\n<script id=\"fx_common_vsh\" type=\"x-shader\/x_vertex\">\nuniform vec3 uResolution;\nattribute vec2 aPosition;\n\nvarying vec2 texCoord;\nvarying vec2 screenCoord;\n\nvoid main(void) {\n    gl_Position = vec4(aPosition, 0.0, 1.0);\n    texCoord = aPosition.xy * 0.5 + vec2(0.5, 0.5);\n    screenCoord = aPosition.xy * vec2(uResolution.z, 1.0);\n}\n<\/script>\n<script id=\"bg_fsh\" type=\"x-shader\/x_fragment\">\n#ifdef GL_ES\n\/\/precision mediump float;\nprecision highp float;\n#endif\n\nuniform vec2 uTimes;\n\nvarying vec2 texCoord;\nvarying vec2 screenCoord;\n\nvoid main(void) {\n    vec3 col;\n    float c;\n    vec2 tmpv = texCoord * vec2(0.8, 1.0) - vec2(0.95, 1.0);\n    c = exp(-pow(length(tmpv) * 1.8, 2.0));\n    col = mix(vec3(0.02, 0.0, 0.03), vec3(0.96, 0.98, 1.0) * 1.5, c);\n    gl_FragColor = vec4(col * 0.5, 1.0);\n}\n<\/script>\n<script id=\"fx_brightbuf_fsh\" type=\"x-shader\/x_fragment\">\n#ifdef GL_ES\n\/\/precision mediump float;\nprecision highp float;\n#endif\nuniform sampler2D uSrc;\nuniform vec2 uDelta;\n\nvarying vec2 texCoord;\nvarying vec2 screenCoord;\n\nvoid main(void) {\n    vec4 col = texture2D(uSrc, texCoord);\n    gl_FragColor = vec4(col.rgb * 2.0 - vec3(0.5), 1.0);\n}\n<\/script>\n<script id=\"fx_dirblur_r4_fsh\" type=\"x-shader\/x_fragment\">\n#ifdef GL_ES\n\/\/precision mediump float;\nprecision highp float;\n#endif\nuniform sampler2D uSrc;\nuniform vec2 uDelta;\nuniform vec4 uBlurDir; \/\/dir(x, y), stride(z, w)\n\nvarying vec2 texCoord;\nvarying vec2 screenCoord;\n\nvoid main(void) {\n    vec4 col = texture2D(uSrc, texCoord);\n    col = col + texture2D(uSrc, texCoord + uBlurDir.xy * uDelta);\n    col = col + texture2D(uSrc, texCoord - uBlurDir.xy * uDelta);\n    col = col + texture2D(uSrc, texCoord + (uBlurDir.xy + uBlurDir.zw) * uDelta);\n    col = col + texture2D(uSrc, texCoord - (uBlurDir.xy + uBlurDir.zw) * uDelta);\n    gl_FragColor = col \/ 5.0;\n}\n<\/script>\n<!-- effect fragment shader template -->\n<script id=\"fx_common_fsh\" type=\"x-shader\/x_fragment\">\n#ifdef GL_ES\n\/\/precision mediump float;\nprecision highp float;\n#endif\nuniform sampler2D uSrc;\nuniform vec2 uDelta;\n\nvarying vec2 texCoord;\nvarying vec2 screenCoord;\n\nvoid main(void) {\n    gl_FragColor = texture2D(uSrc, texCoord);\n}\n<\/script>\n<!-- post processing -->\n<script id=\"pp_final_vsh\" type=\"x-shader\/x_vertex\">\nuniform vec3 uResolution;\nattribute vec2 aPosition;\nvarying vec2 texCoord;\nvarying vec2 screenCoord;\nvoid main(void) {\n    gl_Position = vec4(aPosition, 0.0, 1.0);\n    texCoord = aPosition.xy * 0.5 + vec2(0.5, 0.5);\n    screenCoord = aPosition.xy * vec2(uResolution.z, 1.0);\n}\n<\/script>\n<script id=\"pp_final_fsh\" type=\"x-shader\/x_fragment\">\n#ifdef GL_ES\n\/\/precision mediump float;\nprecision highp float;\n#endif\nuniform sampler2D uSrc;\nuniform sampler2D uBloom;\nuniform vec2 uDelta;\nvarying vec2 texCoord;\nvarying vec2 screenCoord;\nvoid main(void) {\n    vec4 srccol = texture2D(uSrc, texCoord) * 2.0;\n    vec4 bloomcol = texture2D(uBloom, texCoord);\n    vec4 col;\n    col = srccol + bloomcol * (vec4(1.0) + srccol);\n    col *= smoothstep(1.0, 0.0, pow(length((texCoord - vec2(0.5)) * 2.0), 1.2) * 0.5);\n    col = pow(col, vec4(0.45454545454545)); \/\/(1.0 \/ 2.2)\n    \n    gl_FragColor = vec4(col.rgb, 1.0);\n    gl_FragColor.a = 1.0;\n}\n<\/script>\n<\/body>\n<\/html>\n<script>\n    \/\/ Utilities\nvar Vector3 = {};\nvar Matrix44 = {};\nVector3.create = function(x, y, z) {\n    return {'x':x, 'y':y, 'z':z};\n};\nVector3.dot = function (v0, v1) {\n    return v0.x * v1.x + v0.y * v1.y + v0.z * v1.z;\n};\nVector3.cross = function (v, v0, v1) {\n    v.x = v0.y * v1.z - v0.z * v1.y;\n    v.y = v0.z * v1.x - v0.x * v1.z;\n    v.z = v0.x * v1.y - v0.y * v1.x;\n};\nVector3.normalize = function (v) {\n    var l = v.x * v.x + v.y * v.y + v.z * v.z;\n    if(l > 0.00001) {\n        l = 1.0 \/ Math.sqrt(l);\n        v.x *= l;\n        v.y *= l;\n        v.z *= l;\n    }\n};\nVector3.arrayForm = function(v) {\n    if(v.array) {\n        v.array[0] = v.x;\n        v.array[1] = v.y;\n        v.array[2] = v.z;\n    }\n    else {\n        v.array = new Float32Array([v.x, v.y, v.z]);\n    }\n    return v.array;\n};\nMatrix44.createIdentity = function () {\n    return new Float32Array([1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]);\n};\nMatrix44.loadProjection = function (m, aspect, vdeg, near, far) {\n    var h = near * Math.tan(vdeg * Math.PI \/ 180.0 * 0.5) * 2.0;\n    var w = h * aspect;\n    \n    m[0] = 2.0 * near \/ w;\n    m[1] = 0.0;\n    m[2] = 0.0;\n    m[3] = 0.0;\n    \n    m[4] = 0.0;\n    m[5] = 2.0 * near \/ h;\n    m[6] = 0.0;\n    m[7] = 0.0;\n    \n    m[8] = 0.0;\n    m[9] = 0.0;\n    m[10] = -(far + near) \/ (far - near);\n    m[11] = -1.0;\n    \n    m[12] = 0.0;\n    m[13] = 0.0;\n    m[14] = -2.0 * far * near \/ (far - near);\n    m[15] = 0.0;\n};\nMatrix44.loadLookAt = function (m, vpos, vlook, vup) {\n    var frontv = Vector3.create(vpos.x - vlook.x, vpos.y - vlook.y, vpos.z - vlook.z);\n    Vector3.normalize(frontv);\n    var sidev = Vector3.create(1.0, 0.0, 0.0);\n    Vector3.cross(sidev, vup, frontv);\n    Vector3.normalize(sidev);\n    var topv = Vector3.create(1.0, 0.0, 0.0);\n    Vector3.cross(topv, frontv, sidev);\n    Vector3.normalize(topv);\n    \n    m[0] = sidev.x;\n    m[1] = topv.x;\n    m[2] = frontv.x;\n    m[3] = 0.0;\n    \n    m[4] = sidev.y;\n    m[5] = topv.y;\n    m[6] = frontv.y;\n    m[7] = 0.0;\n    \n    m[8] = sidev.z;\n    m[9] = topv.z;\n    m[10] = frontv.z;\n    m[11] = 0.0;\n    \n    m[12] = -(vpos.x * m[0] + vpos.y * m[4] + vpos.z * m[8]);\n    m[13] = -(vpos.x * m[1] + vpos.y * m[5] + vpos.z * m[9]);\n    m[14] = -(vpos.x * m[2] + vpos.y * m[6] + vpos.z * m[10]);\n    m[15] = 1.0;\n};\n\n\/\/\nvar timeInfo = {\n    'start':0, 'prev':0, \/\/ Date\n    'delta':0, 'elapsed':0 \/\/ Number(sec)\n};\n\n\/\/\nvar gl;\nvar renderSpec = {\n    'width':0,\n    'height':0,\n    'aspect':1,\n    'array':new Float32Array(3),\n    'halfWidth':0,\n    'halfHeight':0,\n    'halfArray':new Float32Array(3)\n    \/\/ and some render targets. see setViewport()\n};\nrenderSpec.setSize = function(w, h) {\n    renderSpec.width = w;\n    renderSpec.height = h;\n    renderSpec.aspect = renderSpec.width \/ renderSpec.height;\n    renderSpec.array[0] = renderSpec.width;\n    renderSpec.array[1] = renderSpec.height;\n    renderSpec.array[2] = renderSpec.aspect;\n    \n    renderSpec.halfWidth = Math.floor(w \/ 2);\n    renderSpec.halfHeight = Math.floor(h \/ 2);\n    renderSpec.halfArray[0] = renderSpec.halfWidth;\n    renderSpec.halfArray[1] = renderSpec.halfHeight;\n    renderSpec.halfArray[2] = renderSpec.halfWidth \/ renderSpec.halfHeight;\n};\n\nfunction deleteRenderTarget(rt) {\n    gl.deleteFramebuffer(rt.frameBuffer);\n    gl.deleteRenderbuffer(rt.renderBuffer);\n    gl.deleteTexture(rt.texture);\n}\n\nfunction createRenderTarget(w, h) {\n    var ret = {\n        'width':w,\n        'height':h,\n        'sizeArray':new Float32Array([w, h, w \/ h]),\n        'dtxArray':new Float32Array([1.0 \/ w, 1.0 \/ h])\n    };\n    ret.frameBuffer = gl.createFramebuffer();\n    ret.renderBuffer = gl.createRenderbuffer();\n    ret.texture = gl.createTexture();\n    \n    gl.bindTexture(gl.TEXTURE_2D, ret.texture);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    \n    gl.bindFramebuffer(gl.FRAMEBUFFER, ret.frameBuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, ret.texture, 0);\n    \n    gl.bindRenderbuffer(gl.RENDERBUFFER, ret.renderBuffer);\n    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, w, h);\n    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, ret.renderBuffer);\n    \n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindRenderbuffer(gl.RENDERBUFFER, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    \n    return ret;\n}\n\nfunction compileShader(shtype, shsrc) {\n\tvar retsh = gl.createShader(shtype);\n\t\n\tgl.shaderSource(retsh, shsrc);\n\tgl.compileShader(retsh);\n\t\n\tif(!gl.getShaderParameter(retsh, gl.COMPILE_STATUS)) {\n\t\tvar errlog = gl.getShaderInfoLog(retsh);\n\t\tgl.deleteShader(retsh);\n\t\tconsole.error(errlog);\n\t\treturn null;\n\t}\n\treturn retsh;\n}\n\nfunction createShader(vtxsrc, frgsrc, uniformlist, attrlist) {\n    var vsh = compileShader(gl.VERTEX_SHADER, vtxsrc);\n    var fsh = compileShader(gl.FRAGMENT_SHADER, frgsrc);\n    \n    if(vsh == null || fsh == null) {\n        return null;\n    }\n    \n    var prog = gl.createProgram();\n    gl.attachShader(prog, vsh);\n    gl.attachShader(prog, fsh);\n    \n    gl.deleteShader(vsh);\n    gl.deleteShader(fsh);\n    \n    gl.linkProgram(prog);\n    if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n        var errlog = gl.getProgramInfoLog(prog);\n        console.error(errlog);\n        return null;\n    }\n    \n    if(uniformlist) {\n        prog.uniforms = {};\n        for(var i = 0; i < uniformlist.length; i++) {\n            prog.uniforms[uniformlist[i]] = gl.getUniformLocation(prog, uniformlist[i]);\n        }\n    }\n    \n    if(attrlist) {\n        prog.attributes = {};\n        for(var i = 0; i < attrlist.length; i++) {\n            var attr = attrlist[i];\n            prog.attributes[attr] = gl.getAttribLocation(prog, attr);\n        }\n    }\n    \n    return prog;\n}\n\nfunction useShader(prog) {\n    gl.useProgram(prog);\n    for(var attr in prog.attributes) {\n        gl.enableVertexAttribArray(prog.attributes[attr]);;\n    }\n}\n\nfunction unuseShader(prog) {\n    for(var attr in prog.attributes) {\n        gl.disableVertexAttribArray(prog.attributes[attr]);;\n    }\n    gl.useProgram(null);\n}\n\n\/\/\/\/\/\nvar projection = {\n    'angle':60,\n    'nearfar':new Float32Array([0.1, 100.0]),\n    'matrix':Matrix44.createIdentity()\n};\nvar camera = {\n    'position':Vector3.create(0, 0, 100),\n    'lookat':Vector3.create(0, 0, 0),\n    'up':Vector3.create(0, 1, 0),\n    'dof':Vector3.create(10.0, 4.0, 8.0),\n    'matrix':Matrix44.createIdentity()\n};\n\nvar pointFlower = {};\nvar meshFlower = {};\nvar sceneStandBy = false;\n\nvar BlossomParticle = function () {\n    this.velocity = new Array(3);\n    this.rotation = new Array(3);\n    this.position = new Array(3);\n    this.euler = new Array(3);\n    this.size = 1.0;\n    this.alpha = 1.0;\n    this.zkey = 0.0;\n};\n\nBlossomParticle.prototype.setVelocity = function (vx, vy, vz) {\n    this.velocity[0] = vx;\n    this.velocity[1] = vy;\n    this.velocity[2] = vz;\n};\n\nBlossomParticle.prototype.setRotation = function (rx, ry, rz) {\n    this.rotation[0] = rx;\n    this.rotation[1] = ry;\n    this.rotation[2] = rz;\n};\n\nBlossomParticle.prototype.setPosition = function (nx, ny, nz) {\n    this.position[0] = nx;\n    this.position[1] = ny;\n    this.position[2] = nz;\n};\n\nBlossomParticle.prototype.setEulerAngles = function (rx, ry, rz) {\n    this.euler[0] = rx;\n    this.euler[1] = ry;\n    this.euler[2] = rz;\n};\n\nBlossomParticle.prototype.setSize = function (s) {\n    this.size = s;\n};\n\nBlossomParticle.prototype.update = function (dt, et) {\n    this.position[0] += this.velocity[0] * dt;\n    this.position[1] += this.velocity[1] * dt;\n    this.position[2] += this.velocity[2] * dt;\n    \n    this.euler[0] += this.rotation[0] * dt;\n    this.euler[1] += this.rotation[1] * dt;\n    this.euler[2] += this.rotation[2] * dt;\n};\n\nfunction createPointFlowers() {\n    \/\/ get point sizes\n    var prm = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE);\n    renderSpec.pointSize = {'min':prm[0], 'max':prm[1]};\n    \n    var vtxsrc = document.getElementById(\"sakura_point_vsh\").textContent;\n    var frgsrc = document.getElementById(\"sakura_point_fsh\").textContent;\n    \n    pointFlower.program = createShader(\n        vtxsrc, frgsrc,\n        ['uProjection', 'uModelview', 'uResolution', 'uOffset', 'uDOF', 'uFade'],\n        ['aPosition', 'aEuler', 'aMisc']\n    );\n    \n    useShader(pointFlower.program);\n    pointFlower.offset = new Float32Array([0.0, 0.0, 0.0]);\n    pointFlower.fader = Vector3.create(0.0, 10.0, 0.0);\n    \n    \/\/ paramerters: velocity[3], rotate[3]\n    pointFlower.numFlowers = 1600;\n    pointFlower.particles = new Array(pointFlower.numFlowers);\n    \/\/ vertex attributes {position[3], euler_xyz[3], size[1]}\n    pointFlower.dataArray = new Float32Array(pointFlower.numFlowers * (3 + 3 + 2));\n    pointFlower.positionArrayOffset = 0;\n    pointFlower.eulerArrayOffset = pointFlower.numFlowers * 3;\n    pointFlower.miscArrayOffset = pointFlower.numFlowers * 6;\n    \n    pointFlower.buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, pointFlower.buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, pointFlower.dataArray, gl.DYNAMIC_DRAW);\n    gl.bindBuffer(gl.ARRAY_BUFFER, null);\n    \n    unuseShader(pointFlower.program);\n    \n    for(var i = 0; i < pointFlower.numFlowers; i++) {\n        pointFlower.particles[i] = new BlossomParticle();\n    }\n}\n\nfunction initPointFlowers() {\n    \/\/area\n    pointFlower.area = Vector3.create(20.0, 20.0, 20.0);\n    pointFlower.area.x = pointFlower.area.y * renderSpec.aspect;\n    \n    pointFlower.fader.x = 10.0; \/\/env fade start\n    pointFlower.fader.y = pointFlower.area.z; \/\/env fade half\n    pointFlower.fader.z = 0.1;  \/\/near fade start\n    \n    \/\/particles\n    var PI2 = Math.PI * 2.0;\n    var tmpv3 = Vector3.create(0, 0, 0);\n    var tmpv = 0;\n    var symmetryrand = function() {return (Math.random() * 2.0 - 1.0);};\n    for(var i = 0; i < pointFlower.numFlowers; i++) {\n        var tmpprtcl = pointFlower.particles[i];\n        \n        \/\/velocity\n        tmpv3.x = symmetryrand() * 0.3 + 0.8;\n        tmpv3.y = symmetryrand() * 0.2 - 1.0;\n        tmpv3.z = symmetryrand() * 0.3 + 0.5;\n        Vector3.normalize(tmpv3);\n        tmpv = 2.0 + Math.random() * 1.0;\n        tmpprtcl.setVelocity(tmpv3.x * tmpv, tmpv3.y * tmpv, tmpv3.z * tmpv);\n        \n        \/\/rotation\n        tmpprtcl.setRotation(\n            symmetryrand() * PI2 * 0.5,\n            symmetryrand() * PI2 * 0.5,\n            symmetryrand() * PI2 * 0.5\n        );\n        \n        \/\/position\n        tmpprtcl.setPosition(\n            symmetryrand() * pointFlower.area.x,\n            symmetryrand() * pointFlower.area.y,\n            symmetryrand() * pointFlower.area.z\n        );\n        \n        \/\/euler\n        tmpprtcl.setEulerAngles(\n            Math.random() * Math.PI * 2.0,\n            Math.random() * Math.PI * 2.0,\n            Math.random() * Math.PI * 2.0\n        );\n        \n        \/\/size\n        tmpprtcl.setSize(0.9 + Math.random() * 0.1);\n    }\n}\n\nfunction renderPointFlowers() {\n    \/\/update\n    var PI2 = Math.PI * 2.0;\n    var limit = [pointFlower.area.x, pointFlower.area.y, pointFlower.area.z];\n    var repeatPos = function (prt, cmp, limit) {\n        if(Math.abs(prt.position[cmp]) - prt.size * 0.5 > limit) {\n            \/\/out of area\n            if(prt.position[cmp] > 0) {\n                prt.position[cmp] -= limit * 2.0;\n            }\n            else {\n                prt.position[cmp] += limit * 2.0;\n            }\n        }\n    };\n    var repeatEuler = function (prt, cmp) {\n        prt.euler[cmp] = prt.euler[cmp] % PI2;\n        if(prt.euler[cmp] < 0.0) {\n            prt.euler[cmp] += PI2;\n        }\n    };\n    \n    for(var i = 0; i < pointFlower.numFlowers; i++) {\n        var prtcl = pointFlower.particles[i];\n        prtcl.update(timeInfo.delta, timeInfo.elapsed);\n        repeatPos(prtcl, 0, pointFlower.area.x);\n        repeatPos(prtcl, 1, pointFlower.area.y);\n        repeatPos(prtcl, 2, pointFlower.area.z);\n        repeatEuler(prtcl, 0);\n        repeatEuler(prtcl, 1);\n        repeatEuler(prtcl, 2);\n        \n        prtcl.alpha = 1.0;\/\/(pointFlower.area.z - prtcl.position[2]) * 0.5;\n        \n        prtcl.zkey = (camera.matrix[2] * prtcl.position[0]\n                    + camera.matrix[6] * prtcl.position[1]\n                    + camera.matrix[10] * prtcl.position[2]\n                    + camera.matrix[14]);\n    }\n    \n    \/\/ sort\n    pointFlower.particles.sort(function(p0, p1){return p0.zkey - p1.zkey;});\n    \n    \/\/ update data\n    var ipos = pointFlower.positionArrayOffset;\n    var ieuler = pointFlower.eulerArrayOffset;\n    var imisc = pointFlower.miscArrayOffset;\n    for(var i = 0; i < pointFlower.numFlowers; i++) {\n        var prtcl = pointFlower.particles[i];\n        pointFlower.dataArray[ipos] = prtcl.position[0];\n        pointFlower.dataArray[ipos + 1] = prtcl.position[1];\n        pointFlower.dataArray[ipos + 2] = prtcl.position[2];\n        ipos += 3;\n        pointFlower.dataArray[ieuler] = prtcl.euler[0];\n        pointFlower.dataArray[ieuler + 1] = prtcl.euler[1];\n        pointFlower.dataArray[ieuler + 2] = prtcl.euler[2];\n        ieuler += 3;\n        pointFlower.dataArray[imisc] = prtcl.size;\n        pointFlower.dataArray[imisc + 1] = prtcl.alpha;\n        imisc += 2;\n    }\n    \n    \/\/draw\n    gl.enable(gl.BLEND);\n    \/\/gl.disable(gl.DEPTH_TEST);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n    \n    var prog = pointFlower.program;\n    useShader(prog);\n    \n    gl.uniformMatrix4fv(prog.uniforms.uProjection, false, projection.matrix);\n    gl.uniformMatrix4fv(prog.uniforms.uModelview, false, camera.matrix);\n    gl.uniform3fv(prog.uniforms.uResolution, renderSpec.array);\n    gl.uniform3fv(prog.uniforms.uDOF, Vector3.arrayForm(camera.dof));\n    gl.uniform3fv(prog.uniforms.uFade, Vector3.arrayForm(pointFlower.fader));\n    \n    gl.bindBuffer(gl.ARRAY_BUFFER, pointFlower.buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, pointFlower.dataArray, gl.DYNAMIC_DRAW);\n    \n    gl.vertexAttribPointer(prog.attributes.aPosition, 3, gl.FLOAT, false, 0, pointFlower.positionArrayOffset * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribPointer(prog.attributes.aEuler, 3, gl.FLOAT, false, 0, pointFlower.eulerArrayOffset * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribPointer(prog.attributes.aMisc, 2, gl.FLOAT, false, 0, pointFlower.miscArrayOffset * Float32Array.BYTES_PER_ELEMENT);\n    \n    \/\/ doubler\n    for(var i = 1; i < 2; i++) {\n        var zpos = i * -2.0;\n        pointFlower.offset[0] = pointFlower.area.x * -1.0;\n        pointFlower.offset[1] = pointFlower.area.y * -1.0;\n        pointFlower.offset[2] = pointFlower.area.z * zpos;\n        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);\n        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);\n        \n        pointFlower.offset[0] = pointFlower.area.x * -1.0;\n        pointFlower.offset[1] = pointFlower.area.y *  1.0;\n        pointFlower.offset[2] = pointFlower.area.z * zpos;\n        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);\n        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);\n        \n        pointFlower.offset[0] = pointFlower.area.x *  1.0;\n        pointFlower.offset[1] = pointFlower.area.y * -1.0;\n        pointFlower.offset[2] = pointFlower.area.z * zpos;\n        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);\n        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);\n        \n        pointFlower.offset[0] = pointFlower.area.x *  1.0;\n        pointFlower.offset[1] = pointFlower.area.y *  1.0;\n        pointFlower.offset[2] = pointFlower.area.z * zpos;\n        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);\n        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);\n    }\n    \n    \/\/main\n    pointFlower.offset[0] = 0.0;\n    pointFlower.offset[1] = 0.0;\n    pointFlower.offset[2] = 0.0;\n    gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);\n    gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);\n    \n    gl.bindBuffer(gl.ARRAY_BUFFER, null);\n    unuseShader(prog);\n    \n    gl.enable(gl.DEPTH_TEST);\n    gl.disable(gl.BLEND);\n}\n\n\/\/ effects\n\/\/common util\nfunction createEffectProgram(vtxsrc, frgsrc, exunifs, exattrs) {\n    var ret = {};\n    var unifs = ['uResolution', 'uSrc', 'uDelta'];\n    if(exunifs) {\n        unifs = unifs.concat(exunifs);\n    }\n    var attrs = ['aPosition'];\n    if(exattrs) {\n        attrs = attrs.concat(exattrs);\n    }\n    \n    ret.program = createShader(vtxsrc, frgsrc, unifs, attrs);\n    useShader(ret.program);\n    \n    ret.dataArray = new Float32Array([\n        -1.0, -1.0,\n         1.0, -1.0,\n        -1.0,  1.0,\n         1.0,  1.0\n    ]);\n    ret.buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, ret.buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, ret.dataArray, gl.STATIC_DRAW);\n    \n    gl.bindBuffer(gl.ARRAY_BUFFER, null);\n    unuseShader(ret.program);\n    \n    return ret;\n}\n\n\/\/ basic usage\n\/\/ useEffect(prog, srctex({'texture':texid, 'dtxArray':(f32)[dtx, dty]})); \/\/basic initialize\n\/\/ gl.uniform**(...); \/\/additional uniforms\n\/\/ drawEffect()\n\/\/ unuseEffect(prog)\n\/\/ TEXTURE0 makes src\nfunction useEffect(fxobj, srctex) {\n    var prog = fxobj.program;\n    useShader(prog);\n    gl.uniform3fv(prog.uniforms.uResolution, renderSpec.array);\n    \n    if(srctex != null) {\n        gl.uniform2fv(prog.uniforms.uDelta, srctex.dtxArray);\n        gl.uniform1i(prog.uniforms.uSrc, 0);\n        \n        gl.activeTexture(gl.TEXTURE0);\n        gl.bindTexture(gl.TEXTURE_2D, srctex.texture);\n    }\n}\nfunction drawEffect(fxobj) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, fxobj.buffer);\n    gl.vertexAttribPointer(fxobj.program.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n}\nfunction unuseEffect(fxobj) {\n    unuseShader(fxobj.program);\n}\n\nvar effectLib = {};\nfunction createEffectLib() {\n    \n    var vtxsrc, frgsrc;\n    \/\/common\n    var cmnvtxsrc = document.getElementById(\"fx_common_vsh\").textContent;\n    \n    \/\/background\n    frgsrc = document.getElementById(\"bg_fsh\").textContent;\n    effectLib.sceneBg = createEffectProgram(cmnvtxsrc, frgsrc, ['uTimes'], null);\n    \n    \/\/ make brightpixels buffer\n    frgsrc = document.getElementById(\"fx_brightbuf_fsh\").textContent;\n    effectLib.mkBrightBuf = createEffectProgram(cmnvtxsrc, frgsrc, null, null);\n    \n    \/\/ direction blur\n    frgsrc = document.getElementById(\"fx_dirblur_r4_fsh\").textContent;\n    effectLib.dirBlur = createEffectProgram(cmnvtxsrc, frgsrc, ['uBlurDir'], null);\n    \n    \/\/final composite\n    vtxsrc = document.getElementById(\"pp_final_vsh\").textContent;\n    frgsrc = document.getElementById(\"pp_final_fsh\").textContent;\n    effectLib.finalComp = createEffectProgram(vtxsrc, frgsrc, ['uBloom'], null);\n}\n\n\/\/ background\nfunction createBackground() {\n    \/\/console.log(\"create background\");\n}\nfunction initBackground() {\n    \/\/console.log(\"init background\");\n}\nfunction renderBackground() {\n    gl.disable(gl.DEPTH_TEST);\n    \n    useEffect(effectLib.sceneBg, null);\n    gl.uniform2f(effectLib.sceneBg.program.uniforms.uTimes, timeInfo.elapsed, timeInfo.delta);\n    drawEffect(effectLib.sceneBg);\n    unuseEffect(effectLib.sceneBg);\n    \n    gl.enable(gl.DEPTH_TEST);\n}\n\n\/\/ post process\nvar postProcess = {};\nfunction createPostProcess() {\n    \/\/console.log(\"create post process\");\n}\nfunction initPostProcess() {\n    \/\/console.log(\"init post process\");\n}\n\nfunction renderPostProcess() {\n    gl.enable(gl.TEXTURE_2D);\n    gl.disable(gl.DEPTH_TEST);\n    var bindRT = function (rt, isclear) {\n        gl.bindFramebuffer(gl.FRAMEBUFFER, rt.frameBuffer);\n        gl.viewport(0, 0, rt.width, rt.height);\n        if(isclear) {\n            gl.clearColor(0, 0, 0, 0);\n            gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n        }\n    };\n    \n    \/\/make bright buff\n    bindRT(renderSpec.wHalfRT0, true);\n    useEffect(effectLib.mkBrightBuf, renderSpec.mainRT);\n    drawEffect(effectLib.mkBrightBuf);\n    unuseEffect(effectLib.mkBrightBuf);\n    \n    \/\/ make bloom\n    for(var i = 0; i < 2; i++) {\n        var p = 1.5 + 1 * i;\n        var s = 2.0 + 1 * i;\n        bindRT(renderSpec.wHalfRT1, true);\n        useEffect(effectLib.dirBlur, renderSpec.wHalfRT0);\n        gl.uniform4f(effectLib.dirBlur.program.uniforms.uBlurDir, p, 0.0, s, 0.0);\n        drawEffect(effectLib.dirBlur);\n        unuseEffect(effectLib.dirBlur);\n        \n        bindRT(renderSpec.wHalfRT0, true);\n        useEffect(effectLib.dirBlur, renderSpec.wHalfRT1);\n        gl.uniform4f(effectLib.dirBlur.program.uniforms.uBlurDir, 0.0, p, 0.0, s);\n        drawEffect(effectLib.dirBlur);\n        unuseEffect(effectLib.dirBlur);\n    }\n    \n    \/\/display\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    gl.viewport(0, 0, renderSpec.width, renderSpec.height);\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    \n    useEffect(effectLib.finalComp, renderSpec.mainRT);\n    gl.uniform1i(effectLib.finalComp.program.uniforms.uBloom, 1);\n    gl.activeTexture(gl.TEXTURE1);\n    gl.bindTexture(gl.TEXTURE_2D, renderSpec.wHalfRT0.texture);\n    drawEffect(effectLib.finalComp);\n    unuseEffect(effectLib.finalComp);\n    \n    gl.enable(gl.DEPTH_TEST);\n}\n\n\/\/\/\/\/\nvar SceneEnv = {};\nfunction createScene() {\n    createEffectLib();\n    createBackground();\n    createPointFlowers();\n    createPostProcess();\n    sceneStandBy = true;\n}\n\nfunction initScene() {\n    initBackground();\n    initPointFlowers();\n    initPostProcess();\n    \n    \/\/camera.position.z = 17.320508;\n    camera.position.z = pointFlower.area.z + projection.nearfar[0];\n    projection.angle = Math.atan2(pointFlower.area.y, camera.position.z + pointFlower.area.z) * 180.0 \/ Math.PI * 2.0;\n    Matrix44.loadProjection(projection.matrix, renderSpec.aspect, projection.angle, projection.nearfar[0], projection.nearfar[1]);\n}\n\nfunction renderScene() {\n    \/\/draw\n    Matrix44.loadLookAt(camera.matrix, camera.position, camera.lookat, camera.up);\n    \n    gl.enable(gl.DEPTH_TEST);\n    \n    \/\/gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, renderSpec.mainRT.frameBuffer);\n    gl.viewport(0, 0, renderSpec.mainRT.width, renderSpec.mainRT.height);\n    gl.clearColor(0.005, 0, 0.05, 0);\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    \n    renderBackground();\n    renderPointFlowers();\n    renderPostProcess();\n}\n\n\/\/\/\/\/\nfunction onResize(e) {\n    makeCanvasFullScreen(document.getElementById(\"sakura\"));\n    setViewports();\n    if(sceneStandBy) {\n        initScene();\n    }\n}\n\nfunction setViewports() {\n    renderSpec.setSize(gl.canvas.width, gl.canvas.height);\n    \n    gl.clearColor(0.2, 0.2, 0.5, 1.0);\n    gl.viewport(0, 0, renderSpec.width, renderSpec.height);\n    \n    var rtfunc = function (rtname, rtw, rth) {\n        var rt = renderSpec[rtname];\n        if(rt) deleteRenderTarget(rt);\n        renderSpec[rtname] = createRenderTarget(rtw, rth);\n    };\n    rtfunc('mainRT', renderSpec.width, renderSpec.height);\n    rtfunc('wFullRT0', renderSpec.width, renderSpec.height);\n    rtfunc('wFullRT1', renderSpec.width, renderSpec.height);\n    rtfunc('wHalfRT0', renderSpec.halfWidth, renderSpec.halfHeight);\n    rtfunc('wHalfRT1', renderSpec.halfWidth, renderSpec.halfHeight);\n}\n\nfunction render() {\n    renderScene();\n}\n\nvar animating = true;\nfunction toggleAnimation(elm) {\n    animating ^= true;\n    if(animating) animate();\n    if(elm) {\n        elm.innerHTML = animating? \"Stop\":\"Start\";\n    }\n}\n\nfunction stepAnimation() {\n    if(!animating) animate();\n}\n\nfunction animate() {\n    var curdate = new Date();\n    timeInfo.elapsed = (curdate - timeInfo.start) \/ 1000.0;\n    timeInfo.delta = (curdate - timeInfo.prev) \/ 1000.0;\n    timeInfo.prev = curdate;\n    \n    if(animating) requestAnimationFrame(animate);\n    render();\n}\n\nfunction makeCanvasFullScreen(canvas) {\n    var b = document.body;\n\tvar d = document.documentElement;\n\tfullw = Math.max(b.clientWidth , b.scrollWidth, d.scrollWidth, d.clientWidth);\n\tfullh = Math.max(b.clientHeight , b.scrollHeight, d.scrollHeight, d.clientHeight);\n\tcanvas.width = fullw;\n\tcanvas.height = fullh;\n}\n\nwindow.addEventListener('load', function(e) {\n    var canvas = document.getElementById(\"sakura\");\n    try {\n        makeCanvasFullScreen(canvas);\n        gl = canvas.getContext('experimental-webgl');\n    } catch(e) {\n        alert(\"WebGL not supported.\" + e);\n        console.error(e);\n        return;\n    }\n    \n    window.addEventListener('resize', onResize);\n    \n    setViewports();\n    createScene();\n    initScene();\n    \n    timeInfo.start = new Date();\n    timeInfo.prev = timeInfo.start;\n    animate();\n});\n\n\/\/set window.requestAnimationFrame\n(function (w, r) {\n    w['r'+r] = w['r'+r] || w['webkitR'+r] || w['mozR'+r] || w['msR'+r] || w['oR'+r] || function(c){ w.setTimeout(c, 1000 \/ 60); };\n})(window, 'requestAnimationFrame');\n<\/script>\n\n\n\n<!-- \u5c06\u6b64\u4ee3\u7801\u590d\u5236\u5230WordPress\u6587\u7ae0\/\u9875\u9762\u7684HTML\u7f16\u8f91\u5668\u4e2d -->\n<style>\n\/* \u6587\u4ef6\u5939\u7ec4\u4ef6\u6837\u5f0f *\/\n.folder-system {\n    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n    max-width: 800px;\n    margin: 2rem auto;\n    padding: 20px;\n    background: #f8f9fa;\n    border-radius: 12px;\n    border: 1px solid #e9ecef;\n}\n\n.folder {\n    background: white;\n    border-radius: 8px;\n    margin-bottom: 12px;\n    overflow: hidden;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n    border: 1px solid #dee2e6;\n    transition: all 0.3s ease;\n}\n\n.folder:hover {\n    box-shadow: 0 4px 16px rgba(0,0,0,0.12);\n    transform: translateY(-1px);\n}\n\n\/* \u6587\u4ef6\u5939\u6807\u9898 *\/\n.folder-header {\n    padding: 16px 20px;\n    background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);\n    color: white;\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    font-weight: 600;\n    font-size: 1.1em;\n    user-select: none;\n}\n\n.folder-title {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n}\n\n.folder-icon {\n    font-size: 1.4em;\n    transition: transform 0.3s ease;\n}\n\n.folder-header:hover .folder-icon {\n    transform: scale(1.1);\n}\n\n\/* \u5c55\u5f00\/\u6536\u8d77\u6307\u793a\u5668 *\/\n.folder-indicator {\n    font-size: 1.5em;\n    transition: transform 0.3s ease;\n}\n\n.folder.active .folder-indicator {\n    transform: rotate(90deg);\n}\n\n\/* \u6587\u4ef6\u5939\u5185\u5bb9 *\/\n.folder-content {\n    padding: 0;\n    max-height: 0;\n    overflow: hidden;\n    background: white;\n    transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n    opacity: 0;\n}\n\n.folder.active .folder-content {\n    padding: 20px;\n    max-height: 1000px;\n    opacity: 1;\n}\n\n\/* \u6587\u4ef6\u9879\u6837\u5f0f *\/\n.file-item {\n    padding: 12px 16px;\n    border-left: 3px solid #4dabf7;\n    margin-bottom: 10px;\n    background: #f8f9fa;\n    border-radius: 6px;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    transition: all 0.2s ease;\n}\n\n.file-item:hover {\n    background: #e7f5ff;\n    transform: translateX(4px);\n    border-left-color: #339af0;\n}\n\n.file-icon {\n    color: #339af0;\n    font-size: 1.2em;\n}\n\n.file-name {\n    font-weight: 500;\n    color: #495057;\n}\n\n.file-desc {\n    color: #868e96;\n    font-size: 0.9em;\n    margin-left: auto;\n}\n\n\/* \u54cd\u5e94\u5f0f\u8bbe\u8ba1 *\/\n@media (max-width: 768px) {\n    .folder-system {\n        padding: 15px;\n        margin: 1rem auto;\n    }\n    \n    .folder-header {\n        padding: 14px 16px;\n        font-size: 1em;\n    }\n    \n    .file-item {\n        padding: 10px 12px;\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 5px;\n    }\n    \n    .file-desc {\n        margin-left: 0;\n        font-size: 0.85em;\n    }\n}\n<\/style>\n\n<!-- HTML\u7ed3\u6784 -->\n<div class=\"folder-system\">\n    <h2 style=\"text-align: center; color: #343a40; margin-bottom: 24px;\">\ud83d\udcc1 \u9879\u76ee\u6587\u6863\u6587\u4ef6\u5939<\/h2>\n    \n    <div class=\"folder active\">\n        <div class=\"folder-header\" onclick=\"toggleFolder(this)\">\n            <div class=\"folder-title\">\n                <span class=\"folder-icon\">\ud83d\udcc1<\/span>\n                <span>\u524d\u7aef\u5f00\u53d1\u6587\u6863<\/span>\n            <\/div>\n            <span class=\"folder-indicator\">\u25b6<\/span>\n        <\/div>\n        <div class=\"folder-content\">\n            <div class=\"file-item\">\n                <span class=\"file-icon\">\ud83d\udcc4<\/span>\n                <span class=\"file-name\">index.html<\/span>\n                <span class=\"file-desc\">\u4e3b\u9875\u9762\u7ed3\u6784<\/span>\n            <\/div>\n            <div class=\"file-item\">\n                <span class=\"file-icon\">\ud83c\udfa8<\/span>\n                <span class=\"file-name\">styles.css<\/span>\n                <span class=\"file-desc\">\u6837\u5f0f\u8868\u6587\u4ef6<\/span>\n            <\/div>\n            <div class=\"file-item\">\n                <span class=\"file-icon\">\u26a1<\/span>\n                <span class=\"file-name\">script.js<\/span>\n                <span class=\"file-desc\">\u4ea4\u4e92\u903b\u8f91\u811a\u672c<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n    <div class=\"folder\">\n        <div class=\"folder-header\" onclick=\"toggleFolder(this)\">\n            <div class=\"folder-title\">\n                <span class=\"folder-icon\">\ud83d\udcc1<\/span>\n                <span>\u8bbe\u8ba1\u8d44\u6e90<\/span>\n            <\/div>\n            <span class=\"folder-indicator\">\u25b6<\/span>\n        <\/div>\n        <div class=\"folder-content\">\n            <div class=\"file-item\">\n                <span class=\"file-icon\">\ud83c\udfa8<\/span>\n                <span class=\"file-name\">UI\u8bbe\u8ba1\u7a3f.psd<\/span>\n                <span class=\"file-desc\">Photoshop\u6e90\u6587\u4ef6<\/span>\n            <\/div>\n            <div class=\"file-item\">\n                <span class=\"file-icon\">\ud83d\uddbc\ufe0f<\/span>\n                <span class=\"file-name\">\u56fe\u7247\u8d44\u6e90<\/span>\n                <span class=\"file-desc\">50\u4e2a\u56fe\u6807\u7d20\u6750<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n    <div class=\"folder\">\n        <div class=\"folder-header\" onclick=\"toggleFolder(this)\">\n            <div class=\"folder-title\">\n                <span class=\"folder-icon\">\ud83d\udcc1<\/span>\n                <span>\u9879\u76ee\u8ba1\u5212<\/span>\n            <\/div>\n            <span class=\"folder-indicator\">\u25b6<\/span>\n        <\/div>\n        <div class=\"folder-content\">\n            <div class=\"file-item\">\n                <span class=\"file-icon\">\ud83d\udcc5<\/span>\n                <span class=\"file-name\">\u9879\u76ee\u65f6\u95f4\u8868.xlsx<\/span>\n                <span class=\"file-desc\">\u7518\u7279\u56fe\u4e0e\u91cc\u7a0b\u7891<\/span>\n            <\/div>\n            <div class=\"file-item\">\n                <span class=\"file-icon\">\ud83d\udc65<\/span>\n                <span class=\"file-name\">\u56e2\u961f\u6210\u5458.md<\/span>\n                <span class=\"file-desc\">\u804c\u8d23\u5206\u5de5\u8bf4\u660e<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n\/\/ \u5207\u6362\u6587\u4ef6\u5939\u5c55\u5f00\/\u6536\u8d77\nfunction toggleFolder(header) {\n    const folder = header.parentElement;\n    folder.classList.toggle('active');\n    \n    \/\/ \u53ef\u9009\uff1a\u5982\u679c\u4e00\u6b21\u53ea\u5c55\u5f00\u4e00\u4e2a\u6587\u4ef6\u5939\n    \/\/ const allFolders = document.querySelectorAll('.folder');\n    \/\/ allFolders.forEach(f => {\n    \/\/     if (f !== folder) f.classList.remove('active');\n    \/\/ });\n}\n<\/script>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>123456&lt;p&gt;111&lt;\/p&gt; body { padding:0; margin:0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-272","post","type-post","status-publish","format-standard","hentry","category-misc"],"_links":{"self":[{"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/posts\/272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/comments?post=272"}],"version-history":[{"count":24,"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/posts\/272\/revisions"}],"predecessor-version":[{"id":467,"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/posts\/272\/revisions\/467"}],"wp:attachment":[{"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/media?parent=272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/categories?post=272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hhh3m.top\/index.php\/wp-json\/wp\/v2\/tags?post=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}