From: Sam Moore Date: Wed, 26 Mar 2014 17:20:20 +0000 (+0800) Subject: Make real.h so we can change reals X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=commitdiff_plain;h=32cd67ec48271c176eba218e082fcf5824aa8e6c Make real.h so we can change reals Needed to fix view.cpp to call Float where it expects GLfloat Had an attempt at making a half precision float, but it didn't go very well. I don't think half precision floats are *that* terrible... Probably got the bit masking wrong. --- diff --git a/src/ipdf.h b/src/ipdf.h index 8ee30c3..c34f5ed 100644 --- a/src/ipdf.h +++ b/src/ipdf.h @@ -2,12 +2,11 @@ #define _IPDF_H #include "common.h" +#include "real.h" namespace IPDF { - typedef float Real; - - inline float RealToFloat(Real r) {return r;} + inline Real Random(Real max=1, Real min=0) { return min + (max-min) * ((Real)(rand() % (int)1e6) / 1e6); diff --git a/src/real.h b/src/real.h new file mode 100644 index 0000000..1d3fb8b --- /dev/null +++ b/src/real.h @@ -0,0 +1,51 @@ +#ifndef _REAL_H +#define _REAL_H + +#include "common.h" + +namespace IPDF +{ + +//#define REAL_FLOAT +#define REAL_DOUBLE +//#define REAL_HALF + +#ifdef REAL_SINGLE + typedef float Real; + inline float Float(Real r) {return r;} +#elif defined REAL_DOUBLE + typedef double Real; + inline double Float(Real r) {return r;} +#elif defined REAL_HALF + struct Real + { + Real() = default; + Real(float r) : value(r) + { + int & a = *((int*)(&value)); // um... + // mask out extra bits in exponent + //1000 1111 1000 0000 0000 0011 1111 1111 + // Endianness matters + a &= 0xFF3008F8;//0x8F8003FF; + + } + + Real operator+(float f) {return Real(value+f);} + Real operator-(float f) {return Real(value+f);} + Real operator/(float f) {return Real(value/f);} + Real operator*(float f) {return Real(value*f);} + Real operator+(const Real & r) {return this->operator+(r.value);} + Real operator-(const Real & r) {return this->operator-(r.value);} + Real operator*(const Real & r) {return this->operator*(r.value);} + Real operator/(const Real & r) {return this->operator/(r.value);} + float value; + }; + inline float Float(Real r) {return r.value;} + + inline std::ostream & operator<<(std::ostream & os, Real & r) {return os << r.value;} // yuk + +#endif //REAL_HALF + +} + +#endif //_REAL_H diff --git a/src/tests/realtofloat.cpp b/src/tests/realtofloat.cpp new file mode 100644 index 0000000..b09bd49 --- /dev/null +++ b/src/tests/realtofloat.cpp @@ -0,0 +1,9 @@ +#include "main.h" +float test = 1e4; +int main(int argc, char ** argv) +{ + Real r(test); + Debug("test float %.20f", test); + Debug("test real %.20f", Float(r)); + return 0; +} diff --git a/src/view.cpp b/src/view.cpp index 9e832d2..ed62704 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -19,7 +19,7 @@ void View::Render() glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho(m_bounds.x, m_bounds.x+m_bounds.w, m_bounds.y + m_bounds.h, m_bounds.y, -1.f, 1.f); + glOrtho(Float(m_bounds.x), Float(m_bounds.x)+Float(m_bounds.w), Float(m_bounds.y) + Float(m_bounds.h), Float(m_bounds.y), -1.f, 1.f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -30,10 +30,10 @@ void View::Render() if (m_document.m_objects.types[id] == RECT_FILLED) continue; Rect obj_bounds = m_document.m_objects.bounds[id]; - glVertex2f(obj_bounds.x, obj_bounds.y); - glVertex2f(obj_bounds.x + obj_bounds.w, obj_bounds.y); - glVertex2f(obj_bounds.x + obj_bounds.w, obj_bounds.y + obj_bounds.h); - glVertex2f(obj_bounds.x, obj_bounds.y + obj_bounds.h); + glVertex2f(Float(obj_bounds.x), Float(obj_bounds.y)); + glVertex2f(Float(obj_bounds.x) + Float(obj_bounds.w), Float(obj_bounds.y)); + glVertex2f(Float(obj_bounds.x) + Float(obj_bounds.w), Float(obj_bounds.y) + Float(obj_bounds.h)); + glVertex2f(Float(obj_bounds.x), Float(obj_bounds.y) + Float(obj_bounds.h)); } glEnd(); @@ -43,10 +43,10 @@ void View::Render() continue; Rect obj_bounds = m_document.m_objects.bounds[id]; glBegin(GL_LINE_LOOP); - glVertex2f(obj_bounds.x, obj_bounds.y); - glVertex2f(obj_bounds.x + obj_bounds.w, obj_bounds.y); - glVertex2f(obj_bounds.x + obj_bounds.w, obj_bounds.y + obj_bounds.h); - glVertex2f(obj_bounds.x, obj_bounds.y + obj_bounds.h); + glVertex2f(Float(obj_bounds.x), Float(obj_bounds.y)); + glVertex2f(Float(obj_bounds.x) + Float(obj_bounds.w), Float(obj_bounds.y)); + glVertex2f(Float(obj_bounds.x) + Float(obj_bounds.w), Float(obj_bounds.y) + Float(obj_bounds.h)); + glVertex2f(Float(obj_bounds.x), Float(obj_bounds.y) + Float(obj_bounds.h)); glEnd(); }