root/OpenSceneGraph/trunk/src/osgPlugins/lwo/Block.cpp @ 13041

Revision 13041, 6.1 kB (checked in by robert, 2 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/*******************************************************
2      Lightwave Object Loader for OSG
3
4  Copyright (C) 2004 Marco Jez <marco.jez@poste.it>
5  OpenSceneGraph is (C) 2004 Robert Osfield
6********************************************************/
7
8#include "Block.h"
9
10#include <osg/Notify>
11#include <osg/Matrix>
12
13using namespace lwosg;
14
15Block::Block(const lwo2::FORM::SURF::BLOK *blok)
16:    enabled_(true),
17    opacity_type_(ADDITIVE),
18    opacity_amount_(1)
19{
20    if (blok) {
21        compile(blok);
22    }
23}
24
25void Block::read_common_attributes(const iff::Chunk_list &subchunks)
26{
27    for (iff::Chunk_list::const_iterator i=subchunks.begin(); i!=subchunks.end(); ++i) {
28        const lwo2::FORM::SURF::BLOK::CHAN *chan = dynamic_cast<const lwo2::FORM::SURF::BLOK::CHAN *>(*i);
29        if (chan) {
30            channel_ = std::string(chan->texture_channel.id, 4);
31        }
32        const lwo2::FORM::SURF::BLOK::ENAB *enab = dynamic_cast<const lwo2::FORM::SURF::BLOK::ENAB *>(*i);
33        if (enab) {
34            enabled_ = enab->enable != 0;
35        }
36        const lwo2::FORM::SURF::BLOK::OPAC *opac = dynamic_cast<const lwo2::FORM::SURF::BLOK::OPAC *>(*i);
37        if (opac) {
38            opacity_type_ = static_cast<Opacity_type>(opac->type);
39            opacity_amount_ = opac->opacity.fraction;
40        }
41        const lwo2::FORM::SURF::BLOK::AXIS *axis = dynamic_cast<const lwo2::FORM::SURF::BLOK::AXIS *>(*i);
42        if (axis) {
43            displacement_axis_ = static_cast<Axis_type>(axis->displacement_axis);
44        }
45    }
46}
47
48void Block::compile(const lwo2::FORM::SURF::BLOK *blok)
49{
50    const lwo2::FORM::SURF::BLOK::IMAP *imap = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP *>(blok->header);
51    if (imap) {
52        type_ = "IMAP";
53        ordinal_ = imap->ordinal;
54
55        // read common parameters
56        read_common_attributes(imap->block_attributes);
57
58        // read imagemap-related attributes
59        for (iff::Chunk_list::const_iterator i=blok->attributes.begin(); i!=blok->attributes.end(); ++i) {
60            const lwo2::FORM::SURF::BLOK::IMAP::TMAP *tmap = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::TMAP *>(*i);
61            if (tmap) {
62                Texture_mapping mapping;
63                for (iff::Chunk_list::const_iterator i=tmap->attributes.begin(); i!=tmap->attributes.end(); ++i) {
64                    const lwo2::FORM::SURF::BLOK::IMAP::TMAP::CNTR *cntr = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::TMAP::CNTR *>(*i);
65                    if (cntr) {
66                        mapping.center_ = osg::Vec3(cntr->vector.X, cntr->vector.Y, cntr->vector.Z);
67                    }
68                    const lwo2::FORM::SURF::BLOK::IMAP::TMAP::SIZE *size = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::TMAP::SIZE *>(*i);
69                    if (size) {
70                        mapping.size_ = osg::Vec3(size->vector.X, size->vector.Y, size->vector.Z);
71                    }
72                    const lwo2::FORM::SURF::BLOK::IMAP::TMAP::ROTA *rota = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::TMAP::ROTA *>(*i);
73                    if (rota) {
74                        mapping.rotation_ = osg::Vec3(rota->vector.X, rota->vector.Y, rota->vector.Z);
75                    }
76                    const lwo2::FORM::SURF::BLOK::IMAP::TMAP::CSYS *csys = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::TMAP::CSYS *>(*i);
77                    if (csys) {
78                        mapping.csys_ = static_cast<Texture_mapping::Coordinate_system_type>(csys->type);
79                    }
80                }
81                imap_.mapping = mapping;
82            }
83
84            const lwo2::FORM::SURF::BLOK::IMAP::PROJ *proj = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::PROJ *>(*i);
85            if (proj) {
86                imap_.projection = static_cast<Image_map::Projection_mode>(proj->projection_mode);
87            }
88
89            const lwo2::FORM::SURF::BLOK::IMAP::AXIS *axis = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::AXIS *>(*i);
90            if (axis) {
91                imap_.axis = static_cast<Image_map::Axis_type>(axis->texture_axis);
92            }
93
94            const lwo2::FORM::SURF::BLOK::IMAP::IMAG *imag = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::IMAG *>(*i);
95            if (imag) {
96                imap_.image_map = imag->texture_image.index;
97            }
98
99            const lwo2::FORM::SURF::BLOK::IMAP::WRAP *wrap = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::WRAP *>(*i);
100            if (wrap) {
101                imap_.width_wrap = static_cast<Image_map::Wrap_type>(wrap->width_wrap);
102                imap_.height_wrap = static_cast<Image_map::Wrap_type>(wrap->height_wrap);
103            }
104
105            const lwo2::FORM::SURF::BLOK::IMAP::WRPW *wrpw = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::WRPW *>(*i);
106            if (wrpw) {
107                imap_.wrap_amount_w = wrpw->cycles.fraction;
108            }
109
110            const lwo2::FORM::SURF::BLOK::IMAP::WRPH *wrph = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::WRPH *>(*i);
111            if (wrph) {
112                imap_.wrap_amount_h = wrph->cycles.fraction;
113            }
114
115            const lwo2::FORM::SURF::BLOK::IMAP::VMAP *vmap = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::VMAP *>(*i);
116            if (vmap) {
117                imap_.uv_map = vmap->txuv_map_name;
118            }
119
120            const lwo2::FORM::SURF::BLOK::IMAP::TAMP *tamp = dynamic_cast<const lwo2::FORM::SURF::BLOK::IMAP::TAMP *>(*i);
121            if (tamp) {
122                imap_.texture_amplitude = tamp->amplitude.fraction;
123            }
124        }
125
126    } else {
127        OSG_WARN << "Warning: lwosg::Block: only IMAP (image map) block types are supported, this block will be ignored" << std::endl;
128    }
129}
130
131osg::Vec3 Block::setup_texture_point(const osg::Vec3 &P) const
132{
133    osg::Vec3 Q = P;
134
135    const osg::Vec3 &ypr = imap_.mapping.rotation_;
136    Q -= imap_.mapping.center_;
137    Q = Q * osg::Matrix::rotate(ypr.z(), osg::Vec3(0, 0, -1));
138    Q = Q * osg::Matrix::rotate(ypr.x(), osg::Vec3(0, 1, 0));
139    Q = Q * osg::Matrix::rotate(ypr.y(), osg::Vec3(-1, 0, 0));
140    if (imap_.projection != Image_map::SPHERICAL) {
141        Q.x() *= 1/imap_.mapping.size_.x();
142        Q.y() *= 1/imap_.mapping.size_.y();
143        Q.z() *= 1/imap_.mapping.size_.z();
144    }
145
146    return Q;
147}
Note: See TracBrowser for help on using the browser.