OpenGL2: Support GL_ARB_vertex_type_2_10_10_10_rev for normals/tangents/lightdirs
This commit is contained in:
parent
4c9d39ae6e
commit
f6f3a19f73
13 changed files with 239 additions and 198 deletions
|
@ -22,6 +22,75 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
// tr_vbo.c
|
||||
#include "tr_local.h"
|
||||
|
||||
|
||||
uint32_t R_VboPackTangent(vec4_t v)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
return (((uint32_t)(v[3] * 1.5f + 2.0f )) << 30)
|
||||
| (((uint32_t)(v[2] * 511.5f + 512.0f)) << 20)
|
||||
| (((uint32_t)(v[1] * 511.5f + 512.0f)) << 10)
|
||||
| (((uint32_t)(v[0] * 511.5f + 512.0f)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return (((uint32_t)(v[3] * 127.5f + 128.0f)) << 24)
|
||||
| (((uint32_t)(v[2] * 127.5f + 128.0f)) << 16)
|
||||
| (((uint32_t)(v[1] * 127.5f + 128.0f)) << 8)
|
||||
| (((uint32_t)(v[0] * 127.5f + 128.0f)));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t R_VboPackNormal(vec3_t v)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
return (((uint32_t)(v[2] * 511.5f + 512.0f)) << 20)
|
||||
| (((uint32_t)(v[1] * 511.5f + 512.0f)) << 10)
|
||||
| (((uint32_t)(v[0] * 511.5f + 512.0f)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return (((uint32_t)(v[2] * 127.5f + 128.0f)) << 16)
|
||||
| (((uint32_t)(v[1] * 127.5f + 128.0f)) << 8)
|
||||
| (((uint32_t)(v[0] * 127.5f + 128.0f)));
|
||||
}
|
||||
}
|
||||
|
||||
void R_VboUnpackTangent(vec4_t v, uint32_t b)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
v[0] = ((b) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[1] = ((b >> 10) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[2] = ((b >> 20) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[3] = ((b >> 30) & 0x3) * 1.0f/1.5f - 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
v[0] = ((b) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[1] = ((b >> 8) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[2] = ((b >> 16) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[3] = ((b >> 24) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void R_VboUnpackNormal(vec3_t v, uint32_t b)
|
||||
{
|
||||
if (glRefConfig.packedNormalDataType == GL_UNSIGNED_INT_2_10_10_10_REV)
|
||||
{
|
||||
v[0] = ((b) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[1] = ((b >> 10) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
v[2] = ((b >> 20) & 0x3ff) * 1.0f/511.5f - 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
v[0] = ((b) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[1] = ((b >> 8) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
v[2] = ((b >> 16) & 0xff) * 1.0f/127.5f - 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
R_CreateVBO
|
||||
|
@ -142,14 +211,14 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
if(stateBits & ATTR_NORMAL)
|
||||
{
|
||||
vbo->ofs_normal = dataSize;
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
if(stateBits & ATTR_TANGENT)
|
||||
{
|
||||
vbo->ofs_tangent = dataSize;
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -174,7 +243,7 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
if(stateBits & ATTR_LIGHTDIRECTION)
|
||||
{
|
||||
vbo->ofs_lightdir = dataSize;
|
||||
dataSize += sizeof(verts[0].lightdir);
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
vbo->stride_xyz = dataSize;
|
||||
|
@ -204,31 +273,22 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
// normal
|
||||
if(stateBits & ATTR_NORMAL)
|
||||
{
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].normal[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].normal[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].normal[2] * 127.5f + 128.0f);
|
||||
p[3] = 0;
|
||||
*p = R_VboPackNormal(verts[i].normal);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
// tangent
|
||||
if(stateBits & ATTR_TANGENT)
|
||||
{
|
||||
vec3_t nxt;
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
CrossProduct(verts[i].normal, verts[i].tangent, nxt);
|
||||
*p = R_VboPackTangent(verts[i].tangent);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].tangent[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].tangent[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].tangent[2] * 127.5f + 128.0f);
|
||||
p[3] = (uint8_t)(verts[i].tangent[3] * 127.5f + 128.0f);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -256,8 +316,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
// feed vertex light directions
|
||||
if(stateBits & ATTR_LIGHTDIRECTION)
|
||||
{
|
||||
memcpy(data + dataOfs, &verts[i].lightdir, sizeof(verts[i].lightdir));
|
||||
dataOfs += sizeof(verts[i].lightdir);
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
*p = R_VboPackNormal(verts[i].lightdir);
|
||||
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -268,13 +331,13 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
|
||||
if(stateBits & ATTR_NORMAL)
|
||||
{
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
if(stateBits & ATTR_TANGENT)
|
||||
{
|
||||
dataSize += sizeof(uint8_t) * 4;
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -295,7 +358,7 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
|
||||
if(stateBits & ATTR_LIGHTDIRECTION)
|
||||
{
|
||||
dataSize += sizeof(verts[0].lightdir);
|
||||
dataSize += sizeof(uint32_t);
|
||||
}
|
||||
|
||||
// create VBO
|
||||
|
@ -314,14 +377,14 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_lightdir = 0;
|
||||
|
||||
vbo->stride_xyz = sizeof(verts[0].xyz);
|
||||
vbo->stride_normal = sizeof(uint8_t) * 4;
|
||||
vbo->stride_normal = sizeof(uint32_t);
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
vbo->stride_tangent = sizeof(uint8_t) * 4;
|
||||
vbo->stride_tangent = sizeof(uint32_t);
|
||||
#endif
|
||||
vbo->stride_vertexcolor = sizeof(verts[0].vertexColors);
|
||||
vbo->stride_st = sizeof(verts[0].st);
|
||||
vbo->stride_lightmap = sizeof(verts[0].lightmap);
|
||||
vbo->stride_lightdir = sizeof(verts[0].lightdir);
|
||||
vbo->stride_lightdir = sizeof(uint32_t);
|
||||
|
||||
//ri.Printf(PRINT_ALL, "2CreateVBO: %d, %d %d %d %d %d, %d %d %d %d %d\n", dataSize, vbo->ofs_xyz, vbo->ofs_normal, vbo->ofs_st, vbo->ofs_lightmap, vbo->ofs_vertexcolor,
|
||||
//vbo->stride_xyz, vbo->stride_normal, vbo->stride_st, vbo->stride_lightmap, vbo->stride_vertexcolor);
|
||||
|
@ -339,14 +402,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_normal = dataOfs;
|
||||
for (i = 0; i < numVertexes; i++)
|
||||
{
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].normal[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].normal[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].normal[2] * 127.5f + 128.0f);
|
||||
p[3] = 0;
|
||||
*p = R_VboPackNormal(verts[i].normal);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -357,17 +417,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_tangent = dataOfs;
|
||||
for (i = 0; i < numVertexes; i++)
|
||||
{
|
||||
vec3_t nxt;
|
||||
uint8_t *p = data + dataOfs;
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
CrossProduct(verts[i].normal, verts[i].tangent, nxt);
|
||||
*p = R_VboPackTangent(verts[i].tangent);
|
||||
|
||||
p[0] = (uint8_t)(verts[i].tangent[0] * 127.5f + 128.0f);
|
||||
p[1] = (uint8_t)(verts[i].tangent[1] * 127.5f + 128.0f);
|
||||
p[2] = (uint8_t)(verts[i].tangent[2] * 127.5f + 128.0f);
|
||||
p[3] = (uint8_t)(verts[i].tangent[3] * 127.5f + 128.0f);
|
||||
|
||||
dataOfs += sizeof(uint8_t) * 4;
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -411,8 +465,11 @@ VBO_t *R_CreateVBO2(const char *name, int numVertexes, srfVert_t * vert
|
|||
vbo->ofs_lightdir = dataOfs;
|
||||
for (i = 0; i < numVertexes; i++)
|
||||
{
|
||||
memcpy(data + dataOfs, &verts[i].lightdir, sizeof(verts[i].lightdir));
|
||||
dataOfs += sizeof(verts[i].lightdir);
|
||||
uint32_t *p = (uint32_t *)(data + dataOfs);
|
||||
|
||||
*p = R_VboPackNormal(verts[i].lightdir);
|
||||
|
||||
dataOfs += sizeof(uint32_t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue