Changeset 4009 for trunk/packages
- Timestamp:
- Oct 25, 2013, 1:30:07 AM (11 years ago)
- Location:
- trunk/packages/vizservers/geovis
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/vizservers/geovis/Makefile.in
r3998 r4009 1 1 DEBUG = #yes 2 TRACE = #yes 2 DEBUG_WRITE_FRAME_FILE = #yes 3 TRACE = yes 3 4 USE_OFFSCREEN_RENDERING = #yes 4 5 USE_THREADS = yes … … 36 37 TCL_INC_SPEC = @TCL_INC_SPEC@ 37 38 38 OSG_LIB_DIR = @OSG_LIB_DIR@39 OSG_INC_SPEC = @OSG_INC_SPEC@39 OSG_LIB_DIR = 40 OSG_INC_SPEC = 40 41 OSG_LIB_SPEC = \ 41 42 -losg \ 42 43 -losgDB \ 43 -losgViewer 44 -losgViewer \ 45 -lOpenThreads 46 47 OSGEARTH_LIB_DIR = 48 OSGEARTH_INC_SPEC = 49 OSGEARTH_LIB_SPEC = \ 50 -losgEarth \ 51 -losgEarthUtil 44 52 45 53 LD_RUN_PATH = $(libdir) … … 47 55 LIBS = \ 48 56 $(TCL_LIB_SPEC) \ 57 $(OSGEARTH_LIB_SPEC) \ 49 58 $(OSG_LIB_SPEC) \ 50 59 $(GL_LIB_SPEC) \ … … 56 65 -I$(srcdir) \ 57 66 $(TCL_INC_SPEC) \ 67 $(OSGEARTH_INC_SPEC) \ 58 68 $(OSG_INC_SPEC) 59 69 … … 65 75 DEFINES += -DDEBUG 66 76 CXXFLAGS = -O0 -g 77 endif 78 ifdef DEBUG_WRITE_FRAME_FILE 79 DEFINES += -DDEBUG_WRITE_FRAME_FILE 67 80 endif 68 81 ifdef TRACE -
trunk/packages/vizservers/geovis/RenderServer.cpp
r3998 r4009 53 53 queueFrame(ResponseQueue *queue, const unsigned char *imgData) 54 54 { 55 #ifdef DEBUG 55 #ifdef DEBUG_WRITE_FRAME_FILE 56 56 57 57 #ifdef RENDER_TARGA … … 66 66 g_renderer->getWindowWidth(), 67 67 g_renderer->getWindowHeight(), 68 TARGA_BYTES_PER_PIXEL, 69 true); 68 TARGA_BYTES_PER_PIXEL); 70 69 #endif /*RENDER_TARGA*/ 71 70 … … 381 380 logName = (char *)calloc(logNameLen, sizeof(char)); 382 381 strncpy(logName, "/tmp/geovis_log.txt", logNameLen); 383 } 384 else { 382 } else { 385 383 logNameLen = 16+strlen(user)+4+1; 386 384 logName = (char *)calloc(logNameLen, sizeof(char)); … … 490 488 491 489 if (g_renderer->render()) { 492 TRACE("Rendering new frame"); 493 g_renderer->getRenderedFrame(imgData.get()); 490 TRACE("Rendered new frame"); 491 imgData = g_renderer->getRenderedFrame(); 492 if (imgData == NULL) { 493 ERROR("Empty image"); 494 } else { 495 TRACE("Image: %d x %d", imgData->s(), imgData->t()); 496 } 494 497 #ifdef USE_THREADS 495 498 queueFrame(g_queue, imgData->data()); -
trunk/packages/vizservers/geovis/Renderer.cpp
r3998 r4009 17 17 #endif 18 18 19 #include <osgEarth/Version> 20 #include <osgEarth/MapNode> 21 #include <osgEarth/TerrainLayer> 22 #include <osgEarth/ImageLayer> 23 #include <osgEarthUtil/EarthManipulator> 24 19 25 #include "Renderer.h" 20 26 #include "Trace.h" … … 35 41 _bgColor[2] = 0; 36 42 _viewer = new osgViewer::Viewer(); 43 _viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded); 44 _viewer->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(false, false); 45 _viewer->setReleaseContextAtEndOfFrameHint(false); 46 setBackgroundColor(_bgColor); 47 _captureCallback = new ScreenCaptureCallback(); 48 _viewer->getCamera()->setPostDrawCallback(_captureCallback.get()); 49 _sceneRoot = new osg::Node; 50 _viewer->setSceneData(_sceneRoot.get()); 51 _manipulator = new osgEarth::Util::EarthManipulator; 52 _viewer->setCameraManipulator(_manipulator); 53 _viewer->getCamera()->setNearFarRatio(0.00002); 54 _viewer->getCamera()->setSmallFeatureCullingPixelSize(-1.0f); 37 55 _viewer->setUpViewInWindow(0, 0, _windowWidth, _windowHeight); 38 setBackgroundColor(_bgColor);39 56 _viewer->realize(); 57 if (_viewer->getViewerStats() != NULL) { 58 TRACE("Enabling stats"); 59 _viewer->getViewerStats()->collectStats("scene", true); 60 } 40 61 } 41 62 … … 45 66 46 67 TRACE("Leave"); 68 } 69 70 void Renderer::loadEarthFile(const char *path) 71 { 72 TRACE("Loading %s", path); 73 _sceneRoot = osgDB::readNodeFile(path); 74 osgEarth::MapNode *mapNode = osgEarth::MapNode::findMapNode(_sceneRoot.get()); 75 if (mapNode == NULL) { 76 ERROR("Couldn't find MapNode"); 77 } else { 78 _map = mapNode->getMap(); 79 } 80 _viewer->setSceneData(_sceneRoot.get()); 81 _manipulator->setNode(NULL); 82 _manipulator->setNode(_sceneRoot.get()); 83 _manipulator->computeHomePosition(); 84 _viewer->home(); 85 _needsRedraw = true; 86 } 87 88 void Renderer::addImageLayer(const char *name, const osgEarth::TileSourceOptions& opts) 89 { 90 osgEarth::ImageLayerOptions layerOpts(name, opts); 91 _map->addImageLayer(new osgEarth::ImageLayer(layerOpts)); 92 } 93 94 void Renderer::removeImageLayer(const char *name) 95 { 96 osgEarth::ImageLayer *layer = _map->getImageLayerByName(name); 97 _map->removeImageLayer(layer); 98 } 99 100 void Renderer::moveImageLayer(const char *name, int pos) 101 { 102 osgEarth::ImageLayer *layer = _map->getImageLayerByName(name); 103 _map->moveImageLayer(layer, pos); 104 } 105 106 void Renderer::setImageLayerOpacity(const char *name, double opacity) 107 { 108 osgEarth::ImageLayer *layer = _map->getImageLayerByName(name); 109 layer->setOpacity(opacity); 110 } 111 112 void Renderer::setImageLayerVisibility(const char *name, bool state) 113 { 114 #if OSGEARTH_MIN_VERSION_REQUIRED(2, 4, 0) 115 osgEarth::ImageLayer *layer = _map->getImageLayerByName(name); 116 layer->setVisible(state); 117 #endif 47 118 } 48 119 … … 62 133 _windowWidth = width; 63 134 _windowHeight = height; 64 _viewer->setUpViewInWindow(0, 0, _windowWidth, _windowHeight); 65 135 osgViewer::ViewerBase::Windows windows; 136 _viewer->getWindows(windows); 137 if (windows.size() == 1) { 138 windows[0]->setWindowRectangle(0, 0, _windowWidth, _windowHeight); 139 } else { 140 ERROR("Num windows: %lu", windows.size()); 141 } 66 142 _needsRedraw = true; 67 143 } … … 87 163 { 88 164 TRACE("Enter: resetOrientation=%d", resetOrientation ? 1 : 0); 89 165 _viewer->home(); 90 166 _needsRedraw = true; 91 167 } … … 109 185 x, y, (absolute ? 1 : 0)); 110 186 187 _manipulator->pan(x, y); 188 _needsRedraw = true; 189 } 190 191 void Renderer::rotateCamera(double x, double y, bool absolute) 192 { 193 TRACE("Enter: %g %g, abs: %d", 194 x, y, (absolute ? 1 : 0)); 195 196 _manipulator->rotate(x, y); 111 197 _needsRedraw = true; 112 198 } … … 123 209 z, (absolute ? 1 : 0)); 124 210 211 // FIXME: zoom here wants y mouse coords in normalized viewport coords 212 213 _manipulator->zoom(0, z); 125 214 _needsRedraw = true; 126 215 } … … 159 248 160 249 if (_needsRedraw) { 161 // TODO: render 250 double _runMaxFrameRate = 60.0; 251 double minFrameTime = _runMaxFrameRate>0.0 ? 1.0/_runMaxFrameRate : 0.0; 252 osg::Timer_t startFrameTick = osg::Timer::instance()->tick(); 253 TRACE("Before frame()"); 162 254 _viewer->frame(); 255 TRACE("After frame()"); 256 osg::Timer_t endFrameTick = osg::Timer::instance()->tick(); 257 double frameTime = osg::Timer::instance()->delta_s(startFrameTick, endFrameTick); 258 TRACE("Frame time: %g sec", frameTime); 259 if (frameTime < minFrameTime) { 260 TRACE("Sleeping for %g secs", minFrameTime-frameTime); 261 OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(minFrameTime-frameTime))); 262 } 263 if (_viewer->getViewerStats() != NULL) { 264 _viewer->getViewerStats()->report(std::cerr, _viewer->getViewerStats()->getLatestFrameNumber()); 265 } 163 266 _needsRedraw = false; 164 267 return true; … … 170 273 * \brief Read back the rendered framebuffer image 171 274 */ 172 void Renderer::getRenderedFrame(osg::Image *image)173 { 174 175 } 275 osg::Image *Renderer::getRenderedFrame() 276 { 277 return _captureCallback->getImage(); 278 } -
trunk/packages/vizservers/geovis/Renderer.h
r3998 r4009 19 19 #include <osgViewer/Viewer> 20 20 21 #include <osgEarth/Map> 22 #include <osgEarth/ImageLayer> 23 #include <osgEarth/TileSource> 24 #include <osgEarthUtil/EarthManipulator> 25 21 26 #include "Types.h" 22 27 #include "Trace.h" 23 28 24 29 // Controls if TGA format is sent to client 25 //#define RENDER_TARGA30 #define RENDER_TARGA 26 31 #define TARGA_BYTES_PER_PIXEL 3 27 32 28 33 namespace GeoVis { 34 35 class ScreenCaptureCallback : public osg::Camera::DrawCallback 36 { 37 public: 38 ScreenCaptureCallback() : 39 osg::Camera::DrawCallback() 40 { 41 _image = new osg::Image; 42 } 43 44 virtual void operator()(osg::RenderInfo &renderInfo) const 45 { 46 TRACE("Enter"); 47 int width, height; 48 if (renderInfo.getCurrentCamera() == NULL) { 49 ERROR("No camera"); 50 return; 51 } 52 if (renderInfo.getCurrentCamera()->getViewport() == NULL) { 53 ERROR("No viewport"); 54 return; 55 } 56 width = (int)renderInfo.getCurrentCamera()->getViewport()->width(); 57 height = (int)renderInfo.getCurrentCamera()->getViewport()->height(); 58 TRACE("readPixels: %d x %d", width, height); 59 #ifdef RENDER_TARGA 60 _image->readPixels(0, 0, width, height, 61 GL_BGR, GL_UNSIGNED_BYTE); 62 #else 63 _image->readPixels(0, 0, width, height, 64 GL_RGB, GL_UNSIGNED_BYTE); 65 #endif 66 } 67 68 osg::Image *getImage() 69 { 70 return _image.get(); 71 } 72 73 private: 74 osg::ref_ptr<osg::Image> _image; 75 }; 29 76 30 77 /** … … 36 83 Renderer(); 37 84 virtual ~Renderer(); 85 86 // Scene 87 88 void loadEarthFile(const char *path); 89 90 // Image raster layers 91 92 void addImageLayer(const char *name, const osgEarth::TileSourceOptions& opts); 93 94 void removeImageLayer(const char *name); 95 96 void moveImageLayer(const char *name, int pos); 97 98 void setImageLayerOpacity(const char *name, double opacity); 99 100 void setImageLayerVisibility(const char *name, bool state); 101 102 // Elevation raster layers 103 104 105 106 // Model layers 107 108 38 109 39 110 // Render window … … 55 126 void setCameraOrientation(const double quat[4], bool absolute = true); 56 127 57 void panCamera(double x, double y, bool absolute = true);128 void panCamera(double x, double y, bool absolute = false); 58 129 59 void zoomCamera(double z, bool absolute = true); 130 void rotateCamera(double x, double y, bool absolute = false); 131 132 void zoomCamera(double z, bool absolute = false); 60 133 61 134 // Rendering an image … … 67 140 bool render(); 68 141 69 void getRenderedFrame(osg::Image *image);142 osg::Image *getRenderedFrame(); 70 143 71 144 private: … … 77 150 78 151 osg::ref_ptr<osg::Node> _sceneRoot; 79 //osgEarth::Map *_map;152 osg::ref_ptr<osgEarth::Map> _map; 80 153 osg::ref_ptr<osgViewer::Viewer> _viewer; 154 osg::ref_ptr<ScreenCaptureCallback> _captureCallback; 155 osg::ref_ptr<osgEarth::Util::EarthManipulator> _manipulator; 81 156 }; 82 157 -
trunk/packages/vizservers/geovis/RendererCmd.cpp
r3998 r4009 177 177 178 178 static int 179 CameraRotateOp(ClientData clientData, Tcl_Interp *interp, int objc, 180 Tcl_Obj *const *objv) 181 { 182 double x, y; 183 184 if (Tcl_GetDoubleFromObj(interp, objv[2], &x) != TCL_OK || 185 Tcl_GetDoubleFromObj(interp, objv[3], &y) != TCL_OK) { 186 return TCL_ERROR; 187 } 188 189 g_renderer->rotateCamera(x, y); 190 return TCL_OK; 191 } 192 193 static int 179 194 CameraZoomOp(ClientData clientData, Tcl_Interp *interp, int objc, 180 195 Tcl_Obj *const *objv) … … 191 206 192 207 static Rappture::CmdSpec cameraOps[] = { 193 {"orient", 3, CameraOrientOp, 6, 6, "qw qx qy qz"},208 {"orient", 1, CameraOrientOp, 6, 6, "qw qx qy qz"}, 194 209 {"pan", 1, CameraPanOp, 4, 4, "panX panY"}, 195 210 {"reset", 2, CameraResetOp, 2, 3, "?all?"}, 211 {"rotate", 2, CameraRotateOp, 4, 4, "azimuth elevation"}, 196 212 {"zoom", 1, CameraZoomOp, 3, 3, "zoomAmount"} 197 213 }; … … 296 312 297 313 static int 314 RendererLoadOp(ClientData clientData, Tcl_Interp *interp, int objc, 315 Tcl_Obj *const *objv) 316 { 317 g_renderer->loadEarthFile(Tcl_GetString(objv[2])); 318 return TCL_OK; 319 } 320 321 static int 298 322 RendererRenderOp(ClientData clientData, Tcl_Interp *interp, int objc, 299 323 Tcl_Obj *const *objv) … … 304 328 305 329 static Rappture::CmdSpec rendererOps[] = { 306 {"render", 1, RendererRenderOp, 2, 2, ""} 330 {"load", 1, RendererLoadOp, 3, 3, "path"}, 331 {"render", 1, RendererRenderOp, 2, 2, ""}, 307 332 }; 308 333 static int nRendererOps = NumCmdSpecs(rendererOps);
Note: See TracChangeset
for help on using the changeset viewer.