I have found one error: I was not returning "true" from some
of my configInit() methods. Stefan, in eqPly, you sometimes
write code for configInit(), followed by a call to the parent class.
Usually, the parent class emthod shoudl be called first in case memory
is allocated and variables initialized. Perhaps it was an oversight.
Specifically, look at:

bool Window::configInit( const uint32_t initID )
{
     if( !eq::Window::configInit( initID ))
         return false;

     EQASSERT( !_state );
     _state = new VertexBufferState( getObjectManager( ));

     const Node*     node     = static_cast< const Node* >( getNode( ));
     const InitData& initData = node->getInitData();

     if( initData.useVBOs() )
     {
         // Check if VBO funcs available, else leave DISPLAY_LIST_MODE on
         if( GLEW_VERSION_1_5 )
         {
             _state->setRenderMode( mesh::BUFFER_OBJECT_MODE );
             EQINFO << "VBO rendering enabled" << endl;
         }
         else
             EQWARN << "VBO function pointers missing, using display lists"
                    << endl;
     }

     _loadLogo();

     if( initData.useGLSL() )
         _loadShaders();

     return true;
}


    Gordon




Quoting Gordon Erlebacher <[EMAIL PROTECTED]>:

> Stefan,
>
> Here is my current program: with my own node, window and channel:
> The windows are NOT updating properly. I obviously do not understand
> what I am doing. Perhaps somebody can take a look? The problem has
> nothing to do with RapidMind. It occurs when plotting the original display
> from hello.cpp . I am not getting correct screen refresh, and somehow,
> there is interference between the display window and the window
> (terminal) from which I launch the appNode (./hello) . Strange.
>
>   Gordon
>
>
>
>
>
> #include "life.h"
>
> // Copyright (c) 2007 RapidMind Inc. All Rights Reserved
> // All copies of this file must include the preceding copyright notice.
> //
> // Usage of this software requires acceptance and compliance with the
> RAPIDMIND
> // SAMPLE LICENSE, which is included in the LICENSE.TXT file. Any further
> // distribution of this file must include this license agreement.
> //////////////////////////////////////////////////////////////////////////////
>
> using namespace rapidmind;
> using namespace rapidmind::graphics;
> using namespace std;
>
> Life::Life(int size) : m_board(size, size)
>   {
>     m_update = RM_BEGIN {
>       InOut<Value1i> RM_DECL(value);
>       In<Value1i> neighbours[8];
>
>       Value1i RM_DECL(count) = 0;
>       for(int i = 0; i < 8; i++) {
>         count += neighbours[i];
>       }
>
>       RM_IF(count < 2 || count > 3) {
>         value = 0;
>       } RM_ENDIF;
>
>       RM_IF(count == 3) {
>         value = 1;
>       } RM_ENDIF;
>
>     } RM_END;
>
>     // initialize the board
>     reset();
>   }
> //----------------------------------------------------------------------
> void Life::reset()
>   {
>     int* data = m_board.write_data();
>     for(unsigned int i = 0; i < product(m_board.size())[0]; i++) {
>       data[i] = (rand() % 3) == 0;
>     }
>   }
> //----------------------------------------------------------------------
> void Life::update()
>   {
>     // use shifts to pass in the 8 surrounding neighbours of each cell
>     m_board = m_update(m_board)
>       (shift(m_board, -1, -1), shift(m_board, 0, -1), shift(m_board, 1, -1))
>       (shift(m_board, -1,  0),                        shift(m_board, 1,  0))
>       (shift(m_board, -1,  1), shift(m_board, 0,  1), shift(m_board, 1,  1));
>   }
> //----------------------------------------------------------------------
> rapidmind::Array<2, rapidmind::Value1i>& Life::board()
> {
>         return m_board;
> }
> //----------------------------------------------------------------------
>
>
>
> //----------------------------------------------------------------------
> void Life_GLSL::init_shaders()
> {
>   // This is a simple pass through vertex program.
>   Program vsh = RM_BEGIN_VERTEX_PROGRAM("semantic") {
>     InOut<Position<Value2f> > pos; // from glVertex2f
>     InOut<TexCoord<Value2f> > tex; // from glTexCoord2f
>   } RM_END;
>
>   Program fsh = RM_BEGIN_FRAGMENT_PROGRAM {
>     In<TexCoord<Value2f> > tex;
>     Value1i a = life.board()(tex);
>     Out<Color<Value3f> > color = a*Value3f(1.0f);
>   } RM_END;
>
>   shaders = new ProgramSet(vsh, fsh);
> }
> //----------------------------------------------------------------------
> void Life_GLSL::display()
> {
>   glClear(GL_COLOR_BUFFER_BIT);
>
>   rapidmind::graphics::bind(*shaders);
>
>   // Draw a rectangle over the entire window
>   glBegin(GL_QUADS);
>     // top left
>     glTexCoord2f(0.0f, 0.0f);
>     glVertex2f(-1.0f, 1.0f);
>     // top right
>     glTexCoord2f(1.0f, 0.0f);
>     glVertex2f(1.0f, 1.0f);
>     // bottom right
>     glTexCoord2f(1.0f, 1.0f);
>     glVertex2f(1.0f, -1.0f);
>     // bottom left
>     glTexCoord2f(0.0f, 1.0f);
>     glVertex2f(-1.0f, -1.0f);
>   glEnd();
>
>   rapidmind::graphics::unbind();
>
>  // glutSwapBuffers();
> }
> //----------------------------------------------------------------------
> void Life_GLSL::update()
> {
>   static Timer last = Timer::now();
>   Timer now = Timer::now();
>
>   // update every 50ms (~20fps)
>   if (!limit_fps || (now-last).value() > 50.0f) {
>     // execute the Game of Life stream program
>     life.update();
>     last = now;
>     //glutPostRedisplay();
>   }
> }
> //----------------------------------------------------------------------
> [EMAIL PROTECTED] eqHelloGE]$ cat hello.cpp
>
> /* Copyright (c) 2007, Stefan Eilemann <[EMAIL PROTECTED]>
>  *  All rights reserved.
>  *
>  * Equalizer 'Hello, World!' example. Shows the minimum Equalizer
> program which
>  * renders spinning quads around the origin.
>  */
>
> #include <eq/eq.h>
> #include <stdlib.h>
> #include "life.h"
>
> using namespace eqBase;
> using namespace std;
>
> Life* glife;
> Life_GLSL* glife_glsl;
>
>
> //----------------------------------------------------------------------
> //Added by GE
> class MyWindow : public eq::Window
> {
> public:
>         Life* life;
>         Life_GLSL* life_glsl;
>
> public:
>         MyWindow(eq::Pipe* pipe) : eq::Window(pipe) {
>                 printf("MyWindow::constructor\n");
>         }
>
>         //bool configInit( const uint32_t initID);
>
>         bool configInitGL( const uint32_t initID)
>         {
>         if( !eq::Window::configInit( initID )) {
>                         printf("MyWindow did not inialize properly\n");
>                         return false;
>                 }
>                 printf("MyWindow::configInit\n");
>                 life = new Life(512);
>                 life_glsl = new Life_GLSL(*life);
>                 life_init();
>
>                 printf("glife= %d\n", glife);
>                 glife = life;
>                 printf("glife= %d\n", glife);
>                 glife_glsl = life_glsl;
>         }
>         void life_init() {
>                 rm::init();
>         life = new Life(512);
>                 life_glsl = new Life_GLSL(*life);
>         life_glsl->init_shaders();
>         life_glsl->bind();
>         }
>         bool configExit()
>         {
>                 printf("MyWindow::configExit\n");
>                 delete life;
>                 delete life_glsl;
>                 return eq::Window::configExit();
>         }
> };
> //----------------------------------------------------------------------
> //ADDED by GE
> class MyNode : public eq::Node
> {
> public:
>         Life* life;
>         Life_GLSL* life_glsl;
> public:
>         MyNode(eq::Config* parent) : eq::Node(parent) {
>                 printf("MyNode constructor\n");
>         }
>         bool configInit(const uint32_t initID) {
>         if( !eq::Node::configInit( initID )) {
>                         printf("MyNode did not inialize properly\n");
>                 return false;
>                 }
>                 printf("MyNode:;configInit: initID= %d\n", initID);
>                 return true;
>         }
>         bool configExit()
>         {
>                 printf("MyNode::configExit");
>                 return eq::Node::configExit();
>         }
>         #if 0
>         void life_init() {
>                 //rm::init();
>         life = new Life(512);
>                 life_glsl = new Life_GLSL(*life);
>         life_glsl->init_shaders();
>         life_glsl->bind();
>         }
>         #endif
> };
> //----------------------------------------------------------------------
> class Channel : public eq::Channel
> {
> public:
>         rm::ProgramSetPtr shaders;
>         rm::Program vsh, fsh;
>
> public:
>     Channel( eq::Window* parent ) : eq::Channel( parent ) { }
>
>         bool configInit(const uint32_t initID) {
>                 printf("inside channel constructor\n");
>                 printf("glife= %d\n", glife);
>                 vsh = RM_BEGIN_VERTEX_PROGRAM("semantic") {
>                 rm::InOut<rmg::Position<rm::Value2f> > pos; // from   
> glVertex2f
>                 rm::InOut<rmg::TexCoord<rm::Value2f> > tex; // from
> glTexCoord2f
>                 } RM_END;
>
>                 fsh = RM_BEGIN_FRAGMENT_PROGRAM {
>                 rm::In<rmg::TexCoord<rm::Value2f> > tex;
>                 rm::Value1i a = glife->board()(tex);
>                 rm::Out<rmg::Color<rm::Value3f> > color =   
> a*rm::Value3f(1.0f);
>                 } RM_END;
>
>                 shaders = new rm::ProgramSet(vsh, fsh);
>
>         }
>
> protected:
>     virtual void frameDraw( const uint32_t spin );
> };
> //----------------------------------------------------------------------
> class NodeFactory : public eq::NodeFactory
> {
> public:
>         virtual eq::Window* createWindow(eq::Pipe* pipe)
>                 { return new MyWindow(pipe); }
>         // channel needs glife, defined in  MyWindow
>         virtual eq::Node* createNode(eq::Config* parent)
>                 { return new MyNode(parent); }
>     virtual eq::Channel* createChannel( eq::Window* parent )
>         { return new Channel( parent ); }
> };
>
> //----------------------------------------------------------------------
>   // This is a simple pass through vertex program.
>
>
>
>
>
>
> //----------------------------------------------------------------------
> // initialize this on the appropriate node or channel
>
> int main( const int argc, char** argv )
> {
>
>     // 1. Equalizer initialization
>     NodeFactory nodeFactory;
>     if( !eq::init( argc, argv, &nodeFactory ))
>     {
>         EQERROR << "Equalizer init failed" << endl;
>         return EXIT_FAILURE;
>     }
>
>     // 2. get a configuration
>     bool        error  = false;
>     eq::Config* config = eq::getConfig( argc, argv );
>     if( config )
>     {
>         // 3. init config
>         if( config->init( 0 )) {
>             // 4. run main loop
>             uint32_t spin = 0;
>             while( config->isRunning( ))
>             {
>                 config->startFrame( ++spin );
>                 config->finishFrame();
>             }
>
>             // 5. exit config
>             config->exit();
>         } else {
>             EQERROR << "Config initialization failed: "
>                     << config->getErrorMessage() << endl;
>             error = true;
>         }
>
>         // 6. release config
>         eq::releaseConfig( config );
>     }
>     else
>     {
>         EQERROR << "Cannot get config" << endl;
>         error = true;
>     }
>
>     // 7. exit
>     eq::exit();
>     return error ? EXIT_FAILURE : EXIT_SUCCESS;
> }
>
> /** The rendering routine, a.k.a., glutDisplayFunc() */
> void Channel::frameDraw( const uint32_t spin )
> {
>     // setup OpenGL State
>     eq::Channel::frameDraw( spin );
>
> #if 0
>   glife_glsl->update(); // need better method than glife
>   glife_glsl->display();
>
>   glClear(GL_COLOR_BUFFER_BIT);
>
>   glUseProgram(0);
>   rapidmind::graphics::bind(*shaders);
>
>   glOrtho(-2.,2.,-2.,2., 2.,-2.);
>
>   // Draw a rectangle over the entire window
>   glBegin(GL_QUADS);
>     // top left
>     glTexCoord2f(0.0f, 0.0f);
>     glVertex2f(-1.0f, 1.0f);
>     // top right
>     glTexCoord2f(1.0f, 0.0f);
>     glVertex2f(1.0f, 1.0f);
>     // bottom right
>     glTexCoord2f(1.0f, 1.0f);
>     glVertex2f(1.0f, -1.0f);
>     // bottom left
>     glTexCoord2f(0.0f, 1.0f);
>     glVertex2f(-1.0f, -1.0f);
>   glEnd();
>
>   rapidmind::graphics::unbind();
>
> #endif
>
> #if 1
>     const float lightPos[] = { 0.0f, 0.0f, 1.0f, 0.0f };
>     glLightfv( GL_LIGHT0, GL_POSITION, lightPos );
>
>     const float lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
>     glLightfv( GL_LIGHT0, GL_AMBIENT, lightAmbient );
>
>     // rotate scene around the origin
>     glRotatef( static_cast< float >( spin ) * 0.1f, 1.0f, 0.5f, 0.25f );
>
>     // render six axis-aligned colored quads around the origin
>     //  front
>     glColor3f( 1.0f, 0.5f, 0.5f );
>     glNormal3f( 0.0f, 0.0f, 1.0f );
>     glBegin( GL_TRIANGLE_STRIP );
>     glVertex3f(  .7f,  .7f, -1.0f );
>     glVertex3f(  .7f, -.7f, -1.0f );
>     glVertex3f( -.7f,  .7f, -1.0f );
>     glVertex3f( -.7f, -.7f, -1.0f );
>     glEnd();
>
>     //  bottom
>     glColor3f( 0.5f, 1.0f, 0.5f );
>     glNormal3f( 0.0f, 1.0f, 0.0f );
>     glBegin( GL_TRIANGLE_STRIP );
>     glVertex3f(  .7f, -1.0f,  .7f );
>     glVertex3f(  .7f, -1.0f, -.7f );
>     glVertex3f( -.7f, -1.0f,  .7f );
>     glVertex3f( -.7f, -1.0f, -.7f );
>     glEnd();
>
>     //  back
>     glColor3f( 0.5f, 0.5f, 1.0f );
>     glNormal3f( 0.0f, 0.0f, -1.0f );
>     glBegin( GL_TRIANGLE_STRIP );
>     glVertex3f(  .7f,  .7f, 1.0f );
>     glVertex3f(  .7f, -.7f, 1.0f );
>     glVertex3f( -.7f,  .7f, 1.0f );
>     glVertex3f( -.7f, -.7f, 1.0f );
>     glEnd();
>
>     //  top
>     glColor3f( 1.0f, 1.0f, 0.5f );
>     glNormal3f( 0.f, -1.f, 0.f );
>     glBegin( GL_TRIANGLE_STRIP );
>     glVertex3f(  .7f, 1.0f,  .7f );
>     glVertex3f(  .7f, 1.0f, -.7f );
>     glVertex3f( -.7f, 1.0f,  .7f );
>     glVertex3f( -.7f, 1.0f, -.7f );
>     glEnd();
>
>     //  right
>     glColor3f( 1.0f, 0.5f, 1.0f );
>     glNormal3f( -1.f, 0.f, 0.f );
>     glBegin( GL_TRIANGLE_STRIP );
>     glVertex3f( 1.0f,  .7f,  .7f );
>     glVertex3f( 1.0f,  .7f, -.7f );
>     glVertex3f( 1.0f, -.7f,  .7f );
>     glVertex3f( 1.0f, -.7f, -.7f );
>     glEnd();
>
>     //  left
>     glColor3f( 0.5f, 1.0f, 1.0f );
>     glNormal3f( 1.f, 0.f, 0.f );
>     glBegin( GL_TRIANGLE_STRIP );
>     glVertex3f( -1.0f,  .7f,  .7f );
>     glVertex3f( -1.0f,  .7f, -.7f );
>     glVertex3f( -1.0f, -.7f,  .7f );
>     glVertex3f( -1.0f, -.7f, -.7f );
>     glEnd();
> #endif
> }
>
> ----------------------------------------------------------------
> This message was sent using IMP, the Internet Messaging Program.



Gordon Erlebacher

----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.


_______________________________________________
eq-dev mailing list
[email protected]
https://in-zueri.ch/cgi-bin/mailman/listinfo/eq-dev
http://www.equalizergraphics.com

Reply via email to