Hi Robert,

Thanks for your response!

I might have the two vectors for the textures coordinate.
Basically my idea is to have cubes to draw Labyrinth.
I read a file such as:

Code:

xxxxx
x.....x
xxxxx



Where 'x' represents a wall.

I've a class named Level that hold two Vec2Array for the two textures, it also 
hold vertices and normals.
What I do is
 - Even: the first vector is filled with texture coordinates while the second 
is filled with 0
 - Odd: then the second time the first vector is filled with 0 and the second 
with texture coordinates.

Here is the code:

Code:

float   x = 0;
float   y = 0;
int wallCount = 0;

while(std::getline(stream, line))
      {
        std::stringstream linestream(line);

        while (linestream >> block)
          {
            float posx = 1.0 * x; 
            float posy = 1.0 * y;             
            float endx = posx + 1.0;
            float endy = posy + 1.0;
            switch (block)
              {
              case 'x':
                if (wallCount % 2) // Odd or Even?
                    createCube(level.get(), *level->texcoords, 
*level->texcoords2, posx, posy, endx, endy);
                else
                    createCube(level.get(), *level->texcoords2, 
*level->texcoords, posx, posy, endx, endy);
                wallCount++;
                break;
            x += 1.0;
          }
        x  = 0;
        y -= 1.0; /* We decrements y To keep the labyrinth as on the file */
      }


    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
    geom->setVertexArray(level->vertices);
    geom->setNormalArray(level->normals, osg::Array::Binding::BIND_PER_VERTEX);
    geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 24*wallCount));
    osgUtil::SmoothingVisitor::smooth(*geom);



  /*
   * @param Level       the container of the vertices, normals and textures for 
the walls of our labyrinth
   * @param tex         the Vector that should receive the coordinate for the 
textures
   * @param skip        the second vector for texture filled with '0' to 'skip' 
this wall
   */
  void LevelReader::createCube(Soleil::Level *level, osg::Vec2Array &tex, 
osg::Vec2Array &skip,
                  float posx, float posy, float endx, float endy) const
{    
    // ------ Front
    level->vertices->push_back(osg::Vec3(posx, posy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, posy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, posy, 1.0f));
    level->vertices->push_back(osg::Vec3(posx, posy, 1.0f));

    level->normals->push_back(osg::Vec3(0.0f,-1.0f, 0.0f));
    level->normals->push_back(osg::Vec3(0.0f,-1.0f, 0.0f));
    level->normals->push_back(osg::Vec3(0.0f,-1.0f, 0.0f));
    level->normals->push_back(osg::Vec3(0.0f,-1.0f, 0.0f));

    tex.push_back( osg::Vec2(0.0f, 0.0f)); 
    tex.push_back( osg::Vec2(0.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 0.0f)); 
    //
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
  
  
    // ------ top
    level->vertices->push_back(osg::Vec3(posx, posy, 1.0f));
    level->vertices->push_back(osg::Vec3(endx, posy, 1.0f));
    level->vertices->push_back(osg::Vec3(endx, endy, 1.0f));
    level->vertices->push_back(osg::Vec3(posx, endy, 1.0f));

    level->normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
    level->normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
    level->normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
    level->normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));

    tex.push_back( osg::Vec2(0.0f, 0.0f)); 
    tex.push_back( osg::Vec2(0.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 0.0f)); 
    //
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
  
  
    // ------ back
    level->vertices->push_back(osg::Vec3(posx, endy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, endy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, endy, 1.0f));
    level->vertices->push_back(osg::Vec3(posx, endy, 1.0f));

    level->normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
    level->normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
    level->normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
    level->normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));

    tex.push_back( osg::Vec2(0.0f, 0.0f)); 
    tex.push_back( osg::Vec2(0.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 0.0f)); 
      //
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 

  
    // ------ Bottom
    level->vertices->push_back(osg::Vec3(posx, posy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, posy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, endy, 0.0f));
    level->vertices->push_back(osg::Vec3(posx, endy, 0.0f));

    level->normals->push_back(osg::Vec3(0.0f, 0.0f, -1.0f));
    level->normals->push_back(osg::Vec3(0.0f, 0.0f, -1.0f));
    level->normals->push_back(osg::Vec3(0.0f, 0.0f, -1.0f));
    level->normals->push_back(osg::Vec3(0.0f, 0.0f, -1.0f));

    tex.push_back( osg::Vec2(0.0f, 0.0f)); 
    tex.push_back( osg::Vec2(0.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 0.0f)); 
    //
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 


    // ------ Left
    level->vertices->push_back(osg::Vec3(posx, posy, 0.0f));
    level->vertices->push_back(osg::Vec3(posx, endy, 0.0f));
    level->vertices->push_back(osg::Vec3(posx, endy, 1.0f));
    level->vertices->push_back(osg::Vec3(posx, posy, 1.0f));

    level->normals->push_back(osg::Vec3(-1.0f, 0.0f, 0.0f));
    level->normals->push_back(osg::Vec3(-1.0f, 0.0f, 0.0f));
    level->normals->push_back(osg::Vec3(-1.0f, 0.0f, 0.0f));
    level->normals->push_back(osg::Vec3(-1.0f, 0.0f, 0.0f));

    tex.push_back( osg::Vec2(0.0f, 0.0f)); 
    tex.push_back( osg::Vec2(0.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 0.0f)); 
      //
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 

  
    // ------ Right
    level->vertices->push_back(osg::Vec3(endx, posy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, endy, 0.0f));
    level->vertices->push_back(osg::Vec3(endx, endy, 1.0f));
    level->vertices->push_back(osg::Vec3(endx, posy, 1.0f));

    level->normals->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
    level->normals->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
    level->normals->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
    level->normals->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));

    tex.push_back( osg::Vec2(0.0f, 0.0f)); 
    tex.push_back( osg::Vec2(0.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 1.0f)); 
    tex.push_back( osg::Vec2(1.0f, 0.0f)); 
    //
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 
    skip.push_back( osg::Vec2(0.0f, 0.0f)); 

  }




Thanks,
Florian

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=67041#67041





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to