root/OpenSceneGraph/trunk/src/osgPlugins/ive/Geometry.cpp @ 13497

Revision 13497, 11.3 kB (checked in by robert, 17 hours ago)

Added support for changing background colour of LineEdit? widget when focus changes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/**********************************************************************
2 *
3 *    FILE:            Geometry.cpp
4 *
5 *    DESCRIPTION:    Read/Write osg::Geometry in binary format to disk.
6 *
7 *    CREATED BY:        Auto generated by iveGenerated
8 *                    and later modified by Rune Schmidt Jensen.
9 *
10 *    HISTORY:        Created 18.3.2003
11 *
12 *    Copyright 2003 VR-C
13 **********************************************************************/
14
15#include <osg/Config>
16#ifndef OSG_USE_DEPRECATED_GEOMETRY_METHODS 
17#define OSG_USE_DEPRECATED_GEOMETRY_METHODS 1
18#endif
19
20#include "Exception.h"
21#include "Geometry.h"
22#include "Drawable.h"
23#include "DrawArrays.h"
24#include "DrawArrayLengths.h"
25#include "DrawElementsUByte.h"
26#include "DrawElementsUShort.h"
27#include "DrawElementsUInt.h"
28
29using namespace ive;
30
31void Geometry::write(DataOutputStream* out){
32    // Write Geometry's identification.
33    out->writeInt(IVEGEOMETRY);
34
35    // If the osg class is inherited by any other class we should also write this to file.
36    osg::Drawable*  drawable = dynamic_cast<osg::Drawable*>(this);
37    if(drawable){
38        ((ive::Drawable*)(drawable))->write(out);
39    }
40    else
41        out_THROW_EXCEPTION("Geometry::write(): Could not cast this osg::Geometry to an osg::Drawable.");
42
43
44    // Write Geometry's properties.
45
46    // Write primitiveset list.
47    int size = getNumPrimitiveSets();
48    out->writeInt(size);
49    for(int i=0;i<size;i++){
50        if(dynamic_cast<osg::DrawArrays*>(getPrimitiveSet(i)))
51            ((ive::DrawArrays*)(getPrimitiveSet(i)))->write(out);
52        else if(dynamic_cast<osg::DrawArrayLengths*>(getPrimitiveSet(i)))
53            ((ive::DrawArrayLengths*)(getPrimitiveSet(i)))->write(out);
54        else if(dynamic_cast<osg::DrawElementsUByte*>(getPrimitiveSet(i)))
55            ((ive::DrawElementsUByte*)(getPrimitiveSet(i)))->write(out);
56        else if(dynamic_cast<osg::DrawElementsUShort*>(getPrimitiveSet(i)))
57            ((ive::DrawElementsUShort*)(getPrimitiveSet(i)))->write(out);
58        else if(dynamic_cast<osg::DrawElementsUInt*>(getPrimitiveSet(i)))
59            ((ive::DrawElementsUInt*)(getPrimitiveSet(i)))->write(out);
60        else
61            out_THROW_EXCEPTION("Unknown PrimitivSet in Geometry::write()");
62    }
63
64    // Write vertex array if any
65    out->writeBool(getVertexArray()!=0);
66    if (getVertexArray())
67    {
68        out->writeArray(getVertexArray());
69    }
70    // Write vertex indices if any
71    out->writeBool(getVertexIndices()!=0);
72    if (getVertexIndices())
73    {
74        out->writeArray(getVertexIndices());
75    }
76
77    // Write normal array if any
78    if ( out->getVersion() < VERSION_0013 )
79    {
80        osg::Vec3Array* normals = dynamic_cast<osg::Vec3Array*>(getNormalArray());
81        out->writeBool(normals!=0);
82        if (normals)
83        {
84            out->writeBinding(getNormalBinding());
85            out->writeVec3Array(normals);
86        }
87    }
88    else
89    {
90        out->writeBool(getNormalArray()!=0);
91        if (getNormalArray()!=0)
92        {
93            out->writeBinding(getNormalBinding());
94            out->writeArray(getNormalArray());
95        }
96    }
97
98    // Write normal indices if any
99    out->writeBool(getNormalIndices()!=0);
100    if (getNormalIndices()){
101        out->writeArray(getNormalIndices());
102    }
103    // Write color array if any.
104    out->writeBool(getColorArray()!=0);
105    if (getColorArray()){
106        out->writeBinding(getColorBinding());
107        out->writeArray(getColorArray());
108    }
109    // Write color indices if any
110    out->writeBool(getColorIndices()!=0);
111    if (getColorIndices()){
112        out->writeArray(getColorIndices());
113    }
114    // Write secondary color array if any
115    out->writeBool(getSecondaryColorArray()!=0);
116    if (getSecondaryColorArray()){
117        out->writeBinding(getSecondaryColorBinding());
118        out->writeArray(getSecondaryColorArray());
119    }
120    // Write second color indices if any
121    out->writeBool(getSecondaryColorIndices()!=0);
122    if (getSecondaryColorIndices()){
123        out->writeArray(getSecondaryColorIndices());
124    }
125    // Write fog coord array if any
126    out->writeBool(getFogCoordArray()!=0);
127    if (getFogCoordArray()){
128        out->writeBinding(getFogCoordBinding());
129        out->writeArray(getFogCoordArray());
130    }
131    // Write fog coord indices if any
132    out->writeBool(getFogCoordIndices()!=0);
133    if (getFogCoordIndices()){
134        out->writeArray(getFogCoordIndices());
135    }
136    // Write texture coord arrays
137    Geometry::ArrayList& tcal = getTexCoordArrayList();
138    out->writeInt(tcal.size());
139    unsigned int j;
140    for(j=0;j<tcal.size();j++)
141    {
142        // Write coords if valid
143        out->writeBool(tcal[j].valid());
144        if (tcal[j].valid()){
145            out->writeArray(tcal[j].get());
146        }
147       
148        // Write indices if valid
149        const osg::IndexArray* indices = getTexCoordIndices(j);
150        out->writeBool(indices!=0);
151        if (indices!=0){
152            out->writeArray(indices);
153        }
154    }
155
156    // Write vertex attributes
157    Geometry::ArrayList& vaal = getVertexAttribArrayList();
158    out->writeInt(vaal.size());
159    for(j=0;j<vaal.size();j++)
160    {
161        // Write coords if valid
162        const osg::Array* array = vaal[j].get();
163        if (array)
164        {
165            out->writeBinding(static_cast<osg::Geometry::AttributeBinding>(array->getBinding()));
166            out->writeBool(array->getNormalize());
167            out->writeBool(true);
168            out->writeArray(array);
169       
170            // Write indices if valid
171            const osg::IndexArray* indices = getVertexAttribIndices(j);
172            out->writeBool(indices!=0);
173            if (indices!=0){
174                out->writeArray(indices);
175            }
176        }
177        else
178        {
179            out->writeBinding(BIND_OFF);
180            out->writeBool(false);
181            out->writeBool(false);
182            out->writeBool(false);
183        }
184    }
185}
186
187void Geometry::read(DataInputStream* in){
188    // Read Geometry's identification.
189    int id = in->peekInt();
190    if(id == IVEGEOMETRY){
191        // Code to read Geometry's properties.
192        id = in->readInt();
193        // If the osg class is inherited by any other class we should also read this from file.
194        osg::Drawable*  drawable = dynamic_cast<osg::Drawable*>(this);
195        if(drawable){
196            ((ive::Drawable*)(drawable))->read(in);
197        }
198        else
199            in_THROW_EXCEPTION("Geometry::read(): Could not cast this osg::Geometry to an osg::Drawable.");
200
201
202        // Read geoemtry properties
203
204        // Read primitiveset list.
205        int size = in->readInt();
206        int i;
207        for(i=0;i<size;i++){
208            osg::PrimitiveSet* prim;
209            int primID = in->peekInt();
210            if(primID==IVEDRAWARRAYS){
211                prim = new osg::DrawArrays();
212                ((ive::DrawArrays*)(prim))->read(in);
213                addPrimitiveSet(prim);
214            }
215            else if(primID==IVEDRAWARRAYLENGTHS){
216                prim = new osg::DrawArrayLengths();
217                ((ive::DrawArrayLengths*)(prim))->read(in);
218                addPrimitiveSet(prim);
219            }
220            else if(primID==IVEDRAWELEMENTSUBYTE){
221                prim = new osg::DrawElementsUByte();
222                ((ive::DrawElementsUByte*)(prim))->read(in);
223                addPrimitiveSet(prim);
224            }
225            else if(primID==IVEDRAWELEMENTSUSHORT){
226                prim = new osg::DrawElementsUShort();
227                ((ive::DrawElementsUShort*)(prim))->read(in);
228                addPrimitiveSet(prim);
229            }
230            else if(primID==IVEDRAWELEMENTSUINT){
231                prim = new osg::DrawElementsUInt();
232                ((ive::DrawElementsUInt*)(prim))->read(in);
233                addPrimitiveSet(prim);
234            }
235            else{
236                in_THROW_EXCEPTION("Unknown PrimitiveSet in Geometry::read()");
237            }
238        }
239
240        // Read vertex array if any
241        bool va=in->readBool();
242        if (va){
243            setVertexArray(in->readArray());
244        }
245        // Read vertex indices if any
246        bool vi = in->readBool();
247        if (vi){
248            setVertexIndices(static_cast<osg::IndexArray*>(in->readArray()));
249        }
250
251        // Read normal array if any
252        if ( in->getVersion() < VERSION_0013 )
253        {
254            bool na =in->readBool();
255            if(na){
256                osg::Geometry::AttributeBinding binding = in->readBinding();
257                setNormalArray(in->readVec3Array());
258                setNormalBinding(binding);
259            }
260        }
261        else
262        {
263            bool na =in->readBool();
264            if(na){
265                osg::Geometry::AttributeBinding binding = in->readBinding();
266                setNormalArray(in->readArray());
267                setNormalBinding(binding);
268            }
269        }
270
271        // Read normal indices if any
272        bool ni = in->readBool();
273        if(ni){
274            setNormalIndices(static_cast<osg::IndexArray*>(in->readArray()));
275        }
276        // Read color array if any.
277        if(in->readBool()){
278            osg::Geometry::AttributeBinding binding = in->readBinding();
279            setColorArray(in->readArray());
280            setColorBinding(binding);
281        }
282        // Read color indices if any
283        if(in->readBool()){
284            setColorIndices(static_cast<osg::IndexArray*>(in->readArray()));
285        }
286        // Read secondary color array if any
287        if(in->readBool()){
288            osg::Geometry::AttributeBinding binding = in->readBinding();
289            setSecondaryColorArray(in->readArray());
290            setSecondaryColorBinding(binding);
291        }
292        // Read second color indices if any
293        if(in->readBool()){
294            setSecondaryColorIndices(static_cast<osg::IndexArray*>(in->readArray()));
295        }
296        // Read fog coord array if any
297        if(in->readBool()){
298            osg::Geometry::AttributeBinding binding = in->readBinding();
299            setFogCoordArray(in->readArray());
300            setFogCoordBinding(binding);
301        }
302        // Read fog coord indices if any
303        if(in->readBool()){
304            setFogCoordIndices(static_cast<osg::IndexArray*>(in->readArray()));
305        }
306        // Read texture coord arrays
307        size = in->readInt();
308        for(i =0;i<size;i++)
309        {
310            // Read coords if valid
311            bool coords_valid = in->readBool();
312            if(coords_valid)
313                setTexCoordArray(i, in->readArray());
314            // Read Indices if valid
315            bool indices_valid = in->readBool();
316            if(indices_valid)
317                setTexCoordIndices(i, static_cast<osg::IndexArray*>(in->readArray()));
318        }
319
320        // Read vertex attrib arrays
321        size = in->readInt();
322        for(i =0;i<size;i++)
323        {
324            osg::Geometry::AttributeBinding binding = in->readBinding();
325            bool normalize = in->readBool();
326
327            // Read coords if valid
328            bool coords_valid = in->readBool();
329            if(coords_valid)
330                setVertexAttribArray(i, in->readArray());
331
332            setVertexAttribNormalize(i,normalize);
333            setVertexAttribBinding(i,binding);
334
335            // Read Indices if valid
336            bool indices_valid = in->readBool();
337            if(indices_valid)
338                setVertexAttribIndices(i, static_cast<osg::IndexArray*>(in->readArray()));
339        }
340
341    }
342    else{
343        in_THROW_EXCEPTION("Geometry::read(): Expected Geometry identification.");
344    }
345}
Note: See TracBrowser for help on using the browser.