| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | #include "Block.h" |
|---|
| 9 | |
|---|
| 10 | #include <osg/Notify> |
|---|
| 11 | #include <osg/Matrix> |
|---|
| 12 | |
|---|
| 13 | using namespace lwosg; |
|---|
| 14 | |
|---|
| 15 | Block::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 | |
|---|
| 25 | void 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 | |
|---|
| 48 | void 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 | |
|---|
| 56 | read_common_attributes(imap->block_attributes); |
|---|
| 57 | |
|---|
| 58 | |
|---|
| 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 | |
|---|
| 131 | osg::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 | } |
|---|