Free Electron
SurfaceAccessorHapi.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 __houdini_SurfaceAccessorHapi_h__
8 #define __houdini_SurfaceAccessorHapi_h__
9 
10 #define FE_SAHE_ASSERT_BOUNDS TRUE
11 
12 namespace fe
13 {
14 namespace ext
15 {
16 
17 /**************************************************************************//**
18  @brief Houdini Engine Surface Editing Implementation
19 
20  @ingroup houdini
21 *//***************************************************************************/
22 class FE_DL_EXPORT SurfaceAccessorHapi:
23  public SurfaceAccessorBase,
24  public CastableAs<SurfaceAccessorHapi>
25 {
26  public:
27  SurfaceAccessorHapi(void):
28  m_pHapiSession(NULL)
29  {
30  setName("SurfaceAccessorHapi");
31  }
32 
33 virtual ~SurfaceAccessorHapi(void)
34  {
35  }
36 
37  BWORD bind(SurfaceAccessibleI::Element a_element,
38  SurfaceAccessibleI::Attribute a_attribute)
39  {
40  m_attribute=a_attribute;
41 
42  String name;
43  switch(a_attribute)
44  {
45  case SurfaceAccessibleI::e_generic:
46  case SurfaceAccessibleI::e_position:
47  name="P";
48  break;
49  case SurfaceAccessibleI::e_normal:
50  name="N";
51  break;
52  case SurfaceAccessibleI::e_uv:
53  name="uv";
54  break;
55  case SurfaceAccessibleI::e_color:
56  name="Cd";
57  break;
58  case SurfaceAccessibleI::e_vertices:
59  m_attrName="vertices";
60  FEASSERT(a_element==
61  SurfaceAccessibleI::e_primitive);
62  m_element=a_element;
63  break;
64  case SurfaceAccessibleI::e_properties:
65  m_attrName="properties";
66  FEASSERT(a_element==
67  SurfaceAccessibleI::e_primitive);
68  }
69  return bindInternal(a_element,name);
70  }
71  BWORD bind(SurfaceAccessibleI::Element a_element,
72  const String& a_name)
73  {
74  m_attribute=SurfaceAccessibleI::e_generic;
75 
76  if(a_name=="P")
77  {
78  m_attribute=SurfaceAccessibleI::e_position;
79  }
80  else if(a_name=="N")
81  {
82  m_attribute=SurfaceAccessibleI::e_normal;
83  }
84  else if(a_name=="uv")
85  {
86  m_attribute=SurfaceAccessibleI::e_uv;
87  }
88  else if(a_name=="Cd")
89  {
90  m_attribute=SurfaceAccessibleI::e_color;
91  }
92  else if(a_name=="properties")
93  {
94  m_attribute=SurfaceAccessibleI::e_properties;
95  FEASSERT(a_element==
96  SurfaceAccessibleI::e_primitive);
97  }
98 
99  return bindInternal(a_element,a_name);
100  }
101 
102  //* as SurfaceAccessorI
103 virtual String type(void) const;
104 
105 virtual U32 count(void) const;
106 virtual U32 subCount(U32 a_index) const;
107 
108  using SurfaceAccessorBase::set;
109 virtual void set(U32 a_index,U32 a_subIndex,String a_string)
110  {
111 #if FE_SAHE_ASSERT_BOUNDS
112  FEASSERT(a_index<count());
113  FEASSERT(a_subIndex<subCount(a_index));
114 #endif
115  //* TODO
116  }
117 virtual String string(U32 a_index,U32 a_subIndex=0)
118  {
119 #if FE_SAHE_ASSERT_BOUNDS
120  FEASSERT(a_index<count());
121  FEASSERT(a_subIndex<subCount(a_index));
122 #endif
123 
124  if(m_stringBuffer.size()>a_index)
125  {
126  return m_stringBuffer[a_index];
127  }
128 
129  //* TODO
130  return String();
131  }
132 
133 virtual void set(U32 a_index,U32 a_subIndex,I32 a_integer)
134  {
135 #if FE_SAHE_ASSERT_BOUNDS
136  FEASSERT(a_index<count());
137  FEASSERT(a_subIndex<subCount(a_index));
138 #endif
139  //* TODO
140  }
141 
142 virtual I32 integer(U32 a_index,U32 a_subIndex=0)
143  {
144  if(m_attribute==SurfaceAccessibleI::e_properties)
145  {
146  //* TODO per primitive
147  if(a_subIndex==SurfaceAccessibleI::e_openCurve
148  && m_curveParts)
149  {
150  return 1;
151  }
152 
153  return 0;
154  }
155 
156 #if FE_SAHE_ASSERT_BOUNDS
157  FEASSERT(a_index<count());
158  FEASSERT(m_attribute==
159  SurfaceAccessibleI::e_properties ||
160  a_subIndex<subCount(a_index));
161 #endif
162  if(m_element==SurfaceAccessibleI::e_primitive &&
163  m_attribute==SurfaceAccessibleI::e_vertices)
164  {
165  const I32 offset=m_vertexOffset[a_index];
166 
167  if(a_subIndex<m_vertexCount[a_index])
168  {
169  if(!m_vertexBuffer.size())
170  {
171  return offset+a_subIndex;
172  }
173 
174  return m_vertexBuffer[offset+a_subIndex];
175  }
176  }
177 
178  if(m_integerBuffer.size()>a_index)
179  {
180  return m_integerBuffer[a_index];
181  }
182 
183  //* TODO
184  return 0;
185  }
186 virtual I32 duplicate(U32 a_index,U32 a_subIndex=0)
187  {
188  //* TODO
189  return -1;
190  }
191 
192  using SurfaceAccessorBase::append;
193 virtual I32 append(SurfaceAccessibleI::Form a_form)
194  {
195  //* TODO
196  return -1;
197  }
198 virtual void append(U32 a_index,I32 a_integer)
199  {
200  //* TODO
201  }
202 virtual void append(Array< Array<I32> >& a_rPrimVerts)
203  {
204  //* TODO
205  }
206 
207 virtual void remove(U32 a_index,I32 a_integer)
208  {
209  //* TODO
210  }
211 
212 virtual void set(U32 a_index,U32 a_subIndex,Real a_real)
213  {
214 #if FE_SAHE_ASSERT_BOUNDS
215  FEASSERT(a_index<count());
216  FEASSERT(a_subIndex<subCount(a_index));
217 #endif
218  //* TODO
219  }
220 
221 virtual Real real(U32 a_index,U32 a_subIndex=0)
222  {
223 #if FE_SAHE_ASSERT_BOUNDS
224  FEASSERT(a_index<count());
225  FEASSERT(a_subIndex<subCount(a_index));
226 #endif
227 
228  if(m_realBuffer.size()>a_index)
229  {
230  return m_realBuffer[a_index];
231  }
232 
233  //* TODO
234  return 0.0;
235  }
236 
237 virtual void set(U32 a_index,U32 a_subIndex,
238  const SpatialVector& a_vector)
239  {
240  //* TODO
241  }
242 virtual SpatialVector spatialVector(U32 a_index,U32 a_subIndex=0)
243  {
244 #if FE_SAHE_ASSERT_BOUNDS
245  FEASSERT(a_index<count());
246  FEASSERT(a_subIndex<subCount(a_index));
247 #endif
248  if(m_attribute==SurfaceAccessibleI::e_properties)
249  {
250  return SpatialVector(0.0,0.0,0.0);
251  }
252 
253  if(m_element==SurfaceAccessibleI::e_pointGroup)
254  {
255  //* TODO
256  return SpatialVector(0.0,0.0,0.0);
257  }
258 
259  if(m_element==
260  SurfaceAccessibleI::e_primitiveGroup ||
261  m_attribute==SurfaceAccessibleI::e_vertices)
262  {
263  FEASSERT(m_element==
264  SurfaceAccessibleI::e_primitiveGroup
265  || m_element==
266  SurfaceAccessibleI::e_primitive);
267 
268  //* TODO
269  return SpatialVector(0.0,0.0,0.0);
270  }
271 
272  if((m_element==SurfaceAccessibleI::e_primitive ||
273  m_element==SurfaceAccessibleI::e_vertex ||
274  m_element==
275  SurfaceAccessibleI::e_primitiveGroup) &&
276  m_attribute==SurfaceAccessibleI::e_uv)
277  {
278  //* TODO
279  return SpatialVector(0.0,0.0,0.0);
280  }
281 
282  if(m_vectorBuffer.size()>a_index)
283  {
284  return m_vectorBuffer[a_index];
285  }
286 
287  //* TODO
288  return SpatialVector(0.0,0.0,0.0);
289  }
290 virtual BWORD spatialVector(SpatialVector* a_pVectorArray,
291  const Vector2i* a_pIndexArray,I32 a_arrayCount)
292  {
293  //* TODO
294  return FALSE;
295  }
296 
297  sp<SurfaceAccessibleI> surfaceAccessible(void)
298  { return m_spSurfaceAccessibleI; }
299 
300  //* Houdini specific
301  void setSession(HAPI_Session* a_pHapiSession)
302  {
303  m_pHapiSession=a_pHapiSession;
304  }
305  HAPI_Session* session(void) const { return m_pHapiSession; }
306 
307  void setNodeId(HAPI_NodeId a_hapiNodeId)
308  {
309  m_hapiNodeId=a_hapiNodeId;
310  }
311  HAPI_NodeId nodeId(void) const { return m_hapiNodeId; }
312 
313  private:
314 virtual BWORD bindInternal(SurfaceAccessibleI::Element a_element,
315  const String& a_name);
316 
317  BWORD isBound(void) const
318  {
319  //* TODO
320 
321  return (HAPI_IsSessionValid(m_pHapiSession)==
322  HAPI_RESULT_SUCCESS &&
323  (m_stringBuffer.size() ||
324  m_integerBuffer.size() ||
325  m_realBuffer.size() ||
326  m_vectorBuffer.size()));
327  }
328 
329  HAPI_Session* m_pHapiSession;
330  HAPI_NodeId m_hapiNodeId;
331 
332  I32 m_curveParts;
333  I32 m_meshParts;
334 
335  Array<String> m_stringBuffer;
336  Array<I32> m_integerBuffer;
337  Array<Real> m_realBuffer;
338  Array<SpatialVector> m_vectorBuffer;
339 
340  Array<I32> m_vertexBuffer; //* point index per vertex
341  Array<I32> m_vertexOffset; //* first vertex per primitive
342  Array<I32> m_vertexCount; //* vertices per primitive
343 };
344 
345 } /* namespace ext */
346 } /* namespace fe */
347 
348 #endif /* __houdini_SurfaceAccessorHapi_h__ */
kernel
Definition: namespace.dox:3
Common Functionality for Accessor Surface.
Definition: SurfaceAccessorBase.h:20
Automatically reference-counted string container.
Definition: String.h:128
Wrapper for std::vector.
Definition: Array.h:21
Houdini Engine Surface Editing Implementation.
Definition: SurfaceAccessorHapi.h:22
Intrusive Smart Pointer.
Definition: src/core/ptr.h:53
Per-class participation non-RTTI fallback dynamic casting mechanism.
Definition: Castable.h:192