root/OpenSceneGraph/trunk/src/osgWrappers/deprecated-dotosg/osg/Camera.cpp @ 13041

Revision 13041, 14.3 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <osg/Camera>
2#include <osg/io_utils>
3#include <osg/Notify>
4
5#include <osgDB/Registry>
6#include <osgDB/Input>
7#include <osgDB/Output>
8
9#include "Matrix.h"
10
11#include <string.h>
12
13using namespace osg;
14using namespace osgDB;
15
16// forward declare functions to use later.
17bool Camera_readLocalData(Object& obj, Input& fr);
18bool Camera_writeLocalData(const Object& obj, Output& fw);
19
20bool Camera_matchBufferComponentStr(const char* str,Camera::BufferComponent& buffer);
21const char* Camera_getBufferComponentStr(Camera::BufferComponent buffer);
22
23
24// register the read and write functions with the osgDB::Registry.
25REGISTER_DOTOSGWRAPPER(Camera)
26(
27    new osg::Camera,
28    "Camera",
29    "Object Node Transform Camera Group",
30    &Camera_readLocalData,
31    &Camera_writeLocalData,
32    DotOsgWrapper::READ_AND_WRITE
33);
34
35// register the read and write functions with the osgDB::Registry.
36REGISTER_DOTOSGWRAPPER(CameraNode)
37(
38    new osg::Camera,
39    "CameraNode",
40    "Object Node Transform CameraNode Group",
41    &Camera_readLocalData,
42    &Camera_writeLocalData,
43    DotOsgWrapper::READ_AND_WRITE
44);
45
46bool Camera_readLocalData(Object& obj, Input& fr)
47{
48    bool iteratorAdvanced = false;
49
50    Camera& camera = static_cast<Camera&>(obj);
51
52    if (fr.matchSequence("clearColor %f %f %f %f"))
53    {
54        Vec4 color;
55        fr[1].getFloat(color[0]);
56        fr[2].getFloat(color[1]);
57        fr[3].getFloat(color[2]);
58        fr[4].getFloat(color[3]);
59        camera.setClearColor(color);
60        fr +=5 ;
61        iteratorAdvanced = true;
62    };
63
64    if (fr.matchSequence("clearMask %i"))
65    {
66        unsigned int value;
67        fr[1].getUInt(value);
68        camera.setClearMask(value);
69        fr += 2;
70        iteratorAdvanced = true;
71    }
72
73    osg::ref_ptr<osg::StateAttribute> attribute;
74    while((attribute=fr.readStateAttribute())!=NULL)
75    {
76        osg::Viewport* viewport = dynamic_cast<osg::Viewport*>(attribute.get());
77        if (viewport) camera.setViewport(viewport);
78        else
79        {
80            osg::ColorMask* colormask = dynamic_cast<osg::ColorMask*>(attribute.get());
81            camera.setColorMask(colormask);
82        }
83    }
84
85    if (fr.matchSequence("transformOrder %w"))
86    {
87        if      (fr[1].matchWord("PRE_MULTIPLY")) camera.setTransformOrder(osg::Camera::PRE_MULTIPLY);
88        else if (fr[1].matchWord("POST_MULTIPLY")) camera.setTransformOrder(osg::Camera::POST_MULTIPLY);
89        // the following are for backwards compatibility.
90        else if (fr[1].matchWord("PRE_MULTIPLE")) camera.setTransformOrder(osg::Camera::PRE_MULTIPLY);
91        else if (fr[1].matchWord("POST_MULTIPLE")) camera.setTransformOrder(osg::Camera::POST_MULTIPLY);
92
93        fr += 2;
94        iteratorAdvanced = true;
95    }
96
97    Matrix matrix;
98    if (readMatrix(matrix,fr,"ProjectionMatrix"))
99    {
100        camera.setProjectionMatrix(matrix);
101        iteratorAdvanced = true;
102    }
103
104    if (readMatrix(matrix,fr,"ViewMatrix"))
105    {
106        camera.setViewMatrix(matrix);
107        iteratorAdvanced = true;
108    }
109
110    if (fr.matchSequence("renderOrder %w"))
111    {
112        if      (fr[1].matchWord("PRE_RENDER")) camera.setRenderOrder(osg::Camera::PRE_RENDER);
113        else if (fr[1].matchWord("NESTED_RENDER")) camera.setRenderOrder(osg::Camera::NESTED_RENDER);
114        else if (fr[1].matchWord("POST_RENDER")) camera.setRenderOrder(osg::Camera::POST_RENDER);
115
116        fr += 2;
117        iteratorAdvanced = true;
118    }
119
120    if (fr.matchSequence("renderTargetImplementation %w"))
121    {
122        osg::Camera::RenderTargetImplementation implementation = osg::Camera::FRAME_BUFFER;
123
124        if      (fr[1].matchWord("FRAME_BUFFER_OBJECT")) implementation = osg::Camera::FRAME_BUFFER_OBJECT;
125        else if (fr[1].matchWord("PIXEL_BUFFER_RTT")) implementation = osg::Camera::PIXEL_BUFFER_RTT;
126        else if (fr[1].matchWord("PIXEL_BUFFER")) implementation = osg::Camera::PIXEL_BUFFER;
127        else if (fr[1].matchWord("FRAME_BUFFER")) implementation = osg::Camera::FRAME_BUFFER;
128        else if (fr[1].matchWord("SEPERATE_WINDOW")) implementation = osg::Camera::SEPERATE_WINDOW;
129
130        camera.setRenderTargetImplementation(implementation);
131
132        fr += 2;
133        iteratorAdvanced = true;
134    }
135
136    if (fr.matchSequence("renderTargetImplementation %w"))
137    {
138        osg::Camera::RenderTargetImplementation fallback = camera.getRenderTargetFallback();
139
140        if      (fr[1].matchWord("FRAME_BUFFER_OBJECT")) fallback = osg::Camera::FRAME_BUFFER_OBJECT;
141        else if (fr[1].matchWord("PIXEL_BUFFER_RTT")) fallback = osg::Camera::PIXEL_BUFFER_RTT;
142        else if (fr[1].matchWord("PIXEL_BUFFER")) fallback = osg::Camera::PIXEL_BUFFER;
143        else if (fr[1].matchWord("FRAME_BUFFER")) fallback = osg::Camera::FRAME_BUFFER;
144        else if (fr[1].matchWord("SEPERATE_WINDOW")) fallback = osg::Camera::SEPERATE_WINDOW;
145
146        camera.setRenderTargetImplementation(camera.getRenderTargetImplementation(), fallback);
147
148        fr += 2;
149        iteratorAdvanced = true;
150    }
151
152
153    if (fr.matchSequence("bufferComponent %w {"))
154    {
155        int entry = fr[1].getNoNestedBrackets();
156
157        Camera::BufferComponent buffer;
158        Camera_matchBufferComponentStr(fr[1].getStr(),buffer);
159
160        fr += 3;
161
162        Camera::Attachment& attachment = camera.getBufferAttachmentMap()[buffer];
163
164        // read attachment data.
165        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
166        {
167            bool localAdvance = false;
168
169            if (fr.matchSequence("internalFormat %i"))
170            {
171                // In their infinite wisdom, the Apple engineers changed the type
172                // of GLenum from 'unsigned int' to 'unsigned long', thus breaking
173                // the call by reference of getUInt.
174                unsigned int format;
175                fr[1].getUInt(format);
176                attachment._internalFormat = format;
177                fr += 2;
178                localAdvance = true;
179            }
180
181            osg::ref_ptr<osg::Object> attribute;
182            while((attribute=fr.readObject())!=NULL)
183            {
184                localAdvance = true;
185
186                osg::Texture* texture = dynamic_cast<osg::Texture*>(attribute.get());
187                if (texture) attachment._texture = texture;
188                else
189                {
190                    osg::Image* image = dynamic_cast<osg::Image*>(attribute.get());
191                    attachment._image = image;
192                }
193
194            }
195
196            if (fr.matchSequence("level %i"))
197            {
198                fr[1].getUInt(attachment._level);
199                fr += 2;
200                localAdvance = true;
201            }
202
203            if (fr.matchSequence("face %i"))
204            {
205                fr[1].getUInt(attachment._face);
206                fr += 2;
207                localAdvance = true;
208            }
209
210            if (fr.matchSequence("mipMapGeneration TRUE"))
211            {
212                attachment._mipMapGeneration = true;
213                fr += 2;
214                localAdvance = true;
215            }
216
217            if (fr.matchSequence("mipMapGeneration FALSE"))
218            {
219                attachment._mipMapGeneration = false;
220                fr += 2;
221                localAdvance = true;
222            }
223
224            if (!localAdvance) ++fr;
225        }
226
227        iteratorAdvanced = true;
228    }
229
230    return iteratorAdvanced;
231}
232
233
234bool Camera_writeLocalData(const Object& obj, Output& fw)
235{
236    const Camera& camera = static_cast<const Camera&>(obj);
237
238    fw.indent()<<"clearColor "<<camera.getClearColor()<<std::endl;
239    fw.indent()<<"clearMask 0x"<<std::hex<<camera.getClearMask()<<std::endl;
240
241    if (camera.getColorMask())
242    {
243        fw.writeObject(*camera.getColorMask());
244    }
245
246    if (camera.getViewport())
247    {
248        fw.writeObject(*camera.getViewport());
249    }
250
251    fw.indent()<<"transformOrder ";
252    switch(camera.getTransformOrder())
253    {
254        case(osg::Camera::PRE_MULTIPLY): fw <<"PRE_MULTIPLY"<<std::endl; break;
255        case(osg::Camera::POST_MULTIPLY): fw <<"POST_MULTIPLY"<<std::endl; break;
256    }
257
258    writeMatrix(camera.getProjectionMatrix(),fw,"ProjectionMatrix");
259    writeMatrix(camera.getViewMatrix(),fw,"ViewMatrix");
260
261    fw.indent()<<"renderOrder ";
262    switch(camera.getRenderOrder())
263    {
264        case(osg::Camera::PRE_RENDER): fw <<"PRE_RENDER"<<std::endl; break;
265        case(osg::Camera::NESTED_RENDER): fw <<"NESTED_RENDER"<<std::endl; break;
266        case(osg::Camera::POST_RENDER): fw <<"POST_RENDER"<<std::endl; break;
267    }
268
269    fw.indent()<<"renderTargetImplementation ";
270    switch(camera.getRenderTargetImplementation())
271    {
272        case(osg::Camera::FRAME_BUFFER_OBJECT): fw <<"FRAME_BUFFER_OBJECT"<<std::endl; break;
273        case(osg::Camera::PIXEL_BUFFER_RTT): fw <<"PIXEL_BUFFER_RTT"<<std::endl; break;
274        case(osg::Camera::PIXEL_BUFFER): fw <<"PIXEL_BUFFER"<<std::endl; break;
275        case(osg::Camera::FRAME_BUFFER): fw <<"FRAME_BUFFER"<<std::endl; break;
276        case(osg::Camera::SEPERATE_WINDOW): fw <<"SEPERATE_WINDOW"<<std::endl; break;
277    }
278
279    fw.indent()<<"renderTargetFallback ";
280    switch(camera.getRenderTargetFallback())
281    {
282        case(osg::Camera::FRAME_BUFFER_OBJECT): fw <<"FRAME_BUFFER_OBJECT"<<std::endl; break;
283        case(osg::Camera::PIXEL_BUFFER_RTT): fw <<"PIXEL_BUFFER_RTT"<<std::endl; break;
284        case(osg::Camera::PIXEL_BUFFER): fw <<"PIXEL_BUFFER"<<std::endl; break;
285        case(osg::Camera::FRAME_BUFFER): fw <<"FRAME_BUFFER"<<std::endl; break;
286        case(osg::Camera::SEPERATE_WINDOW): fw <<"SEPERATE_WINDOW"<<std::endl; break;
287    }
288
289    fw.indent()<<"drawBuffer "<<std::hex<<camera.getDrawBuffer()<<std::endl;
290    fw.indent()<<"readBuffer "<<std::hex<<camera.getReadBuffer()<<std::endl;
291
292    const osg::Camera::BufferAttachmentMap& bam = camera.getBufferAttachmentMap();
293    if (!bam.empty())
294    {
295        for(osg::Camera::BufferAttachmentMap::const_iterator itr=bam.begin();
296            itr!=bam.end();
297            ++itr)
298        {
299            const osg::Camera::Attachment& attachment = itr->second;
300            fw.indent()<<"bufferComponent "<<Camera_getBufferComponentStr(itr->first)<<" {"<<std::endl;
301            fw.moveIn();
302
303            fw.indent()<<"internalFormat "<<attachment._internalFormat<<std::endl;
304            if (attachment._texture.valid())
305            {
306                fw.writeObject(*attachment._texture.get());
307            }
308            fw.indent()<<"level "<<attachment._level<<std::endl;
309            fw.indent()<<"face "<<attachment._face<<std::endl;
310            fw.indent()<<"mipMapGeneration "<<(attachment._mipMapGeneration ? "TRUE" : "FALSE")<<std::endl;
311
312            fw.moveOut();
313            fw.indent()<<"}"<<std::endl;
314        }
315    }
316
317    return true;
318}
319
320bool Camera_matchBufferComponentStr(const char* str,Camera::BufferComponent& buffer)
321{
322    if      (strcmp(str,"DEPTH_BUFFER")==0)                 buffer = osg::Camera::DEPTH_BUFFER;
323    else if (strcmp(str,"STENCIL_BUFFER")==0)               buffer = osg::Camera::STENCIL_BUFFER;
324    else if (strcmp(str,"PACKED_DEPTH_STENCIL_BUFFER")==0)  buffer = osg::Camera::PACKED_DEPTH_STENCIL_BUFFER;
325    else if (strcmp(str,"COLOR_BUFFER")==0)                 buffer = osg::Camera::COLOR_BUFFER;
326    else if (strcmp(str,"COLOR_BUFFER0")==0)                buffer = osg::Camera::COLOR_BUFFER0;
327    else if (strcmp(str,"COLOR_BUFFER1")==0)                buffer = osg::Camera::COLOR_BUFFER1;
328    else if (strcmp(str,"COLOR_BUFFER2")==0)                buffer = osg::Camera::COLOR_BUFFER2;
329    else if (strcmp(str,"COLOR_BUFFER3")==0)                buffer = osg::Camera::COLOR_BUFFER3;
330    else if (strcmp(str,"COLOR_BUFFER4")==0)                buffer = osg::Camera::COLOR_BUFFER4;
331    else if (strcmp(str,"COLOR_BUFFER5")==0)                buffer = osg::Camera::COLOR_BUFFER5;
332    else if (strcmp(str,"COLOR_BUFFER6")==0)                buffer = osg::Camera::COLOR_BUFFER6;
333    else if (strcmp(str,"COLOR_BUFFER7")==0)                buffer = osg::Camera::COLOR_BUFFER7;
334    else if (strcmp(str,"COLOR_BUFFER8")==0)                buffer = osg::Camera::COLOR_BUFFER8;
335    else if (strcmp(str,"COLOR_BUFFER9")==0)                buffer = osg::Camera::COLOR_BUFFER9;
336    else if (strcmp(str,"COLOR_BUFFER10")==0)               buffer = osg::Camera::COLOR_BUFFER10;
337    else if (strcmp(str,"COLOR_BUFFER11")==0)               buffer = osg::Camera::COLOR_BUFFER11;
338    else if (strcmp(str,"COLOR_BUFFER12")==0)               buffer = osg::Camera::COLOR_BUFFER12;
339    else if (strcmp(str,"COLOR_BUFFER13")==0)               buffer = osg::Camera::COLOR_BUFFER13;
340    else if (strcmp(str,"COLOR_BUFFER14")==0)               buffer = osg::Camera::COLOR_BUFFER14;
341    else if (strcmp(str,"COLOR_BUFFER15")==0)               buffer = osg::Camera::COLOR_BUFFER15;
342    else return false;
343    return true;
344}
345const char* Camera_getBufferComponentStr(Camera::BufferComponent buffer)
346{
347    switch(buffer)
348    {
349        case (osg::Camera::DEPTH_BUFFER)                : return "DEPTH_BUFFER";
350        case (osg::Camera::STENCIL_BUFFER)              : return "STENCIL_BUFFER";
351        case (osg::Camera::PACKED_DEPTH_STENCIL_BUFFER) : return "PACKED_DEPTH_STENCIL_BUFFER";
352        case (osg::Camera::COLOR_BUFFER)                : return "COLOR_BUFFER";
353        case (osg::Camera::COLOR_BUFFER0)               : return "COLOR_BUFFER0";
354        case (osg::Camera::COLOR_BUFFER1)               : return "COLOR_BUFFER1";
355        case (osg::Camera::COLOR_BUFFER2)               : return "COLOR_BUFFER2";
356        case (osg::Camera::COLOR_BUFFER3)               : return "COLOR_BUFFER3";
357        case (osg::Camera::COLOR_BUFFER4)               : return "COLOR_BUFFER4";
358        case (osg::Camera::COLOR_BUFFER5)               : return "COLOR_BUFFER5";
359        case (osg::Camera::COLOR_BUFFER6)               : return "COLOR_BUFFER6";
360        case (osg::Camera::COLOR_BUFFER7)               : return "COLOR_BUFFER7";
361        case (osg::Camera::COLOR_BUFFER8)               : return "COLOR_BUFFER8";
362        case (osg::Camera::COLOR_BUFFER9)               : return "COLOR_BUFFER9";
363        case (osg::Camera::COLOR_BUFFER10)              : return "COLOR_BUFFER10";
364        case (osg::Camera::COLOR_BUFFER11)              : return "COLOR_BUFFER11";
365        case (osg::Camera::COLOR_BUFFER12)              : return "COLOR_BUFFER12";
366        case (osg::Camera::COLOR_BUFFER13)              : return "COLOR_BUFFER13";
367        case (osg::Camera::COLOR_BUFFER14)              : return "COLOR_BUFFER14";
368        case (osg::Camera::COLOR_BUFFER15)              : return "COLOR_BUFFER15";
369        default                                         : return "UnknownBufferComponent";
370    }
371}
Note: See TracBrowser for help on using the browser.