<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://zh.enter-politics.com/index.php?action=history&amp;feed=atom&amp;title=User%3A%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1%2Fcommon.js</id>
	<title>User:残叶无影/common.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://zh.enter-politics.com/index.php?action=history&amp;feed=atom&amp;title=User%3A%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1%2Fcommon.js"/>
	<link rel="alternate" type="text/html" href="https://zh.enter-politics.com/index.php?title=User:%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1/common.js&amp;action=history"/>
	<updated>2026-07-05T06:49:50Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://zh.enter-politics.com/index.php?title=User:%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1/common.js&amp;diff=6792&amp;oldid=prev</id>
		<title>残叶无影：清空页面</title>
		<link rel="alternate" type="text/html" href="https://zh.enter-politics.com/index.php?title=User:%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1/common.js&amp;diff=6792&amp;oldid=prev"/>
		<updated>2020-08-21T03:27:20Z</updated>

		<summary type="html">&lt;p&gt;清空页面&lt;/p&gt;
&lt;a href=&quot;https://zh.enter-politics.com/index.php?title=User:%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1/common.js&amp;amp;diff=6792&amp;amp;oldid=6789&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>残叶无影</name></author>
	</entry>
	<entry>
		<id>https://zh.enter-politics.com/index.php?title=User:%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1/common.js&amp;diff=6789&amp;oldid=prev</id>
		<title>残叶无影：创建页面，内容为“// Utilities var Vector3 = {}; var Matrix44 = {}; Vector3.create = function(x, y, z) {     return {'x':x, 'y':y, 'z':z}; }; Vector3.dot = function (v0, v1) {     ret…”</title>
		<link rel="alternate" type="text/html" href="https://zh.enter-politics.com/index.php?title=User:%E6%AE%8B%E5%8F%B6%E6%97%A0%E5%BD%B1/common.js&amp;diff=6789&amp;oldid=prev"/>
		<updated>2020-08-21T03:16:57Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“// Utilities var Vector3 = {}; var Matrix44 = {}; Vector3.create = function(x, y, z) {     return {&amp;#039;x&amp;#039;:x, &amp;#039;y&amp;#039;:y, &amp;#039;z&amp;#039;:z}; }; Vector3.dot = function (v0, v1) {     ret…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// Utilities&lt;br /&gt;
var Vector3 = {};&lt;br /&gt;
var Matrix44 = {};&lt;br /&gt;
Vector3.create = function(x, y, z) {&lt;br /&gt;
    return {'x':x, 'y':y, 'z':z};&lt;br /&gt;
};&lt;br /&gt;
Vector3.dot = function (v0, v1) {&lt;br /&gt;
    return v0.x * v1.x + v0.y * v1.y + v0.z * v1.z;&lt;br /&gt;
};&lt;br /&gt;
Vector3.cross = function (v, v0, v1) {&lt;br /&gt;
    v.x = v0.y * v1.z - v0.z * v1.y;&lt;br /&gt;
    v.y = v0.z * v1.x - v0.x * v1.z;&lt;br /&gt;
    v.z = v0.x * v1.y - v0.y * v1.x;&lt;br /&gt;
};&lt;br /&gt;
Vector3.normalize = function (v) {&lt;br /&gt;
    var l = v.x * v.x + v.y * v.y + v.z * v.z;&lt;br /&gt;
    if(l &amp;gt; 0.00001) {&lt;br /&gt;
        l = 1.0 / Math.sqrt(l);&lt;br /&gt;
        v.x *= l;&lt;br /&gt;
        v.y *= l;&lt;br /&gt;
        v.z *= l;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
Vector3.arrayForm = function(v) {&lt;br /&gt;
    if(v.array) {&lt;br /&gt;
        v.array[0] = v.x;&lt;br /&gt;
        v.array[1] = v.y;&lt;br /&gt;
        v.array[2] = v.z;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        v.array = new Float32Array([v.x, v.y, v.z]);&lt;br /&gt;
    }&lt;br /&gt;
    return v.array;&lt;br /&gt;
};&lt;br /&gt;
Matrix44.createIdentity = function () {&lt;br /&gt;
    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]);&lt;br /&gt;
};&lt;br /&gt;
Matrix44.loadProjection = function (m, aspect, vdeg, near, far) {&lt;br /&gt;
    var h = near * Math.tan(vdeg * Math.PI / 180.0 * 0.5) * 2.0;&lt;br /&gt;
    var w = h * aspect;&lt;br /&gt;
    &lt;br /&gt;
    m[0] = 2.0 * near / w;&lt;br /&gt;
    m[1] = 0.0;&lt;br /&gt;
    m[2] = 0.0;&lt;br /&gt;
    m[3] = 0.0;&lt;br /&gt;
    &lt;br /&gt;
    m[4] = 0.0;&lt;br /&gt;
    m[5] = 2.0 * near / h;&lt;br /&gt;
    m[6] = 0.0;&lt;br /&gt;
    m[7] = 0.0;&lt;br /&gt;
    &lt;br /&gt;
    m[8] = 0.0;&lt;br /&gt;
    m[9] = 0.0;&lt;br /&gt;
    m[10] = -(far + near) / (far - near);&lt;br /&gt;
    m[11] = -1.0;&lt;br /&gt;
    &lt;br /&gt;
    m[12] = 0.0;&lt;br /&gt;
    m[13] = 0.0;&lt;br /&gt;
    m[14] = -2.0 * far * near / (far - near);&lt;br /&gt;
    m[15] = 0.0;&lt;br /&gt;
};&lt;br /&gt;
Matrix44.loadLookAt = function (m, vpos, vlook, vup) {&lt;br /&gt;
    var frontv = Vector3.create(vpos.x - vlook.x, vpos.y - vlook.y, vpos.z - vlook.z);&lt;br /&gt;
    Vector3.normalize(frontv);&lt;br /&gt;
    var sidev = Vector3.create(1.0, 0.0, 0.0);&lt;br /&gt;
    Vector3.cross(sidev, vup, frontv);&lt;br /&gt;
    Vector3.normalize(sidev);&lt;br /&gt;
    var topv = Vector3.create(1.0, 0.0, 0.0);&lt;br /&gt;
    Vector3.cross(topv, frontv, sidev);&lt;br /&gt;
    Vector3.normalize(topv);&lt;br /&gt;
    &lt;br /&gt;
    m[0] = sidev.x;&lt;br /&gt;
    m[1] = topv.x;&lt;br /&gt;
    m[2] = frontv.x;&lt;br /&gt;
    m[3] = 0.0;&lt;br /&gt;
    &lt;br /&gt;
    m[4] = sidev.y;&lt;br /&gt;
    m[5] = topv.y;&lt;br /&gt;
    m[6] = frontv.y;&lt;br /&gt;
    m[7] = 0.0;&lt;br /&gt;
    &lt;br /&gt;
    m[8] = sidev.z;&lt;br /&gt;
    m[9] = topv.z;&lt;br /&gt;
    m[10] = frontv.z;&lt;br /&gt;
    m[11] = 0.0;&lt;br /&gt;
    &lt;br /&gt;
    m[12] = -(vpos.x * m[0] + vpos.y * m[4] + vpos.z * m[8]);&lt;br /&gt;
    m[13] = -(vpos.x * m[1] + vpos.y * m[5] + vpos.z * m[9]);&lt;br /&gt;
    m[14] = -(vpos.x * m[2] + vpos.y * m[6] + vpos.z * m[10]);&lt;br /&gt;
    m[15] = 1.0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
var timeInfo = {&lt;br /&gt;
    'start':0, 'prev':0, // Date&lt;br /&gt;
    'delta':0, 'elapsed':0 // Number(sec)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
var gl;&lt;br /&gt;
var renderSpec = {&lt;br /&gt;
    'width':0,&lt;br /&gt;
    'height':0,&lt;br /&gt;
    'aspect':1,&lt;br /&gt;
    'array':new Float32Array(3),&lt;br /&gt;
    'halfWidth':0,&lt;br /&gt;
    'halfHeight':0,&lt;br /&gt;
    'halfArray':new Float32Array(3)&lt;br /&gt;
    // and some render targets. see setViewport()&lt;br /&gt;
};&lt;br /&gt;
renderSpec.setSize = function(w, h) {&lt;br /&gt;
    renderSpec.width = w;&lt;br /&gt;
    renderSpec.height = h;&lt;br /&gt;
    renderSpec.aspect = renderSpec.width / renderSpec.height;&lt;br /&gt;
    renderSpec.array[0] = renderSpec.width;&lt;br /&gt;
    renderSpec.array[1] = renderSpec.height;&lt;br /&gt;
    renderSpec.array[2] = renderSpec.aspect;&lt;br /&gt;
    &lt;br /&gt;
    renderSpec.halfWidth = Math.floor(w / 2);&lt;br /&gt;
    renderSpec.halfHeight = Math.floor(h / 2);&lt;br /&gt;
    renderSpec.halfArray[0] = renderSpec.halfWidth;&lt;br /&gt;
    renderSpec.halfArray[1] = renderSpec.halfHeight;&lt;br /&gt;
    renderSpec.halfArray[2] = renderSpec.halfWidth / renderSpec.halfHeight;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function deleteRenderTarget(rt) {&lt;br /&gt;
    gl.deleteFramebuffer(rt.frameBuffer);&lt;br /&gt;
    gl.deleteRenderbuffer(rt.renderBuffer);&lt;br /&gt;
    gl.deleteTexture(rt.texture);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function createRenderTarget(w, h) {&lt;br /&gt;
    var ret = {&lt;br /&gt;
        'width':w,&lt;br /&gt;
        'height':h,&lt;br /&gt;
        'sizeArray':new Float32Array([w, h, w / h]),&lt;br /&gt;
        'dtxArray':new Float32Array([1.0 / w, 1.0 / h])&lt;br /&gt;
    };&lt;br /&gt;
    ret.frameBuffer = gl.createFramebuffer();&lt;br /&gt;
    ret.renderBuffer = gl.createRenderbuffer();&lt;br /&gt;
    ret.texture = gl.createTexture();&lt;br /&gt;
    &lt;br /&gt;
    gl.bindTexture(gl.TEXTURE_2D, ret.texture);&lt;br /&gt;
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);&lt;br /&gt;
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);&lt;br /&gt;
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);&lt;br /&gt;
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);&lt;br /&gt;
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);&lt;br /&gt;
    &lt;br /&gt;
    gl.bindFramebuffer(gl.FRAMEBUFFER, ret.frameBuffer);&lt;br /&gt;
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, ret.texture, 0);&lt;br /&gt;
    &lt;br /&gt;
    gl.bindRenderbuffer(gl.RENDERBUFFER, ret.renderBuffer);&lt;br /&gt;
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, w, h);&lt;br /&gt;
    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, ret.renderBuffer);&lt;br /&gt;
    &lt;br /&gt;
    gl.bindTexture(gl.TEXTURE_2D, null);&lt;br /&gt;
    gl.bindRenderbuffer(gl.RENDERBUFFER, null);&lt;br /&gt;
    gl.bindFramebuffer(gl.FRAMEBUFFER, null);&lt;br /&gt;
    &lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function compileShader(shtype, shsrc) {&lt;br /&gt;
	var retsh = gl.createShader(shtype);&lt;br /&gt;
	&lt;br /&gt;
	gl.shaderSource(retsh, shsrc);&lt;br /&gt;
	gl.compileShader(retsh);&lt;br /&gt;
	&lt;br /&gt;
	if(!gl.getShaderParameter(retsh, gl.COMPILE_STATUS)) {&lt;br /&gt;
		var errlog = gl.getShaderInfoLog(retsh);&lt;br /&gt;
		gl.deleteShader(retsh);&lt;br /&gt;
		console.error(errlog);&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
	return retsh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function createShader(vtxsrc, frgsrc, uniformlist, attrlist) {&lt;br /&gt;
    var vsh = compileShader(gl.VERTEX_SHADER, vtxsrc);&lt;br /&gt;
    var fsh = compileShader(gl.FRAGMENT_SHADER, frgsrc);&lt;br /&gt;
    &lt;br /&gt;
    if(vsh == null || fsh == null) {&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var prog = gl.createProgram();&lt;br /&gt;
    gl.attachShader(prog, vsh);&lt;br /&gt;
    gl.attachShader(prog, fsh);&lt;br /&gt;
    &lt;br /&gt;
    gl.deleteShader(vsh);&lt;br /&gt;
    gl.deleteShader(fsh);&lt;br /&gt;
    &lt;br /&gt;
    gl.linkProgram(prog);&lt;br /&gt;
    if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {&lt;br /&gt;
        var errlog = gl.getProgramInfoLog(prog);&lt;br /&gt;
        console.error(errlog);&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if(uniformlist) {&lt;br /&gt;
        prog.uniforms = {};&lt;br /&gt;
        for(var i = 0; i &amp;lt; uniformlist.length; i++) {&lt;br /&gt;
            prog.uniforms[uniformlist[i]] = gl.getUniformLocation(prog, uniformlist[i]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if(attrlist) {&lt;br /&gt;
        prog.attributes = {};&lt;br /&gt;
        for(var i = 0; i &amp;lt; attrlist.length; i++) {&lt;br /&gt;
            var attr = attrlist[i];&lt;br /&gt;
            prog.attributes[attr] = gl.getAttribLocation(prog, attr);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return prog;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function useShader(prog) {&lt;br /&gt;
    gl.useProgram(prog);&lt;br /&gt;
    for(var attr in prog.attributes) {&lt;br /&gt;
        gl.enableVertexAttribArray(prog.attributes[attr]);;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function unuseShader(prog) {&lt;br /&gt;
    for(var attr in prog.attributes) {&lt;br /&gt;
        gl.disableVertexAttribArray(prog.attributes[attr]);;&lt;br /&gt;
    }&lt;br /&gt;
    gl.useProgram(null);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
var projection = {&lt;br /&gt;
    'angle':60,&lt;br /&gt;
    'nearfar':new Float32Array([0.1, 100.0]),&lt;br /&gt;
    'matrix':Matrix44.createIdentity()&lt;br /&gt;
};&lt;br /&gt;
var camera = {&lt;br /&gt;
    'position':Vector3.create(0, 0, 100),&lt;br /&gt;
    'lookat':Vector3.create(0, 0, 0),&lt;br /&gt;
    'up':Vector3.create(0, 1, 0),&lt;br /&gt;
    'dof':Vector3.create(10.0, 4.0, 8.0),&lt;br /&gt;
    'matrix':Matrix44.createIdentity()&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var pointFlower = {};&lt;br /&gt;
var meshFlower = {};&lt;br /&gt;
var sceneStandBy = false;&lt;br /&gt;
&lt;br /&gt;
var BlossomParticle = function () {&lt;br /&gt;
    this.velocity = new Array(3);&lt;br /&gt;
    this.rotation = new Array(3);&lt;br /&gt;
    this.position = new Array(3);&lt;br /&gt;
    this.euler = new Array(3);&lt;br /&gt;
    this.size = 1.0;&lt;br /&gt;
    this.alpha = 1.0;&lt;br /&gt;
    this.zkey = 0.0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
BlossomParticle.prototype.setVelocity = function (vx, vy, vz) {&lt;br /&gt;
    this.velocity[0] = vx;&lt;br /&gt;
    this.velocity[1] = vy;&lt;br /&gt;
    this.velocity[2] = vz;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
BlossomParticle.prototype.setRotation = function (rx, ry, rz) {&lt;br /&gt;
    this.rotation[0] = rx;&lt;br /&gt;
    this.rotation[1] = ry;&lt;br /&gt;
    this.rotation[2] = rz;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
BlossomParticle.prototype.setPosition = function (nx, ny, nz) {&lt;br /&gt;
    this.position[0] = nx;&lt;br /&gt;
    this.position[1] = ny;&lt;br /&gt;
    this.position[2] = nz;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
BlossomParticle.prototype.setEulerAngles = function (rx, ry, rz) {&lt;br /&gt;
    this.euler[0] = rx;&lt;br /&gt;
    this.euler[1] = ry;&lt;br /&gt;
    this.euler[2] = rz;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
BlossomParticle.prototype.setSize = function (s) {&lt;br /&gt;
    this.size = s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
BlossomParticle.prototype.update = function (dt, et) {&lt;br /&gt;
    this.position[0] += this.velocity[0] * dt;&lt;br /&gt;
    this.position[1] += this.velocity[1] * dt;&lt;br /&gt;
    this.position[2] += this.velocity[2] * dt;&lt;br /&gt;
    &lt;br /&gt;
    this.euler[0] += this.rotation[0] * dt;&lt;br /&gt;
    this.euler[1] += this.rotation[1] * dt;&lt;br /&gt;
    this.euler[2] += this.rotation[2] * dt;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function createPointFlowers() {&lt;br /&gt;
    // get point sizes&lt;br /&gt;
    var prm = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE);&lt;br /&gt;
    renderSpec.pointSize = {'min':prm[0], 'max':prm[1]};&lt;br /&gt;
    &lt;br /&gt;
    var vtxsrc = document.getElementById(&amp;quot;sakura_point_vsh&amp;quot;).textContent;&lt;br /&gt;
    var frgsrc = document.getElementById(&amp;quot;sakura_point_fsh&amp;quot;).textContent;&lt;br /&gt;
    &lt;br /&gt;
    pointFlower.program = createShader(&lt;br /&gt;
        vtxsrc, frgsrc,&lt;br /&gt;
        ['uProjection', 'uModelview', 'uResolution', 'uOffset', 'uDOF', 'uFade'],&lt;br /&gt;
        ['aPosition', 'aEuler', 'aMisc']&lt;br /&gt;
    );&lt;br /&gt;
    &lt;br /&gt;
    useShader(pointFlower.program);&lt;br /&gt;
    pointFlower.offset = new Float32Array([0.0, 0.0, 0.0]);&lt;br /&gt;
    pointFlower.fader = Vector3.create(0.0, 10.0, 0.0);&lt;br /&gt;
    &lt;br /&gt;
    // paramerters: velocity[3], rotate[3]&lt;br /&gt;
    pointFlower.numFlowers = 1600;&lt;br /&gt;
    pointFlower.particles = new Array(pointFlower.numFlowers);&lt;br /&gt;
    // vertex attributes {position[3], euler_xyz[3], size[1]}&lt;br /&gt;
    pointFlower.dataArray = new Float32Array(pointFlower.numFlowers * (3 + 3 + 2));&lt;br /&gt;
    pointFlower.positionArrayOffset = 0;&lt;br /&gt;
    pointFlower.eulerArrayOffset = pointFlower.numFlowers * 3;&lt;br /&gt;
    pointFlower.miscArrayOffset = pointFlower.numFlowers * 6;&lt;br /&gt;
    &lt;br /&gt;
    pointFlower.buffer = gl.createBuffer();&lt;br /&gt;
    gl.bindBuffer(gl.ARRAY_BUFFER, pointFlower.buffer);&lt;br /&gt;
    gl.bufferData(gl.ARRAY_BUFFER, pointFlower.dataArray, gl.DYNAMIC_DRAW);&lt;br /&gt;
    gl.bindBuffer(gl.ARRAY_BUFFER, null);&lt;br /&gt;
    &lt;br /&gt;
    unuseShader(pointFlower.program);&lt;br /&gt;
    &lt;br /&gt;
    for(var i = 0; i &amp;lt; pointFlower.numFlowers; i++) {&lt;br /&gt;
        pointFlower.particles[i] = new BlossomParticle();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initPointFlowers() {&lt;br /&gt;
    //area&lt;br /&gt;
    pointFlower.area = Vector3.create(20.0, 20.0, 20.0);&lt;br /&gt;
    pointFlower.area.x = pointFlower.area.y * renderSpec.aspect;&lt;br /&gt;
    &lt;br /&gt;
    pointFlower.fader.x = 10.0; //env fade start&lt;br /&gt;
    pointFlower.fader.y = pointFlower.area.z; //env fade half&lt;br /&gt;
    pointFlower.fader.z = 0.1;  //near fade start&lt;br /&gt;
    &lt;br /&gt;
    //particles&lt;br /&gt;
    var PI2 = Math.PI * 2.0;&lt;br /&gt;
    var tmpv3 = Vector3.create(0, 0, 0);&lt;br /&gt;
    var tmpv = 0;&lt;br /&gt;
    var symmetryrand = function() {return (Math.random() * 2.0 - 1.0);};&lt;br /&gt;
    for(var i = 0; i &amp;lt; pointFlower.numFlowers; i++) {&lt;br /&gt;
        var tmpprtcl = pointFlower.particles[i];&lt;br /&gt;
        &lt;br /&gt;
        //velocity&lt;br /&gt;
        tmpv3.x = symmetryrand() * 0.3 + 0.8;&lt;br /&gt;
        tmpv3.y = symmetryrand() * 0.2 - 1.0;&lt;br /&gt;
        tmpv3.z = symmetryrand() * 0.3 + 0.5;&lt;br /&gt;
        Vector3.normalize(tmpv3);&lt;br /&gt;
        tmpv = 2.0 + Math.random() * 1.0;&lt;br /&gt;
        tmpprtcl.setVelocity(tmpv3.x * tmpv, tmpv3.y * tmpv, tmpv3.z * tmpv);&lt;br /&gt;
        &lt;br /&gt;
        //rotation&lt;br /&gt;
        tmpprtcl.setRotation(&lt;br /&gt;
            symmetryrand() * PI2 * 0.5,&lt;br /&gt;
            symmetryrand() * PI2 * 0.5,&lt;br /&gt;
            symmetryrand() * PI2 * 0.5&lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        //position&lt;br /&gt;
        tmpprtcl.setPosition(&lt;br /&gt;
            symmetryrand() * pointFlower.area.x,&lt;br /&gt;
            symmetryrand() * pointFlower.area.y,&lt;br /&gt;
            symmetryrand() * pointFlower.area.z&lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        //euler&lt;br /&gt;
        tmpprtcl.setEulerAngles(&lt;br /&gt;
            Math.random() * Math.PI * 2.0,&lt;br /&gt;
            Math.random() * Math.PI * 2.0,&lt;br /&gt;
            Math.random() * Math.PI * 2.0&lt;br /&gt;
        );&lt;br /&gt;
        &lt;br /&gt;
        //size&lt;br /&gt;
        tmpprtcl.setSize(0.9 + Math.random() * 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderPointFlowers() {&lt;br /&gt;
    //update&lt;br /&gt;
    var PI2 = Math.PI * 2.0;&lt;br /&gt;
    var limit = [pointFlower.area.x, pointFlower.area.y, pointFlower.area.z];&lt;br /&gt;
    var repeatPos = function (prt, cmp, limit) {&lt;br /&gt;
        if(Math.abs(prt.position[cmp]) - prt.size * 0.5 &amp;gt; limit) {&lt;br /&gt;
            //out of area&lt;br /&gt;
            if(prt.position[cmp] &amp;gt; 0) {&lt;br /&gt;
                prt.position[cmp] -= limit * 2.0;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                prt.position[cmp] += limit * 2.0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    var repeatEuler = function (prt, cmp) {&lt;br /&gt;
        prt.euler[cmp] = prt.euler[cmp] % PI2;&lt;br /&gt;
        if(prt.euler[cmp] &amp;lt; 0.0) {&lt;br /&gt;
            prt.euler[cmp] += PI2;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    for(var i = 0; i &amp;lt; pointFlower.numFlowers; i++) {&lt;br /&gt;
        var prtcl = pointFlower.particles[i];&lt;br /&gt;
        prtcl.update(timeInfo.delta, timeInfo.elapsed);&lt;br /&gt;
        repeatPos(prtcl, 0, pointFlower.area.x);&lt;br /&gt;
        repeatPos(prtcl, 1, pointFlower.area.y);&lt;br /&gt;
        repeatPos(prtcl, 2, pointFlower.area.z);&lt;br /&gt;
        repeatEuler(prtcl, 0);&lt;br /&gt;
        repeatEuler(prtcl, 1);&lt;br /&gt;
        repeatEuler(prtcl, 2);&lt;br /&gt;
        &lt;br /&gt;
        prtcl.alpha = 1.0;//(pointFlower.area.z - prtcl.position[2]) * 0.5;&lt;br /&gt;
        &lt;br /&gt;
        prtcl.zkey = (camera.matrix[2] * prtcl.position[0]&lt;br /&gt;
                    + camera.matrix[6] * prtcl.position[1]&lt;br /&gt;
                    + camera.matrix[10] * prtcl.position[2]&lt;br /&gt;
                    + camera.matrix[14]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // sort&lt;br /&gt;
    pointFlower.particles.sort(function(p0, p1){return p0.zkey - p1.zkey;});&lt;br /&gt;
    &lt;br /&gt;
    // update data&lt;br /&gt;
    var ipos = pointFlower.positionArrayOffset;&lt;br /&gt;
    var ieuler = pointFlower.eulerArrayOffset;&lt;br /&gt;
    var imisc = pointFlower.miscArrayOffset;&lt;br /&gt;
    for(var i = 0; i &amp;lt; pointFlower.numFlowers; i++) {&lt;br /&gt;
        var prtcl = pointFlower.particles[i];&lt;br /&gt;
        pointFlower.dataArray[ipos] = prtcl.position[0];&lt;br /&gt;
        pointFlower.dataArray[ipos + 1] = prtcl.position[1];&lt;br /&gt;
        pointFlower.dataArray[ipos + 2] = prtcl.position[2];&lt;br /&gt;
        ipos += 3;&lt;br /&gt;
        pointFlower.dataArray[ieuler] = prtcl.euler[0];&lt;br /&gt;
        pointFlower.dataArray[ieuler + 1] = prtcl.euler[1];&lt;br /&gt;
        pointFlower.dataArray[ieuler + 2] = prtcl.euler[2];&lt;br /&gt;
        ieuler += 3;&lt;br /&gt;
        pointFlower.dataArray[imisc] = prtcl.size;&lt;br /&gt;
        pointFlower.dataArray[imisc + 1] = prtcl.alpha;&lt;br /&gt;
        imisc += 2;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //draw&lt;br /&gt;
    gl.enable(gl.BLEND);&lt;br /&gt;
    //gl.disable(gl.DEPTH_TEST);&lt;br /&gt;
    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);&lt;br /&gt;
    &lt;br /&gt;
    var prog = pointFlower.program;&lt;br /&gt;
    useShader(prog);&lt;br /&gt;
    &lt;br /&gt;
    gl.uniformMatrix4fv(prog.uniforms.uProjection, false, projection.matrix);&lt;br /&gt;
    gl.uniformMatrix4fv(prog.uniforms.uModelview, false, camera.matrix);&lt;br /&gt;
    gl.uniform3fv(prog.uniforms.uResolution, renderSpec.array);&lt;br /&gt;
    gl.uniform3fv(prog.uniforms.uDOF, Vector3.arrayForm(camera.dof));&lt;br /&gt;
    gl.uniform3fv(prog.uniforms.uFade, Vector3.arrayForm(pointFlower.fader));&lt;br /&gt;
    &lt;br /&gt;
    gl.bindBuffer(gl.ARRAY_BUFFER, pointFlower.buffer);&lt;br /&gt;
    gl.bufferData(gl.ARRAY_BUFFER, pointFlower.dataArray, gl.DYNAMIC_DRAW);&lt;br /&gt;
    &lt;br /&gt;
    gl.vertexAttribPointer(prog.attributes.aPosition, 3, gl.FLOAT, false, 0, pointFlower.positionArrayOffset * Float32Array.BYTES_PER_ELEMENT);&lt;br /&gt;
    gl.vertexAttribPointer(prog.attributes.aEuler, 3, gl.FLOAT, false, 0, pointFlower.eulerArrayOffset * Float32Array.BYTES_PER_ELEMENT);&lt;br /&gt;
    gl.vertexAttribPointer(prog.attributes.aMisc, 2, gl.FLOAT, false, 0, pointFlower.miscArrayOffset * Float32Array.BYTES_PER_ELEMENT);&lt;br /&gt;
    &lt;br /&gt;
    // doubler&lt;br /&gt;
    for(var i = 1; i &amp;lt; 2; i++) {&lt;br /&gt;
        var zpos = i * -2.0;&lt;br /&gt;
        pointFlower.offset[0] = pointFlower.area.x * -1.0;&lt;br /&gt;
        pointFlower.offset[1] = pointFlower.area.y * -1.0;&lt;br /&gt;
        pointFlower.offset[2] = pointFlower.area.z * zpos;&lt;br /&gt;
        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);&lt;br /&gt;
        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);&lt;br /&gt;
        &lt;br /&gt;
        pointFlower.offset[0] = pointFlower.area.x * -1.0;&lt;br /&gt;
        pointFlower.offset[1] = pointFlower.area.y *  1.0;&lt;br /&gt;
        pointFlower.offset[2] = pointFlower.area.z * zpos;&lt;br /&gt;
        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);&lt;br /&gt;
        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);&lt;br /&gt;
        &lt;br /&gt;
        pointFlower.offset[0] = pointFlower.area.x *  1.0;&lt;br /&gt;
        pointFlower.offset[1] = pointFlower.area.y * -1.0;&lt;br /&gt;
        pointFlower.offset[2] = pointFlower.area.z * zpos;&lt;br /&gt;
        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);&lt;br /&gt;
        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);&lt;br /&gt;
        &lt;br /&gt;
        pointFlower.offset[0] = pointFlower.area.x *  1.0;&lt;br /&gt;
        pointFlower.offset[1] = pointFlower.area.y *  1.0;&lt;br /&gt;
        pointFlower.offset[2] = pointFlower.area.z * zpos;&lt;br /&gt;
        gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);&lt;br /&gt;
        gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //main&lt;br /&gt;
    pointFlower.offset[0] = 0.0;&lt;br /&gt;
    pointFlower.offset[1] = 0.0;&lt;br /&gt;
    pointFlower.offset[2] = 0.0;&lt;br /&gt;
    gl.uniform3fv(prog.uniforms.uOffset, pointFlower.offset);&lt;br /&gt;
    gl.drawArrays(gl.POINT, 0, pointFlower.numFlowers);&lt;br /&gt;
    &lt;br /&gt;
    gl.bindBuffer(gl.ARRAY_BUFFER, null);&lt;br /&gt;
    unuseShader(prog);&lt;br /&gt;
    &lt;br /&gt;
    gl.enable(gl.DEPTH_TEST);&lt;br /&gt;
    gl.disable(gl.BLEND);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// effects&lt;br /&gt;
//common util&lt;br /&gt;
function createEffectProgram(vtxsrc, frgsrc, exunifs, exattrs) {&lt;br /&gt;
    var ret = {};&lt;br /&gt;
    var unifs = ['uResolution', 'uSrc', 'uDelta'];&lt;br /&gt;
    if(exunifs) {&lt;br /&gt;
        unifs = unifs.concat(exunifs);&lt;br /&gt;
    }&lt;br /&gt;
    var attrs = ['aPosition'];&lt;br /&gt;
    if(exattrs) {&lt;br /&gt;
        attrs = attrs.concat(exattrs);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    ret.program = createShader(vtxsrc, frgsrc, unifs, attrs);&lt;br /&gt;
    useShader(ret.program);&lt;br /&gt;
    &lt;br /&gt;
    ret.dataArray = new Float32Array([&lt;br /&gt;
        -1.0, -1.0,&lt;br /&gt;
         1.0, -1.0,&lt;br /&gt;
        -1.0,  1.0,&lt;br /&gt;
         1.0,  1.0&lt;br /&gt;
    ]);&lt;br /&gt;
    ret.buffer = gl.createBuffer();&lt;br /&gt;
    gl.bindBuffer(gl.ARRAY_BUFFER, ret.buffer);&lt;br /&gt;
    gl.bufferData(gl.ARRAY_BUFFER, ret.dataArray, gl.STATIC_DRAW);&lt;br /&gt;
    &lt;br /&gt;
    gl.bindBuffer(gl.ARRAY_BUFFER, null);&lt;br /&gt;
    unuseShader(ret.program);&lt;br /&gt;
    &lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// basic usage&lt;br /&gt;
// useEffect(prog, srctex({'texture':texid, 'dtxArray':(f32)[dtx, dty]})); //basic initialize&lt;br /&gt;
// gl.uniform**(...); //additional uniforms&lt;br /&gt;
// drawEffect()&lt;br /&gt;
// unuseEffect(prog)&lt;br /&gt;
// TEXTURE0 makes src&lt;br /&gt;
function useEffect(fxobj, srctex) {&lt;br /&gt;
    var prog = fxobj.program;&lt;br /&gt;
    useShader(prog);&lt;br /&gt;
    gl.uniform3fv(prog.uniforms.uResolution, renderSpec.array);&lt;br /&gt;
    &lt;br /&gt;
    if(srctex != null) {&lt;br /&gt;
        gl.uniform2fv(prog.uniforms.uDelta, srctex.dtxArray);&lt;br /&gt;
        gl.uniform1i(prog.uniforms.uSrc, 0);&lt;br /&gt;
        &lt;br /&gt;
        gl.activeTexture(gl.TEXTURE0);&lt;br /&gt;
        gl.bindTexture(gl.TEXTURE_2D, srctex.texture);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
function drawEffect(fxobj) {&lt;br /&gt;
    gl.bindBuffer(gl.ARRAY_BUFFER, fxobj.buffer);&lt;br /&gt;
    gl.vertexAttribPointer(fxobj.program.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);&lt;br /&gt;
    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);&lt;br /&gt;
}&lt;br /&gt;
function unuseEffect(fxobj) {&lt;br /&gt;
    unuseShader(fxobj.program);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var effectLib = {};&lt;br /&gt;
function createEffectLib() {&lt;br /&gt;
    &lt;br /&gt;
    var vtxsrc, frgsrc;&lt;br /&gt;
    //common&lt;br /&gt;
    var cmnvtxsrc = document.getElementById(&amp;quot;fx_common_vsh&amp;quot;).textContent;&lt;br /&gt;
    &lt;br /&gt;
    //background&lt;br /&gt;
    frgsrc = document.getElementById(&amp;quot;bg_fsh&amp;quot;).textContent;&lt;br /&gt;
    effectLib.sceneBg = createEffectProgram(cmnvtxsrc, frgsrc, ['uTimes'], null);&lt;br /&gt;
    &lt;br /&gt;
    // make brightpixels buffer&lt;br /&gt;
    frgsrc = document.getElementById(&amp;quot;fx_brightbuf_fsh&amp;quot;).textContent;&lt;br /&gt;
    effectLib.mkBrightBuf = createEffectProgram(cmnvtxsrc, frgsrc, null, null);&lt;br /&gt;
    &lt;br /&gt;
    // direction blur&lt;br /&gt;
    frgsrc = document.getElementById(&amp;quot;fx_dirblur_r4_fsh&amp;quot;).textContent;&lt;br /&gt;
    effectLib.dirBlur = createEffectProgram(cmnvtxsrc, frgsrc, ['uBlurDir'], null);&lt;br /&gt;
    &lt;br /&gt;
    //final composite&lt;br /&gt;
    vtxsrc = document.getElementById(&amp;quot;pp_final_vsh&amp;quot;).textContent;&lt;br /&gt;
    frgsrc = document.getElementById(&amp;quot;pp_final_fsh&amp;quot;).textContent;&lt;br /&gt;
    effectLib.finalComp = createEffectProgram(vtxsrc, frgsrc, ['uBloom'], null);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// background&lt;br /&gt;
function createBackground() {&lt;br /&gt;
    //console.log(&amp;quot;create background&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function initBackground() {&lt;br /&gt;
    //console.log(&amp;quot;init background&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function renderBackground() {&lt;br /&gt;
    gl.disable(gl.DEPTH_TEST);&lt;br /&gt;
    &lt;br /&gt;
    useEffect(effectLib.sceneBg, null);&lt;br /&gt;
    gl.uniform2f(effectLib.sceneBg.program.uniforms.uTimes, timeInfo.elapsed, timeInfo.delta);&lt;br /&gt;
    drawEffect(effectLib.sceneBg);&lt;br /&gt;
    unuseEffect(effectLib.sceneBg);&lt;br /&gt;
    &lt;br /&gt;
    gl.enable(gl.DEPTH_TEST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// post process&lt;br /&gt;
var postProcess = {};&lt;br /&gt;
function createPostProcess() {&lt;br /&gt;
    //console.log(&amp;quot;create post process&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
function initPostProcess() {&lt;br /&gt;
    //console.log(&amp;quot;init post process&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderPostProcess() {&lt;br /&gt;
    gl.enable(gl.TEXTURE_2D);&lt;br /&gt;
    gl.disable(gl.DEPTH_TEST);&lt;br /&gt;
    var bindRT = function (rt, isclear) {&lt;br /&gt;
        gl.bindFramebuffer(gl.FRAMEBUFFER, rt.frameBuffer);&lt;br /&gt;
        gl.viewport(0, 0, rt.width, rt.height);&lt;br /&gt;
        if(isclear) {&lt;br /&gt;
            gl.clearColor(0, 0, 0, 0);&lt;br /&gt;
            gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    //make bright buff&lt;br /&gt;
    bindRT(renderSpec.wHalfRT0, true);&lt;br /&gt;
    useEffect(effectLib.mkBrightBuf, renderSpec.mainRT);&lt;br /&gt;
    drawEffect(effectLib.mkBrightBuf);&lt;br /&gt;
    unuseEffect(effectLib.mkBrightBuf);&lt;br /&gt;
    &lt;br /&gt;
    // make bloom&lt;br /&gt;
    for(var i = 0; i &amp;lt; 2; i++) {&lt;br /&gt;
        var p = 1.5 + 1 * i;&lt;br /&gt;
        var s = 2.0 + 1 * i;&lt;br /&gt;
        bindRT(renderSpec.wHalfRT1, true);&lt;br /&gt;
        useEffect(effectLib.dirBlur, renderSpec.wHalfRT0);&lt;br /&gt;
        gl.uniform4f(effectLib.dirBlur.program.uniforms.uBlurDir, p, 0.0, s, 0.0);&lt;br /&gt;
        drawEffect(effectLib.dirBlur);&lt;br /&gt;
        unuseEffect(effectLib.dirBlur);&lt;br /&gt;
        &lt;br /&gt;
        bindRT(renderSpec.wHalfRT0, true);&lt;br /&gt;
        useEffect(effectLib.dirBlur, renderSpec.wHalfRT1);&lt;br /&gt;
        gl.uniform4f(effectLib.dirBlur.program.uniforms.uBlurDir, 0.0, p, 0.0, s);&lt;br /&gt;
        drawEffect(effectLib.dirBlur);&lt;br /&gt;
        unuseEffect(effectLib.dirBlur);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //display&lt;br /&gt;
    gl.bindFramebuffer(gl.FRAMEBUFFER, null);&lt;br /&gt;
    gl.viewport(0, 0, renderSpec.width, renderSpec.height);&lt;br /&gt;
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);&lt;br /&gt;
    &lt;br /&gt;
    useEffect(effectLib.finalComp, renderSpec.mainRT);&lt;br /&gt;
    gl.uniform1i(effectLib.finalComp.program.uniforms.uBloom, 1);&lt;br /&gt;
    gl.activeTexture(gl.TEXTURE1);&lt;br /&gt;
    gl.bindTexture(gl.TEXTURE_2D, renderSpec.wHalfRT0.texture);&lt;br /&gt;
    drawEffect(effectLib.finalComp);&lt;br /&gt;
    unuseEffect(effectLib.finalComp);&lt;br /&gt;
    &lt;br /&gt;
    gl.enable(gl.DEPTH_TEST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
var SceneEnv = {};&lt;br /&gt;
function createScene() {&lt;br /&gt;
    createEffectLib();&lt;br /&gt;
    createBackground();&lt;br /&gt;
    createPointFlowers();&lt;br /&gt;
    createPostProcess();&lt;br /&gt;
    sceneStandBy = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initScene() {&lt;br /&gt;
    initBackground();&lt;br /&gt;
    initPointFlowers();&lt;br /&gt;
    initPostProcess();&lt;br /&gt;
    &lt;br /&gt;
    //camera.position.z = 17.320508;&lt;br /&gt;
    camera.position.z = pointFlower.area.z + projection.nearfar[0];&lt;br /&gt;
    projection.angle = Math.atan2(pointFlower.area.y, camera.position.z + pointFlower.area.z) * 180.0 / Math.PI * 2.0;&lt;br /&gt;
    Matrix44.loadProjection(projection.matrix, renderSpec.aspect, projection.angle, projection.nearfar[0], projection.nearfar[1]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderScene() {&lt;br /&gt;
    //draw&lt;br /&gt;
    Matrix44.loadLookAt(camera.matrix, camera.position, camera.lookat, camera.up);&lt;br /&gt;
    &lt;br /&gt;
    gl.enable(gl.DEPTH_TEST);&lt;br /&gt;
    &lt;br /&gt;
    //gl.bindFramebuffer(gl.FRAMEBUFFER, null);&lt;br /&gt;
    gl.bindFramebuffer(gl.FRAMEBUFFER, renderSpec.mainRT.frameBuffer);&lt;br /&gt;
    gl.viewport(0, 0, renderSpec.mainRT.width, renderSpec.mainRT.height);&lt;br /&gt;
    gl.clearColor(0.005, 0, 0.05, 0);&lt;br /&gt;
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);&lt;br /&gt;
    &lt;br /&gt;
    renderBackground();&lt;br /&gt;
    renderPointFlowers();&lt;br /&gt;
    renderPostProcess();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
function onResize(e) {&lt;br /&gt;
    makeCanvasFullScreen(document.getElementById(&amp;quot;sakura&amp;quot;));&lt;br /&gt;
    setViewports();&lt;br /&gt;
    if(sceneStandBy) {&lt;br /&gt;
        initScene();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setViewports() {&lt;br /&gt;
    renderSpec.setSize(gl.canvas.width, gl.canvas.height);&lt;br /&gt;
    &lt;br /&gt;
    gl.clearColor(0.2, 0.2, 0.5, 1.0);&lt;br /&gt;
    gl.viewport(0, 0, renderSpec.width, renderSpec.height);&lt;br /&gt;
    &lt;br /&gt;
    var rtfunc = function (rtname, rtw, rth) {&lt;br /&gt;
        var rt = renderSpec[rtname];&lt;br /&gt;
        if(rt) deleteRenderTarget(rt);&lt;br /&gt;
        renderSpec[rtname] = createRenderTarget(rtw, rth);&lt;br /&gt;
    };&lt;br /&gt;
    rtfunc('mainRT', renderSpec.width, renderSpec.height);&lt;br /&gt;
    rtfunc('wFullRT0', renderSpec.width, renderSpec.height);&lt;br /&gt;
    rtfunc('wFullRT1', renderSpec.width, renderSpec.height);&lt;br /&gt;
    rtfunc('wHalfRT0', renderSpec.halfWidth, renderSpec.halfHeight);&lt;br /&gt;
    rtfunc('wHalfRT1', renderSpec.halfWidth, renderSpec.halfHeight);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function render() {&lt;br /&gt;
    renderScene();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var animating = true;&lt;br /&gt;
function toggleAnimation(elm) {&lt;br /&gt;
    animating ^= true;&lt;br /&gt;
    if(animating) animate();&lt;br /&gt;
    if(elm) {&lt;br /&gt;
        elm.innerHTML = animating? &amp;quot;Stop&amp;quot;:&amp;quot;Start&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function stepAnimation() {&lt;br /&gt;
    if(!animating) animate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function animate() {&lt;br /&gt;
    var curdate = new Date();&lt;br /&gt;
    timeInfo.elapsed = (curdate - timeInfo.start) / 1000.0;&lt;br /&gt;
    timeInfo.delta = (curdate - timeInfo.prev) / 1000.0;&lt;br /&gt;
    timeInfo.prev = curdate;&lt;br /&gt;
    &lt;br /&gt;
    if(animating) requestAnimationFrame(animate);&lt;br /&gt;
    render();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function makeCanvasFullScreen(canvas) {&lt;br /&gt;
    var b = document.body;&lt;br /&gt;
	var d = document.documentElement;&lt;br /&gt;
	fullw = Math.max(b.clientWidth , b.scrollWidth, d.scrollWidth, d.clientWidth);&lt;br /&gt;
	fullh = Math.max(b.clientHeight , b.scrollHeight, d.scrollHeight, d.clientHeight);&lt;br /&gt;
	canvas.width = fullw;&lt;br /&gt;
	canvas.height = fullh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.addEventListener('load', function(e) {&lt;br /&gt;
    var canvas = document.getElementById(&amp;quot;sakura&amp;quot;);&lt;br /&gt;
    try {&lt;br /&gt;
        makeCanvasFullScreen(canvas);&lt;br /&gt;
        gl = canvas.getContext('experimental-webgl');&lt;br /&gt;
    } catch(e) {&lt;br /&gt;
        alert(&amp;quot;WebGL not supported.&amp;quot; + e);&lt;br /&gt;
        console.error(e);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    window.addEventListener('resize', onResize);&lt;br /&gt;
    &lt;br /&gt;
    setViewports();&lt;br /&gt;
    createScene();&lt;br /&gt;
    initScene();&lt;br /&gt;
    &lt;br /&gt;
    timeInfo.start = new Date();&lt;br /&gt;
    timeInfo.prev = timeInfo.start;&lt;br /&gt;
    animate();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//set window.requestAnimationFrame&lt;br /&gt;
(function (w, r) {&lt;br /&gt;
    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); };&lt;br /&gt;
})(window, 'requestAnimationFrame');&lt;/div&gt;</summary>
		<author><name>残叶无影</name></author>
	</entry>
</feed>