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