mirror of
https://github.com/ioquake/ioq3.git
synced 2025-05-30 00:20:59 +00:00
OpenGL2: Store normals/tangents as int16_t[4].
This commit is contained in:
parent
762f50757d
commit
dfbaf50324
13 changed files with 288 additions and 1042 deletions
|
@ -564,6 +564,7 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
{
|
||||
unsigned lat, lng;
|
||||
unsigned short normal;
|
||||
vec3_t fNormal;
|
||||
|
||||
v->xyz[0] = LittleShort(md3xyz->xyz[0]) * MD3_XYZ_SCALE;
|
||||
v->xyz[1] = LittleShort(md3xyz->xyz[1]) * MD3_XYZ_SCALE;
|
||||
|
@ -580,9 +581,11 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
// decode Y as sin( lat ) * sin( long )
|
||||
// decode Z as cos( long )
|
||||
|
||||
v->normal[0] = tr.sinTable[(lat+(FUNCTABLE_SIZE/4))&FUNCTABLE_MASK] * tr.sinTable[lng];
|
||||
v->normal[1] = tr.sinTable[lat] * tr.sinTable[lng];
|
||||
v->normal[2] = tr.sinTable[(lng+(FUNCTABLE_SIZE/4))&FUNCTABLE_MASK];
|
||||
fNormal[0] = tr.sinTable[(lat+(FUNCTABLE_SIZE/4))&FUNCTABLE_MASK] * tr.sinTable[lng];
|
||||
fNormal[1] = tr.sinTable[lat] * tr.sinTable[lng];
|
||||
fNormal[2] = tr.sinTable[(lng+(FUNCTABLE_SIZE/4))&FUNCTABLE_MASK];
|
||||
|
||||
R_VaoPackNormal(v->normal, fNormal);
|
||||
}
|
||||
|
||||
// swap all the ST
|
||||
|
@ -598,10 +601,13 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
// calc tangent spaces
|
||||
{
|
||||
vec3_t *sdirs = ri.Malloc(sizeof(*sdirs) * surf->numVerts * mdvModel->numFrames);
|
||||
vec3_t *tdirs = ri.Malloc(sizeof(*tdirs) * surf->numVerts * mdvModel->numFrames);
|
||||
|
||||
for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++)
|
||||
{
|
||||
VectorClear(v->tangent);
|
||||
VectorClear(v->bitangent);
|
||||
VectorClear(sdirs[j]);
|
||||
VectorClear(tdirs[j]);
|
||||
}
|
||||
|
||||
for(f = 0; f < mdvModel->numFrames; f++)
|
||||
|
@ -626,27 +632,32 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
|
||||
R_CalcTexDirs(sdir, tdir, v0, v1, v2, t0, t1, t2);
|
||||
|
||||
VectorAdd(sdir, surf->verts[index0].tangent, surf->verts[index0].tangent);
|
||||
VectorAdd(sdir, surf->verts[index1].tangent, surf->verts[index1].tangent);
|
||||
VectorAdd(sdir, surf->verts[index2].tangent, surf->verts[index2].tangent);
|
||||
VectorAdd(tdir, surf->verts[index0].bitangent, surf->verts[index0].bitangent);
|
||||
VectorAdd(tdir, surf->verts[index1].bitangent, surf->verts[index1].bitangent);
|
||||
VectorAdd(tdir, surf->verts[index2].bitangent, surf->verts[index2].bitangent);
|
||||
VectorAdd(sdir, sdirs[index0], sdirs[index0]);
|
||||
VectorAdd(sdir, sdirs[index1], sdirs[index1]);
|
||||
VectorAdd(sdir, sdirs[index2], sdirs[index2]);
|
||||
VectorAdd(tdir, tdirs[index0], tdirs[index0]);
|
||||
VectorAdd(tdir, tdirs[index1], tdirs[index1]);
|
||||
VectorAdd(tdir, tdirs[index2], tdirs[index2]);
|
||||
}
|
||||
}
|
||||
|
||||
for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++)
|
||||
{
|
||||
vec3_t sdir, tdir;
|
||||
vec3_t normal;
|
||||
vec4_t tangent;
|
||||
|
||||
VectorCopy(v->tangent, sdir);
|
||||
VectorCopy(v->bitangent, tdir);
|
||||
VectorNormalize(sdirs[j]);
|
||||
VectorNormalize(tdirs[j]);
|
||||
|
||||
VectorNormalize(sdir);
|
||||
VectorNormalize(tdir);
|
||||
R_VaoUnpackNormal(normal, v->normal);
|
||||
|
||||
R_CalcTbnFromNormalAndTexDirs(v->tangent, v->bitangent, v->normal, sdir, tdir);
|
||||
tangent[3] = R_CalcTangentSpace(tangent, NULL, normal, sdirs[j], tdirs[j]);
|
||||
|
||||
R_VaoPackTangent(v->tangent, tangent);
|
||||
}
|
||||
|
||||
ri.Free(sdirs);
|
||||
ri.Free(tdirs);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -676,11 +687,11 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
offset_st = 0;
|
||||
offset_xyz = surf->numVerts * glRefConfig.packedTexcoordDataSize;
|
||||
offset_normal = offset_xyz + sizeof(vec3_t);
|
||||
offset_tangent = offset_normal + sizeof(uint32_t);
|
||||
offset_tangent = offset_normal + sizeof(int16_t) * 4;
|
||||
stride_st = glRefConfig.packedTexcoordDataSize;
|
||||
stride_xyz = sizeof(vec3_t) + sizeof(uint32_t);
|
||||
stride_xyz = sizeof(vec3_t) + sizeof(int16_t) * 4;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
stride_xyz += sizeof(uint32_t);
|
||||
stride_xyz += sizeof(int16_t) * 4;
|
||||
#endif
|
||||
stride_normal = stride_tangent = stride_xyz;
|
||||
|
||||
|
@ -692,11 +703,11 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
offset_xyz = 0;
|
||||
offset_st = offset_xyz + sizeof(vec3_t);
|
||||
offset_normal = offset_st + glRefConfig.packedTexcoordDataSize;
|
||||
offset_tangent = offset_normal + sizeof(uint32_t);
|
||||
offset_tangent = offset_normal + sizeof(int16_t) * 4;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
stride_xyz = offset_tangent + sizeof(uint32_t);
|
||||
stride_xyz = offset_tangent + sizeof(int16_t) * 4;
|
||||
#else
|
||||
stride_xyz = offset_normal + sizeof(uint32_t);
|
||||
stride_xyz = offset_normal + sizeof(int16_t) * 4;
|
||||
#endif
|
||||
stride_st = stride_normal = stride_tangent = stride_xyz;
|
||||
|
||||
|
@ -717,24 +728,18 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
v = surf->verts;
|
||||
for ( j = 0; j < surf->numVerts * mdvModel->numFrames ; j++, v++ )
|
||||
{
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
vec3_t nxt;
|
||||
vec4_t tangent;
|
||||
#endif
|
||||
// xyz
|
||||
memcpy(data + dataOfs, &v->xyz, sizeof(vec3_t));
|
||||
dataOfs += sizeof(vec3_t);
|
||||
|
||||
// normal
|
||||
dataOfs += R_VaoPackNormal(data + dataOfs, v->normal);
|
||||
memcpy(data + dataOfs, &v->normal, sizeof(int16_t) * 4);
|
||||
dataOfs += sizeof(int16_t) * 4;
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
CrossProduct(v->normal, v->tangent, nxt);
|
||||
VectorCopy(v->tangent, tangent);
|
||||
tangent[3] = (DotProduct(nxt, v->bitangent) < 0.0f) ? -1.0f : 1.0f;
|
||||
|
||||
// tangent
|
||||
dataOfs += R_VaoPackTangent(data + dataOfs, tangent);
|
||||
memcpy(data + dataOfs, &v->tangent, sizeof(int16_t) * 4);
|
||||
dataOfs += sizeof(int16_t) * 4;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -744,10 +749,6 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
st = surf->st;
|
||||
for ( j = 0; j < surf->numVerts; j++, v++, st++ )
|
||||
{
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
vec3_t nxt;
|
||||
vec4_t tangent;
|
||||
#endif
|
||||
// xyz
|
||||
memcpy(data + dataOfs, &v->xyz, sizeof(vec3_t));
|
||||
dataOfs += sizeof(v->xyz);
|
||||
|
@ -756,15 +757,13 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
dataOfs += R_VaoPackTexCoord(data + dataOfs, st->st);
|
||||
|
||||
// normal
|
||||
dataOfs += R_VaoPackNormal(data + dataOfs, v->normal);
|
||||
memcpy(data + dataOfs, &v->normal, sizeof(int16_t) * 4);
|
||||
dataOfs += sizeof(int16_t) * 4;
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
CrossProduct(v->normal, v->tangent, nxt);
|
||||
VectorCopy(v->tangent, tangent);
|
||||
tangent[3] = (DotProduct(nxt, v->bitangent) < 0.0f) ? -1.0f : 1.0f;
|
||||
|
||||
// tangent
|
||||
dataOfs += R_VaoPackTangent(data + dataOfs, tangent);
|
||||
memcpy(data + dataOfs, &v->tangent, sizeof(int16_t) * 4);
|
||||
dataOfs += sizeof(int16_t) * 4;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -794,8 +793,8 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_POSITION].type = GL_FLOAT;
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_TEXCOORD].type = glRefConfig.packedTexcoordDataType;
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_NORMAL ].type = glRefConfig.packedNormalDataType;
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_TANGENT ].type = glRefConfig.packedNormalDataType;
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_NORMAL ].type = GL_SHORT;
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_TANGENT ].type = GL_SHORT;
|
||||
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_POSITION].normalized = GL_FALSE;
|
||||
vaoSurf->vao->attribs[ATTR_INDEX_TEXCOORD].normalized = GL_FALSE;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue