Free Electron
SurfaceAccessorPtex.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_SurfaceAccessorPtex_h__
8 #define __ptex_SurfaceAccessorPtex_h__
9 namespace fe
10 {
11 namespace ext
12 {
13 
14 /**************************************************************************//**
15  @brief Accessor for Ptex Texels
16 
17  @ingroup ptex
18 *//***************************************************************************/
19 class FE_DL_EXPORT SurfaceAccessorPtex:
20  public SurfaceAccessorBase
21 {
22  public:
23  SurfaceAccessorPtex(void):
24  m_pTexelArray(NULL)
25  { setName("SurfaceAccessorPtex"); }
26 virtual ~SurfaceAccessorPtex(void) {}
27 
28  using SurfaceAccessorBase::set;
29  using SurfaceAccessorBase::spatialVector;
30 
31  //* as SurfaceAccessorI
32  BWORD bind(SurfaceAccessibleI::Element a_element,
33  SurfaceAccessibleI::Attribute a_attribute)
34  {
35  m_attribute=a_attribute;
36 
37  String name;
38  switch(a_attribute)
39  {
40  case SurfaceAccessibleI::e_generic:
41  case SurfaceAccessibleI::e_position:
42  name="P";
43  break;
44  case SurfaceAccessibleI::e_normal:
45  name="N";
46  break;
47  case SurfaceAccessibleI::e_uv:
48  name="uv";
49  break;
50  case SurfaceAccessibleI::e_color:
51  name="Cd";
52  break;
53  case SurfaceAccessibleI::e_vertices:
54  m_attrName="vertices";
55  FEASSERT(a_element==
56  SurfaceAccessibleI::e_primitive);
57  m_element=a_element;
58  return TRUE;
59  case SurfaceAccessibleI::e_properties:
60  m_attrName="properties";
61  FEASSERT(a_element==
62  SurfaceAccessibleI::e_primitive);
63  m_element=a_element;
64  return TRUE;
65  }
66  return bindInternal(a_element,name);
67  }
68  BWORD bind(SurfaceAccessibleI::Element a_element,
69  const String& a_name)
70  {
71  m_attribute=SurfaceAccessibleI::e_generic;
72 
73  if(a_name=="P")
74  {
75  m_attribute=SurfaceAccessibleI::e_position;
76  }
77  else if(a_name=="N")
78  {
79  m_attribute=SurfaceAccessibleI::e_normal;
80  }
81  else if(a_name=="uv")
82  {
83  m_attribute=SurfaceAccessibleI::e_uv;
84  }
85  else if(a_name=="Cd")
86  {
87  m_attribute=SurfaceAccessibleI::e_color;
88  }
89 
90  return bindInternal(a_element,a_name);
91  }
92 virtual U32 count(void) const
93  {
94  if(!isBound() ||
95  m_element!=SurfaceAccessibleI::e_point ||
96  (m_attribute!=
97  SurfaceAccessibleI::e_position &&
98  m_attrName!="Cd"))
99  {
100  return 0;
101  }
102 
103  return (*m_pTexelArray).size();
104  }
105 virtual U32 subCount(U32 a_index) const
106  { return 0; }
107 
108 virtual void set(U32 a_index,U32 a_subIndex,String a_string) {}
109 virtual String string(U32 a_index,U32 a_subIndex=0)
110  { return ""; }
111 
112 virtual void set(U32 a_index,U32 a_subIndex,I32 a_integer) {}
113 virtual I32 integer(U32 a_index,U32 a_subIndex=0)
114  { return 0; }
115 
116 virtual void set(U32 a_index,U32 a_subIndex,Real a_real) {}
117 virtual Real real(U32 a_index,U32 a_subIndex=0)
118  { return Real(0); }
119 
120 virtual void set(U32 a_index,U32 a_subIndex,
121  const SpatialVector& a_vector) {}
122 virtual SpatialVector spatialVector(U32 a_index,U32 a_subIndex=0)
123  {
124  if(!isBound())
125  {
126  return SpatialVector(0.0,0.0,0.0);
127  }
128 
129  if(m_element!=SurfaceAccessibleI::e_point)
130  {
131  return SpatialVector(0.0,0.0,0.0);
132  }
133 
134  if(m_attribute==SurfaceAccessibleI::e_position)
135  {
136  return (*m_pTexelArray)[a_index].m_location;
137  }
138 
139  if(m_attrName=="Cd")
140  {
141  return (*m_pTexelArray)[a_index].m_color;
142  }
143 
144  return SpatialVector(0.0,0.0,0.0);
145  }
146 
147  //* Ptex specific
148  void setTexelArray(Array<SurfaceAccessiblePtex::Texel>*
149  a_pTexelArray)
150  { m_pTexelArray=a_pTexelArray; }
151 
152  private:
153 
154 virtual BWORD bindInternal(SurfaceAccessibleI::Element a_element,
155  const String& a_name)
156  {
157  //* TODO can Ptex have custom attributes?
158  if(m_attribute==SurfaceAccessibleI::e_generic)
159  {
160  return FALSE;
161  }
162 
163  if(a_element<0 && a_element>5)
164  {
165  a_element=SurfaceAccessibleI::e_point;
166  }
167 
168  m_element=a_element;
169  m_attrName=a_name;
170 
171  return TRUE;
172  }
173 
174  BWORD isBound(void) const
175  { return (m_pTexelArray!=NULL); }
176 
178 };
179 
180 } /* namespace ext */
181 } /* namespace fe */
182 
183 #endif /* __ptex_SurfaceAccessorPtex_h__ */
kernel
Definition: namespace.dox:3
Accessor for Ptex Texels.
Definition: SurfaceAccessorPtex.h:19
Common Functionality for Accessor Surface.
Definition: SurfaceAccessorBase.h:20
Automatically reference-counted string container.
Definition: String.h:128