Forum: Ruby How can I evaluate and visualize code instead of running it.

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
E29eaefee1709918198c8a4f55c42667?d=identicon&s=25 anne001 (Guest)
on 2006-02-21 12:49
(Received via mailing list)
I am using a tree and traversing down a tree to generate opengl code
How could I easily list the opengl code that I am generating, instead
of running it?

  def applytransform
    GL.PushMatrix();
    GL.Translate(*@Translation);
    GL.Translate(*@jointP);
    if @parent != nil
      GL.Translate(*@parentjointP);
    end
    GL.Rotate(*@rotation);
    GL.Translate(*@jointP.minus);
  end

  def traversetree
    GL.Clear(GL::COLOR_BUFFER_BIT);
    GL.PushMatrix();
    applytransform
    @children.each {|childnode| childnode.traversetree}
    drawprimitive
    GL.PopMatrix();
    GLUT.SwapBuffers();
  end
5befe95e6648daec3dd5728cd36602d0?d=identicon&s=25 Robert Klemme (Guest)
on 2006-02-21 15:10
(Received via mailing list)
"anne001" <anne@wjh.harvard.edu> schrieb im Newsbeitrag
news:1140522334.803789.181360@g14g2000cwa.googlegroups.com...
>    end
>    GL.PopMatrix();
>    GLUT.SwapBuffers();
>  end

I'd refactor the traversal out of the code and encapsulate actions on
tree
nodes in blocks or a specific visitor class.  In your case a specific
class
might be better because you seem to need entry and exit code.  Something
like:

....
def traversetree(visitor)
  visitor.entry[self]
  @children.each {|childnode| childnode.traversetree(visitor)}
  visitor.exit[self]
end
....

GLVisitor = Struct.new(:entry, :exit)

code_runner = GLVisitor.new( lambda do |n|
  GL.Clear(GL::COLOR_BUFFER_BIT)
  GL.PushMatrix()
  n.applytransform
end,
lambda do |n|
  n.drawprimitive
  GL.PopMatrix();
  GLUT.SwapBuffers();
end)

code_lister = GLVisitor.new( lambda ...

HTH

Kind regards

    robert
4feed660d3728526797edeb4f0467384?d=identicon&s=25 Bill Kelly (Guest)
on 2006-02-21 17:19
(Received via mailing list)
Hi,

From: "anne001" <anne@wjh.harvard.edu>
>    end
>    GL.PopMatrix();
>    GLUT.SwapBuffers();
>  end

Maybe one possibility:

require 'opengl'

RealGL = GL

class LoggingGL
  class << self
    def method_missing(meth, *args)
      puts "#{meth}(#{args.join(', ')})"
      RealGL.send(meth, *args)  # remove this line if you don't want to
really call GL
    end
    def const_missing(const)
      RealGL.const_get(const)
    end
  end
end

GL = LoggingGL

#####################################

The above will turn this:

  GL.MatrixMode(GL::PROJECTION)
  GL.LoadIdentity
  GL.Scaled(1.5, 1.2, 1.0)

Into the following output:

  MatrixMode(5889)
  LoadIdentity()
  Scaled(1.5, 1.2, 1.0)


Hope this helps,

Bill
E29eaefee1709918198c8a4f55c42667?d=identicon&s=25 anne001 (Guest)
on 2006-02-21 21:19
(Received via mailing list)
Thank you Robert. I can see that it would be cleaner to
separate the code from the traversing of the code. And I
see how you did it.

But I don't see how it helps, how does "code_lister" list what is in
"code_runner? "

anne
E29eaefee1709918198c8a4f55c42667?d=identicon&s=25 anne001 (Guest)
on 2006-02-21 22:36
(Received via mailing list)
Thank you very much Bill Kelly for your response.

The Key is that you are swapping what GL means. If I say
GL=LoggingGL
suddenly, I am no longer calling on OpenGL, I am calling on methods in
loggingGL

I tried it as it, as it is very easy to tag this little code to modify
the fx. The glut fx
was not modified, and it opened a window with the strangest mix of
text/image.
I could fix that by redirecting glut I think.

This will work very well. Thank you for thinking of this scheme and
taking the time to
write it all out so it works right away

thank you

Anne
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2006-02-22 11:30
(Received via mailing list)
2006/2/21, anne001 <anne@wjh.harvard.edu>:
> Thank you Robert. I can see that it would be cleaner to
> separate the code from the traversing of the code. And I
> see how you did it.
>
> But I don't see how it helps, how does "code_lister" list what is in
> "code_runner? "

You'll have to separate the generation code from the invocation code.
That way you can reuse the generation code in the lister and simply
print it instead of invoking it.

<disclaimer>I don't know GL so take this advice with a grain of salt.
It was a general advice about separating concerns
properly.</disclaimer>

HTH

robert
This topic is locked and can not be replied to.