Public feed #529387

Unnamed

public text v1 · immutable
Raw Edit
·published 2007-06-01 22:07 UTC
rendered paste body
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");