<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html;charset=ISO-2022-JP">
<title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
<small><font face="Courier New, Courier, monospace">Hi,<br>
<br>
I need to do some OpenGL immediate mode rendering into a VTK scene. In
this example, I draw a cone using VTK, and when I get an EndEvent from
the vtkRenderer (which occurs at the end of the render), I draw a
little rectangle using pure OpenGL.<br>
<br>
Here's the problem: The drawn rectangle is always the same color as the
cone, regardless of what I set it to with glColor3f. If I change the
cone to red, the rectangle will be red, etc. The rect is renderer in
the correct location, but with the wrong color.<br>
<br>
The code is below. I sure could use some help on this one.<br>
<br>
Thanks,<br>
<br>
- David Edwards<br>
<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
// Draw vtk cone and pure OpenGL rectangle.<br>
//<br>
<br>
#include "stdafx.h"<br>
#include "vtkRenderer.h"<br>
#include "vtkRenderWindow.h"<br>
#include "vtkConeSource.h"<br>
#include "vtkPolyDataMapper.h"<br>
#include "vtkActor.h"<br>
#include "vtkRenderWindowInteractor.h"<br>
#include "vtkCommand.h"<br>
#include "vtkProperty.h"<br>
#include <gl/gl.h><br>
#include <gl/glu.h><br>
<br>
class CRenderCommand : public vtkCommand<br>
{<br>
public:<br>
static CRenderCommand *New() <br>
{ return new CRenderCommand; }<br>
//<br>
// This gets executed when the Renderer completes the rendering <br>
// (but before exiting UpdateGeometry()<br>
virtual void Execute(vtkObject *caller, unsigned long, void*) {<br>
vtkRenderer *renderer =
reinterpret_cast<vtkRenderer*>(caller);<br>
vtkRenderWindow* rw = renderer->GetRenderWindow();<br>
rw->MakeCurrent();<br>
<br>
glColor3f(0,1,0); // This line has no effect<br>
glRectf(.3,-.3,.4,-.4); // Draw the rectangle<br>
}<br>
};<br>
<br>
void main( int argc, char *argv[] )<br>
{<br>
<br>
// <br>
// create a rendering window and renderer<br>
vtkRenderer *ren = vtkRenderer::New();<br>
//<br>
// Add the callback for the render method<br>
</font></small><small><font face="Courier New, Courier, monospace">
CRenderCommand* pCallback = CRenderCommand::New();</font></small><small><font
face="Courier New, Courier, monospace"> <br>
ren->AddObserver(vtkCommand::EndEvent,pCallback);<br>
<br>
vtkRenderWindow *renWindow = vtkRenderWindow::New();<br>
renWindow->AddRenderer(ren);<br>
//<br>
// create an actor and give it cone geometry<br>
vtkConeSource *cone = vtkConeSource::New();<br>
cone->SetResolution(8);<br>
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();<br>
coneMapper->SetInput(cone->GetOutput());<br>
vtkActor *coneActor = vtkActor::New();<br>
coneActor->SetMapper(coneMapper);<br>
coneActor->GetProperty()->SetColor(0,0,1);<br>
//<br>
// assign our actor to the renderer<br>
ren->AddActor(coneActor);<br>
//<br>
// draw the resulting scene<br>
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();<br>
iren->SetRenderWindow(renWindow);<br>
<br>
renWindow->Render();<br>
iren->Start();<br>
//<br>
// Clean up<br>
ren->Delete();<br>
renWindow->Delete();<br>
cone->Delete();<br>
coneMapper->Delete();<br>
coneActor->Delete();<br>
}<br>
<br>
</font></small><br>
</body>
</html>