lights.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*!
  2. \file lib/nviz/lights.c
  3. \brief Nviz library -- Change lighting settings
  4. Based on visualization/nviz/src/lights.c
  5. (C) 2008, 2010 by the GRASS Development Team
  6. This program is free software under the GNU General Public License
  7. (>=v2). Read the file COPYING that comes with GRASS for details.
  8. \author Updated/modified by Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  9. */
  10. #include <grass/glocale.h>
  11. #include <grass/nviz.h>
  12. /*!
  13. \brief Set light position
  14. \param data nviz data
  15. \param num light num (starts at 1)
  16. \param x,y,z,w position, model coordinates
  17. \return 1
  18. */
  19. int Nviz_set_light_position(nv_data * data, int num,
  20. double x, double y, double z, double w)
  21. {
  22. /*
  23. double xpos, ypos;
  24. xpos = x;
  25. xpos = (xpos < 0) ? 0 : (xpos > 1.0) ? 1.0 : xpos;
  26. ypos = 1.0 - y;
  27. ypos = (ypos < 0) ? 0 : (ypos > 1.0) ? 1.0 : ypos;
  28. if (x < 0.0 || x > 1.0 || y < 0.0 || y > 1.0) {
  29. G_debug(1, "Invalid light position coordinates (%f,%f), using %f,%f",
  30. x, y, xpos, 1.0 - ypos);
  31. }
  32. */
  33. data->light[num].id = num;
  34. data->light[num].x = x;
  35. data->light[num].y = y;
  36. data->light[num].z = z;
  37. data->light[num].w = w;
  38. G_debug(1, "Nviz_set_light_position(): num = %d x = %f y = %f z = %f w = %f",
  39. num, x, y, z, w);
  40. GS_setlight_position(num, x, y, z, w);
  41. return 1;
  42. }
  43. /*!
  44. \brief Set light brightness
  45. \param data nviz data
  46. \param num light num (starts at 1)
  47. \param value brightness value
  48. */
  49. int Nviz_set_light_bright(nv_data * data, int num, double value)
  50. {
  51. double r, g, b;
  52. data->light[num].brt = value;
  53. r = data->light[num].r * data->light[num].brt;
  54. g = data->light[num].g * data->light[num].brt;
  55. b = data->light[num].b * data->light[num].brt;
  56. G_debug(1, "Nviz_set_light_bright(): num = %d value = %f r = %f g = %f b = %f",
  57. num, value, r, g, b);
  58. GS_setlight_color(num, r, g, b);
  59. return 1;
  60. }
  61. /*!
  62. \brief Set light color
  63. \param data nviz data
  64. \param num light num (starts at 1)
  65. \param red,green,blue RGB values (0-255)
  66. */
  67. int Nviz_set_light_color(nv_data * data, int num,
  68. int red, int green, int blue)
  69. {
  70. double r, g, b;
  71. data->light[num].r = red / 255.;
  72. data->light[num].g = green / 255.;
  73. data->light[num].b = blue / 255.;
  74. r = data->light[num].r * data->light[num].brt;
  75. g = data->light[num].g * data->light[num].brt;
  76. b = data->light[num].b * data->light[num].brt;
  77. G_debug(1, "Nviz_set_light_color(): num = %d r = %d/%f g = %d/%f b = %d/%f",
  78. num, red, r, green, g, blue, b);
  79. GS_setlight_color(num, r, g, b);
  80. return 1;
  81. }
  82. /*!
  83. \brief Set light ambient
  84. \param data nviz data
  85. \param num light num (starts at 1)
  86. \param value ambient value (same for R/G/B) (0-1)
  87. */
  88. int Nviz_set_light_ambient(nv_data * data, int num, double value)
  89. {
  90. data->light[num].ar = value;
  91. data->light[num].ag = value;
  92. data->light[num].ab = value;
  93. G_debug(1, "Nviz_set_light_ambient(): num = %d value = %f",
  94. num, value);
  95. GS_setlight_ambient(num, value, value, value);
  96. return 1;
  97. }
  98. /*!
  99. \brief Init new light
  100. \param data nviz data
  101. \param num light num (starts at 1)
  102. */
  103. int Nviz_init_light(nv_data * data, int num)
  104. {
  105. G_debug(1, "Nviz_init_light(): num = %d", num);
  106. if (num > MAX_LIGHTS) {
  107. return 0;
  108. }
  109. data->light[num].id = 0;
  110. data->light[num].brt = 0.8;
  111. data->light[num].ar = 0.3;
  112. data->light[num].ag = 0.3;
  113. data->light[num].ab = 0.3;
  114. data->light[num].r = 1.0;
  115. data->light[num].b = 1.0;
  116. data->light[num].g = 1.0;
  117. data->light[num].x = 1.0;
  118. data->light[num].y = 1.0;
  119. data->light[num].z = 1.0;
  120. data->light[num].w = 1.0;
  121. return 1;
  122. }
  123. /*!
  124. \brief Define new light
  125. \param data nviz data
  126. \return 1 on success
  127. \return 0 on failure
  128. */
  129. int Nviz_new_light(nv_data * data)
  130. {
  131. int num;
  132. num = GS_new_light();
  133. if (num < 1) {
  134. G_warning(_("Unable to define new light"));
  135. return 0;
  136. }
  137. Nviz_init_light(data, num);
  138. return 1;
  139. }
  140. /*!
  141. \brief Draw lighting model
  142. \param data nviz data
  143. */
  144. void Nviz_draw_model(nv_data * data)
  145. {
  146. GS_set_draw(GSD_FRONT);
  147. GS_ready_draw();
  148. GS_draw_lighting_model();
  149. GS_done_draw();
  150. GS_set_draw(GSD_BACK);
  151. }