Murga-Projects Forums

Full Version: drawing graphics in murgaLua
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
After reading information on drawing functions, I tried this

Code:
ww=180 --window width
wh=200 --window height

w=fltk:Fl_Window(ww,wh,"murgaLua Drawing Demo")
w:color(55)

-- fltk void fl_color(Fl_Color)
--- Set the color for all subsequent drawing operations.
fltk.fl_color(96)

-- fltk  void fl_rectf(int x, int y, int w, int h)
--- Color a rectangle that exactly fills the given bounding box.
fltk.fl_rect(20,20,50,50)

w:show()
Fl:run()


This doesn't do anything. Not implemented yet? I had come across a list of stuff not implemented yet but cannot find it again.

I tried the same thing several months ago, and it didn't do anything =o)
You're probably right about it not being implemented.

There is a list in the murgaLua distribution archive, doc/other
fl_draw_pixmap
fl_draw_image_mono
fl_draw_image
fl_draw
are listed as unimplemented.
fl_rectf is not listed, but i think it relies on fl_draw?
Hi,

Those functions are now supported (I have to update the list), however if you look at the FLTK reference they have to be within a widget (I have to find a workaround, or maybe we can use callbacks) ... Either way here I have a test that produces some amusing results under Win32 :

Code:
w=fltk:Fl_Window(0,0, 200, 200, "draw demo")

w:color(55)

fltk.fl_color(96)

b=fltk:Fl_Box(30,30, 100, 100, "Test box")

w:make_current()
w:show()

fltk.fl_rectf(20,20,50,50)
fltk.fl_draw("this is a test",20,18)

fltk.fl_rectf(20,300,50,50)
fltk.fl_draw("this is a test",20,300)

Fl:run()

OK, it kinda works now ...

I decided to have a quick go before I got my things ready for this weekend.

Try running this and pressing the ESC key :

Code:
function draw_callback(eventValue)

  fltk.fl_color(96)

  w:make_current()

  fltk.fl_rectf(20,20,50,50)
  fltk.fl_draw("this is a test",20,18)

end

w=fltk:Fl_Window(0,0, 200, 200, "draw demo")

w:callback(draw_callback)

w:color(55)

w:show()

while 1 do

    Fl:check()

end


Now the thing is that we should be hooking this into the idle callback or a timeout for animations, but you'll have to wait for version 0.5 for this kinda stuff :-) ...

Cheers
JohnM

That's pretty cool!
I'm not sure what the while loop does, though. I had to force the app to close, and received this message (not an error, but a message):

Quote:
/usr/bin/murgaLua: ./draw.lua:26: interrupted!
stack traceback:
[C]: in function 'check'
./draw.lua:26: in main chunk
[C]: ?

After replacing the loop with Fl:run() it still required a force close (due to the w:callback I assume), but no message.
I'm not sure if the force close is a problem. My window manager doesn't supply the typical titlebar buttons, but uses a key combo instead to close apps. I assume the key combo passes the same signal as a button, though, but it didn't close the app.

Anyway, I was messing around with it for a few minutes trying to see if I could animate it at all. I was able to repeat the draw_callback function with a repeat button just for testing purposes, and set the rectf position a little to the right each time. The drawback is that I didn't spend enough time with it to explore whether or not the previous rectf could be removed. The result was something that resembled a progress bar.

This is going to be a very fun thing to experiment with.

mikshaw Wrote:
That's pretty cool!

OK, what I have now is cooler :-) :-)

mikshaw Wrote:
/usr/bin/murgaLua: ./draw.lua:26: interrupted!
stack traceback:
[C]: in function 'check'
./draw.lua:26: in main chunk
[C]: ?

That is normal as you where interrupting a busy loop ... What I did before was a REAL quick hack.

Here is another hack, but this is pretty cool as drawing now works propperly !!!

Code:
function draw_callback(eventValue)

  if (Fl:event() == 0)
  then
      -- 0 means no even I think, so we know we are requesting a draw.
      fltk.fl_color(96)

      w:make_current()

      fltk.fl_rectf(20,20,50,50)
      fltk.fl_draw("this is a test",20,18)
  else
      os.exit(0)
  end

end

w=fltk:Fl_Window(0,0, 200, 200, "draw demo")

w:callback(draw_callback)

w:color(55)

w:show()

Fl:wait(1)
w:do_callback()

Fl:run()

And now for an animated demo ... Looks a lot nicer on murgaLua 0.5 but you'll have to wait ;-)

Code:
function draw_callback(eventValue)

  -- Need to look into what event 11 is ...

  if (Fl:event() == 0 or Fl:event() == 11)
  then
      -- 0 means no even I think, so we know we are requesting a draw.
      fltk.fl_color(96+counter)

      w:make_current()

      fltk.fl_rectf(20+counter,20,50,50)
      fltk.fl_draw("this is a test",20,80+counter)
      fltk.fl_loop( 20,20,80+counter,80+counter, 200,0)
      counter=counter+4
      if counter > 120 then counter=2 end
  else
      print(Fl:event())
      os.exit(0)
  end

end

counter = 0

w=fltk:Fl_Window(0,0, 210, 220, "draw demo")

w:callback(draw_callback)

w:color(55)

w:show()

while 1 do
    Fl:check()
    w:do_callback()
    -- murgaLua.sleep(25) -- Milliseconds, looks really cool (murgaLua 0.5).

    -- This sleeps reliably for one second
    socket.sleep(1)
end

Fl:run()

Hmmm.....

The first one exits immediately. If I remove the "else os.exit(0)" then it shows a blank window which doesn't appear to accept any events.

The second one results in a segmentation fault.

murgaLua 0.4.1 on Slackware Linux
The segfault was related to event 0, apparently.
I changed it to fltk.FL_MOUSEWHEEL and it seems to work.
That's really impressive.

Code:
--- concentric circles at mouse coordinates demo
--- mouse delta distance modifies circle height and width
windowHeight = 280
windowWidth = 320
centerx,centery=windowHeight/2,windowWidth/2
oldpointx,oldpointy=centerx,centery
counter = 96
lineStep=.1 -- increase for geometry
radiusStep=-.4 -- changes concentric density

function circles(cWidth,cHeight)
pi=3.14159
for ring=30,2,radiusStep do
radius=ring
C=2*pi

for cPoint=0,C,lineStep do
x=radius*math.cos(cPoint)*(cWidth/30)
y=radius*math.sin(cPoint)*(cHeight/30)
pointx=math.floor(Fl:event_x()+x)
pointy=math.floor(Fl:event_y()+y)
fltk.fl_loop(pointx,pointy,oldpointx,oldpointy,pointx,pointy)
oldpointx,oldpointy=pointx,pointy
end
end
end

function draw_callback(eventValue)
      fltk.fl_color(96+counter)
      w:make_current() -- whats this?
      flmousex=math.abs(oldpointx-Fl:event_x())
  flmousey=math.abs(oldpointy-Fl:event_y())
      circles(flmousex,flmousey)
         counter=counter+2
     if counter > 128 then counter=2 end
end

w=fltk:Fl_Window(0,0, windowWidth, windowHeight, "circles demo")
w:callback(draw_callback)
w:color(55)
w:labelsize(9)
w:show()

while (Fl:event_key() ~= fltk.FL_Escape)  do
    Fl:check()
     w:do_callback()
murgaLua.sleep(35)
end

Pages: 1 2
Reference URL's