Ignore:
Timestamp:
Apr 16, 2013 12:52:20 AM (9 years ago)
Author:
ldelgass
Message:

Nanovis refactoring to fix problems with scaling and multiple results.
Do rendering in world space to properly place and scale multiple data sets.
Also fix flows to reduce resets of animations. More work toward removing
Cg dependency. Fix panning to convert viewport coords to world coords.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/nanovis/VelocityArrowsSlice.cpp

    r3612 r3630  
    1919#include "nanovis.h"
    2020#include "VelocityArrowsSlice.h"
     21#include "Volume.h"
    2122#include "Shader.h"
    2223#include "Camera.h"
     
    3839VelocityArrowsSlice::VelocityArrowsSlice() :
    3940    _vectorFieldGraphicsID(0),
    40     _vfXscale(0),
    41     _vfYscale(0),
    42     _vfZscale(0),
    4341    _slicePos(0.5f),
    44     _axis(2),
     42    _axis(AXIS_Z),
    4543    _fbo(0),
    4644    _tex(0),
     
    5755    _maxVelocityScale(1, 1, 1),
    5856    _arrowColor(1, 1, 0),
    59     _enabled(false),
     57    _visible(false),
    6058    _dirty(true),
    6159    _vertexBufferGraphicsID(0),
     
    6361    _renderMode(LINES)
    6462{
    65     axis(2);
    66 
    67     _queryVelocityFP.loadFragmentProgram("queryvelocity.cg", "main");
    68 
    69     _particleShader.loadVertexProgram("velocityslicevp.cg", "vpmain");
    70     _particleShader.loadFragmentProgram("velocityslicefp.cg", "fpmain");
     63    setSliceAxis(AXIS_Z);
     64
     65    _queryVelocityFP.loadFragmentProgram("queryvelocity.cg");
     66
     67    _particleShader.loadVertexProgram("velocityslicevp.cg");
     68    _particleShader.loadFragmentProgram("velocityslicefp.cg");
    7169
    7270    createRenderTarget();
     
    175173}
    176174
    177 void VelocityArrowsSlice::axis(int axis)
     175void VelocityArrowsSlice::setSliceAxis(FlowSliceAxis axis)
    178176{
    179177    _axis = axis;
    180178    switch (_axis) {
    181     case 0:
     179    case AXIS_X:
    182180        _projectionVector.x = 0;
    183181        _projectionVector.y = 1;
    184182        _projectionVector.z = 1;
    185183        break;
    186     case 1 :
     184    case AXIS_Y:
    187185        _projectionVector.x = 1;
    188186        _projectionVector.y = 0;
    189187        _projectionVector.z = 1;
    190188        break;
    191     case 2:
     189    case AXIS_Z:
    192190        _projectionVector.x = 1;
    193191        _projectionVector.y = 1;
     
    200198void VelocityArrowsSlice::queryVelocity()
    201199{
    202     if (!_enabled) return;
    203 
    204200    glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT);
    205201    int fboOrig;
     
    301297void VelocityArrowsSlice::render()
    302298{
    303     if (!_enabled)
     299    if (!_visible)
    304300        return;
    305301
     
    310306    }
    311307
    312     TRACE("_vf: %g %g %g", _vfXscale,_vfYscale, _vfZscale);
     308    TRACE("_scale: %g %g %g", _scale.x, _scale.y, _scale.z);
    313309    TRACE("_maxVelocityScale: %g %g %g",
    314310          _maxVelocityScale.x, _maxVelocityScale.y, _maxVelocityScale.z);
     
    319315    glPushMatrix();
    320316
    321     glScalef(_vfXscale,_vfYscale, _vfZscale);
    322     glTranslatef(-0.5f, -0.5f, -0.5f);
     317    glTranslatef(_origin.x, _origin.y, _origin.z);
     318    glScalef(_scale.x, _scale.y, _scale.z);
    323319
    324320    if (_renderMode == LINES) {
     
    422418        _particleShader.setFPTextureParameter("arrows", _arrowsTex->id());
    423419        _particleShader.setVPParameter1f("tanHalfFOV",
    424                                          tan(NanoVis::getCamera()->fov() * 0.5) * NanoVis::winHeight * 0.5);
     420                                         tan(NanoVis::getCamera()->getFov() * 0.5) * NanoVis::winHeight * 0.5);
    425421        _particleShader.setGLStateMatrixVPParameter("modelview",
    426422                                                    Shader::MODELVIEW_MATRIX,
     
    457453
    458454void
    459 VelocityArrowsSlice::setVectorField(unsigned int vfGraphicsID, const Vector3f& origin,
    460                                     float xScale, float yScale, float zScale, float max)
    461 {
    462     _vectorFieldGraphicsID = vfGraphicsID;
    463     _vfXscale = xScale;
    464     _vfYscale = yScale;
    465     _vfZscale = zScale;
     455VelocityArrowsSlice::setVectorField(Volume *volume)
     456{
     457    _vectorFieldGraphicsID = volume->textureID();
     458    Vector3f bmin, bmax;
     459    volume->getBounds(bmin, bmax);
     460    _origin = bmin;
     461    _scale.set(bmax.x-bmin.x, bmax.y-bmin.y, bmax.z-bmin.z);
    466462
    467463    _dirty = true;
     
    470466void VelocityArrowsSlice::computeSamplingTicks()
    471467{
    472     if (_vfXscale < _vfYscale) {
    473         if (_vfXscale < _vfZscale || _vfZscale == 0.0) {
    474             // vfXscale
     468    if (_scale.x < _scale.y) {
     469        if (_scale.x < _scale.z || _scale.z == 0.0) {
     470            // _scale.x
    475471            _tickCountX = _tickCountForMinSizeAxis;
    476472
    477             float step = _vfXscale / (_tickCountX + 1);
    478 
    479             _tickCountY = (int)(_vfYscale/step);
    480             _tickCountZ = (int)(_vfZscale/step);
     473            float step = _scale.x / (_tickCountX + 1);
     474            _tickCountY = (int)(_scale.y/step);
     475            _tickCountZ = (int)(_scale.z/step);
    481476        } else {
    482             // vfZscale
     477            // _scale.z
    483478            _tickCountZ = _tickCountForMinSizeAxis;
    484479
    485             float step = _vfZscale / (_tickCountZ + 1);
    486             _tickCountX = (int)(_vfXscale/step);
    487             _tickCountY = (int)(_vfYscale/step);
     480            float step = _scale.z / (_tickCountZ + 1);
     481            _tickCountX = (int)(_scale.x/step);
     482            _tickCountY = (int)(_scale.y/step);
    488483        }
    489484    } else {
    490         if (_vfYscale < _vfZscale || _vfZscale == 0.0) {
    491             // _vfYscale
     485        if (_scale.y < _scale.z || _scale.z == 0.0) {
     486            // _scale.y
    492487            _tickCountY = _tickCountForMinSizeAxis;
    493488
    494             float step = _vfYscale / (_tickCountY + 1);
    495             _tickCountX = (int)(_vfXscale/step);
    496             _tickCountZ = (int)(_vfZscale/step);
     489            float step = _scale.y / (_tickCountY + 1);
     490            _tickCountX = (int)(_scale.x/step);
     491            _tickCountZ = (int)(_scale.z/step);
    497492        } else {
    498             // vfZscale
     493            // _scale.z
    499494            _tickCountZ = _tickCountForMinSizeAxis;
    500495
    501             float step = _vfZscale / (_tickCountZ + 1);
    502             _tickCountX = (int)(_vfXscale/step);
    503             _tickCountY = (int)(_vfYscale/step);
     496            float step = _scale.z / (_tickCountZ + 1);
     497            _tickCountX = (int)(_scale.x/step);
     498            _tickCountY = (int)(_scale.y/step);
    504499        }
    505500    }
Note: See TracChangeset for help on using the changeset viewer.