GRASS Programmer's Manual  6.5.svn(2012)-r51648
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
lights.c
Go to the documentation of this file.
00001 
00015 #include <grass/glocale.h>
00016 #include <grass/nviz.h>
00017 
00027 int Nviz_set_light_position(nv_data * data, int num,
00028                             double x, double y, double z, double w)
00029 {
00030     /*
00031     double xpos, ypos;
00032     xpos = x;
00033     xpos = (xpos < 0) ? 0 : (xpos > 1.0) ? 1.0 : xpos;
00034     ypos = 1.0 - y;
00035     ypos = (ypos < 0) ? 0 : (ypos > 1.0) ? 1.0 : ypos;
00036     
00037     if (x < 0.0 || x > 1.0 || y < 0.0 || y > 1.0) {
00038         G_debug(1, "Invalid light position coordinates (%f,%f), using %f,%f",
00039                 x, y, xpos, 1.0 - ypos);
00040     }
00041     */
00042 
00043     data->light[num].id = num;
00044     data->light[num].x = x;
00045     data->light[num].y = y;
00046     data->light[num].z = z;
00047     data->light[num].w = w;
00048 
00049     G_debug(1, "Nviz_set_light_position(): num = %d x = %f y = %f z = %f w = %f",
00050             num, x, y, z, w);
00051     GS_setlight_position(num, x, y, z, w);
00052 
00053     return 1;
00054 }
00055 
00063 int Nviz_set_light_bright(nv_data * data, int num, double value)
00064 {
00065     double r, g, b;
00066 
00067     data->light[num].brt = value;
00068 
00069     r = data->light[num].r * data->light[num].brt;
00070     g = data->light[num].g * data->light[num].brt;
00071     b = data->light[num].b * data->light[num].brt;
00072 
00073     G_debug(1, "Nviz_set_light_bright(): num = %d value = %f r = %f g = %f b = %f",
00074             num, value, r, g, b);
00075     GS_setlight_color(num, r, g, b);
00076 
00077     return 1;
00078 }
00079 
00087 int Nviz_set_light_color(nv_data * data, int num,
00088                          int red, int green, int blue)
00089 {
00090     double r, g, b;
00091 
00092     data->light[num].r = red / 255.;
00093     data->light[num].g = green / 255.;
00094     data->light[num].b = blue / 255.;
00095 
00096     r = data->light[num].r * data->light[num].brt;
00097     g = data->light[num].g * data->light[num].brt;
00098     b = data->light[num].b * data->light[num].brt;
00099 
00100     G_debug(1, "Nviz_set_light_color(): num = %d r = %d/%f g = %d/%f b = %d/%f",
00101             num, red, r, green, g, blue, b);
00102     GS_setlight_color(num, r, g, b);
00103 
00104     return 1;
00105 }
00106 
00114 int Nviz_set_light_ambient(nv_data * data, int num, double value)
00115 {
00116     data->light[num].ar = value;
00117     data->light[num].ag = value;
00118     data->light[num].ab = value;
00119 
00120     G_debug(1, "Nviz_set_light_ambient(): num = %d value = %f",
00121             num, value);
00122     GS_setlight_ambient(num, value, value, value);
00123     
00124     return 1;
00125 }
00126 
00133 int Nviz_init_light(nv_data * data, int num)
00134 {
00135         G_debug(1, "Nviz_init_light(): num = %d", num);
00136     if (num > MAX_LIGHTS) {
00137         return 0;
00138     }
00139 
00140     data->light[num].id = 0;
00141     data->light[num].brt = 0.8;
00142     data->light[num].ar = 0.3;
00143     data->light[num].ag = 0.3;
00144     data->light[num].ab = 0.3;
00145     data->light[num].r = 1.0;
00146     data->light[num].b = 1.0;
00147     data->light[num].g = 1.0;
00148     data->light[num].x = 1.0;
00149     data->light[num].y = 1.0;
00150     data->light[num].z = 1.0;
00151     data->light[num].w = 1.0;
00152 
00153     return 1;
00154 }
00155 
00164 int Nviz_new_light(nv_data * data)
00165 {
00166     int num;
00167 
00168     num = GS_new_light();
00169 
00170     if (num < 1) {
00171         G_warning(_("Unable to define new light"));
00172         return 0;
00173     }
00174 
00175     Nviz_init_light(data, num);
00176 
00177     return 1;
00178 }
00179 
00185 void Nviz_draw_model(nv_data * data)
00186 {
00187     GS_set_draw(GSD_FRONT);
00188     GS_ready_draw();
00189     GS_draw_lighting_model();
00190     GS_done_draw();
00191     GS_set_draw(GSD_BACK);
00192 }