3 * Copyright (C) 2008 Stuart Buchanan
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
22 #include <osgDB/Registry>
23 #include <osgDB/Input>
24 #include <osgDB/ParameterOutput>
25 #include <simgear/screen/extensions.hxx>
27 #include "ShaderGeometry.hxx"
30 using namespace osgDB;
34 void ShaderGeometry::drawImplementation(RenderInfo& renderInfo) const
36 osg::State& state = *renderInfo.getState();
37 const Extensions* extensions = getExtensions(state.getContextID(),true);
39 for(TreeBin::TreeList::const_iterator t = _trees.begin(); t != _trees.end(); ++t)
41 extensions->glVertexAttrib1f(1, (float) t->texture_index/varieties);
42 glColor4f(t->position.x(), t->position.y(), t->position.z(), t->scale);
43 _geometry->draw(renderInfo);
47 BoundingBox ShaderGeometry::computeBound() const
49 BoundingBox geom_box = _geometry->getBound();
51 for(TreeBin::TreeList::const_iterator itr = _trees.begin();
54 bb.expandBy(geom_box.corner(0)*itr->scale +
55 osg::Vec3( itr->position.x(), itr->position.y(), itr->position.z() ));
56 bb.expandBy(geom_box.corner(7)*itr->scale +
57 osg::Vec3( itr->position.x(), itr->position.y(), itr->position.z() ));
62 bool ShaderGeometry_readLocalData(Object& obj, Input& fr)
64 bool iteratorAdvanced = false;
66 ShaderGeometry& geom = static_cast<ShaderGeometry&>(obj);
68 if ((fr[0].matchWord("geometry"))) {
70 iteratorAdvanced = true;
71 osg::Drawable* drawable = fr.readDrawable();
73 geom._geometry = drawable;
76 if ((fr.matchSequence("instances %i"))) {
77 int entry = fr[0].getNoNestedBrackets();
79 fr[1].getInt(capacity);
80 geom._trees.reserve(capacity);
82 iteratorAdvanced = true;
84 while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) {
88 if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y())
89 && fr[2].getFloat(v.z()) && fr[3].getInt(t) && fr[4].getFloat(s)) {
91 //SGVec3f* v = new SGVec3f(v.x(), v.y(), v.z());
92 //TreeBin::Tree tree = new TreeBin::Tree(v, t, s);
93 geom._trees.push_back(TreeBin::Tree(v, t, s));
99 return iteratorAdvanced;
102 bool ShaderGeometry_writeLocalData(const Object& obj, Output& fw)
104 const ShaderGeometry& geom = static_cast<const ShaderGeometry&>(obj);
106 fw.indent() << "geometry" << std::endl;
107 fw.writeObject(*geom._geometry);
108 fw.indent() << "instances " << geom._trees.size() << std::endl;
109 fw.indent() << "{" << std::endl;
111 for (TreeBin::TreeList::const_iterator iter
112 = geom._trees.begin();
113 iter != geom._trees.end();
115 fw.indent() << iter->position.x() << " " << iter->position.y() << " " << iter->position.z() << " "
116 << iter->texture_index << " " << iter->scale << std::endl;
119 fw.indent() << "}" << std::endl;
123 osgDB::RegisterDotOsgWrapperProxy shaderGeometryProxy
127 "Object Drawable ShaderGeometry",
128 &ShaderGeometry_readLocalData,
129 &ShaderGeometry_writeLocalData