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
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
But I don't see how it helps, how does "code_lister" list what is in
"code_runner? "
anne
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
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/fussel-foto/