[osg-users] Using multiples texture for a geometry
Robert Osfield
robert.osfield at gmail.com
Wed May 4 00:39:32 PDT 2016
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.golestin at 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 at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20160504/268208a6/attachment-0002.htm>
More information about the osg-users
mailing list