OpenCores
URL https://opencores.org/ocsvn/pdp1/pdp1/trunk

Subversion Repositories pdp1

[/] [pdp1/] [trunk/] [sw/] [xyplot-nogl.js] - Rev 12

Compare with Previous | Blame | View Log

/*
  Canvas 2D version of an XY oscilloscope (real time scatterplot). 
  Goal performance: 5µs point processing time at 60Hz. 
  That's about 3.3k points per frame. 
 
  Next steps: Measure performance drawing 3400 random points.
  Make it read from a pipe of some sort (websocket?). 
  Make a translator that we can pipe into. 
  Why am I not doing this sort of thing in puredata?
 
 
*/
 
var width=1024, height=1024;
var imageData, ctx, frame=0;
 
function renderonce(event) {
    requestAnimationFrame( render );
}
var lastCalledTime, fps;
function renderloop(now) {
    if (render(now))  // Let render() decide if we finished.
	requestAnimationFrame( renderloop );
}
 
function render(now) {
    //    var now = Date.now()
    var delta;
    if(!lastCalledTime) {
	lastCalledTime = now;
	fps = 0;
	delta = 1e6;
    } else {
	delta = (now - lastCalledTime)/1000;
	lastCalledTime = now;
	fps = /*frame*/1/delta;
    }
 
    // Decay hack
    // This isn't nearly as good as an age based exponential falloff.
    // It produces the faint trace effect of digital emulated
    // phosphorous. Still, might be good enough for the moment.
    var alpha = 1-Math.exp(-5*delta);
    ctx.fillStyle = 'rgba(0,0,0,'+alpha+')';
    ctx.fillRect(0,0,width,height);
 
    // Plot colour
    ctx.fillStyle = 'rgba(255,255,255,1)';
    for (var i=0; i<5400; i++) {
	var x = Math.floor(Math.random()*width);
	var y = Math.floor(Math.random()*height);
	ctx.fillRect(x,y,1,1);
	/*
	var s = Math.floor(Math.sin(x/100)*height/2+height/2);
	var miny = Math.max(s-5,0), maxy=Math.min(s+5,height);
	for (var y=miny; y<maxy; y++) {
	    var pi = (y*width+x)*4;
	    imageData.data.fill(255, pi+0, pi+3);
	    //imageData.data[pi+3] = 0;
	}
	*/
    }
    //    ctx.putImageData(imageData, 0, 0);
 
    if (++frame==width) {
	frame=0;
	ctx.font = "48px serif";
	ctx.fillText(fps, width/3, height/3);
	return false;
    }
    return true;
}
 
function startrenderloop(event) {
    requestAnimationFrame( renderloop );
}
 
function start(canvasid) {
    canvas = document.getElementById(canvasid);
    if (!canvas.getContext) {
	alert("Canvas doesn't support contexts?");
	return;
    }
    canvas.onclick = startrenderloop;
    ctx = canvas.getContext("2d");
    /*
    imageData = ctx.createImageData(width,height);
 
    // TODO: Generate new points per frame
 
    imageData.data.fill(0);
    for (var pi = 3; pi < width*height*4; pi+=4)
	imageData.data[pi]=255;  // opaque
    ctx.putImageData(imageData, 0, 0);
    */
 
//    renderloop();
}
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.