Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_studiolight.c')
-rw-r--r--source/blender/draw/engines/workbench/workbench_studiolight.c117
1 files changed, 9 insertions, 108 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_studiolight.c b/source/blender/draw/engines/workbench/workbench_studiolight.c
index 5b1d4432ca7..f7d107ea403 100644
--- a/source/blender/draw/engines/workbench/workbench_studiolight.c
+++ b/source/blender/draw/engines/workbench/workbench_studiolight.c
@@ -22,118 +22,19 @@
/** \file workbench_studiolight.c
* \ingroup draw_engine
*/
+#include "BKE_studiolight.h"
+
#include "DRW_engine.h"
#include "workbench_private.h"
#include "BLI_math.h"
-
-#define STUDIOLIGHT_X_POS 0
-#define STUDIOLIGHT_X_NEG 1
-#define STUDIOLIGHT_Y_POS 2
-#define STUDIOLIGHT_Y_NEG 3
-#define STUDIOLIGHT_Z_POS 4
-#define STUDIOLIGHT_Z_NEG 5
-
-const float studiolights[][6][3] = {
- {
- {1.0, 0.8, 0.6},
- {1.0, 0.6, 0.6},
- {0.9, 0.9, 1.0},
- {0.05, 0.025, 0.025},
- {0.8, 0.8, 0.75},
- {1.0, 0.95, 0.8},
- },
- {
- {0.0, 0.0, 0.0},
- {0.0, 0.0, 0.0},
- {0.0, 0.0, 0.0},
- {0.0, 0.0, 0.0},
- {0.8, 0.8, 1.0},
- {0.0, 0.0, 0.0},
- },
- {
- {0.4, 0.3, 0.8},
- {0.4, 0.3, 0.8},
- {0.8, 0.8, 0.2},
- {0.0, 0.0, 0.0},
- {0.4, 0.4, 0.8},
- {0.0, 0.0, 0.0},
- },
- {
- {0.2, 0.2, 0.0},
- {0.8, 0.2, 0.0},
- {0.8, 0.2, 0.0},
- {0.2, 0.2, 0.0},
- {0.8, 0.6, 0.4},
- {0.0, 0.0, 0.0},
- },
- {
- {0.8, 0.2, 0.0},
- {0.8, 0.2, 0.0},
- {0.8, 0.6, 0.0},
- {0.2, 0.2, 0.0},
- {1.0, 0.5, 0.0},
- {0.0, 0.0, 0.0},
- },
-};
-
-void studiolight_update_world(int studio_light, WORKBENCH_UBO_World *wd)
-{
- copy_v3_v3(wd->diffuse_light_x_pos, studiolights[studio_light][STUDIOLIGHT_X_POS]);
- copy_v3_v3(wd->diffuse_light_x_neg, studiolights[studio_light][STUDIOLIGHT_X_NEG]);
- copy_v3_v3(wd->diffuse_light_y_pos, studiolights[studio_light][STUDIOLIGHT_Y_POS]);
- copy_v3_v3(wd->diffuse_light_y_neg, studiolights[studio_light][STUDIOLIGHT_Y_NEG]);
- copy_v3_v3(wd->diffuse_light_z_pos, studiolights[studio_light][STUDIOLIGHT_Z_POS]);
- copy_v3_v3(wd->diffuse_light_z_neg, studiolights[studio_light][STUDIOLIGHT_Z_NEG]);
-}
-
-uint *WORKBENCH_generate_studiolight_preview(int studiolight_id, int icon_size)
+void studiolight_update_world(StudioLight *sl, WORKBENCH_UBO_World *wd)
{
- uint *rect = MEM_mallocN(icon_size * icon_size * sizeof(uint), __func__);
- int icon_center = icon_size / 2;
- float sphere_radius = icon_center * 0.9;
-
- int offset = 0;
- for (int y = 0; y < icon_size; y++) {
- float dy = y - icon_center;
- for (int x = 0; x < icon_size; x++) {
- float dx = x - icon_center;
- /* calculate aliasing */
- float alias = 0;
- const float alias_step = 0.2;
- for (float ay = dy - 0.5; ay < dy + 0.5; ay += alias_step) {
- for (float ax = dx - 0.5; ax < dx + 0.5; ax += alias_step) {
- if (sqrt(ay * ay + ax * ax) < sphere_radius) {
- alias += alias_step * alias_step;
- }
- }
- }
- uint pixelresult = 0x0;
- uint alias_i = clamp_i(alias * 256, 0, 255);
- if (alias_i != 0) {
- /* calculate normal */
- uint alias_mask = alias_i << 24;
- float normal[3];
- normal[0] = dx / sphere_radius;
- normal[1] = dy / sphere_radius;
- normal[2] = sqrt(-(normal[0] * normal[0]) - (normal[1] * normal[1]) + 1);
- normalize_v3(normal);
-
- float color[3];
- mul_v3_v3fl(color, studiolights[studiolight_id][STUDIOLIGHT_X_POS], clamp_f(normal[0], 0.0, 1.0));
- interp_v3_v3v3(color, color, studiolights[studiolight_id][STUDIOLIGHT_X_NEG], clamp_f(-normal[0], 0.0, 1.0));
- interp_v3_v3v3(color, color, studiolights[studiolight_id][STUDIOLIGHT_Y_POS], clamp_f(normal[1], 0.0, 1.0));
- interp_v3_v3v3(color, color, studiolights[studiolight_id][STUDIOLIGHT_Y_NEG], clamp_f(-normal[1], 0.0, 1.0));
- interp_v3_v3v3(color, color, studiolights[studiolight_id][STUDIOLIGHT_Z_POS], clamp_f(normal[2], 0.0, 1.0));
-
- pixelresult = rgb_to_cpack(
- linearrgb_to_srgb(color[0]),
- linearrgb_to_srgb(color[1]),
- linearrgb_to_srgb(color[2])) | alias_mask;
- }
- rect[offset++] = pixelresult;
- }
- }
- return rect;
+ copy_v3_v3(wd->diffuse_light_x_pos, sl->diffuse_light[STUDIOLIGHT_X_POS]);
+ copy_v3_v3(wd->diffuse_light_x_neg, sl->diffuse_light[STUDIOLIGHT_X_NEG]);
+ copy_v3_v3(wd->diffuse_light_y_pos, sl->diffuse_light[STUDIOLIGHT_Y_POS]);
+ copy_v3_v3(wd->diffuse_light_y_neg, sl->diffuse_light[STUDIOLIGHT_Y_NEG]);
+ copy_v3_v3(wd->diffuse_light_z_pos, sl->diffuse_light[STUDIOLIGHT_Z_POS]);
+ copy_v3_v3(wd->diffuse_light_z_neg, sl->diffuse_light[STUDIOLIGHT_Z_NEG]);
}