[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

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

anne001

2/21/2006 11:46:00 AM

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

5 Answers

Robert Klemme

2/21/2006 2:08:00 PM

0


"anne001" <anne@wjh.harvard.edu> schrieb im Newsbeitrag
news:1140522334.803789.181360@g14g2000cwa.googlegroups.com...
>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

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

Bill Kelly

2/21/2006 4:18:00 PM

0

Hi,

From: "anne001" <anne@wjh.harvard.edu>
>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

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




anne001

2/21/2006 8:16:00 PM

0

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

anne001

2/21/2006 9:32:00 PM

0

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

Robert Klemme

2/22/2006 10:27:00 AM

0

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

--
Have a look: http://www.flickr.com/photos/fu...