source: nanovis/trunk/Unirect.cpp @ 4878

Last change on this file since 4878 was 4878, checked in by ldelgass, 9 years ago

sync

  • Property svn:eol-style set to native
File size: 22.6 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * Copyright (C) 2004-2013  HUBzero Foundation, LLC
4 *
5 * Author: George A. Howlett <gah@purdue.edu>
6 */
7#include <float.h>
8
9#include <tcl.h>
10
11#include "Command.h"
12#include "Unirect.h"
13#include "Trace.h"
14
15using namespace nv;
16
17static inline char *
18skipspaces(char *string)
19{
20    while (isspace(*string)) {
21        string++;
22    }
23    return string;
24}
25
26static inline char *
27getline(char **stringPtr, char *endPtr)
28{
29    char *line, *p;
30
31    line = skipspaces(*stringPtr);
32    for (p = line; p < endPtr; p++) {
33        if (*p == '\n') {
34            *p++ = '\0';
35            *stringPtr = p;
36            return line;
37        }
38    }
39    *stringPtr = p;
40    return line;
41}
42
43int
44nv::Unirect2d::parseBuffer(Tcl_Interp *interp, const char *bytes, size_t len)
45{
46    Tcl_Obj *objPtr = Tcl_NewStringObj(bytes, len);
47    Tcl_Obj **objv;
48    int objc;
49    if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) {
50        return TCL_ERROR;
51    }
52    int result = loadData(interp, objc, objv);
53    Tcl_DecrRefCount(objPtr);
54    if ((result != TCL_OK) || (!isInitialized())) {
55        return TCL_ERROR;
56    }
57    return TCL_OK;
58}
59
60int
61nv::Unirect3d::parseBuffer(Tcl_Interp *interp, const char *bytes, size_t len)
62{
63    Tcl_Obj *objPtr = Tcl_NewStringObj(bytes, len);
64    Tcl_Obj **objv;
65    int objc;
66    if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) {
67        return TCL_ERROR;
68    }
69    int result = loadData(interp, objc, objv);
70    Tcl_DecrRefCount(objPtr);
71    if ((result != TCL_OK) || (!isInitialized())) {
72        return TCL_ERROR;
73    }
74    return TCL_OK;
75}
76
77int
78nv::Unirect3d::loadData(Tcl_Interp *interp, int objc,
79                        Tcl_Obj *const *objv)
80{
81    int num[3], nValues;
82    float min[3], max[3];
83    const char *units[4];
84
85    if ((objc-1) & 0x01) {
86        Tcl_AppendResult(interp, Tcl_GetString(objv[0]), ": ",
87                "wrong # of arguments: should be key-value pairs",
88                (char *)NULL);
89        return TCL_ERROR;
90    }
91
92    /* Default order is  z, y, x. */
93    int axis1, axis2, axis3;
94    axis1 = 0;                  /* X-axis */
95    axis2 = 1;                  /* Y-axis */
96    axis3 = 2;                  /* Z-axis */
97
98    num[0] = num[1] = num[2] = nValues = 0;
99    min[0] = min[1] = min[2] = max[0] = max[1] = max[2] = 0.0f;
100    units[0] = units[1] = units[2] = units[3] = NULL;
101
102    int i;
103    for (i = 1; i < objc; i += 2) {
104        const char *string;
105        char c;
106
107        string = Tcl_GetString(objv[i]);
108        c = string[0];
109        if ((c == 'x') && (strcmp(string, "xmin") == 0)) {
110            if (GetFloatFromObj(interp, objv[i+1], min+2) != TCL_OK) {
111                return TCL_ERROR;
112            }
113        } else if ((c == 'x') && (strcmp(string, "xmax") == 0)) {
114            if (GetFloatFromObj(interp, objv[i+1], max+2) != TCL_OK) {
115                return TCL_ERROR;
116            }
117        } else if ((c == 'x') && (strcmp(string, "xnum") == 0)) {
118            if (Tcl_GetIntFromObj(interp, objv[i+1], num+2) != TCL_OK) {
119                return TCL_ERROR;
120            }
121            if (num[2] <= 0) {
122                Tcl_AppendResult(interp, "bad xnum value: must be > 0",
123                     (char *)NULL);
124                return TCL_ERROR;
125            }
126        } else if ((c == 'x') && (strcmp(string, "xunits") == 0)) {
127            units[2] = Tcl_GetString(objv[i+1]);
128        } else if ((c == 'y') && (strcmp(string, "ymin") == 0)) {
129            if (GetFloatFromObj(interp, objv[i+1], min+1) != TCL_OK) {
130                return TCL_ERROR;
131            }
132        } else if ((c == 'y') && (strcmp(string, "ymax") == 0)) {
133            if (GetFloatFromObj(interp, objv[i+1], max+1) != TCL_OK) {
134                return TCL_ERROR;
135            }
136        } else if ((c == 'y') && (strcmp(string, "ynum") == 0)) {
137            if (Tcl_GetIntFromObj(interp, objv[i+1], num+1) != TCL_OK) {
138                return TCL_ERROR;
139            }
140            if (num[1] <= 0) {
141                Tcl_AppendResult(interp, "bad ynum value: must be > 0",
142                                 (char *)NULL);
143                return TCL_ERROR;
144            }
145        } else if ((c == 'y') && (strcmp(string, "yunits") == 0)) {
146            units[1] = Tcl_GetString(objv[i+1]);
147        } else if ((c == 'z') && (strcmp(string, "zmin") == 0)) {
148            if (GetFloatFromObj(interp, objv[i+1], min) != TCL_OK) {
149                return TCL_ERROR;
150            }
151        } else if ((c == 'z') && (strcmp(string, "zmax") == 0)) {
152            if (GetFloatFromObj(interp, objv[i+1], max) != TCL_OK) {
153                return TCL_ERROR;
154            }
155        } else if ((c == 'z') && (strcmp(string, "znum") == 0)) {
156            if (Tcl_GetIntFromObj(interp, objv[i+1], num) != TCL_OK) {
157                return TCL_ERROR;
158            }
159            if (num[0] <= 0) {
160                Tcl_AppendResult(interp, "bad znum value: must be > 0",
161                                 (char *)NULL);
162                return TCL_ERROR;
163            }
164        } else if ((c == 'z') && (strcmp(string, "zunits") == 0)) {
165            units[0] = Tcl_GetString(objv[i+1]);
166        } else if ((c == 'v') && (strcmp(string, "values") == 0)) {
167            Tcl_Obj **vobj;
168
169            if (Tcl_ListObjGetElements(interp, objv[i+1], &nValues, &vobj)
170                != TCL_OK) {
171                return TCL_ERROR;
172            }
173            _values = (float *)realloc(_values, sizeof(float) * nValues);
174            int j;
175            for (j = 0; j < nValues; j++) {
176                if (GetFloatFromObj(interp, vobj[j], _values + j)!=TCL_OK) {
177                    return TCL_ERROR;
178                }
179            }
180        } else if ((c == 'u') && (strcmp(string, "units") == 0)) {
181            _vUnits = strdup(Tcl_GetString(objv[i+1]));
182        } else if ((c == 'c') && (strcmp(string, "components") == 0)) {
183            int n;
184
185            if (Tcl_GetIntFromObj(interp, objv[i+1], &n) != TCL_OK) {
186                return TCL_ERROR;
187            }
188            if (n <= 0) {
189                Tcl_AppendResult(interp, "bad extents value: must be > 0",
190                                 (char *)NULL);
191                return TCL_ERROR;
192            }
193            _nComponents = n;
194        } else if ((c == 'a') && (strcmp(string, "axisorder") == 0)) {
195            Tcl_Obj **axes;
196            int n;
197
198            if (Tcl_ListObjGetElements(interp, objv[i+1], &n, &axes)
199                != TCL_OK) {
200                return TCL_ERROR;
201            }
202            if (n != 3) {
203                return TCL_ERROR;
204            }
205            if ((GetAxisFromObj(interp, axes[0], &axis1) != TCL_OK) ||
206                (GetAxisFromObj(interp, axes[1], &axis2) != TCL_OK) ||
207                (GetAxisFromObj(interp, axes[2], &axis3) != TCL_OK)) {
208                return TCL_ERROR;
209            }
210        } else {
211            Tcl_AppendResult(interp, "unknown key \"", string,
212                (char *)NULL);
213            return TCL_ERROR;
214        }
215    }
216    if (_values == NULL) {
217        Tcl_AppendResult(interp, "missing \"values\" key", (char *)NULL);
218        return TCL_ERROR;
219    }
220    if ((size_t)nValues != (num[0] * num[1] * num[2] * _nComponents)) {
221        TRACE("num[0]=%d num[1]=%d num[2]=%d ncomponents=%d nValues=%d",
222               num[0], num[1], num[2], _nComponents, nValues);
223        Tcl_AppendResult(interp,
224                "wrong # of values: must be xnum*ynum*znum*extents",
225                         (char *)NULL);
226       return TCL_ERROR;
227    }
228   
229#ifdef notdef
230    if ((axis1 != 0) || (axis2 != 1) || (axis3 != 2)) {
231        // Reorder the data into x, y, z where x varies fastest and so on.
232        int z;
233        float *data, *dp;
234
235        dp = data = new float[nValues];
236        for (z = 0; z < num[0]; z++) {
237            int y;
238
239            for (y = 0; y < num[1]; y++) {
240                int x;
241
242                for (x = 0; x < num[2]; x++) {
243                    int i;
244                   
245                    /* Compute the index from the data's described ordering. */
246                    i = ((z*num[axis2]*num[axis3]) + (y*num[axis3]) + x) * 3;
247                    for(size_t v = 0; v < _nComponents; v++) {
248                        dp[v] = values[i+v];
249                    }
250                    dp += _nComponents;
251                }
252            }
253        }
254        delete [] values;
255        values = data;
256    }
257#endif
258    _nValues = nValues;
259    if (units[3] != NULL) {
260        if (_vUnits != NULL) {
261            free(_vUnits);
262        }
263        _vUnits = strdup(units[3]);
264    }
265    _xMin = min[axis3];
266    _xMax = max[axis3];
267    _xNum = num[axis3];
268    if (units[axis3] != NULL) {
269        if (_xUnits != NULL) {
270            free(_xUnits);
271        }
272        _xUnits = strdup(units[axis3]);
273    }
274    _yMin = min[axis2];
275    _yMax = max[axis2];
276    _yNum = num[axis2];
277    if (units[axis2] != NULL) {
278        if (_yUnits != NULL) {
279            free(_yUnits);
280        }
281        _yUnits = strdup(units[axis2]);
282    }
283    _zMin = min[axis1];
284    _zMax = max[axis1];
285    _zNum = num[axis1];
286    if (units[axis1] != NULL) {
287        if (_zUnits != NULL) {
288            free(_zUnits);
289        }
290        _zUnits = strdup(units[axis1]);
291    }
292    _initialized = true;
293#ifdef notdef
294    {
295        FILE *f;
296        f = fopen("/tmp/unirect3d.txt", "w");
297        fprintf(f, "unirect3d xmin %g xmax %g xnum %d ", _xMin, _xMax, _xNum);
298        fprintf(f, "ymin %g ymax %g ynum %d ", _yMin, _yMax, _yNum);
299        fprintf(f, "zmin %g zmax %g znum %d ", _zMin, _zMax, _zNum);
300        fprintf(f, "components %d values {\n",  _nComponents);
301        for (size_t i = 0; i < _nValues; i+= 3) {
302            fprintf(f, "%g %g %g\n", _values[i], _values[i+1], _values[i+2]);
303        }
304        fprintf(f, "}\n");
305        fclose(f);
306    }
307#endif
308    return TCL_OK;
309}
310
311int
312nv::Unirect2d::loadData(Tcl_Interp *interp, int objc,
313                        Tcl_Obj *const *objv)
314{
315    if ((objc & 0x01) == 0) {
316        Tcl_AppendResult(interp, Tcl_GetString(objv[0]), ": ",
317                "wrong number of arguments: should be key-value pairs",
318                (char *)NULL);
319        return TCL_ERROR;
320    }
321
322    int axis[2];
323    axis[0] = 1;                         /* X-axis */
324    axis[1] = 0;                        /* Y-axis */
325
326    _xNum = _yNum = _nValues = 0;
327    _xMin = _yMin = _xMax = _yMax = 0.0f;
328    if (_xUnits != NULL) {
329        free(_xUnits);
330    }
331    if (_yUnits != NULL) {
332        free(_yUnits);
333    }
334    if (_vUnits != NULL) {
335        free(_vUnits);
336    }
337    _xUnits = _yUnits = _vUnits = NULL;
338    _nValues = 0;
339
340    int i;
341    for (i = 1; i < objc; i += 2) {
342        const char *string;
343        char c;
344
345        string = Tcl_GetString(objv[i]);
346        c = string[0];
347        if ((c == 'x') && (strcmp(string, "xmin") == 0)) {
348            if (GetFloatFromObj(interp, objv[i+1], &_xMin) != TCL_OK) {
349                return TCL_ERROR;
350            }
351        } else if ((c == 'x') && (strcmp(string, "xmax") == 0)) {
352            if (GetFloatFromObj(interp, objv[i+1], &_xMax) != TCL_OK) {
353                return TCL_ERROR;
354            }
355        } else if ((c == 'x') && (strcmp(string, "xnum") == 0)) {
356            int n;
357            if (Tcl_GetIntFromObj(interp, objv[i+1], &n) != TCL_OK) {
358                return TCL_ERROR;
359            }
360            if (n <= 0) {
361                Tcl_AppendResult(interp, "bad xnum value: must be > 0",
362                     (char *)NULL);
363                return TCL_ERROR;
364            }
365            _xNum = n;
366        } else if ((c == 'x') && (strcmp(string, "xunits") == 0)) {
367            _xUnits = strdup(Tcl_GetString(objv[i+1]));
368        } else if ((c == 'y') && (strcmp(string, "ymin") == 0)) {
369            if (GetFloatFromObj(interp, objv[i+1], &_yMin) != TCL_OK) {
370                return TCL_ERROR;
371            }
372        } else if ((c == 'y') && (strcmp(string, "ymax") == 0)) {
373            if (GetFloatFromObj(interp, objv[i+1], &_yMax) != TCL_OK) {
374                return TCL_ERROR;
375            }
376        } else if ((c == 'y') && (strcmp(string, "ynum") == 0)) {
377            int n;
378            if (Tcl_GetIntFromObj(interp, objv[i+1], &n) != TCL_OK) {
379                return TCL_ERROR;
380            }
381            if (n <= 0) {
382                Tcl_AppendResult(interp, "bad ynum value: must be > 0",
383                                 (char *)NULL);
384                return TCL_ERROR;
385            }
386            _yNum = n;
387        } else if ((c == 'y') && (strcmp(string, "yunits") == 0)) {
388            _yUnits = strdup(Tcl_GetString(objv[i+1]));
389        } else if ((c == 'v') && (strcmp(string, "values") == 0)) {
390            Tcl_Obj **vobj;
391            int n;
392
393            Tcl_IncrRefCount(objv[i+1]);
394            if (Tcl_ListObjGetElements(interp, objv[i+1], &n, &vobj) != TCL_OK){
395                return TCL_ERROR;
396            }
397            if (n <= 0) {
398                Tcl_AppendResult(interp, "empty values list : must be > 0",
399                                 (char *)NULL);
400                return TCL_ERROR;
401            }
402            _nValues = n;
403            _values = (float *)realloc(_values, sizeof(float) * _nValues);
404            size_t j;
405            for (j = 0; j < _nValues; j++) {
406                if (GetFloatFromObj(interp, vobj[j], _values + j)!=TCL_OK) {
407                    return TCL_ERROR;
408                }
409            }
410            Tcl_DecrRefCount(objv[i+1]);
411        } else if ((c == 'u') && (strcmp(string, "units") == 0)) {
412            _vUnits = strdup(Tcl_GetString(objv[i+1]));
413        } else if ((c == 'c') && (strcmp(string, "components") == 0)) {
414            int n;
415
416            if (Tcl_GetIntFromObj(interp, objv[i+1], &n) != TCL_OK) {
417                return TCL_ERROR;
418            }
419            if (n <= 0) {
420                Tcl_AppendResult(interp, "bad extents value: must be > 0",
421                                 (char *)NULL);
422                return TCL_ERROR;
423            }
424            _nComponents = n;
425        } else if ((c == 'a') && (strcmp(string, "axisorder") == 0)) {
426            Tcl_Obj **order;
427            int n;
428
429            if (Tcl_ListObjGetElements(interp, objv[i+1], &n, &order)
430                != TCL_OK) {
431                return TCL_ERROR;
432            }
433            if (n != 2) {
434                Tcl_AppendResult(interp,
435                        "wrong # of axes defined for ordering the data",
436                        (char *)NULL);
437                return TCL_ERROR;
438            }
439            if ((GetAxisFromObj(interp, order[0], axis) != TCL_OK) ||
440                (GetAxisFromObj(interp, order[1], axis+1) != TCL_OK)) {
441                return TCL_ERROR;
442            }
443        } else {
444            Tcl_AppendResult(interp, "unknown key \"", string,
445                (char *)NULL);
446            return TCL_ERROR;
447        }
448    }
449    if (_nValues == 0) {
450        Tcl_AppendResult(interp, "missing \"values\" key", (char *)NULL);
451        return TCL_ERROR;
452    }
453    if (_nValues != (_xNum * _yNum * _nComponents)) {
454        Tcl_AppendResult(interp,
455                "wrong number of values: must be xnum*ynum*components",
456                         (char *)NULL);
457        return TCL_ERROR;
458    }
459   
460    if ((axis[0] != 1) || (axis[1] != 0)) {
461        TRACE("reordering data");
462        /* Reorder the data into x, y where x varies fastest and so on. */
463        size_t y;
464        float *dp;
465
466        dp = _values = (float *)realloc(_values, sizeof(float) * _nValues);
467        for (y = 0; y < _yNum; y++) {
468            size_t x;
469
470            for (x = 0; x < _xNum; x++) {
471                size_t i, v;
472                   
473                /* Compute the index from the data's described ordering. */
474                i = (y + (_yNum * x)) * _nComponents;
475                for(v = 0; v < _nComponents; v++) {
476                    dp[v] = _values[i+v];
477                }
478                dp += _nComponents;
479            }
480        }
481    }
482    _initialized = true;
483    return TCL_OK;
484}
485
486#ifdef USE_DX_READER
487bool
488nv::Unirect3d::importDx(size_t nComponents,
489                        size_t length, char *string)
490{
491    int nx, ny, nz, npts;
492    double x0, y0, z0, dx, dy, dz, ddx, ddy, ddz;
493    char *p, *pend;
494
495    dx = dy = dz = 0.0;                 /* Suppress compiler warning. */
496    x0 = y0 = z0 = 0.0;                 /* May not have an origin line. */
497    nx = ny = nz = npts = 0;            /* Suppress compiler warning. */
498    for (p = string, pend = p + length; p < pend; /*empty*/) {
499        char *line;
500
501        line = getline(&p, pend);
502        if (line == pend) {
503            break;                        /* EOF */
504        }
505        if ((line[0] == '#') || (line == '\0')) {
506            continue;                        /* Skip blank or comment lines. */
507        }
508        if (sscanf(line, "object %*d class gridpositions counts %d %d %d",
509                   &nx, &ny, &nz) == 3) {
510            if ((nx < 0) || (ny < 0) || (nz < 0)) {
511                ERROR("invalid grid size: x=%d, y=%d, z=%d",
512                      nx, ny, nz);
513                return false;
514            }
515        } else if (sscanf(line, "origin %lg %lg %lg", &x0, &y0, &z0) == 3) {
516            /* Found origin. */
517        } else if (sscanf(line, "delta %lg %lg %lg", &ddx, &ddy, &ddz) == 3) {
518            /* Found one of the delta lines. */
519            if (ddx != 0.0) {
520                dx = ddx;
521            } else if (ddy != 0.0) {
522                dy = ddy;
523            } else if (ddz != 0.0) {
524                dz = ddz;
525            }
526        } else if (sscanf(line, "object %*d class array type %*s shape 3"
527                " rank 1 items %d data follows", &npts) == 1) {
528            if (npts < 0) {
529                ERROR("bad # points %d", npts);
530                return false;
531            }
532            TRACE("#points=%d", npts);
533            if (npts != nx*ny*nz) {
534                ERROR("inconsistent data: expected %d points"
535                      " but found %d points", nx*ny*nz, npts);
536                return false;
537            }
538            break;
539        } else if (sscanf(line, "object %*d class array type %*s rank 0"
540                " times %d data follows", &npts) == 1) {
541            if (npts != nx*ny*nz) {
542                ERROR("inconsistent data: expected %d points"
543                      " but found %d points", nx*ny*nz, npts);
544                return false;
545            }
546            break;
547        }
548    }
549    if (npts != nx*ny*nz) {
550        ERROR("inconsistent data: expected %d points"
551              " but found %d points", nx*ny*nz, npts);
552        return false;
553    }
554
555    _initialized = false;
556    _xValueMin = _yValueMin = _zValueMin = FLT_MAX;
557    _xValueMax = _yValueMax = _zValueMax = -FLT_MAX;
558    _xMin = x0, _yMin = y0, _zMin = z0;
559    _xNum = nx, _yNum = ny, _zNum = nz;
560    _xMax = _xMin + dx * _xNum;
561    _yMax = _yMin + dy * _yNum;
562    _zMax = _zMin + dz * _zNum;
563    _nComponents = nComponents;
564
565    _values = (float *)realloc(_values, sizeof(float) * npts * _nComponents);
566    _nValues = 0;
567    for (size_t ix = 0; ix < _xNum; ix++) {
568        for (size_t iy = 0; iy < _yNum; iy++) {
569            for (size_t iz = 0; iz < _zNum; iz++) {
570                char *line;
571                if ((p == pend) || (_nValues > (size_t)npts)) {
572                    break;
573                }
574                line = getline(&p, pend);
575                if ((line[0] == '#') || (line[0] == '\0')) {
576                    continue;                /* Skip blank or comment lines. */
577                }
578                double vx, vy, vz;
579                if (sscanf(line, "%lg %lg %lg", &vx, &vy, &vz) == 3) {
580                    int nindex = (iz*nx*ny + iy*nx + ix) * 3;
581                    if (vx < _xValueMin) {
582                        _xValueMin = vx;
583                    } else if (vx > _xValueMax) {
584                        _xValueMax = vx;
585                    }
586                    if (vy < _yValueMin) {
587                        _yValueMin = vy;
588                    } else if (vy > _yValueMax) {
589                        _yValueMax = vy;
590                    }
591                    if (vz < _zValueMin) {
592                        _zValueMin = vz;
593                    } else if (vz > _zValueMax) {
594                        _zValueMax = vz;
595                    }
596                    _values[nindex] = vx;
597                    _values[nindex+1] = vy;
598                    _values[nindex+2] = vz;
599                    _nValues++;
600                }
601            }
602        }
603    }
604    /* Make sure that we read all of the expected points. */
605    if (_nValues != (size_t)npts) {
606        ERROR("inconsistent data: expected %d points"
607              " but found %d points", npts, _nValues);
608        free(_values);
609        _values = NULL;
610        return false;
611    }
612    _nValues *= _nComponents;
613    _initialized = true;
614#ifdef notdef
615    {
616        FILE *f;
617        f = fopen("/tmp/dx.txt", "w");
618        fprintf(f, "unirect3d xmin %g xmax %g xnum %d ", _xMin, _xMax, _xNum);
619        fprintf(f, "ymin %g ymax %g ynum %d ", _yMin, _yMax, _yNum);
620        fprintf(f, "zmin %g zmax %g znum %d ", _zMin, _zMax, _zNum);
621        fprintf(f, "components %d values {\n",  _nComponents);
622        for (size_t i = 0; i < _nValues; i+= 3) {
623            fprintf(f, "%g %g %g\n", _values[i], _values[i+1], _values[i+2]);
624        }
625        fprintf(f, "}\n");
626        fclose(f);
627    }
628#endif
629    return true;
630}
631#endif
632
633void
634nv::Unirect3d::getVectorRange()
635{
636    assert(_nComponents == 3);
637    _magMax = -DBL_MAX, _magMin = DBL_MAX;
638    size_t i;
639    for (i = 0; i < _nValues; i += _nComponents) {
640        double vx, vy, vz, vm;
641
642        vx = _values[i];
643        vy = _values[i+1];
644        vz = _values[i+2];
645                   
646        vm = sqrt(vx*vx + vy*vy + vz*vz);
647        if (vm > _magMax) {
648            _magMax = vm;
649        }
650        if (vm < _magMin) {
651            _magMin = vm;
652        }
653    }
654    TRACE("getVectorRange: %g %g", _magMin, _magMax);
655}
656
657bool
658nv::Unirect3d::convert(nv::Unirect2d *dataPtr)
659{
660    _initialized = false;
661
662    _xValueMin = dataPtr->xValueMin();
663    _yValueMin = dataPtr->yValueMin();
664    _zValueMin = 0.0;
665    _xMin = dataPtr->xMin();
666    _yMin = dataPtr->yMin();
667    _zMin = 0.0;
668    _xMax = dataPtr->xMax();
669    _yMax = dataPtr->yMax();
670    _zMax = 0.0;
671    _xNum = dataPtr->xNum();
672    _yNum = dataPtr->yNum();
673    _zNum = 1;
674    switch (dataPtr->nComponents()) {
675    case 1:
676    case 3:
677        _values = (float *)realloc(_values, sizeof(float) * dataPtr->nValues());
678        if (_values == NULL) {
679            return false;
680        }
681        memcpy(_values, dataPtr->values(), dataPtr->nValues());
682        _nValues = dataPtr->nValues();
683        _nComponents = dataPtr->nComponents();
684        break;
685    case 2:
686        float *values;
687        _nValues = 3 * _xNum * _yNum * _zNum;
688        _values = (float *)realloc(_values, sizeof(float) * _nValues);
689        if (_values == NULL) {
690            return false;
691        }
692        values = dataPtr->values();
693        size_t i, j;
694        for (j = i = 0; i < dataPtr->nValues(); i += 2, j+= 3) {
695            _values[j] = values[i];
696            _values[j+1] = values[i+1];
697            _values[j+2] = 0.0f;
698        }
699        _nComponents = 3;
700        break;
701    }
702    return true;
703}
Note: See TracBrowser for help on using the repository browser.