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:
authorClément Foucault <foucault.clem@gmail.com>2018-06-17 00:28:28 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-06-17 00:28:39 +0300
commitfe98124a9821c2b5fdf5a81ac69f80ff2fa8e8bb (patch)
tree2219bb9be3352b79c44a2efc28fde3dcdf03fba2 /source/blender/blenkernel/intern/studiolight.c
parentb503dd7747bf5894c3407cba15fe029e54134094 (diff)
Custom Hdri: Use same AntiAliasing as Matcaps
Diffstat (limited to 'source/blender/blenkernel/intern/studiolight.c')
-rw-r--r--source/blender/blenkernel/intern/studiolight.c56
1 files changed, 24 insertions, 32 deletions
diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c
index e30534e2761..1735388d954 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -607,53 +607,48 @@ static uint alpha_circle_mask(float u, float v, float inner_edge, float outer_ed
return mask << 24;
}
+#define STUDIOLIGHT_DIAMETER 0.95f
+
static uint *studiolight_radiance_preview(StudioLight *sl, int icon_size)
{
BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EXTERNAL_IMAGE_LOADED);
uint *rect = MEM_mallocN(icon_size * icon_size * sizeof(uint), __func__);
- int icon_center = icon_size / 2;
- float sphere_radius = icon_center * 0.9;
+ float pixel_size = 1.0f / (float)icon_size;
int offset = 0;
for (int y = 0; y < icon_size; y++) {
- float dy = y - icon_center;
+ float dy = (y + 0.5f) / (float)icon_size;
+ dy = dy / STUDIOLIGHT_DIAMETER - (1.0f - STUDIOLIGHT_DIAMETER) / 2.0f;
for (int x = 0; x < icon_size; x++) {
- float dx = x - icon_center;
- /* calculate aliasing */
- float alias = 0;
- const float alias_step = 0.333;
- 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;
- }
- }
- }
+ float dx = (x + 0.5f) / (float)icon_size;
+ dx = dx / STUDIOLIGHT_DIAMETER - (1.0f - STUDIOLIGHT_DIAMETER) / 2.0f;
+
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 incoming[3];
- copy_v3_fl3(incoming, 0.0, 1.0, 0.0);
+ uint alphamask = alpha_circle_mask(dx, dy, 0.5f - pixel_size, 0.5f);
+ if (alphamask != 0) {
+ float incoming[3] = {0.0f, 0.0f, -1.0f};
float normal[3];
- normal[0] = dx / sphere_radius;
- normal[2] = dy / sphere_radius;
- normal[1] = -sqrt(-(normal[0] * normal[0]) - (normal[2] * normal[2]) + 1);
- normalize_v3(normal);
+ normal[0] = dx * 2.0f - 1.0f;
+ normal[1] = dy * 2.0f - 1.0f;
+ float dist = len_v2(normal);
+ normal[2] = sqrtf(1.0f - dist*dist);
float direction[3];
reflect_v3_v3v3(direction, incoming, normal);
+ /* We want to see horizon not poles. */
+ SWAP(float, direction[1], direction[2]);
+ direction[1] = -direction[1];
+
float color[4];
studiolight_calculate_radiance(sl->equirectangular_radiance_buffer, color, direction);
pixelresult = rgb_to_cpack(
linearrgb_to_srgb(color[0]),
linearrgb_to_srgb(color[1]),
- linearrgb_to_srgb(color[2])) | alias_mask;
+ linearrgb_to_srgb(color[2])) | alphamask;
}
rect[offset++] = pixelresult;
}
@@ -672,13 +667,12 @@ static uint *studiolight_matcap_preview(StudioLight *sl, int icon_size, bool fli
int offset = 0;
ImBuf *ibuf = sl->equirectangular_radiance_buffer;
- const float diameter = 0.95f;
for (int y = 0; y < icon_size; y++) {
fy = (y + 0.5f) / (float)icon_size;
- fy = fy / diameter - (1.0f - diameter) / 2.0f;
+ fy = fy / STUDIOLIGHT_DIAMETER - (1.0f - STUDIOLIGHT_DIAMETER) / 2.0f;
for (int x = 0; x < icon_size; x++) {
fx = (x + 0.5f) / (float)icon_size;
- fx = fx / diameter - (1.0f - diameter) / 2.0f;
+ fx = fx / STUDIOLIGHT_DIAMETER - (1.0f - STUDIOLIGHT_DIAMETER) / 2.0f;
if (flipped) {
fx = 1.0f - fx;
}
@@ -705,17 +699,15 @@ static uint *studiolight_irradiance_preview(StudioLight *sl, int icon_size)
BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED);
uint *rect = MEM_mallocN(icon_size * icon_size * sizeof(uint), __func__);
- int icon_center = icon_size / 2;
float pixel_size = 1.0f / (float)icon_size;
int offset = 0;
- const float diameter = 0.95f;
for (int y = 0; y < icon_size; y++) {
float dy = (y + 0.5f) / (float)icon_size;
- dy = dy / diameter - (1.0f - diameter) / 2.0f;
+ dy = dy / STUDIOLIGHT_DIAMETER - (1.0f - STUDIOLIGHT_DIAMETER) / 2.0f;
for (int x = 0; x < icon_size; x++) {
float dx = (x + 0.5f) / (float)icon_size;
- dx = dx / diameter - (1.0f - diameter) / 2.0f;
+ dx = dx / STUDIOLIGHT_DIAMETER - (1.0f - STUDIOLIGHT_DIAMETER) / 2.0f;
uint pixelresult = 0x0;
uint alphamask = alpha_circle_mask(dx, dy, 0.5f - pixel_size, 0.5f);