X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Ftgdb%2FShaderGeometry.cxx;h=a6a7c1ed9300018b65eae93373be5c71f4159409;hb=d4c7e950927b1e19a7a7622a7919f32233a6b7a8;hp=d98b5b663d4706d07f816579b2d45ba0c9190fb3;hpb=4b63bc051e701835a12f6f1eca5437b6abd58593;p=simgear.git diff --git a/simgear/scene/tgdb/ShaderGeometry.cxx b/simgear/scene/tgdb/ShaderGeometry.cxx index d98b5b66..a6a7c1ed 100644 --- a/simgear/scene/tgdb/ShaderGeometry.cxx +++ b/simgear/scene/tgdb/ShaderGeometry.cxx @@ -1,15 +1,44 @@ +/* -*-c++-*- + * + * Copyright (C) 2008 Stuart Buchanan + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + */ + +#include +#include +#include + #include "ShaderGeometry.hxx" using namespace osg; +using namespace osgDB; namespace simgear { void ShaderGeometry::drawImplementation(RenderInfo& renderInfo) const { - for(PositionSizeList::const_iterator itr = _trees.begin(); - itr != _trees.end(); - ++itr) { - glColor4fv(itr->ptr()); + osg::State& state = *renderInfo.getState(); + const Extensions* extensions = getExtensions(state.getContextID(),true); + + for(TreeBin::TreeList::const_iterator t = _trees.begin(); t != _trees.end(); ++t) + { + extensions->glVertexAttrib1f(1, (float) t->texture_index/varieties); + glColor4f(t->position.x(), t->position.y(), t->position.z(), t->scale); _geometry->draw(renderInfo); } } @@ -18,15 +47,84 @@ BoundingBox ShaderGeometry::computeBound() const { BoundingBox geom_box = _geometry->getBound(); BoundingBox bb; - for(PositionSizeList::const_iterator itr = _trees.begin(); + for(TreeBin::TreeList::const_iterator itr = _trees.begin(); itr != _trees.end(); ++itr) { - bb.expandBy(geom_box.corner(0)*(*itr)[3] + - Vec3((*itr)[0], (*itr)[1], (*itr)[2])); - bb.expandBy(geom_box.corner(7)*(*itr)[3] + - Vec3((*itr)[0], (*itr)[1], (*itr)[2])); + bb.expandBy(geom_box.corner(0)*itr->scale + + osg::Vec3( itr->position.x(), itr->position.y(), itr->position.z() )); + bb.expandBy(geom_box.corner(7)*itr->scale + + osg::Vec3( itr->position.x(), itr->position.y(), itr->position.z() )); } return bb; } +bool ShaderGeometry_readLocalData(Object& obj, Input& fr) +{ + bool iteratorAdvanced = false; + + ShaderGeometry& geom = static_cast(obj); + + if ((fr[0].matchWord("geometry"))) { + ++fr; + iteratorAdvanced = true; + osg::Drawable* drawable = fr.readDrawable(); + if (drawable) { + geom._geometry = drawable; + } + } + if ((fr.matchSequence("instances %i"))) { + int entry = fr[0].getNoNestedBrackets(); + int capacity; + fr[1].getInt(capacity); + geom._trees.reserve(capacity); + fr += 3; + iteratorAdvanced = true; + // skip { + while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) { + SGVec3f v; + int t; + float s; + if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) + && fr[2].getFloat(v.z()) && fr[3].getInt(t) && fr[4].getFloat(s)) { + fr += 4; + //SGVec3f* v = new SGVec3f(v.x(), v.y(), v.z()); + //TreeBin::Tree tree = new TreeBin::Tree(v, t, s); + geom._trees.push_back(TreeBin::Tree(v, t, s)); + } else { + ++fr; + } + } + } + return iteratorAdvanced; +} + +bool ShaderGeometry_writeLocalData(const Object& obj, Output& fw) +{ + const ShaderGeometry& geom = static_cast(obj); + + fw.indent() << "geometry" << std::endl; + fw.writeObject(*geom._geometry); + fw.indent() << "instances " << geom._trees.size() << std::endl; + fw.indent() << "{" << std::endl; + fw.moveIn(); + for (TreeBin::TreeList::const_iterator iter + = geom._trees.begin(); + iter != geom._trees.end(); + ++iter) { + fw.indent() << iter->position.x() << " " << iter->position.y() << " " << iter->position.z() << " " + << iter->texture_index << " " << iter->scale << std::endl; + } + fw.moveOut(); + fw.indent() << "}" << std::endl; + return true; +} + +osgDB::RegisterDotOsgWrapperProxy shaderGeometryProxy +( + new ShaderGeometry, + "ShaderGeometry", + "Object Drawable ShaderGeometry", + &ShaderGeometry_readLocalData, + &ShaderGeometry_writeLocalData + ); }