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

A

anne001

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
 
R

Robert Klemme

anne001 said:
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
 
B

Bill Kelly

Hi,

From: "anne001 said:
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
 
A

anne001

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
 
A

anne001

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
 
R

Robert Klemme

2006/2/21 said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,202
Messages
2,571,057
Members
47,665
Latest member
salkete

Latest Threads

Top