]> git.mxchange.org Git - simgear.git/blob - simgear/scene/tgdb/ShaderGeometry.cxx
Replace SG_USE_STD() by using std::
[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 using namespace osg;
29 using namespace osgDB;
30
31 namespace simgear
32 {
33 void ShaderGeometry::drawImplementation(RenderInfo& renderInfo) const
34 {
35     osg::State& state = *renderInfo.getState();
36     const Extensions* extensions = getExtensions(state.getContextID(),true);
37
38     for(TreeBin::TreeList::const_iterator t = _trees.begin(); t != _trees.end(); ++t)
39     {
40         extensions->glVertexAttrib1f(1, (float) t->texture_index/varieties);
41         glColor4f(t->position.x(), t->position.y(), t->position.z(), t->scale);
42         _geometry->draw(renderInfo);
43     }
44 }
45
46 BoundingBox ShaderGeometry::computeBound() const
47 {
48     BoundingBox geom_box = _geometry->getBound();
49     BoundingBox bb;
50     for(TreeBin::TreeList::const_iterator itr = _trees.begin();
51         itr != _trees.end();
52         ++itr) {
53          bb.expandBy(geom_box.corner(0)*itr->scale +
54                      osg::Vec3( itr->position.x(), itr->position.y(), itr->position.z() ));
55          bb.expandBy(geom_box.corner(7)*itr->scale +
56                      osg::Vec3( itr->position.x(), itr->position.y(), itr->position.z() ));
57     }
58     return bb;
59 }
60
61 bool ShaderGeometry_readLocalData(Object& obj, Input& fr)
62 {
63     bool iteratorAdvanced = false;
64
65     ShaderGeometry& geom = static_cast<ShaderGeometry&>(obj);
66
67     if ((fr[0].matchWord("geometry"))) {
68         ++fr;
69         iteratorAdvanced = true;
70         osg::Drawable* drawable = fr.readDrawable();
71         if (drawable) {
72             geom._geometry = drawable;
73         }
74     }
75     if ((fr.matchSequence("instances %i"))) {
76         int entry = fr[0].getNoNestedBrackets();
77         int capacity;
78         fr[1].getInt(capacity);
79         geom._trees.reserve(capacity);
80         fr += 3;
81         iteratorAdvanced = true;
82         // skip {
83         while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) {
84             SGVec3f v;
85             int t;
86             float s;
87             if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y())
88                 && fr[2].getFloat(v.z()) && fr[3].getInt(t) && fr[4].getFloat(s)) {
89                     fr += 4;
90                     //SGVec3f* v = new SGVec3f(v.x(), v.y(), v.z());
91                     //TreeBin::Tree tree = new TreeBin::Tree(v, t, s);
92                     geom._trees.push_back(TreeBin::Tree(v, t, s));
93             } else {
94                 ++fr;
95             }
96         }
97     }
98     return iteratorAdvanced;
99 }
100
101 bool ShaderGeometry_writeLocalData(const Object& obj, Output& fw)
102 {
103     const ShaderGeometry& geom = static_cast<const ShaderGeometry&>(obj);
104
105     fw.indent() << "geometry" << std::endl;
106     fw.writeObject(*geom._geometry);
107     fw.indent() << "instances " << geom._trees.size() << std::endl;
108     fw.indent() << "{" << std::endl;
109     fw.moveIn();
110     for (TreeBin::TreeList::const_iterator iter
111              = geom._trees.begin();
112          iter != geom._trees.end();
113          ++iter) {
114         fw.indent() << iter->position.x() << " " << iter->position.y() << " " << iter->position.z() << " "
115                     << iter->texture_index << " " << iter->scale << std::endl;
116     }
117     fw.moveOut();
118     fw.indent() << "}" << std::endl;
119     return true;
120 }
121
122 osgDB::RegisterDotOsgWrapperProxy shaderGeometryProxy
123 (
124     new ShaderGeometry,
125     "ShaderGeometry",
126     "Object Drawable ShaderGeometry",
127     &ShaderGeometry_readLocalData,
128     &ShaderGeometry_writeLocalData
129     );
130 }