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>
26 #include "ShaderGeometry.hxx"
31 using namespace osgDB;
35 void ShaderGeometry::addObject(const Vec3& position, float scale,
38 if (!_posScaleArray.valid()) {
39 _posScaleArray = new Vec4Array();
40 _vertexAttribArray = new FloatArray();
42 _posScaleArray->push_back(Vec4(position, scale));
43 _vertexAttribArray->push_back((float)texture_index / varieties);
47 void ShaderGeometry::drawImplementation(osg::RenderInfo& renderInfo) const
49 State& state = *renderInfo.getState();
50 const Extensions* extensions = getExtensions(state.getContextID(), true);
51 Vec4Array::const_iterator citer = _posScaleArray->begin();
52 Vec4Array::const_iterator cend = _posScaleArray->end();
53 FloatArray::const_iterator viter = _vertexAttribArray->begin();
54 for (; citer != cend; ++citer, ++viter) {
55 const Vec4& color = *citer;
56 const float attrib = *viter;
57 glColor4fv(color.ptr());
58 extensions->glVertexAttrib1f(1, attrib);
59 _geometry->draw(renderInfo);
63 BoundingBox ShaderGeometry::computeBound() const
65 const BoundingBox& geom_box = _geometry->getBound();
67 const Vec4Array* posScales = _posScaleArray.get();
70 // size_t numPosScales = posScales->size();
71 for (Vec4Array::const_iterator iter = _posScaleArray->begin(),
72 e = _posScaleArray->end();
75 const Vec4& posScale = *iter;
76 const float scale = posScale.w();
77 const Vec3 pos(posScale.x(), posScale.y(), posScale.z());
78 for (unsigned j = 0; j < 7; ++j)
79 bb.expandBy(geom_box.corner(j) * scale + pos);
84 bool ShaderGeometry_readLocalData(Object& obj, Input& fr)
86 bool iteratorAdvanced = false;
88 ShaderGeometry& geom = static_cast<ShaderGeometry&>(obj);
90 if ((fr[0].matchWord("geometry"))) {
92 iteratorAdvanced = true;
93 osg::Geometry* drawable = dynamic_cast<osg::Geometry*>(fr.readDrawable());
95 geom._geometry = drawable;
99 if (fr.matchSequence("posScale %i {")) {
100 int entry = fr[1].getNoNestedBrackets();
102 fr[1].getInt(capacity);
103 Vec4Array* posScale = new Vec4Array;
104 posScale->reserve(capacity);
106 while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) {
108 if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y())
109 && fr[2].getFloat(v.z()) && fr[3].getFloat(v.w())) {
111 posScale->push_back(v);
116 geom._posScaleArray = posScale;
118 if (fr.matchSequence("variety %i {")) {
119 int entry = fr[1].getNoNestedBrackets();
121 fr[1].getInt(capacity);
122 FloatArray* variety = new FloatArray;
123 variety->reserve(capacity);
125 while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) {
127 if (fr[0].getFloat(val)) {
129 variety->push_back(val);
134 geom._vertexAttribArray = variety;
137 return iteratorAdvanced;
140 bool ShaderGeometry_writeLocalData(const Object& obj, Output& fw)
142 const ShaderGeometry& geom = static_cast<const ShaderGeometry&>(obj);
144 fw.indent() << "geometry" << std::endl;
145 fw.writeObject(*geom._geometry);
146 if (geom._posScaleArray.valid()) {
147 fw.indent() << "posScale " << geom._posScaleArray->size() << " {\n";
149 for (Vec4Array::const_iterator iter = geom._posScaleArray->begin();
150 iter != geom._posScaleArray->end();
152 fw.indent() << iter->x() << " " << iter->y() << " " << iter->z() << " "
153 << iter->w() << "\n";
156 fw.indent() << "}\n";
158 if (geom._vertexAttribArray.valid()) {
159 fw.indent() << "variety" << geom._vertexAttribArray->size() << " {\n";
161 for (FloatArray::const_iterator iter = geom._vertexAttribArray->begin();
162 iter != geom._vertexAttribArray->end();
164 fw.indent() << *iter << "\n";
167 fw.indent() << "}\n";
172 osgDB::RegisterDotOsgWrapperProxy shaderGeometryProxy
176 "Object Drawable ShaderGeometry",
177 &ShaderGeometry_readLocalData,
178 &ShaderGeometry_writeLocalData