source: branches/blt4/packages/vizservers/vtkvis/RpVtkRenderServer.cpp @ 2201

Last change on this file since 2201 was 2201, checked in by gah, 13 years ago
File size: 4.2 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * Copyright (C) 2011, Purdue Research Foundation
4 *
5 * Author: Leif Delgass <ldelgass@purdue.edu>
6 */
7
8#include <cstdio>
9#include <cstring>
10#include <cstdlib>
11#include <string>
12#include <sstream>
13#include <unistd.h>
14#include <signal.h>
15
16#include "Trace.h"
17#include "RpVtkRenderServer.h"
18#include "RpVtkRendererCmd.h"
19#include "RpVtkRenderer.h"
20#include "PPMWriter.h"
21#include "TGAWriter.h"
22
23using namespace Rappture::VtkVis;
24
25int Rappture::VtkVis::g_fdIn = STDIN_FILENO; ///< Input file descriptor
26int Rappture::VtkVis::g_fdOut = STDOUT_FILENO; ///< Output file descriptor
27FILE *Rappture::VtkVis::g_fIn = stdin; ///< Input file handle
28FILE *Rappture::VtkVis::g_fOut = stdout; ///< Output file handle
29FILE *Rappture::VtkVis::g_fLog = NULL; ///< Trace logging file handle
30Renderer *Rappture::VtkVis::g_renderer = NULL; ///< Main render worker
31
32static void
33writeFrame(int fd, vtkUnsignedCharArray *imgData)
34{
35#ifdef DEBUG
36    if (g_renderer->getCameraMode() == Renderer::IMAGE) {
37        double xywh[4];
38        g_renderer->getScreenWorldCoords(xywh);
39        TRACE("Image bbox: %g %g %g %g",
40              xywh[0],
41              (xywh[1] + xywh[3]),
42              (xywh[0] + xywh[2]),
43              xywh[1]);
44    }
45
46    writeTGAFile("/tmp/frame.tga",
47                 imgData->GetPointer(0),
48                 g_renderer->getWindowWidth(),
49                 g_renderer->getWindowHeight());
50#else
51    if (g_renderer->getCameraMode() == Renderer::IMAGE) {
52        double xywh[4];
53        g_renderer->getScreenWorldCoords(xywh);
54        std::ostringstream oss;
55        oss.precision(12);
56        // Send upper left and lower right corners as bbox
57        oss << "nv>image -type image -bbox {"
58            << std::scientific
59            << xywh[0] << " "
60            << (xywh[1] + xywh[3]) << " "
61            << (xywh[0] + xywh[2]) << " "
62            << xywh[1] << "} -bytes";
63
64        writePPM(fd, oss.str().c_str(),
65                 imgData->GetPointer(0),
66                 g_renderer->getWindowWidth(),
67                 g_renderer->getWindowHeight());
68    } else {
69        writePPM(fd, "nv>image -type image -bytes",
70                 imgData->GetPointer(0),
71                 g_renderer->getWindowWidth(),
72                 g_renderer->getWindowHeight());
73    }
74#endif
75}
76
77static void
78initService()
79{
80    const char *user = getenv("USER");
81    char *logName = NULL;
82    int logNameLen = 0;
83
84    if (user == NULL) {
85        logNameLen = 19+1;
86        logName = (char *)calloc(logNameLen, sizeof(char));
87        strncpy(logName, "/tmp/vtkvis_log.txt", logNameLen);
88    }
89    else {
90        logNameLen = 16+strlen(user)+4+1;
91        logName = (char *)calloc(logNameLen, sizeof(char));
92        strncpy(logName, "/tmp/vtkvis_log_", logNameLen);
93        strncat(logName, user, strlen(user));
94        strncat(logName, ".txt", 4);
95    }
96
97    // open log and map stderr to log file
98    g_fLog = fopen(logName, "w");
99    close(STDERR_FILENO);
100    dup2(fileno(g_fLog), STDERR_FILENO);
101    // flush junk
102    fflush(stderr);
103
104    // clean up malloc'd memory
105    if (logName != NULL) {
106        free(logName);
107    }
108}
109
110static void
111exitService()
112{
113    // close log file
114    if (g_fLog != NULL) {
115        fclose(g_fLog);
116        g_fLog = NULL;
117    }
118}
119
120int
121main(int argc, char *argv[])
122{
123    // Ignore SIGPIPE.  **Is this needed? **
124    signal(SIGPIPE, SIG_IGN);
125    initService();
126    InitLog();
127
128    TRACE("Starting VTKVis Server");
129
130    g_fIn = stdin;
131    g_fOut = stdout;
132    g_fdIn = fileno(stdin);
133    g_fdOut = fileno(stdout);
134
135    g_renderer = new Renderer();
136    vtkSmartPointer<vtkUnsignedCharArray> imgData =
137        vtkSmartPointer<vtkUnsignedCharArray>::New();
138
139    Tcl_Interp *interp = initTcl();
140
141    int ret = 0;
142
143    while (1) {
144        ret = processCommands(interp, g_fIn, g_fOut);
145        if (ret < 0)
146            break;
147
148        if (g_renderer->render()) {
149            TRACE("Rendering new frame");
150            g_renderer->getRenderedFrame(imgData);
151            writeFrame(g_fdOut, imgData);
152        } else {
153            TRACE("No render required");
154        }
155
156        if (feof(g_fIn))
157            break;
158    }
159
160    delete g_renderer;
161
162    TRACE("Exiting VTKVis Server");
163
164    CloseLog();
165    exitService();
166
167    return ret;
168}
169
Note: See TracBrowser for help on using the repository browser.