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