Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F61366
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
19 KB
Subscribers
None
View Options
diff --git a/scripts/render.js b/scripts/render.js
index 677af40..b0f7628 100644
--- a/scripts/render.js
+++ b/scripts/render.js
@@ -1,556 +1,556 @@
/*
* 3DCycles - A lightcycle game.
* Copyright (C) 2019 Glen Harpring
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
var draw2dmap = true;
function render()
{
if(!engine.roundCommencing && !engine.paused)
{
engine.renderRunning = true;
if(settings.GAME_LOOP > 0) game(true); //update game right before render
if(settings.REDRAW_MODE == 0) requestAnimationFrame(render);
else setTimeout(render,1000/settings.TARGET_FPS);
draw(); //actual 3d draw
if(settings.HUD_MAP && draw2dmap && engine.hud.style.opacity > 0)
{
draw2dmap = false;
if(settings.REDRAW_MODE == 0)
setTimeout(draw2d_canvas,0);
else
requestAnimationFrame(draw2d_canvas);
}
}
else
{
engine.renderRunning = false;
if(engine.paused)
{
//var lines = engine.console.innerText.split("\n");
//if(lines[(parseFloat(0+engine.console.style.top)/engine.console.scrollby].length > 0)
}
}
if(settings.TEXT_OUT_MODE == 1)
{
var lines = engine.console.scrollback
var lnnum = engine.console.scrollby;
var currln = lines[lnnum];
}
else
{
var lines = engine.console.innerText.split("\n");
var lnnum = (-(parseFloat(engine.console.style.top)/engine.console.scrollby));
var currln = lines[lnnum-1];
}
if(Math.round(engine.console.time/engine.console.scrolltime) < Math.round(performance.now()/engine.console.scrolltime) || (performance.now() > engine.console.time_manual+engine.console.scrolltime_manual && lines.length-lnnum > 10))
{
if(!currln && lnnum != lines.length)
{
if(lnnum < 0) var scrby = 1;
if(lnnum > lines.length) var scrby = -1;
engine.console.scroll(scrby);
console.log("scroll",scrby);
}
else
{
engine.console.time = performance.now();
if(typeof(currln) != "undefined" && currln.length > 0)
engine.console.scroll();
console.log("scroll");
}
}
}
function draw()
{
//time handlers and delta
var timenow = performance.now();
var delta = (timenow - engine.lastRenderTime);
var frametime = delta/1000;//time step
engine.lastRenderTime = timenow;
var fpsDelta = (timenow - engine.fpsTime);
settings.TARGET_FPS = (1000/delta)*2;
if(settings.TARGET_FPS < 10) settings.TARGET_FPS = 10;
if(settings.MAX_TARGET_FPS < settings.TARGET_FPS) settings.TARGET_FPS = settings.MAX_TARGET_FPS;
//if(fpsDelta > 999) //update fps gui once every second
if(fpsDelta >= 500) // experimental quicker FPS updating...
{
//var fpsValue = fpsDelta/delta;
/*var fpsValue = 1000/delta;*/
var fpsValue = engine.framesCount*(1000/fpsDelta);
//settings.TARGET_FPS = fpsValue*2;
engine.framesCount = 0;
engine.fpsTime = timenow;
/*document.getElementById("fps").innerHTML = "FPS: " + fpsValue;*/
updateHUD("current_framerate",fpsValue);
}
//updateHUD("current_framerate_now",1000/delta);
updateHUD("current_frametime",delta);
var timeElapsed = (timenow - engine.timeStart)-engine.totalPauseTime-4000;
if(engine.zones) for(var x=engine.zones.children.length-1;x>=0;--x)
{
//zones spin
switch(settings.ZONE_RENDER_TYPE)
{
case "cylinder":
engine.zones.children[x].rotation.y += ((engine.zones.children[x].cfg.rotationSpeed * pi(2)) * frametime);
break;
default:
engine.zones.children[x].rotation.z += ((engine.zones.children[x].cfg.rotationSpeed * pi(2)) * frametime);
break;
}
}
for(var x=engine.players.length-1;x>=0;x--) if(engine.players[x] !== undefined)
{ //cycle un-tilting
var cycle=engine.players[x];
var xdir=Math.cos(cycle.rotation.z),ydir=Math.sin(cycle.rotation.z);
var xd = Math.abs(xdir), yd = Math.abs(ydir);
var sens = 0;
if(cycle.sensor.left < 1) sens -= 0.02/cycle.sensor.left;
if(cycle.sensor.right < 1) sens += 0.02/cycle.sensor.right;
if(sens > 1) sens = 1;
if(sens < -1) sens = -1;
cycle.rotation.x -= xd*(((cycle.rotation.x)*frametime*4)+(sens*frametime*xdir));
cycle.rotation.y -= yd*(((cycle.rotation.y)*frametime*4)+(sens*frametime*ydir));
//sound
mixCycle(cycle);
}
if(settings.WALLS_STAY_UP_DELAY >= 0)
{
for(var x=engine.players.length;x>=0;x--) if(engine.players[x] !== undefined)
{
if(!engine.players[x].alive && timenow-engine.players[x].dedtime >= settings.WALLS_STAY_UP_DELAY*1000)
{
if(engine.players[x].walls.scale.z > 0)
{
engine.players[x].walls.scale.z -= frametime*2;
}
else
{
engine.scene.remove(engine.players[x].walls);
}
}
}
}
for(var x=engine.expl.length-1;x>=0;x--)
{
if(engine.expl[x].children[0].material.opacity <= 0)
{
engine.scene.remove(engine.expl[x]);
engine.expl.splice(x,1);
}
else for(var y=engine.expl[x].children.length-1;y>=0;y--)
{
engine.expl[x].children[y].scale.x = engine.expl[x].children[y].scale.y = engine.expl[x].children[y].scale.z += frametime*10;
//engine.expl[x].children[y].position.z += frametime;
if(engine.expl[x].children[y].scale.z > 10)
{
engine.expl[x].children[y].material.opacity -= frametime/25;
}
}
}
if(settings.FLOOR_MIRROR && typeof(engine.grid.reflection) != "undefined")
{
engine.grid.visible = false;
engine.grid.reflection.update(engine.renderer,engine.scene);
engine.grid.visible = true;
}
if(settings.RIM_WALL_COLOR_MODE == 3)
{
var color = engine.walls.children[0].material.color;
var p = settings.COLOR_MODE_3_COLORS.split(";");
var c = p[engine.currrim3clr].split(",");
//var c = {r:parse[0],g:parse[1],b:parse[2]};
var sum = color.r+color.g+color.b;
var keys = Object.keys(color);
for(var x=keys.length-1;x>=0;--x)
{
if(c[x] < color[keys[x]])
{
color[keys[x]] -= frametime*settings.COLOR_MODE_3_SPEED;
}
else if(c[x] > color[keys[x]])
{
color[keys[x]] += frametime*settings.COLOR_MODE_3_SPEED;
}
if(color[keys[x]] > 1)
color[keys[x]] = 1;
if(color[keys[x]] < 0)
color[keys[x]] = 0;
}
//console.log(color,c);
if(color.r == c[0] && color.g == c[1] && color.b == c[2])
{
engine.currrim3clr += 1;
if(engine.currrim3clr >= p.length)
engine.currrim3clr = 0;
}
for(var x=engine.walls.children.length-1;x>=0;--x)
{
engine.walls.children[x].material.color = color;
}
}
if(timenow > engine.cMFadeOutAfter)
{
var cm = document.getElementById("centerMessage")
cm.style.opacity -= frametime;
if(cm.style.opacity <= 0)
{
cm.style.opacity = 0;
cm.style.display = "none";
engine.cMFadeOutAfter = Infinity;
}
}
if(engine.hud.fadein && engine.hud.game.style.opacity < 1)
{
engine.hud.game.style.opacity = (engine.hud.game.style.opacity*1)+(frametime*0.25); //workaround for opacity being a string
if(engine.hud.game.style.opacity > 1) engine.hud.game.style.opacity = 1;
}
else if(!engine.hud.fadein && engine.hud.game.style.opacity > 0)
{
engine.hud.game.style.opacity -= frametime*0.25;
if(engine.hud.game.style.opacity < 0) engine.hud.game.style.opacity = 0;
}
//update HUD (needs to be done for cycle being viewed)
var cycle = engine.players[engine.viewTarget];
updateHUD("player_rubber",cycle.rubber,0,settings.CYCLE_RUBBER);
var maxspeed = maxSpeed();
updateHUD("player_speed",cycle.speed,0,maxspeed);
updateHUD("player_brake",cycle.brakes,0,1);
updateHUD("max_speed",maxspeed);
updateHUD("player_acceleration",cycle.accel);
updateHUD("dist_to_impact_front",cycle.sensor.front);
updateHUD("time_to_impact_front",cycle.sensor.front/cycle.speed);
updateHUD("dist_to_impact_left",cycle.sensor.left);
updateHUD("time_to_impact_left",cycle.sensor.left/cycle.speed);
updateHUD("dist_to_impact_right",cycle.sensor.right);
updateHUD("time_to_impact_right",cycle.sensor.right/cycle.speed);
updateHUD("current_name",cycle.name);
updateHUD("current_pos_x",cycle.position.x,engine.logicalBox.min.x*engine.REAL_ARENA_SIZE_FACTOR,engine.logicalBox.max.x*engine.REAL_ARENA_SIZE_FACTOR);
updateHUD("current_pos_y",cycle.position.y,engine.logicalBox.min.y*engine.REAL_ARENA_SIZE_FACTOR,engine.logicalBox.max.y*engine.REAL_ARENA_SIZE_FACTOR);
updateHUD("current_pos_x_adj",cycle.position.x/engine.REAL_ARENA_SIZE_FACTOR,engine.logicalBox.min.x,engine.logicalBox.max.x);
updateHUD("current_pos_y_adj",cycle.position.y/engine.REAL_ARENA_SIZE_FACTOR,engine.logicalBox.min.y,engine.logicalBox.max.y);
var dir = cdir(cycle.rotation.z);
updateHUD("current_angle_x",dir[0]);
updateHUD("current_angle_y",dir[1]);
updateHUD("current_time",Math.round(timeElapsed)/1000);
//settings test
var setnames = Object.keys(settings);
for(var i=setnames.length;i--;)
{
var setting = setnames[i];
updateHUD(setting.toLowerCase(),settings[setting]);
}
//actual drawing
/*if(engine.players[engine.viewTarget].alive)*/ cameraView(engine.players[engine.viewTarget],frametime*engine.timemult);
if(ctx) audioMixing();
//renderer switch for post processing
if (engine.usingPostProcessing) {
engine.composer.render();//new render? for post processing
}
else {
engine.renderer.render(engine.scene, engine.camera);
}
engine.framesCount++;
}
function updateHUD(celement,thevalue,min=false,max=false)
{
var elements = document.getElementsByName(celement);
for(var i=elements.length;i--;)
{
var value = thevalue;
var element = elements[i];
if(min && element.attributes.min) element.setAttribute("min",min);
if(max && element.attributes.max) element.setAttribute("max",max);
if(element.attributes.precision)
{
var prec = Math.pow(10,element.attributes.precision.value);
value = Math.round(value*prec)/prec;
if(isNaN(value)) value = 0;
}
if(element.attributes.toprecision)
{
var prec = 1*element.attributes.toprecision.value;
if(!element.attributes.dontlimit)
{
value = parseFloat(value).toPrecision(prec-1+((""+Math.round(thevalue)).length));
}
else
{
value = value.toPrecision(prec);
}
}
//if(element.attributes.precision) element.attributes.precision.value==0?value=Math.round(value):value.toPrecision(element.attributes.precision.value);
//if(value)
{
if(element.tagName == "PROGRESS")
{
element.setAttribute("value",value);
//console.log(value);
}
else if(element.className == "progress")
{
element.style.width = (Math.min(1,value/max)*100)+"%";
}
else if(!element.attributes.ignoretext)
{
element.innerHTML = ""+value;
}
if(element.attributes.bgcolorgrad)
{
var grad = element.attributes.bgcolorgrad.value;
var p = grad.split(";");
var c1 = p[0].split(",");
var c2 = p[1].split(",");
var color = {r:c1[0]*1,g:c1[1]*1,b:c1[2]*1},key=['r','g','b'];
var progval = (value/max)*15;
for(var x=0;x<3;x++)
{
if(c1[x] < c2[x])
{
color[key[x]] += progval;
}
else if(c1[x] > c2[x])
{
color[key[x]] -= progval;
}
}
element.style.backgroundColor = "rgb("+(color.r*255)+","+(color.g*255)+","+(color.b*255)+")";
}
}
}
}
function draw2d_canvas() //TODO: have an svg output option
{
var canvas = document.getElementById("canvas");
if(!canvas) return;
var ctx = canvas.getContext("2d");
ctx.clearRect(0,0,canvas.width,canvas.height);
var xsize = engine.logicalBox.max.x-engine.logicalBox.min.x, ysize = engine.logicalBox.max.y-engine.logicalBox.min.y;
canvas.width = canvas.offsetWidth;
- canvas.height = canvas.offsetWidth*(xsize/ysize);
+ canvas.height = canvas.offsetWidth*(ysize/xsize);
ctx.scale(
canvas.width/(xsize*engine.REAL_ARENA_SIZE_FACTOR),
canvas.height/(ysize*engine.REAL_ARENA_SIZE_FACTOR),
);
var ax = engine.logicalBox.min.x * engine.REAL_ARENA_SIZE_FACTOR,
ay = engine.logicalBox.min.y * engine.REAL_ARENA_SIZE_FACTOR;
ctx.lineWidth = ((xsize*engine.REAL_ARENA_SIZE_FACTOR)/canvas.width);
//ctx.lineWidth = canvas.width-canvas.height-2;
//ctx.lineWidth = (canvas.offsetWidth-canvas.width)*engine.REAL_ARENA_SIZE_FACTOR;
ctx.strokeStyle = "white";
for(var i=engine.map.walls.length-1;i>=0;i--)
{
ctx.beginPath();
var spl = engine.map.walls[i][engine.map.walls[i].length-1];
ctx.moveTo(1*spl[0],1*spl[1]);
for(var z=engine.map.walls[i].length-1;z>=0;z--)
{
var spl = engine.map.walls[i][z];
ctx.lineTo(1*spl[0]-ax,1*spl[1]-ay);
//console.log(spl[0],spl[1]);
}
ctx.stroke();
}
for(var x=engine.players.length-1;x>=0;x--) if(engine.players[x] !== undefined)
{
var color = engine.players[x].walls.children[0].children[0].material.color;
ctx.strokeStyle = "rgb("+(color.r*255)+","+(color.g*255)+","+(color.b*255)+")";
ctx.beginPath();
if(engine.players[x].walls.map.length > 0)
{
var walls = engine.players[x].walls.map;
ctx.moveTo(walls[walls.length-1][0]-ax,walls[walls.length-1][1]-ay);
for(var i=walls.length-1;i>=0;i--)
{
ctx.lineTo(walls[i][0]-ax,walls[i][1]-ay);
}
}
ctx.stroke();
if(engine.players[x].alive)
{
var color = new THREE.Color(engine.players[x].cycleColor);
ctx.fillStyle = "rgb("+(color.r*255)+","+(color.g*255)+","+(color.b*255)+")";
ctx.beginPath();
ctx.arc(engine.players[x].position.x-ax,engine.players[x].position.y-ay, ctx.lineWidth, 0,Math.PI*2);
ctx.fill();
}
}
var lw = ctx.lineWidth;
ctx.lineWidth = lw*settings.ZONE_ALPHA*settings.ZONE_ALPHA_SERVER;
for(var x=engine.zones.children.length-1;x>=0;--x)
{
var zone = engine.zones.children[x];
var color = zone.material.color;
ctx.strokeStyle = "rgb("+(color.r*255)+","+(color.g*255)+","+(color.b*255)+")";
var geo = zone.geometry.clone(); geo.applyMatrix(zone.matrix); //apply rotation, scale, and position
ctx.beginPath();
var pX = zone.position.x-ax, pY = zone.position.y-ay;
for(var i=geo.faces.length-2;i>=0;i-=2)
{
ctx.moveTo(geo.vertices[geo.faces[i].b].x-ax,geo.vertices[geo.faces[i].b].y-ay);
ctx.lineTo(geo.vertices[geo.faces[i].a].x-ax,geo.vertices[geo.faces[i].a].y-ay);
}
ctx.stroke();
}
lw *= 0.7;
for(var x=engine.expl.length-1;x>=0;x--)
{
ctx.lineWidth = lw*engine.expl[x].children[0].material.opacity;
if(ctx.lineWidth > 0)
{
var scale = (engine.expl[x].children[0].scale.x+engine.expl[x].children[0].scale.y)/2;
var cx = engine.expl[x].children[0].position.x, cy = engine.expl[x].children[0].position.y;
for(var y=engine.expl[x].children.length;y--;)
{
var color = engine.expl[x].children[y].material.color;
ctx.strokeStyle = "rgb("+(color.r*255)+","+(color.g*255)+","+(color.b*255)+")";
ctx.beginPath();
ctx.moveTo(cx-ax,cy-ay);
ctx.lineTo(
(cx+engine.expl[x].children[y].geometry.vertices[1].x*scale)-ax,
(cy+engine.expl[x].children[y].geometry.vertices[1].y*scale)-ay
);
ctx.stroke();
}
}
}
draw2dmap = true;
}
//camera view function (handles all views for view target)
var cameraView = function(cycle, timestep) {
var relativeCameraOffset, cameraOffset;
var cameraEase = engine.cameraEase;
if(engine.camera.userViewDir !== false) // HACK: camera rotation
{
var realRot = cycle.rotation.z;
cycle.rotation.z = Math.atan2(engine.camera.userViewDir[1],engine.camera.userViewDir[0]);
cycle.updateWorldMatrix();
cycle.rotation.z = realRot;
}
switch(engine.view)
{
case 'smart':
if(engine.camera.userViewDir === false)
{
//relativeCameraOffset = new THREE.Vector3(-5,0,5+cycle.speed);
relativeCameraOffset = new THREE.Vector3(-5,0,(5+cycle.speed*0.006));
cameraOffset = relativeCameraOffset.applyMatrix4(cycle.matrixWorld);
engine.camera.position.x += (cameraOffset.x - engine.camera.position.x) * (engine.cameraEase/3) * timestep*60;
engine.camera.position.y += (cameraOffset.y - engine.camera.position.y) * (engine.cameraEase/3) * timestep*60;
engine.camera.position.z += (cameraOffset.z - engine.camera.position.z) * (engine.cameraEase/5) * timestep*60;
engine.camera.lookAt(cycle.position);
break;
}
else
{
relativeCameraOffset = new THREE.Vector3((-10-(cycle.speed*0.006)),0,(5+cycle.speed*0.006));
cameraEase = 0.3;
// [[FALLTHROUGH]]
}
case 'chase':
if(!relativeCameraOffset) relativeCameraOffset = new THREE.Vector3((-10-(cycle.speed*0.006)),0,(15+cycle.speed*0.006));
cameraOffset = relativeCameraOffset.applyMatrix4(cycle.matrixWorld);
engine.camera.position.x += (cameraOffset.x - engine.camera.position.x) * cameraEase * timestep*60;
engine.camera.position.y += (cameraOffset.y - engine.camera.position.y) * cameraEase * timestep*60;
engine.camera.position.z += (cameraOffset.z - engine.camera.position.z) * cameraEase * timestep*60;
engine.camera.lookAt(cycle.position);
break;
case 'custom':
engine.camera.position.set(0,0,0);
engine.camera.rotation.z = settings.CAMERA_CUSTOM_PITCH;
break;
case 'stationary':
break;
case 'track':
engine.camera.lookAt(cycle.position);
break;
case 'topdown':
engine.camera.position.set(cycle.position.x, (cycle.position.y-0.01), (10+cycle.speed*timestep));
engine.camera.lookAt(cycle.position);
break;
case 'birdseye':
relativeCameraOffset = new THREE.Vector3(-0.1, 0, 10+(cycle.speed*timestep));
cameraOffset = relativeCameraOffset.applyMatrix4(cycle.matrixWorld);
engine.camera.position.x += (cameraOffset.x - engine.camera.position.x) * engine.cameraEase * timestep*60;
engine.camera.position.y += (cameraOffset.y - engine.camera.position.y) * engine.cameraEase * timestep*60;
engine.camera.position.z += (cameraOffset.z - engine.camera.position.z) * engine.cameraEase * timestep*60;
// engine.camera.position.set(cycle.position.x, cycle.position.y, (10+cycle.speed));
// engine.camera.rotation.z = cycle.rotation.z;
engine.camera.lookAt(cycle.position);
break;
case 'cockpit':
/**/// cockpit
//if(cycle.speed > 2)
{
relativeCameraOffset = new THREE.Vector3(-2+(2.5*cycle.speed),0,0.5);
}
/*else
{
relativeCameraOffset = new THREE.Vector3(0.01,0,0.5);
}*/
cameraOffset = relativeCameraOffset.applyMatrix4(cycle.matrixWorld);
engine.camera.position.set(cycle.position.x,cycle.position.y,cycle.position.z+0.5);
//engine.camera.rotation.set(cycle.rotation.x,cycle.rotation.y,0);
// engine.camera.position.x += (cameraOffset.x - engine.camera.position.x) * 0.5;
// engine.camera.position.y += (cameraOffset.y - engine.camera.position.y) * 0.5;
// engine.camera.position.z = 2;
engine.camera.lookAt(cameraOffset);
//engine.camera.rotation.z = cycle.rotation.x+cycle.rotation.y;
// cycle.audio.gain.setTargetAtTime(0.2, ctx.currentTime, 0.02);
//cycle.textLabel.style.visibility = 'hidden';
//cycle.model.visible = false;
/*/
if (cycle.walls.children[cycle.walls.children.length-2]) {
cycle.walls.children[cycle.walls.children.length-1].visible = false;
cycle.walls.children[cycle.walls.children.length-2].visible = true;
}
/**/
break;
}
};
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Wed, Aug 6, 8:17 PM (5 d, 56 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
11220
Attached To
rTDCWEB 3DCycles Web
Event Timeline
Log In to Comment