W3C home > Mailing lists > Public > whatwg@whatwg.org > April 2009

[whatwg] '' <canvas> element "selection buffer"

From: Ian Hickson <ian@hixie.ch>
Date: Thu, 30 Apr 2009 21:19:15 +0000 (UTC)
Message-ID: <Pine.LNX.4.62.0904302115500.18851@hixie.dreamhostps.com>
On Sat, 7 Jun 2008, Ond?ej ?i?ka wrote:
> 
> I've been looking for something similar to OpenGL's selection buffer - 
> that is, you can get some object ID for the given coordinates.
> 
> E.g., Jacob Seidelin's chess game 
> http://blog.nihilogic.dk/search/label/chess could use it, but instead, 
> keyboard control had to be used.
> 
> isPointInPath() does not solve the problem effectively if the path would 
> be too complex - e.g. pixel-based sprites in several layers.
> 
> For an example of what I want to implement, see e.g. 
> http://www.openttd.org/screens.php?image=images/screens/0.5.0/japan_national_railway_3_aug_1984 
> . Mathematical computation of the object is principially impossible (or 
> too complex in best case).
> 
> So, my suggestion is to add functionality similar to OpenGL's selection 
> buffer: The canvas element would keep a 2D array with an integer ID for 
> each pixel. When turned on, these values would be set by every operation 
> that changes the pixel, seting it to the current context's value. 
> Pseudo-code example:
> 
> ------------
> function DrawCell( iCellId ){
> 
>   canvas.selectionBuffer.trackChanges( ON );
>   canvas.selectionBuffer.setFillValue( iCellId );
> 
>   canvas.drawRasterImage( ..., cellImage );
> 
>   canvas.selectionBuffer.trackChanges( OFF );
> 
> }
> ------------
> 
> Then, upon user's mouse click on the canvas, you could determine which 
> object was clicked:
> 
> ------------
> canvas.onclick = function( e ){
>   id = canvas.selectionBuffer.getIdAt( e.x, e.y );
>   // eventually:
>   id = e.selectionBufferID;
> }
> ------------
> 
> Such feature would allow interactive application with isometric or 3D 
> graphic. Is something like this planned or already suggested? I haven't 
> found.

On Fri, 18 Jul 2008, Mathieu HENRI wrote:
> 
> My solution to this type of problem is to render the scene on a 
> (ObjectID) back buffer using a single color per object ( which serves as 
> ID ), and retrieve the color where the user clicked.
> 
> Simple, relatively fast and it works for any type of graphics.
> 
> It's more or less a work around but it has worked for years, on various 
> platforms, and is usually very fast. Plus approximate versions of the 
> objects can be used in the OID buffer to gain in speed and help the user 
> (e.g. simplify and inflate the objects to make them easier to point at)

Based on Mathieu's coments, I haven't added anything to the API to do 
this. It may make sense to revisit this in a future version, though.

-- 
Ian Hickson               U+1047E                )\._.,--....,'``.    fL
http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'
Received on Thursday, 30 April 2009 14:19:15 UTC

This archive was generated by hypermail 2.4.0 : Wednesday, 22 January 2020 16:59:11 UTC