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:
authorCampbell Barton <ideasman42@gmail.com>2012-05-31 15:57:09 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-05-31 15:57:09 +0400
commitceea98be2f54ed72691a130ea8eed613726e4521 (patch)
tree6af6f1353ecad62c68d586529ba144ac488bc33f /source/blender
parent31a94e400397c528f230d2c578176175b2f731f7 (diff)
math lib changes from tomato
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenlib/BLI_math_base.h3
-rw-r--r--source/blender/blenlib/BLI_math_color.h4
-rw-r--r--source/blender/blenlib/BLI_math_geom.h3
-rw-r--r--source/blender/blenlib/BLI_math_vector.h4
-rw-r--r--source/blender/blenlib/intern/math_color.c84
-rw-r--r--source/blender/blenlib/intern/math_geom.c39
-rw-r--r--source/blender/blenlib/intern/math_vector.c42
7 files changed, 179 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h
index 22672db9edb..b0e0d3cbf19 100644
--- a/source/blender/blenlib/BLI_math_base.h
+++ b/source/blender/blenlib/BLI_math_base.h
@@ -53,6 +53,9 @@
#ifndef M_SQRT1_2
#define M_SQRT1_2 0.70710678118654752440
#endif
+#ifndef M_SQRT3
+#define M_SQRT3 1.7320508075688772
+#endif
#ifndef M_1_PI
#define M_1_PI 0.318309886183790671538
#endif
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index 746a2b958ea..44f54c41129 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -69,6 +69,8 @@ void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
void rgb_to_hsv_v(const float rgb[3], float r_hsv[3]);
void rgb_to_hsv_compat(float r, float g, float b, float *lh, float *ls, float *lv);
void rgb_to_hsv_compat_v(const float rgb[3], float r_hsv[3]);
+void rgb_to_lab(float r, float g, float b, float *ll, float *la, float *lb);
+void rgb_to_xyz(float r, float g, float b, float *x, float *y, float *z);
unsigned int rgb_to_cpack(float r, float g, float b);
unsigned int hsv_to_cpack(float h, float s, float v);
@@ -112,6 +114,8 @@ void rgba_uchar_to_float(float col_r[4], const unsigned char col_ub[4]);
void rgb_float_to_uchar(unsigned char col_r[3], const float col_f[3]);
void rgba_float_to_uchar(unsigned char col_r[4], const float col_f[4]);
+void xyz_to_lab(float x, float y, float z, float *l, float *a, float *b);
+
/***************** lift/gamma/gain / ASC-CDL conversion *****************/
void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *offset, float *slope, float *power);
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 0560a3f6e64..93599dee63d 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -191,6 +191,9 @@ void barycentric_transform(float pt_tar[3], float const pt_src[3],
void barycentric_weights_v2(const float v1[2], const float v2[2], const float v3[2],
const float co[2], float w[3]);
+int barycentric_coords_v2(const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3]);
+int barycentric_inside_triangle_v2(const float w[3]);
+
void resolve_tri_uv(float r_uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2]);
void resolve_quad_uv(float uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2], const float st3[2]);
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index 374da46a686..7ff52a5824f 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -228,8 +228,12 @@ void mul_vn_fl(float *array_tar, const int size, const float f);
void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f);
void add_vn_vn(float *array_tar, const float *array_src, const int size);
void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
+void madd_vn_vn(float *array_tar, const float *array_src, const float f, const int size);
+void madd_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const float f, const int size);
void sub_vn_vn(float *array_tar, const float *array_src, const int size);
void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
+void msub_vn_vn(float *array_tar, const float *array_src, const float f, const int size);
+void msub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const float f, const int size);
void fill_vn_i(int *array_tar, const int size, const int val);
void fill_vn_ushort(unsigned short *array_tar, const int size, const unsigned short val);
void fill_vn_fl(float *array_tar, const int size, const float val);
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 152fc98945f..9433cfd31df 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -264,6 +264,35 @@ void rgb_to_hsv_v(const float rgb[3], float r_hsv[3])
rgb_to_hsv(rgb[0], rgb[1], rgb[2], &r_hsv[0], &r_hsv[1], &r_hsv[2]);
}
+void rgb_to_hsl(float r, float g, float b, float *lh, float *ls, float *ll)
+{
+ float cmax = MAX3(r, g, b);
+ float cmin = MIN3(r, g, b);
+ float h, s, l = (cmax + cmin) / 2.0f;
+
+ if (cmax == cmin) {
+ h = s = 0.0f; // achromatic
+ }
+ else {
+ float d = cmax - cmin;
+ s = l > 0.5f ? d / (2.0f - cmax - cmin) : d / (cmax + cmin);
+ if (cmax == r) {
+ h = (g - b) / d + (g < b ? 6.0f : 0.0f);
+ }
+ else if (cmax == g) {
+ h = (b - r) / d + 2.0f;
+ }
+ else {
+ h = (r - g) / d + 4.0f;
+ }
+ }
+ h /= 6.0f;
+
+ *lh = h;
+ *ls = s;
+ *ll = l;
+}
+
void rgb_to_hsv_compat(float r, float g, float b, float *lh, float *ls, float *lv)
{
float orig_h = *lh;
@@ -603,3 +632,58 @@ void BLI_init_srgb_conversion(void)
BLI_color_to_srgb_table[i] = b * 0x100;
}
}
+static float inverse_srgb_companding(float v)
+{
+ if (v > 0.04045f) {
+ return powf((v + 0.055f) / 1.055f, 2.4);
+ }
+ else {
+ return v / 12.92f;
+ }
+}
+
+void rgb_to_xyz(float r, float g, float b, float *x, float *y, float *z)
+{
+ r = inverse_srgb_companding(r) * 100.0f;
+ g = inverse_srgb_companding(g) * 100.0f;
+ b = inverse_srgb_companding(b) * 100.0f;
+
+ *x = r * 0.4124 + g * 0.3576 + b * 0.1805;
+ *y = r * 0.2126 + g * 0.7152 + b * 0.0722;
+ *z = r * 0.0193 + g * 0.1192 + b * 0.9505;
+}
+
+static float xyz_to_lab_component(float v)
+{
+ const float eps = 0.008856f;
+ const float k = 903.3f;
+
+ if (v > eps) {
+ return pow(v, 1.0f / 3.0f);
+ }
+ else {
+ return (k * v + 16.0f) / 116.0f;
+ }
+}
+
+void xyz_to_lab(float x, float y, float z, float *l, float *a, float *b)
+{
+ float xr = x / 95.047f;
+ float yr = y / 100.0f;
+ float zr = z / 108.883f;
+
+ float fx = xyz_to_lab_component(xr);
+ float fy = xyz_to_lab_component(yr);
+ float fz = xyz_to_lab_component(zr);
+
+ *l = 116.0f * fy - 16.0f;
+ *a = 500.0f * (fx - fy);
+ *b = 200.0f * (fy - fz);
+}
+
+void rgb_to_lab(float r, float g, float b, float *ll, float *la, float *lb)
+{
+ float x, y, z;
+ rgb_to_xyz(r, g, b, &x, &y, &z);
+ xyz_to_lab(x, y, z, ll, la, lb);
+}
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 3962f53862d..d35624e84d2 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -1825,6 +1825,45 @@ void interp_weights_face_v3(float w[4], const float v1[3], const float v2[3], co
}
}
+/* return 1 of point is inside triangle, 2 if it's on the edge, 0 if point is outside of triangle */
+int barycentric_inside_triangle_v2(const float w[3])
+{
+ if (IN_RANGE(w[0], 0.0f, 1.0f) &&
+ IN_RANGE(w[1], 0.0f, 1.0f) &&
+ IN_RANGE(w[2], 0.0f, 1.0f))
+ {
+ return 1;
+ }
+ else if (IN_RANGE_INCL(w[0], 0.0f, 1.0f) &&
+ IN_RANGE_INCL(w[1], 0.0f, 1.0f) &&
+ IN_RANGE_INCL(w[2], 0.0f, 1.0f))
+ {
+ return 2;
+ }
+
+ return 0;
+}
+
+/* returns 0 for degenerated triangles */
+int barycentric_coords_v2(const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3])
+{
+ float x = co[0], y = co[1];
+ float x1 = v1[0], y1 = v1[1];
+ float x2 = v2[0], y2 = v2[1];
+ float x3 = v3[0], y3 = v3[1];
+ float det = (y2 - y3) * (x1 - x3) + (x3 - x2) * (y1 - y3);
+
+ if (fabsf(det) > FLT_EPSILON) {
+ w[0] = ((y2 - y3) * (x - x3) + (x3 - x2) * (y - y3)) / det;
+ w[1] = ((y3 - y1) * (x - x3) + (x1 - x3) * (y - y3)) / det;
+ w[2] = 1.0f - w[0] - w[1];
+
+ return 1;
+ }
+
+ return 0;
+}
+
/* used by projection painting
* note: using area_tri_signed_v2 means locations outside the triangle are correctly weighted */
void barycentric_weights_v2(const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3])
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index 90e6a4cb945..d939576904e 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -550,6 +550,27 @@ void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_
}
}
+void madd_vn_vn(float *array_tar, const float *array_src, const float f, const int size)
+{
+ float *tar = array_tar + (size - 1);
+ const float *src = array_src + (size - 1);
+ int i = size;
+ while (i--) {
+ *(tar--) += *(src--) * f;
+ }
+}
+
+void madd_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const float f, const int size)
+{
+ float *tar = array_tar + (size - 1);
+ const float *src_a = array_src_a + (size - 1);
+ const float *src_b = array_src_b + (size - 1);
+ int i = size;
+ while (i--) {
+ *(tar--) = *(src_a--) + (*(src_b--) * f);
+ }
+}
+
void sub_vn_vn(float *array_tar, const float *array_src, const int size)
{
float *tar = array_tar + (size - 1);
@@ -571,6 +592,27 @@ void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_
}
}
+void msub_vn_vn(float *array_tar, const float *array_src, const float f, const int size)
+{
+ float *tar = array_tar + (size - 1);
+ const float *src = array_src + (size - 1);
+ int i = size;
+ while (i--) {
+ *(tar--) -= *(src--) * f;
+ }
+}
+
+void msub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const float f, const int size)
+{
+ float *tar = array_tar + (size - 1);
+ const float *src_a = array_src_a + (size - 1);
+ const float *src_b = array_src_b + (size - 1);
+ int i = size;
+ while (i--) {
+ *(tar--) = *(src_a--) - (*(src_b--) * f);
+ }
+}
+
void fill_vn_i(int *array_tar, const int size, const int val)
{
int *tar = array_tar + (size - 1);