00001 /*************************************************************************** 00002 *cr 00003 *cr (C) Copyright 1995-2019 The Board of Trustees of the 00004 *cr University of Illinois 00005 *cr All Rights Reserved 00006 *cr 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * RCS INFORMATION: 00011 * 00012 * $RCSfile: OptiXDisplayDevice.h,v $ 00013 * $Author: johns $ $Locker: $ $State: Exp $ 00014 * $Revision: 1.33 $ $Date: 2020年11月17日 20:34:02 $ 00015 * 00016 ***************************************************************************/ 00075 #ifndef LIBOPTIXDISPLAYDEVICE 00076 #define LIBOPTIXDISPLAYDEVICE 00077 00078 #include <stdio.h> 00079 #include "Matrix4.h" 00080 #include "FileRenderer.h" 00081 #include "WKFUtils.h" // timers 00082 00084 class OptiXRenderer; 00085 00087 class OptiXDisplayDevice: public FileRenderer { 00088 private: 00089 int isinteractive; 00090 OptiXRenderer * ort; 00091 wkf_timerhandle ort_timer; 00092 00093 void reset_vars(void); 00094 void write_lights(void); 00095 void write_materials(void); 00096 void add_material(void); 00097 00098 #if 0 00099 // state tracking for volumetric texturing 00100 int involtex; 00101 int voltexID; 00102 float xplaneeq[4]; 00103 float yplaneeq[4]; 00104 float zplaneeq[4]; 00105 00106 // state tracking for user-defined clipping planes 00107 int inclipgroup; 00108 #endif 00109 00110 // storage and state variables needed to aggregate lone cylinders 00111 // with common color and material state into a larger buffer for 00112 // transmission to OptiX 00113 int cylinder_matindex; 00114 Matrix4 *cylinder_xform; 00115 float cylinder_radius_scalefactor; 00116 ResizeArray<float> cylinder_vert_buffer; 00117 ResizeArray<float> cylinder_radii_buffer; 00118 ResizeArray<float> cylinder_color_buffer; 00119 // cylinder end caps, made from rings 00120 ResizeArray<float> cylcap_vert_buffer; 00121 ResizeArray<float> cylcap_norm_buffer; 00122 ResizeArray<float> cylcap_radii_buffer; 00123 ResizeArray<float> cylcap_color_buffer; 00124 00125 00127 void reset_cylinder_buffer() { 00128 cylinder_matindex = -1; 00129 cylinder_xform = NULL; 00130 cylinder_radius_scalefactor=1.0f; 00131 cylinder_vert_buffer.clear(); 00132 cylinder_radii_buffer.clear(); 00133 cylinder_color_buffer.clear(); 00134 00135 cylcap_vert_buffer.clear(); 00136 cylcap_norm_buffer.clear(); 00137 cylcap_radii_buffer.clear(); 00138 cylcap_color_buffer.clear(); 00139 }; 00140 00141 00142 // storage and state variables needed to aggregate lone spheres 00143 // with common color and material state into a larger buffer for 00144 // transmission to OptiX 00145 int sphere_matindex; 00146 Matrix4 *sphere_xform; 00147 float sphere_radius_scalefactor; 00148 ResizeArray<float> sphere_vert_buffer; 00149 ResizeArray<float> sphere_radii_buffer; 00150 ResizeArray<float> sphere_color_buffer; 00151 00152 00154 void reset_sphere_buffer() { 00155 sphere_matindex = -1; 00156 sphere_xform = NULL; 00157 sphere_radius_scalefactor=1.0f; 00158 sphere_vert_buffer.clear(); 00159 sphere_radii_buffer.clear(); 00160 sphere_color_buffer.clear(); 00161 }; 00162 00163 00164 // storage and state variables needed to aggregate lone triangles 00165 // with common color and material state into a larger buffer for 00166 // transmission to OptiX 00167 int triangle_cindex; 00168 int triangle_matindex; 00169 Matrix4 *triangle_xform; 00170 ResizeArray<float> triangle_vert_buffer; 00171 ResizeArray<float> triangle_norm_buffer; 00172 00174 void reset_triangle_buffer() { 00175 triangle_cindex = -1; 00176 triangle_matindex = -1; 00177 triangle_xform = NULL; 00178 triangle_vert_buffer.clear(); 00179 triangle_norm_buffer.clear(); 00180 }; 00181 00182 protected: 00183 void send_cylinder_buffer(void); 00184 void send_sphere_buffer(void); 00185 void send_triangle_buffer(void); 00186 00187 void cylinder(float *, float *, float rad, int filled); 00188 void sphere(float *xyzr); 00189 void sphere_array(int num, int res, float *centers, 00190 float *radii, float *colors); 00191 void text(float *pos, float size, float thickness, const char *str); 00192 void triangle(const float *, const float *, const float *, 00193 const float *, const float *, const float *); 00194 void tricolor(const float * xyz1, const float * xyz2, const float * xyz3, 00195 const float * n1, const float * n2, const float * n3, 00196 const float * c1, const float * c2, const float * c3); 00197 void trimesh_c4u_n3b_v3f(unsigned char *c, signed char *n, float *v, int numfacets); 00198 void trimesh_c4u_n3f_v3f(unsigned char *c, float *n, float *v, int numfacets); 00199 void trimesh_c4n3v3(int numverts, float * cnv, int numfacets, int * facets); 00200 void trimesh_n3b_v3f(signed char *n, float *v, int numfacets); 00201 void trimesh_n3f_v3f(float *n, float *v, int numfacets); 00202 void trimesh_n3fopt_v3f(float *n, float *v, int numfacets); 00203 void tristrip(int numverts, const float * cnv, 00204 int numstrips, const int *vertsperstrip, 00205 const int *facets); 00206 00207 public: 00208 OptiXDisplayDevice(VMDApp *, int interactive); 00209 virtual ~OptiXDisplayDevice(void); 00210 00212 static unsigned int device_count(void); 00213 00214 void write_header(void); 00215 void write_trailer(void); 00216 }; 00217 00218 #endif 00219