[API Review] RT-28129: event coordinates with perspective camera

Chien Yang chien.yang at oracle.com
Fri Feb 1 11:33:06 PST 2013

Good point. This is worth a consideration. I'm fineto change if it 
doesn't go well with the JavaFX API as a whole. However I've a 
preference towards texCoord as it is used in all major graphics APIs 
that I'm aware of including D3D. Nothing to do with its length, really.  ;-)

- Chien

On 2/1/2013 11:16 AM, Richard Bair wrote:
> Do we want to continue that tradition? There is a long history of 
> crappy names in C APIs, not all of which we brought with us to Java :-)
> Richard
> On Feb 1, 2013, at 11:12 AM, Chien Yang <chien.yang at oracle.com 
> <mailto:chien.yang at oracle.com>> wrote:
>> Yes we do, texCoord (texture coordinate) is a commonly used term in 
>> the computer graphics world, for example, OpenGL has methods such as 
>> glTexCoord4f(x, y, z, w ),  and glTexCoordPointer(4,GL_FLOAT,0,0).
>> - Chien
>> On 2/1/2013 11:01 AM, Richard Bair wrote:
>>> Only thing that got my attention was: getIntersectedTexCoord
>>> Is the rest of the 3D API using shortened names like "tex" and 
>>> "coord" as well?
>>> Richard
>>> On Feb 1, 2013, at 10:57 AM, Chien Yang <chien.yang at oracle.com 
>>> <mailto:chien.yang at oracle.com>> wrote:
>>>> Looks good to me. This proposed change will also provide a 
>>>> consistent picking framework for 2D and 3D primitives.
>>>> Thanks,
>>>> - Chien
>>>> On 2/1/2013 8:51 AM, Pavel Safrata wrote:
>>>>> Hello,
>>>>> this is related to the 3D support planned for FX8, yet it is a 
>>>>> bugfix of an existing issue.
>>>>> With perspective camera, events delivered to any node that's not 
>>>>> lying flat on the XY plane contain wrong local coordinates - they 
>>>>> ignore the projection transformations. It's enough to rotate a 
>>>>> rectangle along X axis and the coordinates become useless.
>>>>> http://javafx-jira.kenai.com/browse/RT-28129
>>>>> Solution to this problem requires API changes, because we need to 
>>>>> compute in 3D to get proper numbers. So I propose to add a "double 
>>>>> getZ()" method to all picking-based events, with the following 
>>>>> semantics: the event's getSceneX(), getSceneY() values still 
>>>>> represent the 2D coordinates of the mouse in the window content 
>>>>> pixels (screen coordinates minus window position and decorations); 
>>>>> the getX(), getY(), getZ() represent the hit point in the local 3D 
>>>>> space (which may now be different even for scene because of the 
>>>>> perspective transform). If no node is picked, the hit point with 
>>>>> the scene will be found on the projection plane. Note that nothing 
>>>>> changes for the 2D case, for the 3D case we now have correct 3D 
>>>>> coordinates instead of a complete nonsense.
>>>>> There is one more issue - how to pass the correct coordinates to 
>>>>> the event constructors. Instead of creating more construrctors 
>>>>> with the three additional coordinates, I propose to use a concept 
>>>>> called PickResult which was briefly discussed earlier and will 
>>>>> soon be part of a 3D API review. In short, it is an object that 
>>>>> contains information about the pick for the event - the picked 
>>>>> node, local coordinates of the hit and some 3D-specific stuff. For 
>>>>> proper 3D support, it will anyway be necessary to pass the 
>>>>> PickResult to the events and allow access to it; once this is 
>>>>> done, the event can compute the coordinates from it. So I propose 
>>>>> adding PickResult to the event constructors. Note that they've not 
>>>>> been released yet, so we can modify them instead of adding new 
>>>>> ones. Also note that for convenience of 2D use-cases, the 
>>>>> constructors will accept a null PickResult and in this case 
>>>>> compute PickResult values based on the passed event target and 
>>>>> scene coordinates (which is sufficient for 2D case).
>>>>> Side note for those who remember the previous 3D API discussion: 
>>>>> the PickResult is no longer restricted to 3d shapes, it is present 
>>>>> always, with the 3D-specific fields having null values where not 
>>>>> applicable.
>>>>> Summary of this proposal:
>>>>> Affected classes: MouseEvent, MouseDragEvent, DragEvent, 
>>>>> GestureEvent, ContextMenuEvent and TouchPoint
>>>>> new methods: getZ(), getPickResult() (and extended semantics of 
>>>>> event local coordinates for 3D case)
>>>>> modified methods: added PickResult to all constructors
>>>>> Concrete description of the PickResult and the proposed picking 
>>>>> API can be found here:
>>>>> https://wikis.oracle.com/display/OpenJDK/Picking3dAPI
>>>>> Thanks,
>>>>> Pavel

More information about the openjfx-dev mailing list