// // water.js //-------------------- // Provides multiple types of traffic. // by RHY3756547 // // includes: // render stuff idk // window.ObjWater = function(obji, scene) { var obji = obji; var res = []; var t = this; t.pos = vec3.clone(obji.pos); //t.angle = vec3.clone(obji.angle); t.scale = vec3.clone(obji.scale); t.requireRes = requireRes; t.provideRes = provideRes; t.update = update; t.draw = draw; var frame = 0; var wheight = 6.144; var wosc = 12.288; var wstay = 5*60; var wchange = 4*60; function draw(view, pMatrix) { if (nitroRender.flagShadow) return; var waterM = mat4.create(); gl.enable(gl.STENCIL_TEST); gl.stencilMask(0xFF); gl.stencilFunc(gl.ALWAYS, 1, 0xFF); gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE); //when depth test passes for water lower layer, pixel is already drawn, do not cover it with the white overlay (set stencil bit) var height = (t.pos[1])+wheight+Math.sin(frame/150)*wosc //0.106 mat4.translate(waterM, view, [Math.sin(frame/180)*96, height, Math.cos(frame/146)*96]) nitroRender.setColMult([1, 1, 1, 0x0A/31]); res.mdl[0].drawPoly(mat4.scale([], waterM, [16, 16, 16]), pMatrix, 0, 0); //water gl.stencilFunc(gl.EQUAL, 0, 0xFF); gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); if (obji.ID != 9) { mat4.translate(waterM, view, [0, height, 0]) nitroRender.setColMult([1, 1, 1, 0x10/31]); res.mdl[0].drawPoly(mat4.scale([], waterM, [16, 16, 16]), pMatrix, 0, 1); //white shore wash part, water is stencil masked out } gl.disable(gl.STENCIL_TEST); if (res.mdl[1] != null) { mat4.translate(waterM, view, [-Math.sin((frame+30)/180)*96, height, Math.cos((frame+100)/146)*96]) nitroRender.setColMult([1, 1, 1, 0x04/31]); res.mdl[1].draw(mat4.scale([], waterM, [16, 16, 16]), pMatrix); //water white detail part. stencil should do nothing here, since it's in the same position as the above. } nitroRender.setColMult([1, 1, 1, 1]); } function update() { frame = (frame+1)%197100; //it's a big number but yolo... we have the technology... //TODO: physics and void-out for karts } function requireRes() { //scene asks what resources to load switch (obji.ID) { case 0x0001: return {mdl:[{nsbmd:"beach_waterC.nsbmd"}, {nsbmd:"beach_waterA.nsbmd"}]}; case 0x0003: return {mdl:[{nsbmd:"town_waterC.nsbmd"}, {nsbmd:"town_waterA.nsbmd"}]}; case 0x0006: return {mdl:[{nsbmd:"yoshi_waterC.nsbmd"}]}; case 0x0009: return {mdl:[{nsbmd:"hyudoro_waterC.nsbmd"}, {nsbmd:"hyudoro_waterA.nsbmd"}]}; case 0x000C: wheight = 38; wosc = 16; return {mdl:[{nsbmd:"mini_stage3_waterC.nsbmd"}, {nsbmd:"mini_stage3_waterA.nsbmd"}]}; } } function provideRes(r) { res = r; //...and gives them to us. :) } }