/* -*-c++-*- */ /* osgEarth - Geospatial SDK for OpenSceneGraph * Copyright 2020 Pelican Mapping * http://osgearth.org * * osgEarth is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #pragma once #include #include #include #include namespace osgEarth { namespace Util { /** * Utility that reads GLSL source code and lexes it into chunks that * you can then perform operations on. */ class OSGEARTH_EXPORT GLSLChunker { public: struct Chunk { enum Type { TYPE_STATEMENT, TYPE_DIRECTIVE, TYPE_FUNCTION, TYPE_COMMENT }; Type type; std::string text; std::vector tokens; }; typedef std::vector Chunks; public: /** Read GLSL into chunks */ void read(const std::string& input, Chunks& output) const; /** Write chunks (read using the read() method) back to GLSL */ void write(const Chunks& input, std::string& output, bool reindent=true) const; /** Search and replace a string */ void replace(Chunks& input, const std::string& target, const std::string& replacement) const; /** Dump chunks to notify (for debugging) */ void dump(const std::string&, const Chunks&) const; /** Create a chunk from a line. */ Chunk chunkLine(const std::string& line) const; }; } }