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