]> git.mxchange.org Git - simgear.git/blob - simgear/scene/tgdb/ShaderGeometry.cxx
Only disable display lists if using VBOs.
[simgear.git] / simgear / scene / tgdb / ShaderGeometry.cxx
1 /* -*-c++-*-
2  *
3  * Copyright (C) 2008 Stuart Buchanan
4  *
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.
9  *
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.
14  *
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,
18  * MA 02110-1301, USA.
19  *
20  */
21
22 #include <osgDB/Registry>
23 #include <osgDB/Input>
24 #include <osgDB/ParameterOutput>
25
26 #include "ShaderGeometry.hxx"
27
28 #include <algorithm>
29
30 using namespace osg;
31 using namespace osgDB;
32
33 namespace simgear
34 {
35 void ShaderGeometry::addObject(const Vec3& position, float scale,
36                                int texture_index)
37 {
38     if (!_posScaleArray.valid()) {
39         _posScaleArray = new Vec4Array();
40         _vertexAttribArray = new FloatArray();
41     }
42     _posScaleArray->push_back(Vec4(position, scale));
43     _vertexAttribArray->push_back((float)texture_index / varieties);
44     dirtyBound();
45 }
46
47 void ShaderGeometry::drawImplementation(osg::RenderInfo& renderInfo) const
48 {
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);
60     }
61 }
62
63 BoundingBox ShaderGeometry::computeBound() const
64 {
65     const BoundingBox& geom_box = _geometry->getBound();
66     BoundingBox bb;
67     const Vec4Array* posScales = _posScaleArray.get();
68     if (!posScales)
69         return bb;
70 //    size_t numPosScales = posScales->size();
71     for (Vec4Array::const_iterator iter = _posScaleArray->begin(),
72              e = _posScaleArray->end();
73          iter != e;
74          ++iter) {
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);
80     }
81     return bb;
82 }
83
84 bool ShaderGeometry_readLocalData(Object& obj, Input& fr)
85 {
86     bool iteratorAdvanced = false;
87
88     ShaderGeometry& geom = static_cast<ShaderGeometry&>(obj);
89
90     if ((fr[0].matchWord("geometry"))) {
91         ++fr;
92         iteratorAdvanced = true;
93         osg::Geometry* drawable = dynamic_cast<osg::Geometry*>(fr.readDrawable());
94         if (drawable) {
95             geom._geometry = drawable;
96         }
97     }
98 //    int capacity = 0;
99     if (fr.matchSequence("posScale %i {")) {
100         int entry = fr[1].getNoNestedBrackets();
101         int capacity;
102         fr[1].getInt(capacity);
103         Vec4Array* posScale = new Vec4Array;
104         posScale->reserve(capacity);
105         fr += 3;
106         while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) {
107             Vec4 v;
108             if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y())
109                 && fr[2].getFloat(v.z()) && fr[3].getFloat(v.w())) {
110                 fr += 4;
111                 posScale->push_back(v);
112             }
113             else ++fr;
114         }
115         ++fr;
116         geom._posScaleArray = posScale;
117     }
118     if (fr.matchSequence("variety %i {")) {
119         int entry = fr[1].getNoNestedBrackets();
120         int capacity;
121         fr[1].getInt(capacity);
122         FloatArray* variety = new FloatArray;
123         variety->reserve(capacity);
124         fr += 3;
125         while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) {
126             float val;
127             if (fr[0].getFloat(val)) {
128                 ++fr;
129                 variety->push_back(val);
130             }
131             else ++fr;
132         }
133         ++fr;
134         geom._vertexAttribArray = variety;
135     }
136
137     return iteratorAdvanced;
138 }
139
140 bool ShaderGeometry_writeLocalData(const Object& obj, Output& fw)
141 {
142     const ShaderGeometry& geom = static_cast<const ShaderGeometry&>(obj);
143
144     fw.indent() << "geometry" << std::endl;
145     fw.writeObject(*geom._geometry);
146     if (geom._posScaleArray.valid()) {
147         fw.indent() << "posScale " << geom._posScaleArray->size() << " {\n";
148         fw.moveIn();
149         for (Vec4Array::const_iterator iter = geom._posScaleArray->begin();
150              iter != geom._posScaleArray->end();
151              ++iter) {
152             fw.indent() << iter->x() << " " << iter->y() << " " << iter->z() << " "
153                         << iter->w() << "\n";
154         }
155         fw.moveOut();
156         fw.indent() << "}\n";
157     }
158     if (geom._vertexAttribArray.valid()) {
159         fw.indent() << "variety" << geom._vertexAttribArray->size() << " {\n";
160         fw.moveIn();
161         for (FloatArray::const_iterator iter = geom._vertexAttribArray->begin();
162              iter != geom._vertexAttribArray->end();
163              ++iter) {
164             fw.indent() << *iter << "\n";
165         }
166         fw.moveOut();
167         fw.indent() << "}\n";
168     }
169     return true;
170 }
171
172 osgDB::RegisterDotOsgWrapperProxy shaderGeometryProxy
173 (
174     new ShaderGeometry,
175     "ShaderGeometry",
176     "Object Drawable ShaderGeometry",
177     &ShaderGeometry_readLocalData,
178     &ShaderGeometry_writeLocalData
179     );
180 }
181