Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

Scene.h

Go to the documentation of this file.
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  * RCS INFORMATION:
00010  *
00011  *      $RCSfile: Scene.h,v $
00012  *      $Author: johns $        $Locker:  $             $State: Exp $
00013  *      $Revision: 1.69 $       $Date: 2020/12/24 04:21:51 $
00014  *
00015  ***************************************************************************/
00026 #ifndef SCENE_H
00027 #define SCENE_H
00028 
00029 #include "Displayable.h"
00030 #include "NameList.h"
00031 
00032 class DisplayDevice;
00033 class FileRenderer;
00034 class DisplayColor;
00035 
00036 // constants for this object
00037 #define DISP_LIGHTS 4
00038 
00039 // total number of colors defined here
00040 #define REGCLRS         33
00041 #define EXTRACLRS       1
00042 #define VISCLRS         (REGCLRS - EXTRACLRS)
00043 #define MAPCLRS         1024    
00044 #define MAXCOLORS       (REGCLRS + MAPCLRS)
00045 
00046 // where different type of colors start in indices
00047 #define BEGREGCLRS      0
00048 #define BEGMAP          REGCLRS
00049 
00050 // regular (visible) colors
00051 #define REGBLUE         0
00052 #define REGRED          1
00053 #define REGGREY         2
00054 #define REGORANGE       3
00055 #define REGYELLOW       4
00056 #define REGTAN          5
00057 #define REGSILVER       6
00058 #define REGGREEN        7
00059 #define REGWHITE        8
00060 #define REGPINK         9
00061 #define REGCYAN         10
00062 #define REGPURPLE       11
00063 #define REGLIME         12
00064 #define REGMAUVRE       13
00065 #define REGOCHRE        14
00066 #define REGICEBLUE      15
00067 #define REGBLACK        16
00068 
00069 #define REGBLUE2        23
00070 
00071 // macro to get colormap colors
00072 #define MAPCOLOR(a)             (a + BEGMAP)
00073 
00074 
00076 class ColorScale {
00077 public:
00078   float min[3], mid[3], max[3];
00079   char name[32];
00080 
00081   int operator==(const ColorScale c) {
00082     return !memcmp(&c, this, sizeof(ColorScale));
00083   }
00084 };
00085 
00086 
00088 class Scene {
00089 private:
00091   int backgroundmode;           
00092   int backgroundmode_changed;   
00093  
00095   struct LightState {
00096     float color[3];             
00097     float pos[3];               
00098     int highlighted;            
00099     int on;                     
00100   };
00101   int light_changed;            
00102   LightState lightState[DISP_LIGHTS]; 
00103 
00105   struct AdvancedLightState {
00106     float color[3];             
00107     float pos[3];               
00108     float constfactor;          
00109     float linearfactor;         
00110     float quadfactor;           
00111     float spotdir[3];           
00112     float fallstart;            
00113     float fallend;              
00114     int spoton;                 
00115     int highlighted;            
00116     int on;                     
00117   };
00118   int adv_light_changed;        
00119   AdvancedLightState advLightState[DISP_LIGHTS]; 
00120 
00122   static const float defaultColor[3L*REGCLRS];
00123   float colorData[3L*MAXCOLORS];
00124   NameList<NameList<int> *> categories;
00125   
00126   NameList<int> colorNames;
00127   
00128   int scaleActive;              
00129   float scaleMin, scaleMid, scaleMax;
00130   int scaleReverse;
00131   int scalePosterize;
00132   ResizeArray<ColorScale> colorScales;
00133   ResizeArray<const char *> colorScaleMenuNames;
00134   void create_colorscale();
00135 
00136   // displayables to handle the foreground and background colors of the display
00137   DisplayColor *background;
00138   DisplayColor *backgradtop;
00139   DisplayColor *backgradbot;
00140   DisplayColor *foreground;
00141 
00144   int background_color_changed;
00145   int background_color_id;
00146 
00149   int backgradtop_color_changed;
00150   int backgradtop_color_id;
00151   int backgradbot_color_changed;
00152   int backgradbot_color_id;
00153 
00156   int foreground_color_changed;
00157   int foreground_color_id;
00158 
00159 public:
00160   Scene(void);            
00161   virtual ~Scene(void);   
00162 
00166   Displayable root;
00167 
00169   void set_background_mode(int mode);
00170   int  background_mode(void);
00171 
00172   void reset_lights(); 
00173 
00175 
00176   void define_light(int n, const float *color, const float *position);
00177   void activate_light(int n, int turnon);
00178   void highlight_light(int /* n */, int /* turnon */) {}
00179   void rotate_light(int n, float theta, char axis);
00180   void move_light(int n, const float *);
00181   const float *light_pos(int n) const; // return light position, or NULL
00182   const float *light_pos_default(int n) const; // return def. light position
00183   const float *light_color(int n) const;
00184   const float *light_color_default(int n) const;
00185   int light_active(int n) const { return lightState[n].on; }
00186   int light_highlighted(int) const { return FALSE; }
00188 
00190 
00191   void define_adv_light(int n, const float *color, const float *position,
00192                         float constant, float linear, float quad, 
00193                         float *spotdir, float fallstart, float fallend,
00194                         int spoton);
00195   void activate_adv_light(int n, int turnon);
00196   void highlight_adv_light(int /* n */, int /* turnon */) {}
00197   void move_adv_light(int n, const float *);
00198   const float *adv_light_pos(int n) const; // return light position, or NULL
00199   const float *adv_light_pos_default(int n) const; // return def. light position
00200   const float *adv_light_color(int n) const;
00201   const float *adv_light_color_default(int n) const;
00202   void adv_light_attenuation(int n, float constant, float linear, float quad);
00203   void adv_light_get_attenuation(int n, float &constant, float &linear, float &quad) const;
00204   void adv_light_spotlight(int n, float *spotdir, float fallstart, 
00205                            float fallend, int spoton);
00206   const float *adv_light_get_spotlight(int n, float &fallstart,
00207                                        float &fallend, int &spoton) const;
00208   int adv_light_active(int n) const { return advLightState[n].on; }
00209   int adv_light_highlighted(int) const { return FALSE; }
00211 
00213 
00214   int add_color_category(const char *catname) {
00215     if (categories.typecode(catname) != -1) return -1;
00216     return categories.add_name(catname, new NameList<int>);
00217   }
00218   int add_color_item(int cat_id, const char *name, int init_color) {
00219     NameList<int> *cat = categories.data(cat_id);
00220     return cat->add_name(name, init_color);
00221   }
00222 
00225   void set_category_item(int cat_id, int item, int color) {
00226     NameList<int> *cat = categories.data(cat_id);
00227     cat->set_data(item, color);
00228     root.color_changed(cat_id);
00229   }
00230   void set_color_value(int n, const float *rgb) {
00231     memcpy(colorData+3L*n, rgb, 3L*sizeof(float));
00232     root.color_rgb_changed(n);
00233   }
00234 
00235   // Returns the color index for a color category
00236   int get_category_item(int cat_id, int item) {
00237     NameList<int> *cat = categories.data(cat_id);
00238     return cat->data(item);
00239   }
00240 
00242   int num_categories() const { return categories.num(); }
00243   const char *category_name(int cat) const { return categories.name(cat); }
00244   int category_index(const char *catname) const { 
00245     return categories.typecode(catname);
00246   }
00247   int num_colors() const { return MAXCOLORS; }
00248   int num_regular_colors() const { return REGCLRS; }
00249   const char *color_name(int n) const { return colorNames.name(n); }
00250 
00252   int color_index(const char *name) const { return colorNames.typecode(name); }
00253   const float *color_value(int n) const { return colorData+3L*n; }
00254   const float *color_default_value(int n) const { return defaultColor+3L*n; }
00255   int num_category_items(int cat) const { 
00256     return categories.data(cat)->num(); 
00257   }
00258   const char *category_item_name(int cat, int item) const {
00259     return categories.data(cat)->name(item);
00260   }
00261   int category_item_index(int cat, const char *item) const {
00262     return categories.data(cat)->typecode(item);
00263   }
00264   int category_item_value(int cat, const char *item) const {
00265     return categories.data(cat)->data(item);
00266   }
00267   int category_item_value(int cat, int item) const {
00268     return categories.data(cat)->data(item);
00269   }
00270 
00273   int nearest_index(float r, float g, float b) const;
00274 
00276   void set_colorscale_params(float min, float mid, float max, 
00277                              int reverse, int posterize) {
00278     scaleMin = min; scaleMid = mid; scaleMax = max;
00279     scaleReverse = reverse;
00280     scalePosterize = posterize;
00281     create_colorscale();
00282   }
00283   void set_colorscale_method(int index) {
00284     if (scaleActive != index) {
00285       scaleActive = index;
00286       create_colorscale();
00287     }
00288   }
00289 
00291   int get_colorscale_colors(int whichScale, 
00292       float min[3], float mid[3], float max[3]);
00293 
00295   int set_colorscale_colors(int whichScale, 
00296       const float min[3], const float mid[3], const float max[3]);
00297 
00299   void colorscale_params(float *mid, float *min, float *max,
00300                          int *reverse, int *posterize) const {
00301     *mid = scaleMid; *min = scaleMin; *max = scaleMax; 
00302     *reverse = scaleReverse;
00303     *posterize = scalePosterize;
00304   }
00305 
00306   int colorscale_method() const { return scaleActive; }
00307 
00308   int num_colorscale_methods() const { return int(colorScales.num()); }
00309   const char *colorscale_method_name(int n) const {
00310     return colorScales[n].name;
00311   }
00312   const char *colorscale_method_menuname(int n) const {
00313     return colorScaleMenuNames[n];
00314   }
00315 
00316   int colorscale_type(int index);
00317 
00319  
00322   virtual int prepare();
00323 
00330   virtual void draw(DisplayDevice *);
00331   
00337   int filedraw(FileRenderer *, const char *, DisplayDevice *);
00338 
00340   void draw_finished();
00341 
00342 };
00343 
00344 #endif
00345 

Generated on Fri Nov 8 02:45:32 2024 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002