HI Florian, I can't any obvious mistakes, but the use of the SmoothingVisitor looks redudent to me as you are providing your own normals. Try comment it out.
Robert. On 3 May 2016 at 21:13, Florian GOLESTIN <florian.goles...@gmail.com> wrote: > Hi Robert, > > Sorry my mistake, I wanted to put only the interesting part but this is > not efficient. > No more censure! > > > Code: > > namespace Soleil > { > > LevelReader::LevelReader() > { > //supportsExtension("level", "Text map format for Donjon"); > } > > LevelReader::~LevelReader() > { > } > > > osg::ref_ptr<Level> LevelReader::readFile(const std::string &file) const > { > std::string fileName = osgDB::findDataFile(file); > if (fileName.empty()) return nullptr; // TODO throw e? > > errno = 0; > std::cout << "Stream: " << fileName.c_str() << "\n"; > std::ifstream stream; > stream.exceptions(std::ifstream::failbit); // | std::ifstream::badbit > stream.open(fileName.c_str(), std::ios::in); > if (!stream) return nullptr; // TODO throw e > > return readStream(stream); > } > > osg::ref_ptr<Level> LevelReader::readStream(std::istream &stream) const > { > char block; // current reading block > float x = 0; // Current position on x > float y = 0; // Current position on y > int wallCount = 0; // Number of cubes > float maxX = 0; // Max size of the map in X > > > osg::ref_ptr<Soleil::Level> level = new Soleil::Level(); > std::string line; > while(std::getline(stream, line)) > { > std::stringstream linestream(line); > > while (linestream >> block) > { > /* TODO Configurable size for the blocks */ > float posx = 1.0 * x; > float posy = 1.0 * y; > float endx = posx + 1.0; > float endy = posy + 1.0; > > bool blockFound = false; > switch (block) > { > case '.': > break; > case 'D': > level->_startingPosition = osg::Vec3(posx + .5, posy + .5, > .3); > blockFound = true; > break; > case 'd': > level->_startingOrientation = osg::Vec3(posx + .5, posy + > .5, .3); > blockFound = true; > break; > case 'x': > if (wallCount % 2) > { > std::cout << "1" << "\n"; > createCube(level.get(), *level->texcoords, > *level->texcoords2, posx, posy, endx, endy); > } > else > { > std::cout << "2" << "\n"; > createCube(level.get(), *level->texcoords2, > *level->texcoords, posx, posy, endx, endy); > } > blockFound = true; > wallCount++; > break; > // default: > // blockFound = levelConfiguration(block); > // break; > } > if (blockFound == false) > std::cout << "Unexpected character: " << block << std::endl; > > x += 1.0; > maxX = std::max(x, maxX); > } > x = 0; > y -= 1.0; // TODO Cube size > } > // TODO read failed? > > // Floor ------------- > level->vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f)); > level->vertices->push_back(osg::Vec3(maxX, 0.0f, 0.0f)); > level->vertices->push_back(osg::Vec3(maxX, y, 0.0f)); > level->vertices->push_back(osg::Vec3(0, y, 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)); > > level->texcoords->push_back( osg::Vec2(0.0f, 0.0f) ); // 0 > level->texcoords->push_back( osg::Vec2(0.0f, 1.0f) ); // 1 > level->texcoords->push_back( osg::Vec2(1.0f, 1.0f) ); // 2 > level->texcoords->push_back( osg::Vec2(1.0f, 0.0f) ); // 3 > > > 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+4)); // +4 for the floor texture coordinates > osgUtil::SmoothingVisitor::smooth(*geom); > // > > // > osg::ref_ptr<osg::Geode> geode = new osg::Geode; > geode->addDrawable(geom); > > > /* I added this in the hope to have the second texture appearing */ > // osg::Material* material = new osg::Material; > // material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); > // material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1, 1, > 1, 1)); > // material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1, 1, > 1, 1)); > // material->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(1, > 1, 1, 1)); > // material->setShininess(osg::Material::FRONT_AND_BACK, 64.0f); > // > level->getOrCreateStateSet()->setAttribute(material,osg::StateAttribute::ON > | osg::StateAttribute::OVERRIDE); > > > > level->addChild(geode); > > > // Texture 1 > geom->setTexCoordArray(0, level->texcoords.get()); > { > osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; > osg::ref_ptr<osg::Image> image = > osgDB::readImageFile("media/textures/stone_3_2048x2048.jpg"); > texture->setImage(image); > texture->setUnRefImageDataAfterApply(true); > level->getOrCreateStateSet()->setTextureAttributeAndModes(0, > texture); > } > //Texture 2 > geom->setTexCoordArray(1, level->texcoords2.get()); > { > osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; > osg::ref_ptr<osg::Image> image = > osgDB::readImageFile("media/textures/Metal_seamless2_ch16.jpg"); > texture->setImage(image); > texture->setUnRefImageDataAfterApply(true); > level->getOrCreateStateSet()->setTextureAttributeAndModes(1, > texture); > } > > std::cout << "done.\n"; > return level; > } > > /* > * @param Level Is the container of the vertices, normals and > textures for the walls of our labyrinth > * @param tex Is the Vector that should receive the coordinate > for the textures > * @param skip Is 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)); > > } > } > > > > > > Here is the original file: > https://github.com/fulezi/soleil/blob/master/LevelReader.cpp > > > An idea? > > Florian > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=67046#67046 > > > > > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org