forums.silverfrost.com Forum Index forums.silverfrost.com
Welcome to the Silverfrost forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

How to get cursor position in openGL screen ?
Goto page 1, 2  Next
 
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> ClearWin+
View previous topic :: View next topic  
Author Message
DanRRight



Joined: 10 Mar 2008
Posts: 2813
Location: South Pole, Antarctica

PostPosted: Wed Jul 23, 2008 10:21 am    Post subject: How to get cursor position in openGL screen ? Reply with quote

It is easy to get x,y in regular graphics window, but how to do similar thing in openGL?
Back to top
View user's profile Send private message
IanLambley



Joined: 17 Dec 2006
Posts: 490
Location: Sunderland

PostPosted: Wed Jul 23, 2008 12:40 pm    Post subject: Reply with quote

I've used something like this

In definitions:
Code:

common/mouse_stuff/mouse_button_state,mx,my,mxp,myp
integer :: passivemotion, mouse_press
external :: passivemotion, mouse_press
mouse_button_state = 0


After setting up window + %lw

Code:

call glutMouseFunc(mouse_press)
call glutMotionFunc(motion)
call glutPassiveMotionFunc(passivemotion)


Typical routines:

Code:

integer function motion(x, y)
include <opengl.ins>
integer :: x, y
common/mouse_stuff/mouse_button_state,mx,my,mxp,myp
mx = x
my = y
if(mouse_button_state .eq. 2)then
.
.
.
endif
motion = 2
end function motion




integer function passivemotion(x, y)
include <opengl.ins>
integer :: x, y
common/mouse_stuff/mouse_button_state,mx,my,mxp,myp
mxp = x
myp = y
passivemotion = 2
end function passivemotion


integer function mouse_press()
include <opengl.ins>
include <clearwin.ins>
character*32 reason
common/mouse_stuff/mouse_button_state,mx,my,mxp,myp
reason=clearwin_string@('CALL_BACK_REASON')
select case(reason)
  case('MOUSE_LEFT_CLICK')
  mouse_button_state = 1
  case('MOUSE_MIDDLE_CLICK')
  mouse_button_state = 3
  case('MOUSE_RIGHT_CLICK')
  mouse_button_state = 2
  case default
  mouse_button_state = 0
end select
mouse_press = 2
end function mouse_press



I have a series of "nvert" 3D vertices splattered around the window, previously stored in array "xyz", and by the following routines they can be located say while moving the mouse around the screen and calling within function "passivemotion":

as:
Code:
 
call get_graphic_matrices
inode = ifind_node(mxp,myp)



Code:
 
      integer*4 function ifind_node(ix,iy)
      implicit real*8 (a-h,o-z)
      include <clearwin.ins>, nolist
      include <opengl.ins>, nolist
      common/vertices/nvert,xyz(3,5000)
      dimension screen(3)
      common/matrices/iviewport(4),amvmatrix(4,4),projmatrix(4,4)
      realx = ix
      realy = iviewport(4)-iy-1
c
c set proximity to detect node
      distance = iviewport(3)*0.015d0
c
c scan each stored vertex for a match
        test = sqrt((screen(1) - realx)**2 + (screen(2) - realy)**2)
        if(test .lt. distance)then
          ifind_node = i
          distance = test
        endif
      enddo
      end


      subroutine get_graphic_matrices()
      implicit real*8 (a-h,o-z)
      include <clearwin.ins>, nolist
      include <opengl.ins>, nolist
      common/matrices/iviewport(4),amvmatrix(4,4),projmatrix(4,4)
      call glGetIntegerv(GL_VIEWPORT,iviewport)
      call glGetDoublev(GL_MODELVIEW_MATRIX,amvmatrix)
      call glGetDoublev(GL_PROJECTION_MATRIX,projmatrix)
      end


Although these are cut down code fragments, and not tested at this level, I hope they help.

Ian
Back to top
View user's profile Send private message Send e-mail
JohnHorspool



Joined: 26 Sep 2005
Posts: 270
Location: Gloucestershire UK

PostPosted: Wed Jul 23, 2008 1:32 pm    Post subject: Reply with quote

I use:-

CALL GET_OPENGL_MOUSE_STATE@(mx,my,mflag)

where mx and my is cursor position (obviously!)

and:-

mflag=1 for left mouse button pressed
mflag=2 for right mouse button
mflag=3 for middle mouse button
mflag=16 for both left and right buttons pressed
Back to top
View user's profile Send private message Visit poster's website
IanLambley



Joined: 17 Dec 2006
Posts: 490
Location: Sunderland

PostPosted: Wed Jul 23, 2008 6:20 pm    Post subject: Reply with quote

John,

Where is that documented? It does not show up in the FTN95 help or have you been rumaging through the opengl.ins & clearwin.ins files?

Thanks, that will make things easier, but the code I posted, helps to find positions in real space, from the integer values returned from the mouse location. It will obviously replace the code in mouse_press and can be used elsewhere.

Are there any more useful OpenGL items that are undocumented? Or for that matter, for other things.

Regards

Ian
Back to top
View user's profile Send private message Send e-mail
DanRRight



Joined: 10 Mar 2008
Posts: 2813
Location: South Pole, Antarctica

PostPosted: Wed Jul 23, 2008 9:04 pm    Post subject: Reply with quote

Thanx Ian and John!
Back to top
View user's profile Send private message
JohnHorspool



Joined: 26 Sep 2005
Posts: 270
Location: Gloucestershire UK

PostPosted: Thu Jul 24, 2008 8:05 am    Post subject: Reply with quote

Ian,

Its some years since I first used that routine, so I can't remember how I stumbled across it, I guess I must have scanned the clearwin.ins file for anything OpenGL related at the time.

Having first started writing graphics routines in fortran for tektronix machines which were subsequently migrated to HPUX starbase, then to PC's using FTN77 with graphics in a DOS environment, followed by MS windows GDI graphics (using %gr), I finally arrived at OpenGL. I now maintain dual graphics drivers in my software using %gr and %og from clearwin. For that reason I don't use the glut libraries in OpenGL or any third party graphics libraries at all. Therefore I had to replicate in OpenGL the same cursor enquiry techniques I had always used, dating back to the tektronix, as I wasn't going to throw away the best part of 30 years worth of code!

When it came to implementing OpenGL, I quickly found out that there were some hurdles to jump through:-

1). cursor interrogation of the image.
2). writing text to the graphics screen (as OpenGL can't do this!)
3). copying the image to clipboard or bmp/jpg files

And finally I never figured out how to get the specific OpenGL printer statements to work correctly, so I managed to implement DIB_PRINT instead!

The resolution to 1). is as above, 3). I covered in another thread about a month ago, and 2). was resolved by converting a C++ routine (of which I have a near zero understanding!) and modifying the windf95.ins file (which I first reported as being incorrect some years ago - and is still not fixed!), so putting text into OpenGL graphics is a quite involved procedure (well at least for me it was - but I daresay some other whizz will wonder why I struggled).

OpenGL can be problematic on some machines, especially laptops, which is usually resolved by turning graphics acceleration off (anyone know how to do this automatically via fortran?), which is why I still maintain the very stable GDI graphics drivers as well.

But I now see that MS (typically!) are pushing their own DirectX/DirectDraw stuff to the fore with vista and relegating OpenGL to a secondary emulation level ! (MS policy to kill off anything not MS?)

Anyway I hope that helps!
Back to top
View user's profile Send private message Visit poster's website
IanLambley



Joined: 17 Dec 2006
Posts: 490
Location: Sunderland

PostPosted: Thu Jul 24, 2008 12:11 pm    Post subject: Reply with quote

John,

Thanks very much for the info, and it seems that we must all go through the difficulties of OpenGL and interrogating locations on the screen. Writing text has also confused me, because due to the helpful nature of the beautiful "3D hidden line/surface/etc" removal of OpenGL, putting a text overlay never seems to be described in terms simple enough for my brain to comprehend. As such, I really haven't got to grips with OpenGL. More examples are needed!

Is FTN95 going to have support for DirectX/DirectDraw, I wonder?

It is nice to see that you have been though the development route which started with Tektronix. Does 4006, 4014, 4662 & 4663 ring a bell? I've got the latter two items lying around my house if you know of anybody who might like them.

Regards

Ian
Back to top
View user's profile Send private message Send e-mail
DanRRight



Joined: 10 Mar 2008
Posts: 2813
Location: South Pole, Antarctica

PostPosted: Thu Jul 24, 2008 12:12 pm    Post subject: Reply with quote

John, what do you mean by

2). writing text to the graphics screen (as OpenGL can't do this!)

"Animate.for" example writes the text on og screen.

I also have one problem. I can not make specular reflection from the surface a la reflection from the water. I can send couple simple OpenGL examples for anyone to try. Will very appreciate.
Back to top
View user's profile Send private message
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2388
Location: Yateley, Hants, UK

PostPosted: Thu Jul 24, 2008 5:08 pm    Post subject: Reply with quote

Dan,

Are you using OpenGL to do the reflection business or are you programming it yourself? If the latter, can I recommend Angell & Griffith "High resolution computer graphics using Fortran 77" (Macmillan, 1987) ISBN 0-333-40398-3 or 0-333-430399-1 (paperback) - Chapter 15. Not light reading, but good for reflection (pun intended)!

Eddie
Back to top
View user's profile Send private message
JohnHorspool



Joined: 26 Sep 2005
Posts: 270
Location: Gloucestershire UK

PostPosted: Thu Jul 24, 2008 5:22 pm    Post subject: Reply with quote

Ian,

My tektronix experience started with the monochrome storage scope displays of the 4010 and 4014 and finished with the 4111 colour displays. I do miss the ability to write a complete fully interactive graphical application using 100% standard fortran that was possible with the tektronix. I don't miss the time it took to render a colour filled stress contour plot! (plot times of 30 minutes were not uncommon - compare that to the fraction of a second to rotate an OpenGL image!) If still you have source code from this era then it is possible after installing linux (ubuntu can now be installed very easily under MS windows), to compile with g95 and display it in a tektronix simulation window (using "xterm -t").

As for OpenGL examples, there are enough provided with FTN95 to get you going, then there are masses to be found on the web, the fortran examples you find are never for FTN95, but all the OpenGL calls (which is what you are after) are the same in any dialect of fortran (and very little different in C++). So just keep pluging away, it's well worth it in the end!
BTW OpenGL can be very unforgiving when you get it wrong (re-boots were common with me when first starting) and the debugger only debugs fortran not OpenGL calls.


DanRRight,

Yes you're correct, this example does show text in OpenGL Exclamation
But it is not how I do it! With the routines I use, I can select font type and all the normal attributes (bold, italic and so on...), not sure how this could be done in this example. As Ian hinted, text can either be made to move with geometry or placed statically, unobscured somewhere on the image whilst geometry can be rotated, zoomed and panned behind the static text.
Back to top
View user's profile Send private message Visit poster's website
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2388
Location: Yateley, Hants, UK

PostPosted: Thu Jul 24, 2008 6:11 pm    Post subject: Reply with quote

Can't you just plug the old Tektronix terminal in a serial port and write to it from FTN95?

What is wrong with windf95.ins ?

Eddie
Back to top
View user's profile Send private message
JohnHorspool



Joined: 26 Sep 2005
Posts: 270
Location: Gloucestershire UK

PostPosted: Thu Jul 24, 2008 9:31 pm    Post subject: Reply with quote

Hi Eddie,

I didn't seriously expect anyone to be still using tektronix hardware!! My point was that it is still possible to compile and run tektronix dependent fortran source code (but only for 4010/4014 not any later models) without any great difficulty (infact very easily using ubuntu).

What is wrong with windf95.ins ?

Well, using an undoctored version you get so many errors like the following that the compiler aborts with a too many errors message:-

1/1102) C_EXTERNAL GETDRIVERINFO 'GetDriverInfo' (VAL,WINREF):LOGICAL*2
*** Bad argument descriptor in C_EXTERNAL (In include file C:\Program Files
(x86)\Silverfrost\FTN95\include\WINDF95.INS)
*** Return type is expected.
Found (VAL,WINREF):LOGICAL*2
1/1111) C_EXTERNAL OPENDRIVER 'OpenDriver' (WINSTRING,WINSTRING &
1/1112) &,VAL):INTEGER*2
*** Bad argument descriptor in C_EXTERNAL (In include file C:\Program Files
(x86)\Silverfrost\FTN95\include\WINDF95.INS)
*** Return type is expected.


How do I fix it?

Answer by editing the file and making the following changes for every occurence of the variable name on the left, replace it with that on the right.

WINREF -> REF
WINSTRING -> INSTRING
WOUTSTRING -> OUTSTRING
WSTRING -> STRING

As I said, I informed Salford Software at the time, to which I got the rather amusing replying "it seems that not too many people are using this file"

cheers
John
Back to top
View user's profile Send private message Visit poster's website
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2388
Location: Yateley, Hants, UK

PostPosted: Thu Jul 24, 2008 10:30 pm    Post subject: Reply with quote

Hi John,

That's useful to know - but what does windf95.ins do? I haven't moved on from INCLUDE <WINDOWS.INS>.

I used ESC-code driven graphics hardware on the COM port of my 8086 Apricot PC, and found that it was about equal to being one of several users on a VAX. The great thing about external graphics hardware is that it can be programmed in anybody's Fortran - but you need to reinvent the GUI for yourself.

Eddie
Back to top
View user's profile Send private message
JohnHorspool



Joined: 26 Sep 2005
Posts: 270
Location: Gloucestershire UK

PostPosted: Thu Jul 24, 2008 11:05 pm    Post subject: Reply with quote

Hi Eddie,

I use windf95.ins to provide definitions used by STDCALL CREATEFONTA which I use to create a text font for use in OpenGL graphics.

So it looks I've been a unique user of this include file! Rolling Eyes

cheers
John
Back to top
View user's profile Send private message Visit poster's website
DanRRight



Joined: 10 Mar 2008
Posts: 2813
Location: South Pole, Antarctica

PostPosted: Fri Jul 25, 2008 12:36 am    Post subject: Reply with quote

Eddie,

Where I will find that old book? And not being specifically easy reading makes me grieving because most probably it will stop me on the first not working example. This is exactly what happening with 99 or of 100 people who looked at OpenGL. My usual point here is : who now RTFM ? Very Happy I saw a lot of courses on OpenGL on the net but even Digital/Compaq Fortran examples do not work without serious sometimes intimate editing unfortunately... Adding refection like most of things in programming is 3 min work for those who did that and know that or if we have an example.

This is why I encourage everyone to send your small nice loooking code snippets to delelopers, so they will include them for everyones benefits. I believe if FTN77 and then FTN95, Clearwin+ and OpenGL and recently .NET had 100 (will repeat, A HUNDRED) times more very nice looking and useful in science, technology and education examples of all sort, it would make Salford #1 or #2 Fortran compiler 10 years ago.

Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> ClearWin+ All times are GMT + 1 Hour
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group