00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00038 #ifndef LIBOSPRAY2RENDERER
00039 #define LIBOSPRAY2RENDERER
00040
00041 #include <stdio.h>
00042 #include <stdlib.h>
00043 #include <ospray/ospray.h>
00044 #include "Matrix4.h"
00045 #include "ResizeArray.h"
00046 #include "WKFUtils.h"
00047 #if !defined(OSPRAY_VERSION_MAJOR)
00048 #include <ospray/version.h>
00049 #endif
00050
00051
00052
00053 #if defined(VMDOPTIX_INTERACTIVE_OPENGL) && !defined(VMDOPENGL)
00054 #undef VMDOPTIX_INTERACTIVE_OPENGL
00055 #endif
00056
00057 #if defined(VMDOSPRAY_INTERACTIVE_OPENGL)
00058 #include "glwin.h"
00059 #endif
00060
00062 typedef struct {
00063 OSPMaterial mat;
00064 int isvalid;
00065 float ambient;
00066 float diffuse;
00067 float specular;
00068 float shininess;
00069 float reflectivity;
00070 float opacity;
00071 float outline;
00072 float outlinewidth;
00073 int transmode;
00074 int ind;
00075 } osp_material;
00076
00077 typedef struct {
00078 float dir[3];
00079 float color[3];
00080 } osp_directional_light;
00081
00082 typedef struct {
00083 float pos[3];
00084 float color[3];
00085 } osp_positional_light;
00086
00087
00088 typedef struct {
00089 int num;
00090 float *v;
00091 float *n;
00092 float *c;
00093 int *f;
00094 OSPGeometry geom;
00095 OSPData verts;
00096 OSPData norms;
00097 OSPData cols;
00098 OSPData ind;
00099 OSPGeometricModel model;
00100 int matindex;
00101 } osp_trimesh_v3f_n3f_c3f;
00102
00103
00104 typedef struct {
00105 int num;
00106 float *xyz;
00107 float *radii;
00108 float *colors;
00109 OSPGeometry geom;
00110 OSPData cents;
00111 OSPData rads;
00112 OSPData cols;
00113 OSPGeometricModel model;
00114 int matindex;
00115 } osp_sphere_array_color;
00116
00117
00118 typedef struct {
00119 int num;
00120 float *vertsrads;
00121 float *colors;
00122 unsigned int *indices;
00123 OSPGeometry geom;
00124 OSPData cyls;
00125 OSPData cols;
00126 OSPData ind;
00127 OSPGeometricModel model;
00128 int matindex;
00129 } osp_cylinder_array_color;
00130
00131
00132 class OSPRay2Renderer {
00133 public:
00134
00135 enum RtShadowMode { RT_SHADOWS_OFF=0,
00136 RT_SHADOWS_ON=1,
00137 };
00138 enum FogMode { RT_FOG_NONE=0, RT_FOG_LINEAR=1, RT_FOG_EXP=2, RT_FOG_EXP2=3 };
00139 enum CameraProjection { RT_PERSPECTIVE=0,
00140 RT_ORTHOGRAPHIC=1
00141
00142
00143
00144
00145
00146 };
00147 enum Verbosity { RT_VERB_MIN=0, RT_VERB_TIMING=1, RT_VERB_DEBUG=2 };
00148 enum BGMode { RT_BACKGROUND_TEXTURE_SOLID=0,
00149 RT_BACKGROUND_TEXTURE_SKY_SPHERE=1,
00150 RT_BACKGROUND_TEXTURE_SKY_ORTHO_PLANE=2 };
00151 enum RenderMode { RT_SCIVIS=0, RT_PATHTRACER=1 };
00152
00153 private:
00154 struct vec3 { float x, y, z; };
00155 struct rgba { float r, g, b, a; };
00156
00157 struct Sphere {
00158 vec3 center;
00159 float radius;
00160 rgba color;
00161 int type;
00162 };
00163
00164 Verbosity verbose;
00165 int width;
00166 int height;
00167
00168 wkf_timerhandle osp_timer;
00169 double time_ctx_create;
00170 double time_ctx_setup;
00171 double time_ctx_validate;
00172 double time_ctx_AS_build;
00173 double time_ctx_destroy_scene;
00174 double time_ray_tracing;
00175 double time_image_io;
00176
00177
00178 RenderMode osp_rendermode;
00179 int context_created;
00180 OSPRenderer ospRenderer;
00181 OSPWorld ospWorld;
00182 ResizeArray<OSPInstance> ospInstances;
00183
00184 ResizeArray<OSPLight> ospLights;
00185 OSPData ospLightData;
00186 OSPCamera ospCamera;
00187 OSPFrameBuffer ospFrameBuffer;
00188
00189 int interactive_renderer;
00190
00191 int lasterror;
00192 int buffers_allocated;
00193 int headlight_enabled;
00194
00195 float ao_ambient;
00196 float ao_direct;
00197
00198
00199 long cylinder_array_cnt;
00200
00201
00202 long cylinder_array_color_cnt;
00203
00204
00205 long ring_array_color_cnt;
00206
00207
00208 long sphere_array_cnt;
00209
00210
00211 long sphere_array_color_cnt;
00212
00213
00214
00215 long tricolor_cnt;
00216 long trimesh_c4u_n3b_v3f_cnt;
00217 long trimesh_n3b_v3f_cnt;
00218 long trimesh_n3f_v3f_cnt;
00219 long trimesh_v3f_cnt;
00220
00221
00222 int scene_created;
00223
00224
00225
00226
00227
00228
00229 int shadows_enabled;
00230 float cam_zoom;
00231
00232 float cam_stereo_eyesep;
00233 float cam_stereo_convergence_dist;
00234
00235 int dof_enabled;
00236 float cam_dof_focal_dist;
00237 float cam_dof_fnumber;
00238
00239 CameraProjection camera_projection;
00240
00241 int ext_aa_loops;
00242 int aa_samples;
00243 int ao_samples;
00244
00245
00246 BGMode scene_background_mode;
00247 float scene_bg_color[3];
00248 float scene_bg_grad_top[3];
00249 float scene_bg_grad_bot[3];
00250 float scene_gradient[3];
00251 float scene_gradient_topval;
00252 float scene_gradient_botval;
00253 float scene_gradient_invrange;
00254
00255
00256 int fog_mode;
00257 float fog_start;
00258 float fog_end;
00259 float fog_density;
00260
00261 ResizeArray<osp_material> materialcache;
00262
00263 ResizeArray<osp_directional_light> directional_lights;
00264 ResizeArray<osp_positional_light> positional_lights;
00265
00266
00267 ResizeArray<osp_trimesh_v3f_n3f_c3f> trimesh_v3f_n3f_c3f;
00268 ResizeArray<osp_sphere_array_color> spheres_color;
00269 ResizeArray<osp_cylinder_array_color> cylinders_color;
00270
00271 public:
00272 static int OSPRay_Global_Init(void);
00273 static void OSPRay_Global_Shutdown(void);
00274
00276 OSPRay2Renderer(void);
00277 ~OSPRay2Renderer(void);
00278
00280 void check_verbose_env();
00281
00283 void setup_context(int width, int height);
00284
00286 void reposp_context_stats(void);
00287
00289 void shadows_on(int onoff) { shadows_enabled = (onoff != 0); }
00290
00292 void set_aa_samples(int cnt) { aa_samples = cnt; }
00293
00295 void set_camera_projection(CameraProjection m) { camera_projection = m; }
00296
00298 void set_camera_zoom(float zoomfactor) { cam_zoom = zoomfactor; }
00299
00301 void set_camera_stereo_eyesep(float eyesep) { cam_stereo_eyesep = eyesep; }
00302
00304 void set_camera_stereo_convergence_dist(float dist) {
00305 cam_stereo_convergence_dist = dist;
00306 }
00307
00309 void dof_on(int onoff) { dof_enabled = (onoff != 0); }
00310
00312 void set_camera_dof_focal_dist(float d) { cam_dof_focal_dist = d; }
00313
00315 void set_camera_dof_fnumber(float n) { cam_dof_fnumber = n; }
00316
00318 void set_ao_samples(int cnt) { ao_samples = cnt; }
00319
00321 void set_ao_ambient(float aoa) { ao_ambient = aoa; }
00322
00324 void set_ao_direct(float aod) { ao_direct = aod; }
00325
00326 void set_bg_mode(BGMode m) { scene_background_mode = m; }
00327 void set_bg_color(float *rgb) { memcpy(scene_bg_color, rgb, sizeof(scene_bg_color)); }
00328 void set_bg_color_grad_top(float *rgb) { memcpy(scene_bg_grad_top, rgb, sizeof(scene_bg_grad_top)); }
00329 void set_bg_color_grad_bot(float *rgb) { memcpy(scene_bg_grad_bot, rgb, sizeof(scene_bg_grad_bot)); }
00330 void set_bg_gradient(float *vec) { memcpy(scene_gradient, vec, sizeof(scene_gradient)); }
00331 void set_bg_gradient_topval(float v) { scene_gradient_topval = v; }
00332 void set_bg_gradient_botval(float v) { scene_gradient_botval = v; }
00333
00334 void set_cue_mode(FogMode mode, float start, float end, float density) {
00335 fog_mode = mode;
00336 fog_start = start;
00337 fog_end = end;
00338 fog_density = density;
00339 }
00340
00341 void init_materials();
00342 void add_material(int matindex, float ambient, float diffuse,
00343 float specular, float shininess, float reflectivity,
00344 float opacity, float outline, float outlinewidth,
00345 int transmode);
00346 void set_material(OSPGeometricModel &model, int matindex, float *uniform_color);
00347 void attach_sphere_array(int numsp, int matindex,
00348 osp_sphere_array_color &sparray);
00349 void attach_cylinder_array(int numcyl, int matindex,
00350 osp_cylinder_array_color &cylarray);
00351 void attach_mesh(int numverts, int numfacets, int matindex,
00352 osp_trimesh_v3f_n3f_c3f &mesh);
00353
00354
00355 void clear_all_lights() {
00356 headlight_enabled = 0;
00357 directional_lights.clear();
00358 positional_lights.clear();
00359 }
00360 void headlight_onoff(int onoff) { headlight_enabled = (onoff==1); };
00361 void add_directional_light(const float *dir, const float *color);
00362 void add_positional_light(const float *pos, const float *color);
00363
00364 void update_rendering_state(int interactive);
00365
00366 void framebuffer_config(int fbwidth, int fbheight);
00367 void framebuffer_resize(int fbwidth, int fbheight);
00368 void framebuffer_destroy(void);
00369
00370 void render_compile_and_validate(void);
00371 void render_to_file(const char *filename);
00372 #if defined(VMDOSPRAY_INTERACTIVE_OPENGL)
00373 void render_to_glwin(const char *filename);
00374 #endif
00375
00376 void destroy_scene(void);
00377
00378 #if 1
00379 void cylinder_array(Matrix4 *wtrans, float rscale, float *uniform_color,
00380 int cylnum, float *points, int matindex);
00381 #endif
00382
00383 void cylinder_array_color(Matrix4 & wtrans, float rscale, int cylnum,
00384 float *points, float *radii, float *colors,
00385 int matindex);
00386
00387 #if 0
00388 void ring_array_color(Matrix4 & wtrans, float rscale, int rnum,
00389 float *centers, float *norms, float *radii,
00390 float *colors, int matindex);
00391 #endif
00392
00393 void sphere_array(Matrix4 *wtrans, float rscale, float *uniform_color,
00394 int spnum, float *centers, float *radii, int matindex);
00395
00396 void sphere_array_color(Matrix4 & wtrans, float rscale, int spnum,
00397 float *centers, float *radii, float *colors,
00398 int matindex);
00399
00400 void tricolor_list(Matrix4 & wtrans, int numtris, float *vnc, int matindex);
00401
00402 void trimesh_c4n3v3(Matrix4 & wtrans, int numverts,
00403 float *cnv, int numfacets, int * facets, int matindex);
00404
00405 void trimesh_c4u_n3b_v3f(Matrix4 & wtrans, unsigned char *c, signed char *n,
00406 float *v, int numfacets, int matindex);
00407
00408 void trimesh_c4u_n3f_v3f(Matrix4 & wtrans, unsigned char *c,
00409 float *n, float *v, int numfacets, int matindex);
00410
00411 void trimesh_n3b_v3f(Matrix4 & wtrans, float *uniform_color,
00412 signed char *n, float *v, int numfacets, int matindex);
00413
00414 void trimesh_n3f_v3f(Matrix4 & wtrans, float *uniform_color,
00415 float *n, float *v, int numfacets, int matindex);
00416
00417 #if 0
00418 void trimesh_v3f(Matrix4 & wtrans, float *uniform_color,
00419 float *v, int numfacets, int matindex);
00420 #endif
00421
00422 void tristrip(Matrix4 & wtrans, int numverts, const float * cnv,
00423 int numstrips, const int *vertsperstrip,
00424 const int *facets, int matindex);
00425
00426 };
00427
00428 #endif
00429