Marcus Lindblom wrote:
[snip]

When I get back to work on tuesday I'll have another look at it and maybe post the code. (I've been mixing this with other work, so I haven't been able to fully concentrate on it yet. I'd like to do so first before taking anymore of you guys' time. :)

Here is my code. Is there anything obvious you can spot?

All my viewports are sized (0,0,1,1), so I assume that in this code.

/Marcus
---

void HiResScreenShot::doApply()
{
    using namespace osg;

    wnd::SGWindow::Ptr ptr(m_window.get());
    if (!ptr) {
        s_log.err("No window set!");
        return;
    }

    MFViewportPtr&  vs = m_window->getOSGWindow()->getPort();
    if (vs.empty()) {
        s_log.err("No viewports on window");
        return;
    }

    // make filename
    boost::posix_time::ptime time =     
        boost::posix_time::second_clock::local_time();

    std::ostringstream os;
    os << "Screenshot_" << time.date() << '_';
    os << time.time_of_day().hours() << '-' <<
        time.time_of_day().minutes();
    os << '-' << time.time_of_day().seconds();

    // create 'work-objects'
    GrabForegroundRefPtr grabber(GrabForeground::create());
    ImageRefPtr output(Image::create());
    output->set(Image::OSG_RGBA_PF, m_size.x(), m_size.y());

    ImageRefPtr img(Image::create());
    {
        CPEditAll(grabber);
        grabber->setImage(img);
        grabber->setActive(true);
        grabber->setAutoResize(true);
    }

    std::vector<TileCameraDecoratorRefPtr> decorators;
    decorators.resize(vs.size());
    for (size_t i = 0; i < vs.size(); ++i) {
        ViewportPtr vp = vs[i];

        TileCameraDecoratorPtr camdec = TileCameraDecorator::create();
        CPEditAll(camdec);
        camdec->setFullSize(m_size.x(), m_size.y());
        camdec->setDecoratee(vp->getCamera());
        decorators[i] = camdec;

        CPEditAll(vp);
        vp->setCamera(camdec);
        if (vp == vs.back()) {
            vp->getForegrounds().push_back(grabber);
        }
    }

    // grab all subscreens
    int maxWidth = m_window->getOSGWindow()->getWidth();
    int maxHeight = m_window->getOSGWindow()->getHeight();

    for (int xPos = 0; xPos < m_size.x(); xPos += maxWidth) {
        int xSize = std::min(maxWidth, m_size.x() - xPos);
        for (int yPos = 0; yPos < m_size.y(); yPos += maxHeight) {
            int ySize = std::min(maxHeight, m_size.y() - yPos);

            for (size_t i = 0; i < vs.size(); ++i) {
                ViewportPtr vp = vs[i];
                CPEditAll(vp);

                // coords > 1 are interpreted as pixels
                vp->setSize(0, 0, xSize, ySize);

                TileCameraDecoratorPtr camdec = decorators[i];
                CPEditAll(camdec);

                camdec->setSize(xPos / float(m_size.x()),
                                yPos / float(m_size.y()),
                                (xPos + xSize) / float(m_size.x()),
                                (yPos + ySize) / float(m_size.y()));
            }

            s_log.info("Grabbing image at %i,%i of size %i,%i",
                        xPos, yPos, xSize, ySize);
            m_window->render();

            CPEditAll(output);
            output->setSubData(xPos, yPos, 0, xSize, ySize, 0,
                               grabber->getImage()->getData());

            // save subimage for debug purposes
            std::ostringstream os2;
            os2 << os.str() << '_' << m_count++;
            saveImage(ImageRefPtr(grabber->getImage()), os2.str());
        }
    }

    // restore window
    for (size_t i = 0; i < vs.size(); ++i) {
        ViewportPtr vp = vs[i];
        CPEditAll(vp);
        vp->setCamera(decorators[i]->getDecoratee());
        vp->setSize(0, 0, 1, 1);
        if (vp == vs.back()) {
            base::erase_first(vp->getForegrounds(), grabber);
        }
    }

    boost::thread(boost::bind(saveImage, output, os.str()));
}


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to