Changeset 1311


Ignore:
Timestamp:
Apr 30, 2012, 3:12:44 AM (9 years ago)
Author:
sam
Message:

math: add min(), max() and clamp() for half, real and vector types.

Location:
trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lol/math/half.h

    r1176 r1311  
    115115};
    116116
     117static inline half min(half a, half b) { return a < b ? a : b; }
     118static inline half max(half a, half b) { return a > b ? a : b; }
     119
     120static inline half clamp(half x, half a, half b)
     121{
     122    return (x < a) ? a : (x > b) ? b : x;
     123}
     124
     125
    117126#define DECLARE_COERCE_HALF_NUMERIC_OPS(op, type, ret, x2, h2) \
    118127    inline ret operator op(type x, half h) { return x2 op h2; } \
  • trunk/src/lol/math/real.h

    r1163 r1311  
    7171    bool operator !() const;
    7272    operator bool() const;
     73
     74    /* Comparison functions */
     75    template<int M> friend Real<M> min(Real<M> const &a, Real<M> const &b);
     76    template<int M> friend Real<M> max(Real<M> const &a, Real<M> const &b);
     77    template<int M> friend Real<M> clamp(Real<M> const &x,
     78                                         Real<M> const &a, Real<M> const &b);
    7379
    7480    /* Trigonometric functions */
     
    228234template<> real::operator bool() const;
    229235
     236template<> real min(real const &a, real const &b);
     237template<> real max(real const &a, real const &b);
     238template<> real clamp(real const &x, real const &a, real const &b);
     239
    230240template<> real sin(real const &x);
    231241template<> real cos(real const &x);
  • trunk/src/lol/math/vector.h

    r1305 r1311  
    977977 */
    978978
     979/*
     980 * vec +(vec, vec)   (also complex & quaternion)
     981 * vec -(vec, vec)   (also complex & quaternion)
     982 * vec *(vec, vec)
     983 * vec /(vec, vec)
     984 */
    979985#define DECLARE_VECTOR_VECTOR_COERCE_OP(tname, op, tprefix, t1, t2, tf) \
    980986    tprefix \
     
    987993    }
    988994
     995/*
     996 * vec +=(vec, vec)   (also complex & quaternion)
     997 * vec -=(vec, vec)   (also complex & quaternion)
     998 * vec *=(vec, vec)
     999 * vec /=(vec, vec)
     1000 */
    9891001#define DECLARE_VECTOR_VECTOR_OP(tname, op, tprefix, type) \
    9901002    tprefix \
     
    9941006    }
    9951007
     1008/*
     1009 * vec min(vec, vec)     (also max)
     1010 * vec min(vec, scalar)  (also max)
     1011 * vec min(scalar, vec)  (also max)
     1012 */
     1013#define DECLARE_VECTOR_MINMAX_OP(tname, op, tprefix, type) \
     1014    tprefix \
     1015    inline tname<type> op(tname<type> const &a, tname<type> const &b) \
     1016    { \
     1017        using std::op; \
     1018        tname<type> ret; \
     1019        for (size_t n = 0; n < sizeof(a) / sizeof(type); n++) \
     1020            ret[n] = op(a[n], b[n]); \
     1021        return ret; \
     1022    } \
     1023    \
     1024    tprefix \
     1025    inline tname<type> op(tname<type> const &a, type const &b) \
     1026    { \
     1027        using std::op; \
     1028        tname<type> ret; \
     1029        for (size_t n = 0; n < sizeof(a) / sizeof(type); n++) \
     1030            ret[n] = op(a[n], b); \
     1031        return ret; \
     1032    } \
     1033    \
     1034    tprefix \
     1035    inline tname<type> op(type const &a, tname<type> const &b) \
     1036    { \
     1037        using std::op; \
     1038        tname<type> ret; \
     1039        for (size_t n = 0; n < sizeof(b) / sizeof(type); n++) \
     1040            ret[n] = op(a, b[n]); \
     1041        return ret; \
     1042    }
     1043
     1044/*
     1045 * vec clamp(vec, vec, vec)
     1046 * vec clamp(vec, vec, scalar)
     1047 * vec clamp(vec, scalar, vec)
     1048 */
     1049#define DECLARE_VECTOR_CLAMP_OP(tname, tprefix, type) \
     1050    tprefix \
     1051    inline tname<type> clamp(tname<type> const &x, \
     1052                             tname<type> const &a, tname<type> const &b) \
     1053    { \
     1054        return max(min(x, b), a); \
     1055    } \
     1056    \
     1057    tprefix \
     1058    inline tname<type> clamp(tname<type> const &x, \
     1059                             type const &a, tname<type> const &b) \
     1060    { \
     1061        return max(min(x, b), a); \
     1062    } \
     1063    \
     1064    tprefix \
     1065    inline tname<type> clamp(tname<type> const &x, \
     1066                             tname<type> const &a, type const &b) \
     1067    { \
     1068        return max(min(x, b), a); \
     1069    }
     1070
     1071/*
     1072 * bool ==(vec, vec)   (also complex & quaternion)
     1073 * bool !=(vec, vec)   (also complex & quaternion)
     1074 * bool >=(vec, vec)
     1075 * bool <=(vec, vec)
     1076 * bool >(vec, vec)
     1077 * bool <(vec, vec)
     1078 */
    9961079#define DECLARE_VECTOR_VECTOR_BOOLOP(tname, op, op2, ret, tprefix, t1, t2) \
    9971080    tprefix \
     
    10041087    }
    10051088
     1089/*
     1090 * vec *(vec, scalar)   (also complex & quaternion)
     1091 * vec *(scalar, vec)   (also complex & quaternion)
     1092 * vec /(vec, scalar)   (also complex & quaternion)
     1093 * vec /(scalar, vec)   (also complex & quaternion)
     1094 */
    10061095#define DECLARE_VECTOR_SCALAR_COERCE_OP(tname, op, tprefix, t1, t2, tf) \
    10071096    tprefix \
     
    10231112    }
    10241113
     1114/*
     1115 * vec *=(vec, scalar)   (also complex & quaternion)
     1116 * vec /=(vec, scalar)   (also complex & quaternion)
     1117 */
    10251118#define DECLARE_VECTOR_SCALAR_OP(tname, op, tprefix, type) \
    10261119    tprefix \
     
    10981191    \
    10991192    DECLARE_VECTOR_VECTOR_OP(tname, -, tprefix, type) \
    1100     DECLARE_VECTOR_VECTOR_OP(tname, +, tprefix, type)
     1193    DECLARE_VECTOR_VECTOR_OP(tname, +, tprefix, type) \
     1194    \
     1195    DECLARE_VECTOR_MINMAX_OP(tname, min, tprefix, type) \
     1196    DECLARE_VECTOR_MINMAX_OP(tname, max, tprefix, type) \
     1197    DECLARE_VECTOR_CLAMP_OP(tname, tprefix, type)
    11011198
    11021199#define DECLARE_VECTOR_COERCE_OPS(tname, tprefix, t1, t2, tf) \
  • trunk/src/math/real.cpp

    r1180 r1311  
    559559}
    560560
     561template<> real min(real const &a, real const &b)
     562{
     563    return (a < b) ? a : b;
     564}
     565
     566template<> real max(real const &a, real const &b)
     567{
     568    return (a > b) ? a : b;
     569}
     570
     571template<> real clamp(real const &x, real const &a, real const &b)
     572{
     573    return (x < a) ? a : (x > b) ? b : x;
     574}
     575
    561576template<> real re(real const &x)
    562577{
Note: See TracChangeset for help on using the changeset viewer.