From 489831afce6fec9509dfa3d8c729d2abbddcb18a Mon Sep 17 00:00:00 2001 From: Robert Menzel <menzel@informatik.rwth-aachen.de> Date: Fri, 10 Feb 2012 12:38:21 +0100 Subject: [PATCH] added rudimentary ppm loader --- .../Controller/TextureDataControlFilePPM.hh | 59 +++++++++++++++++ include/ACGL/OpenGL/Data/TextureData.hh | 5 ++ .../Controller/TextureDataControlFilePPM.cc | 63 +++++++++++++++++++ src/ACGL/OpenGL/InitStaticFileTypes.cc | 2 + 4 files changed, 129 insertions(+) create mode 100644 include/ACGL/OpenGL/Controller/TextureDataControlFilePPM.hh create mode 100644 src/ACGL/OpenGL/Controller/TextureDataControlFilePPM.cc diff --git a/include/ACGL/OpenGL/Controller/TextureDataControlFilePPM.hh b/include/ACGL/OpenGL/Controller/TextureDataControlFilePPM.hh new file mode 100644 index 00000000..f0b8e030 --- /dev/null +++ b/include/ACGL/OpenGL/Controller/TextureDataControlFilePPM.hh @@ -0,0 +1,59 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2011, 2012 Computer Graphics Group RWTH Aachen University // +// All rights reserved. // +//////////////////////////////////////////////////////////////////////////////// + +#ifndef ACGL_OPENGL_CONTROLLER_TEXTUREDATACONTROLFILEPPM_HH +#define ACGL_OPENGL_CONTROLLER_TEXTUREDATACONTROLFILEPPM_HH + +#include <ACGL/ACGL.hh> + +#include <ACGL/OpenGL/Controller/TextureDataControlFile.hh> +#include <ACGL/OpenGL/InitStaticFileTypes.hh> + +namespace ACGL{ +namespace OpenGL{ + +class TextureDataControlFilePPM : public TextureDataControlFile +{ + friend void initStaticFileTypes(void); + + // ========================================================================================================= \/ + // ============================================================================================ CONSTRUCTORS \/ + // ========================================================================================================= \/ +public: + TextureDataControlFilePPM(const std::string& _filename) + : TextureDataControlFile(_filename) + {} + virtual ~TextureDataControlFilePPM(void) {} + + static SharedTextureDataControlFile creator(const std::string& _filename) { return SharedTextureDataControlFile(new TextureDataControlFilePPM(_filename)); } + + // ===================================================================================================== \/ + // ============================================================================================ OVERRIDE \/ + // ===================================================================================================== \/ +private: + virtual bool load(SharedTextureData& texture) const; + + // ==================================================================================================== \/ + // ============================================================================================ METHODS \/ + // ==================================================================================================== \/ +public: + static int_t getTypeID(void) { return sTypeID; } + +private: + static int_t registerType(void); + + // =================================================================================================== \/ + // ============================================================================================ FIELDS \/ + // =================================================================================================== \/ +private: + static int_t sTypeID; +}; + +ACGL_SMARTPOINTER_TYPEDEFS(TextureDataControlFilePPM) + +} // OpenGL +} // ACGL + +#endif // ACGL_OPENGL_CONTROLLER_TEXTUREDATACONTROLFILEPPM_HH diff --git a/include/ACGL/OpenGL/Data/TextureData.hh b/include/ACGL/OpenGL/Data/TextureData.hh index 2c39fec6..a61360a5 100644 --- a/include/ACGL/OpenGL/Data/TextureData.hh +++ b/include/ACGL/OpenGL/Data/TextureData.hh @@ -6,6 +6,11 @@ #ifndef ACGL_OPENGL_DATA_TEXTUREDATA_HH #define ACGL_OPENGL_DATA_TEXTUREDATA_HH +/** + * TextureData holds the data of a 1,2 or 3 dimensional image to be used as a texture. + * This structure is used for texture loading. + */ + #include <ACGL/ACGL.hh> #include <ACGL/Base/Macros.hh> diff --git a/src/ACGL/OpenGL/Controller/TextureDataControlFilePPM.cc b/src/ACGL/OpenGL/Controller/TextureDataControlFilePPM.cc new file mode 100644 index 00000000..944b9fe1 --- /dev/null +++ b/src/ACGL/OpenGL/Controller/TextureDataControlFilePPM.cc @@ -0,0 +1,63 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2011, 2012 Computer Graphics Group RWTH Aachen University // +// All rights reserved. // +//////////////////////////////////////////////////////////////////////////////// + +#include <ACGL/OpenGL/Controller/TextureDataControlFilePPM.hh> +#include <ACGL/OpenGL/Controller/TextureDataControlFileFactory.hh> + +#include <fstream> + +using namespace ACGL; +using namespace ACGL::OpenGL; +using namespace ACGL::Utils; + +bool TextureDataControlFilePPM::load(SharedTextureData& texture) const +{ + std::ifstream fileStream( getFullFilePath().c_str(), std::ifstream::in ); + + if (!fileStream.good()) { + error() << "could not open file " << getFullFilePath() << std::endl; + return false; + } + + int width, height, maxValue; + + std::string line; + fileStream >> line; // ignore the header + + // note: we assume no comments in this file! + // a general ppm loader has to be more clever! + + fileStream >> width; + fileStream >> height; + fileStream >> maxValue; // we will ignore this and assume the value range is 0..255 + + unsigned char *data = new unsigned char[width*height*3]; // we assume RGB + + int pos = 0; + while (fileStream.good() && pos < (width*height*3)) { + int i; + fileStream >> i; + data[pos] = (unsigned char) i; + pos++; + } + fileStream.close(); + + texture->setData(data); // data will get deleted by the TextureData destructor! + texture->setDepth(1); // 2D so, depth is 1 + texture->setHeight(height); + texture->setWidth(width); + texture->setFormat(GL_RGB); + texture->setType(GL_UNSIGNED_BYTE); // == unsigned char + + return true; +} + +int_t TextureDataControlFilePPM::registerType(void) +{ + sTypeID = TextureDataControlFileFactory::the()->registerType("ppm", &TextureDataControlFilePPM::creator); + return sTypeID; +} + +int_t TextureDataControlFilePPM::sTypeID = -1; diff --git a/src/ACGL/OpenGL/InitStaticFileTypes.cc b/src/ACGL/OpenGL/InitStaticFileTypes.cc index 4a73d9bc..41c01dae 100644 --- a/src/ACGL/OpenGL/InitStaticFileTypes.cc +++ b/src/ACGL/OpenGL/InitStaticFileTypes.cc @@ -7,6 +7,7 @@ #include <ACGL/OpenGL/Controller/TextureDataControlFileJPG.hh> #include <ACGL/OpenGL/Controller/TextureDataControlFilePNG.hh> +#include <ACGL/OpenGL/Controller/TextureDataControlFilePPM.hh> using namespace ACGL::OpenGL; @@ -16,5 +17,6 @@ void ACGL::OpenGL::initStaticFileTypes(void) TextureDataControlFileJPG::registerType(); TextureDataControlFilePNG::registerType(); #endif + TextureDataControlFilePPM::registerType(); } -- GitLab