Free Electron
SurfaceAccessorVDB.h
Go to the documentation of this file.
1 /* Copyright (C) 2003-2021 Free Electron Organization
2  Any use of this software requires a license. If a valid license
3  was not distributed with this file, visit freeelectron.org. */
4 
5 /** @file */
6 
7 #ifndef __ptex_SurfaceAccessorVDB_h__
8 #define __ptex_SurfaceAccessorVDB_h__
9 namespace fe
10 {
11 namespace ext
12 {
13 
14 /**************************************************************************//**
15  @brief Accessor for VDB Voxels
16 
17  @ingroup ptex
18 *//***************************************************************************/
19 class FE_DL_EXPORT SurfaceAccessorVDB:
20  public SurfaceAccessorBase
21 {
22  public:
23  SurfaceAccessorVDB(void)
24  { setName("SurfaceAccessorVDB"); }
25 virtual ~SurfaceAccessorVDB(void) {}
26 
27  using SurfaceAccessorBase::set;
28  using SurfaceAccessorBase::spatialVector;
29 
30  //* as SurfaceAccessorI
31  BWORD bind(SurfaceAccessibleI::Element a_element,
32  SurfaceAccessibleI::Attribute a_attribute)
33  {
34  m_attribute=a_attribute;
35 
36  String name;
37  switch(a_attribute)
38  {
39  case SurfaceAccessibleI::e_generic:
40  case SurfaceAccessibleI::e_position:
41  name="P";
42  break;
43  case SurfaceAccessibleI::e_normal:
44  name="N";
45  break;
46  case SurfaceAccessibleI::e_uv:
47  name="uv";
48  break;
49  case SurfaceAccessibleI::e_color:
50  name="Cd";
51  break;
52  case SurfaceAccessibleI::e_vertices:
53  m_attrName="vertices";
54  FEASSERT(a_element==
55  SurfaceAccessibleI::e_primitive);
56  m_element=a_element;
57  return TRUE;
58  case SurfaceAccessibleI::e_properties:
59  m_attrName="properties";
60  FEASSERT(a_element==
61  SurfaceAccessibleI::e_primitive);
62  m_element=a_element;
63  return TRUE;
64  }
65  return bindInternal(a_element,name);
66  }
67  BWORD bind(SurfaceAccessibleI::Element a_element,
68  const String& a_name)
69  {
70  m_attribute=SurfaceAccessibleI::e_generic;
71 
72  if(a_name=="P")
73  {
74  m_attribute=SurfaceAccessibleI::e_position;
75  }
76  else if(a_name=="N")
77  {
78  m_attribute=SurfaceAccessibleI::e_normal;
79  }
80  else if(a_name=="uv")
81  {
82  m_attribute=SurfaceAccessibleI::e_uv;
83  }
84  else if(a_name=="Cd")
85  {
86  m_attribute=SurfaceAccessibleI::e_color;
87  }
88 
89  return bindInternal(a_element,a_name);
90  }
91 virtual U32 count(void) const
92  {
93  if(!isBound() ||
94  m_element!=SurfaceAccessibleI::e_point ||
95  (m_attribute!=
96  SurfaceAccessibleI::e_position &&
97  m_attrName!="Cd"))
98  {
99  return 0;
100  }
101 
102  return m_spSurfaceVDB->vertexCount();
103  }
104 virtual U32 subCount(U32 a_index) const
105  { return 0; }
106 
107 virtual void set(U32 a_index,U32 a_subIndex,String a_string) {}
108 virtual String string(U32 a_index,U32 a_subIndex=0)
109  { return ""; }
110 
111 virtual void set(U32 a_index,U32 a_subIndex,I32 a_integer) {}
112 virtual I32 integer(U32 a_index,U32 a_subIndex=0)
113  { return 0; }
114 
115 virtual void set(U32 a_index,U32 a_subIndex,Real a_real) {}
116 virtual Real real(U32 a_index,U32 a_subIndex=0)
117  {
118  if(!isBound())
119  {
120  return Real(0);
121  }
122 
123  if(m_element!=SurfaceAccessibleI::e_point)
124  {
125  return Real(0);
126  }
127 
128  if(m_attrName=="value")
129  {
130  Real value(0);
131  m_spSurfaceVDB->getVertexValue(a_index,value);
132  return value;
133  }
134 
135  return Real(0);
136  }
137 
138 
139 virtual void set(U32 a_index,U32 a_subIndex,
140  const SpatialVector& a_vector) {}
141 virtual SpatialVector spatialVector(U32 a_index,U32 a_subIndex=0)
142  {
143  if(!isBound())
144  {
145  return SpatialVector(0.0,0.0,0.0);
146  }
147 
148  if(m_element!=SurfaceAccessibleI::e_point)
149  {
150  return SpatialVector(0.0,0.0,0.0);
151  }
152 
153  if(m_attribute==SurfaceAccessibleI::e_position)
154  {
155  SpatialVector value(0.0,0.0,0.0);
156  m_spSurfaceVDB->getVertexPoint(a_index,value);
157  return value;
158  }
159 
160  if(m_attribute==SurfaceAccessibleI::e_normal)
161  {
162  SpatialVector value(0.0,0.0,0.0);
163  m_spSurfaceVDB->getVertexNormal(a_index,value);
164  return value;
165  }
166 
167  if(m_attrName=="cpt")
168  {
169  SpatialVector value(0.0,0.0,0.0);
170  m_spSurfaceVDB->getVertexCpt(a_index,value);
171  return value;
172  }
173 
174  if(m_attrName=="Cd")
175  {
176  //* TODO
177  }
178 
179  return SpatialVector(0.0,0.0,0.0);
180  }
181 
182  //* VDB specific
183  void setSurfaceVDB(sp<SurfaceVDB> a_spSurfaceVDB)
184  { m_spSurfaceVDB=a_spSurfaceVDB; }
185 
186  private:
187 
188 virtual BWORD bindInternal(SurfaceAccessibleI::Element a_element,
189  const String& a_name)
190  {
191  //* TODO can VDB have custom attributes?
192  if(m_attribute==SurfaceAccessibleI::e_generic &&
193  a_name!="cpt" && a_name!="value")
194  {
195  return FALSE;
196  }
197 
198  if(a_element<0 && a_element>5)
199  {
200  a_element=SurfaceAccessibleI::e_point;
201  }
202 
203  m_element=a_element;
204  m_attrName=a_name;
205 
206  return TRUE;
207  }
208 
209  BWORD isBound(void) const
210  { return m_spSurfaceVDB.isValid(); }
211 
212  sp<SurfaceVDB> m_spSurfaceVDB;
213 };
214 
215 } /* namespace ext */
216 } /* namespace fe */
217 
218 #endif /* __ptex_SurfaceAccessorVDB_h__ */
kernel
Definition: namespace.dox:3
Common Functionality for Accessor Surface.
Definition: SurfaceAccessorBase.h:20
Accessor for VDB Voxels.
Definition: SurfaceAccessorVDB.h:19
Automatically reference-counted string container.
Definition: String.h:128
Intrusive Smart Pointer.
Definition: src/core/ptr.h:53