diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 6901145..0c9c2be 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -852,6 +852,36 @@ static void depth_copy(IWineD3DDevice *iface) { } } +float convert16bitfloatto32 (unsigned short ptr) { + +float ret; +unsigned short *sptr = (unsigned short * )&ptr; +int i = 1; +/* +int fract = (*sptr >> 0) & 0x7FFFFF; +int exp = (*sptr >> 23) & 0xFF; +int sign = (*sptr >> 31) & 0x1; +*/ + +short fract = (*sptr >> 0) & 0x3FF; +short exp = (*sptr >> 10) & 0x1F; +short sign = (*sptr >> 15) & 0x1; + + +FIXME("fract=%d, exp=%d, sign=%d\n", fract, exp, sign); + +while (1<= (fract / pow(10, i))) i++; + +FIXME("0.something=%f\n", pow(10, -i)*fract); +FIXME("p1=%d, %f, %f\n", (sign == 0 ? 1 : -1), (pow(10, -i)*fract+1), pow(2,((int)exp-15))); +ret = (sign == 0 ? 1 : -1) * ((pow(10, -i)*fract+1) * pow(2,((int)exp-15))); + +FIXME("float=%f\n", ret); + +return ret; + +} + static inline void drawStridedInstanced(IWineD3DDevice *iface, WineDirect3DVertexStridedData *sd, UINT numberOfVertices, GLenum glPrimitiveType, const void *idxData, short idxSize, ULONG minIndex, ULONG startIdx, ULONG startVertex) { @@ -972,9 +1002,14 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, WineDirect3DVerte FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_2\n"); break; case WINED3DDECLTYPE_FLOAT16_4: - FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_4\n"); + { +// FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_4\n"); + float f[4] = {convert16bitfloatto32(((unsigned short * ) ptr)[0]), convert16bitfloatto32(((unsigned short * ) ptr)[1]), + convert16bitfloatto32(((unsigned short * ) ptr)[2]), convert16bitfloatto32(((unsigned short * ) ptr)[3])}; + GL_EXTCALL(glVertexAttrib4fvARB(instancedData[j], (float *) f)); +// FIXME("FLOAT=%f\n", convert16bitfloatto32(((unsigned short * ) ptr)[0])); break; - + } case WINED3DDECLTYPE_UNUSED: default: ERR("Unexpected declaration in instanced attributes\n");