LightWrap++
AC++wrapperfortheLightWave3DSDK
volumetric_handler.h
Go to the documentation of this file.
1 
7 #ifndef VOLUMETRIC_HANDLER_H
8 #define VOLUMETRIC_HANDLER_H
9 
10 #include <lwpp/plugin_handler.h>
11 #include <lwpp/Point3d.h>
12 #include <lwpp/Vector3d.h>
13 #include <lwvolume.h>
14 #include <lwmath.h>
15 #include <lwshader.h>
16 
17 namespace lwpp
18 {
19 
21  {
22  protected:
23  const LWVolumeAccess *access;
24  public:
25  VolumetricAccess(const LWVolumeAccess *acc) : access(acc) { ;}
26 
27  int getFlags() {return access->flags;}
28  const LWItemID getSource() const {return access->source;}
29 
36  const Point3d getOrigin( void ) const {return Point3d(access->o);}
37 
43  const Vector3d getDirection() const {return Vector3d(access->dir);}
44 
45 
46  const Vector3d getRayColor( void ) const {return Vector3d(access->rayColor);}
47  const double getRayColorR( void ) const {return access->rayColor[0];}
48  const double getRayColorG( void ) const {return access->rayColor[1];}
49  const double getRayColorB( void ) const {return access->rayColor[2];}
50 
51  const double getFarClip() const {return access->farClip;}
52  const double getNearClip() const {return access->nearClip;}
53  const double getOriginDistance() const {return access->oDist;}
54  const double getFrustrum() const {return access->frustum;}
55 
56  void addSample (LWVolumeSample *smp) {access->addSample(access->ray, smp);}
57  const double getOpacity (double dist, double opa[3]) const {return access->getOpacity(access->ray, dist, opa);}
58 
59  const double getSubPixelX ( void ) const { return access->sx; }
60  const double getSubPixelY ( void ) const { return access->sy; }
61  const int getBounces (void) const { return access->bounces; }
62 
63 
64  // CALLBACKS
65  const int illuminate(LWItemID light, const LWDVector position, LWDVector direction, LWDVector color) const
66  {
67  return access->illuminate(light, position, direction, color);
68  }
69 
70  const double rayTrace(const LWDVector position, const LWDVector direction, LWDVector color) const
71  {
72  return access->rayTrace(position, direction, color);
73  }
74 
75  const double rayCast(const LWDVector position, const LWDVector direction) const
76  {
77  return access->rayCast(position, direction);
78  }
79 
80  const double rayShade(const LWDVector position, const LWDVector direction, LWShaderAccess shaderaccess) const
81  {
82  return access->rayShade(position, direction, &shaderaccess);
83  }
84 
85  const double rayTraceMode(const LWDVector position, const LWDVector direction, LWDVector color, const double eta, const int rtmode ) const
86  {
87  return access->rayTraceMode(position, direction, color, eta, rtmode);
88  }
89 #if (LW_SDK != 75)
90  const double rayTraceReflection(const LWDVector position, const LWDVector direction, LWDVector color, const double eta ) const
91  {
92  return access->rayTraceMode(position, direction, color, eta, RTMODE_REFLECTION);
93  }
94 
95  const double rayTraceRefraction(const LWDVector position, const LWDVector direction, LWDVector color, const double eta ) const
96  {
97  return access->rayTraceMode(position, direction, color, eta, RTMODE_REFRACTION);
98  }
99 
100  const double rayTraceDistance(const LWDVector position, const LWDVector direction, LWDVector color, const double eta ) const
101  {
102  return access->rayTraceMode(position, direction, color, eta, RTMODE_DISTANCE);
103  }
104 
105  const double rayTraceDissolve(const LWDVector position, const LWDVector direction, LWDVector color, const double eta ) const
106  {
107  return access->rayTraceMode(position, direction, color, eta, RTMODE_DISSOLVE);
108  }
109 
110  const double rayTraceShadow(const LWDVector position, const LWDVector direction, LWDVector color, const double eta ) const
111  {
112  return access->rayTraceMode(position, direction, color, eta, RTMODE_SHADOW);
113  }
114 
115  const double rayTraceOcclusion(const LWDVector position, const LWDVector direction, LWDVector color, const double eta ) const
116  {
117  return access->rayTraceMode(position, direction, color, eta, RTMODE_OCCLUSION);
118  }
119 
120  const double rayTraceBackdrop(const LWDVector position, const LWDVector direction, LWDVector color, const double eta ) const
121  {
122  return access->rayTraceMode(position, direction, color, eta, RTMODE_BACKDROP);
123  }
124 #endif // LW92
125  const double illuminateSample( LWItemID light, const LWDVector position, LWDVector direction, LightSampleFunc sampler, void *data ) const
126  {
127  return access->illuminateSample(light, position, direction, &sampler, &data);
128  }
129  };
130 
132 
138  {
139  protected:
140  LWItemID Context;
141  public:
142  VolumetricHandler(void *g, void *context, LWError *err) : InstanceHandler(g, context, err, LWVOLUMETRIC_HCLASS)
143  {
144  Context = LWItemID(context);
145  }
146  virtual ~VolumetricHandler() {;}
147  virtual double Evaluate(VolumetricAccess &voa)
148  {
149  UNUSED(voa);
150  return 1.0;
151  }
152  virtual unsigned int Flags() {return 0;}
153  };
154 
156 
159  template <class T, int min, int max>
160  class VolumetricAdaptor : public InstanceAdaptor <T>, public ItemAdaptor <T>, public RenderAdaptor <T>
161  {
162  public:
163  VolumetricAdaptor(const char *name, ServerTagInfo *tags)
164  {
165  LWServer::AddPlugin(LWVOLUMETRIC_HCLASS, name, Activate, tags);
166  }
168  static int Activate (int version, GlobalFunc *global, LWInstance inst, void *serverData)
169  {
170  UNUSED(serverData);
171 
172  if ( version != LWVOLUMETRIC_VERSION ) return AFUNC_BADVERSION;
173  try
174  {
175  lwpp::SetSuperGlobal(global);
176  LWVolumetricHandler *plugin = static_cast<LWVolumetricHandler *>(inst);
177 
178  InstanceAdaptor<T>::Activate(plugin->inst);
179  ItemAdaptor<T>::Activate(plugin->item);
180  RenderAdaptor<T>::Activate(plugin->rend);
181  plugin->evaluate = VolumetricAdaptor::Evaluate;
182  plugin->flags = VolumetricAdaptor::Flags;
183 
184  return AFUNC_OK;
185  }
186  catch (std::exception &e)
187  {
188  lwpp::LWMessage::Error("An exception occured in Volumetric::Activate():", e.what());
189  return AFUNC_BADAPP;
190  }
191  }
192  private:
193 
194  static double Evaluate (LWInstance instance, LWVolumeAccess *lw_voa)
195  {
196  try
197  {
198  T *plugin = (T *) instance;
199  return plugin->Evaluate(VolumetricAccess(lw_voa));
200  }
201  catch (std::exception &e)
202  {
203  lwpp::LWMessage::Error("An exception occured in Volumetric::Evaluate():", e.what());
204  return 0.0;
205  }
206  }
207 
208  static unsigned int Flags (LWInstance instance)
209  {
210  try
211  {
212  T *plugin = (T *) instance;
213  return plugin->Flags();
214  }
215  catch (std::exception &e)
216  {
217  lwpp::LWMessage::Error("An exception occured in Volumetric::Flags():", e.what());
218  return AFUNC_BADAPP;
219  }
220  }
221  };
222 
229 
234 
238 
239 } // end namespace
240 
241 #endif // VOLUMETRIC_HANDLER_H