⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scene.cpp

📁 最新osg包
💻 CPP
字号:
/* Importation de fichiers DXF dans OpenSceneGraph (see www.openscenegraph.org)Copyright (C) 2004 by Paul de Repentigny <pdr@grapharchitecture.com>*/#include "scene.h"#include "dxfTable.h"#include "aci.h"using namespace osg;using namespace std;osg::Vec4        sceneLayer::getColor(unsigned short color){    // you're supposed to have a correct color in hand    unsigned short r = color * 3;    unsigned short g = color * 3 + 1;    unsigned short b = color * 3 + 2;    Vec4 c(aci::table[r], aci::table[g], aci::table[b], 1.0f);    return c;}scene::scene(dxfLayerTable* lt) : _layerTable(lt){     _m.makeIdentity();     _r.makeIdentity(); }void scene::setLayerTable(dxfLayerTable* lt){     _layerTable = lt; }Vec3d scene::addVertex(Vec3d v) {    v += _t;    v = preMultd(_r, v);    osg::Matrixd m = osg::Matrixd::translate(v.x(), v.y(), v.z());    m = m * _m;    Vec3d a = preMultd(m, Vec3d(0,0,0));    _b.expandBy(a);    return a;}Vec3d scene::addNormal(Vec3d v) {    // to do: vertices are not always listed in order. find why.    return v;}void scene::addLine(const std::string & l, unsigned short color, Vec3d & s, Vec3d & e) {    dxfLayer* layer = _layerTable->findOrCreateLayer(l);    if (layer->getFrozen()) return;    sceneLayer* ly = findOrCreateSceneLayer(l);    Vec3d a(addVertex(s)), b(addVertex(e));    ly->_lines[correctedColorIndex(l, color)].push_back(a);    ly->_lines[correctedColorIndex(l, color)].push_back(b);}void scene::addLineStrip(const std::string & l, unsigned short color, std::vector<Vec3d> & vertices) {    dxfLayer* layer = _layerTable->findOrCreateLayer(l);    if (layer->getFrozen()) return;    sceneLayer* ly = findOrCreateSceneLayer(l);    std::vector<Vec3d> converted;    for (std::vector<Vec3d>::iterator itr = vertices.begin();        itr != vertices.end(); ++itr) {            converted.push_back(addVertex(*itr));    }    ly->_linestrips[correctedColorIndex(l, color)].push_back(converted);}void scene::addLineLoop(const std::string & l, unsigned short color, std::vector<Vec3d> & vertices) {    dxfLayer* layer = _layerTable->findOrCreateLayer(l);    if (layer->getFrozen()) return;    sceneLayer* ly = findOrCreateSceneLayer(l);    std::vector<Vec3d> converted;    for (std::vector<Vec3d>::iterator itr = vertices.begin();        itr != vertices.end(); ++itr) {            converted.push_back(addVertex(*itr));    }    converted.push_back(addVertex(vertices.front()));    ly->_linestrips[correctedColorIndex(l, color)].push_back(converted);}void scene::addTriangles(const std::string & l, unsigned short color, std::vector<Vec3d> & vertices, bool inverted) {    dxfLayer* layer = _layerTable->findOrCreateLayer(l);    if (layer->getFrozen()) return;    sceneLayer* ly = findOrCreateSceneLayer(l);    for (VList::iterator itr = vertices.begin();        itr != vertices.end(); ) {            VList::iterator a;            VList::iterator b;            VList::iterator c;            if (inverted) {                c = itr++;                b = itr++;                a = itr++;            } else {                a = itr++;                b = itr++;                c = itr++;            }                        if (a != vertices.end() &&                b != vertices.end() &&                c != vertices.end()) {                Vec3d n = ((*b - *a) ^ (*c - *a));                n.normalize();                ly->_trinorms[correctedColorIndex(l, color)].push_back( n );                ly->_triangles[correctedColorIndex(l, color)].push_back(addVertex(*a));                ly->_triangles[correctedColorIndex(l, color)].push_back(addVertex(*b));                ly->_triangles[correctedColorIndex(l, color)].push_back(addVertex(*c));            }    }}void scene::addQuads(const std::string & l, unsigned short color, std::vector<Vec3d> & vertices, bool inverted) {    dxfLayer* layer = _layerTable->findOrCreateLayer(l);    if (layer->getFrozen()) return;        sceneLayer* ly = findOrCreateSceneLayer(l);    for (VList::iterator itr = vertices.begin();        itr != vertices.end(); ) {            VList::iterator a = vertices.end();            VList::iterator b = vertices.end();            VList::iterator c = vertices.end();            VList::iterator d = vertices.end();            if (inverted) {                d = itr++;                if (itr != vertices.end())                    c = itr++;                if (itr != vertices.end())                    b = itr++;                if (itr != vertices.end())                    a = itr++;            } else {                a = itr++;                if (itr != vertices.end())                    b = itr++;                if (itr != vertices.end())                    c = itr++;                if (itr != vertices.end())                    d = itr++;            }            if (a != vertices.end() &&                b != vertices.end() &&                c != vertices.end()&&                d != vertices.end()) {                Vec3d n = ((*b - *a) ^ (*c - *a));                n.normalize();                short cindex = correctedColorIndex(l, color);                ly->_quadnorms[cindex].push_back( n );                MapVList mvl = ly->_quads;                VList vl = mvl[cindex];                vl.push_back(addVertex(*a));                vl.push_back(addVertex(*b));                vl.push_back(addVertex(*c));                vl.push_back(addVertex(*d));                mvl[cindex] = vl;                ly->_quads = mvl;            }    }}    void scene::addText(const std::string & l, unsigned short color, Vec3d & point, osgText::Text *text) {    dxfLayer* layer = _layerTable->findOrCreateLayer(l);    if (layer->getFrozen()) return;    sceneLayer* ly = findOrCreateSceneLayer(l);    // Apply the scene settings to the text size and rotation    Vec3d pscene(addVertex(point));    Vec3d xvec = addVertex( point + (text->getRotation() * X_AXIS) ) - pscene;    Vec3d yvec = addVertex( point + (text->getRotation() * Y_AXIS) ) - pscene;    text->setCharacterSize( text->getCharacterHeight()*yvec.length(), text->getCharacterAspectRatio()*yvec.length()/xvec.length() );    Matrix qm = _r * _m;    Vec3d t, s;    Quat ro, so;    qm.decompose( t, ro, s, so );    text->setRotation( text->getRotation() * ro );        sceneLayer::textInfo ti( correctedColorIndex(l,color), pscene, text );    ly->_textList.push_back(ti);}unsigned short scene::correctedColorIndex(const std::string & l, unsigned short color){    if (color >= aci::MIN && color <= aci::MAX)    {        return color;    }    else if (!color || color == aci::BYLAYER)    {        dxfLayer* layer = _layerTable->findOrCreateLayer(l);        unsigned short lcolor = layer->getColor();        if (lcolor >= aci::MIN && lcolor <= aci::MAX)        {            return lcolor;        }    }    return aci::WHITE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -