File: FieldVector.h

package info (click to toggle)
glgrib 1.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,861,496 kB
  • sloc: cpp: 20,811; ansic: 6,530; perl: 2,902; sh: 513; makefile: 147; python: 58; sql: 18
file content (82 lines) | stat: -rw-r--r-- 2,041 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#pragma once

#include "glGrib/Field.h"
#include "glGrib/View.h"

namespace glGrib
{

class FieldVector : public FieldPacked<8>
{
public:
  explicit FieldVector (const Field::Privatizer) : scalar (this), vector (this) { }
  void setup (const Field::Privatizer, Loader *, const OptionsField &, float = 0) override;
  FieldVector (const FieldVector &) = delete;

  using T = typename FieldPackingType<8>::type;
  
  Field::kind getKind () const 
  {
    return Field::VECTOR;
  }
  FieldVector * clone () const;
  void renderArrow (const View &, const OptionsLight &) const;
  void renderNorms (const View &, const OptionsLight &) const;
  void render (const View &, const OptionsLight &) const override;
  void reSample (const View &);
  void toggleShowVector () { opts.vector.arrow.on = ! opts.vector.arrow.on; }
  void toggleShowNorm () { opts.vector.norm.on = ! opts.vector.norm.on; }
  void reSize (const View &) override;
  float getNormedMinValue () const override
  {
    std::vector<float> val = getMinValue ();
    return val[0];
  }
  float getNormedMaxValue () const override
  {
    std::vector<float> val = getMaxValue ();
    return val[0];
  }
  bool useColorBar () const override { return true; }
  int getSlotMax () const override
  {
    return (int)opts.path.size () / 2;
  }
private:
  
  enum
  {
    SCALAR=0,
    VECTOR=1
  };
  template <int N>
  class field_t
  {
  public:
    explicit field_t (FieldVector * f) : field (f), VAID (this) {}
    field_t & operator= (const field_t & s)
    {   
      if (this != &s) 
        VAID = s.VAID;
      return *this;
    }   
    void setupVertexAttributes () const;
    void render (const glGrib::View &, const glGrib::OptionsLight &) const;
    FieldVector * field;
    OpenGLVertexArray<field_t> VAID;
  };  
  using scalar_t = field_t<SCALAR>;
  using vector_t = field_t<VECTOR>;
  friend class field_t<SCALAR>;
  friend class field_t<VECTOR>;
  struct
  {
    OpenGLBufferPtr<T> buffer_n, buffer_d;
    float vscale;
  } d;
  scalar_t scalar;
  vector_t vector;
};


}