Merge pull request #100 from secondlife/SL-19294
SL-19294: Fix Blinn-Phong texture transforms affecting PBR materialsmeow-7.2.2
commit
f92dddcf1f
|
|
@ -1524,7 +1524,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
|| mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD2);
|
||||
}
|
||||
|
||||
bool do_tex_mat = tex_mode && mTextureMatrix;
|
||||
// For GLTF materials: Transforms will be applied later
|
||||
bool do_tex_mat = tex_mode && mTextureMatrix && !gltf_mat;
|
||||
|
||||
if (!do_bump)
|
||||
{ //not bump mapped, might be able to do a cheap update
|
||||
|
|
@ -1614,7 +1615,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
*tex_coords0++ = tc;
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (do_xform)
|
||||
{
|
||||
for (S32 i = 0; i < num_vertices; i++)
|
||||
{
|
||||
|
|
@ -1627,6 +1628,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
|
||||
xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
|
||||
|
||||
*tex_coords0++ = tc;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (S32 i = 0; i < num_vertices; i++)
|
||||
{
|
||||
LLVector2 tc(vf.mTexCoords[i]);
|
||||
LLVector4a& norm = vf.mNormals[i];
|
||||
LLVector4a& center = *(vf.mCenter);
|
||||
LLVector4a vec = vf.mPositions[i];
|
||||
vec.mul(scalea);
|
||||
planarProjection(tc, norm, center, vec);
|
||||
|
||||
*tex_coords0++ = tc;
|
||||
}
|
||||
}
|
||||
|
|
@ -1694,44 +1709,44 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
}
|
||||
|
||||
|
||||
for (S32 i = 0; i < num_vertices; i++)
|
||||
{
|
||||
LLVector2 tc(vf.mTexCoords[i]);
|
||||
|
||||
LLVector4a& norm = vf.mNormals[i];
|
||||
|
||||
LLVector4a& center = *(vf.mCenter);
|
||||
|
||||
if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
|
||||
{
|
||||
LLVector4a vec = vf.mPositions[i];
|
||||
|
||||
vec.mul(scalea);
|
||||
for (S32 i = 0; i < num_vertices; i++)
|
||||
{
|
||||
LLVector2 tc(vf.mTexCoords[i]);
|
||||
|
||||
LLVector4a& norm = vf.mNormals[i];
|
||||
|
||||
LLVector4a& center = *(vf.mCenter);
|
||||
|
||||
if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
|
||||
{
|
||||
LLVector4a vec = vf.mPositions[i];
|
||||
|
||||
vec.mul(scalea);
|
||||
|
||||
if (texgen == LLTextureEntry::TEX_GEN_PLANAR)
|
||||
{
|
||||
planarProjection(tc, norm, center, vec);
|
||||
}
|
||||
}
|
||||
if (texgen == LLTextureEntry::TEX_GEN_PLANAR)
|
||||
{
|
||||
planarProjection(tc, norm, center, vec);
|
||||
}
|
||||
}
|
||||
|
||||
if (tex_mode && mTextureMatrix)
|
||||
{
|
||||
LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
|
||||
tmp = tmp * *mTextureMatrix;
|
||||
tc.mV[0] = tmp.mV[0];
|
||||
tc.mV[1] = tmp.mV[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
|
||||
}
|
||||
if (tex_mode && mTextureMatrix)
|
||||
{
|
||||
LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
|
||||
tmp = tmp * *mTextureMatrix;
|
||||
tc.mV[0] = tmp.mV[0];
|
||||
tc.mV[1] = tmp.mV[1];
|
||||
}
|
||||
else if (do_xform)
|
||||
{
|
||||
xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
|
||||
}
|
||||
|
||||
*dst++ = tc;
|
||||
if (do_bump)
|
||||
{
|
||||
bump_tc.push_back(tc);
|
||||
}
|
||||
}
|
||||
*dst++ = tc;
|
||||
if (do_bump)
|
||||
{
|
||||
bump_tc.push_back(tc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((!mat && !gltf_mat) && do_bump)
|
||||
|
|
|
|||
|
|
@ -686,6 +686,7 @@ private:
|
|||
static LLFace** sNormFaces[2];
|
||||
static LLFace** sSpecFaces[2];
|
||||
static LLFace** sNormSpecFaces[2];
|
||||
static LLFace** sPbrFaces[2];
|
||||
static LLFace** sAlphaFaces[2];
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -5105,6 +5105,7 @@ LLFace** LLVolumeGeometryManager::sSimpleFaces[2] = { NULL };
|
|||
LLFace** LLVolumeGeometryManager::sNormFaces[2] = { NULL };
|
||||
LLFace** LLVolumeGeometryManager::sSpecFaces[2] = { NULL };
|
||||
LLFace** LLVolumeGeometryManager::sNormSpecFaces[2] = { NULL };
|
||||
LLFace** LLVolumeGeometryManager::sPbrFaces[2] = { NULL };
|
||||
LLFace** LLVolumeGeometryManager::sAlphaFaces[2] = { NULL };
|
||||
|
||||
LLVolumeGeometryManager::LLVolumeGeometryManager()
|
||||
|
|
@ -5141,6 +5142,7 @@ void LLVolumeGeometryManager::allocateFaces(U32 pMaxFaceCount)
|
|||
sNormFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));
|
||||
sSpecFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));
|
||||
sNormSpecFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));
|
||||
sPbrFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));
|
||||
sAlphaFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));
|
||||
}
|
||||
}
|
||||
|
|
@ -5155,6 +5157,7 @@ void LLVolumeGeometryManager::freeFaces()
|
|||
ll_aligned_free<64>(sNormFaces[i]);
|
||||
ll_aligned_free<64>(sSpecFaces[i]);
|
||||
ll_aligned_free<64>(sNormSpecFaces[i]);
|
||||
ll_aligned_free<64>(sPbrFaces[i]);
|
||||
ll_aligned_free<64>(sAlphaFaces[i]);
|
||||
|
||||
sFullbrightFaces[i] = NULL;
|
||||
|
|
@ -5163,6 +5166,7 @@ void LLVolumeGeometryManager::freeFaces()
|
|||
sNormFaces[i] = NULL;
|
||||
sSpecFaces[i] = NULL;
|
||||
sNormSpecFaces[i] = NULL;
|
||||
sPbrFaces[i] = NULL;
|
||||
sAlphaFaces[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
|
@ -5596,6 +5600,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
U32 norm_count[2] = { 0 };
|
||||
U32 spec_count[2] = { 0 };
|
||||
U32 normspec_count[2] = { 0 };
|
||||
U32 pbr_count[2] = { 0 };
|
||||
|
||||
static LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
|
||||
static LLCachedControl<S32> max_node_size(gSavedSettings, "RenderMaxNodeSize", 65536);
|
||||
|
|
@ -5877,8 +5882,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
{
|
||||
if (gltf_mat != nullptr)
|
||||
{
|
||||
// all gltf materials have all vertex attributes for now
|
||||
add_face(sNormSpecFaces, normspec_count, facep);
|
||||
add_face(sPbrFaces, pbr_count, facep);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -5977,6 +5981,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
U32 normspec_mask = norm_mask | LLVertexBuffer::MAP_TEXCOORD2;
|
||||
U32 spec_mask = simple_mask | LLVertexBuffer::MAP_TEXCOORD2;
|
||||
|
||||
U32 pbr_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TANGENT;
|
||||
|
||||
if (emissive)
|
||||
{ //emissive faces are present, include emissive byte to preserve batching
|
||||
simple_mask = simple_mask | LLVertexBuffer::MAP_EMISSIVE;
|
||||
|
|
@ -5986,6 +5992,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
norm_mask = norm_mask | LLVertexBuffer::MAP_EMISSIVE;
|
||||
normspec_mask = normspec_mask | LLVertexBuffer::MAP_EMISSIVE;
|
||||
spec_mask = spec_mask | LLVertexBuffer::MAP_EMISSIVE;
|
||||
pbr_mask = pbr_mask | LLVertexBuffer::MAP_EMISSIVE;
|
||||
}
|
||||
|
||||
BOOL batch_textures = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1;
|
||||
|
|
@ -6016,6 +6023,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
geometryBytes += genDrawInfo(group, norm_mask | extra_mask, sNormFaces[i], norm_count[i], FALSE, FALSE, rigged);
|
||||
geometryBytes += genDrawInfo(group, spec_mask | extra_mask, sSpecFaces[i], spec_count[i], FALSE, FALSE, rigged);
|
||||
geometryBytes += genDrawInfo(group, normspec_mask | extra_mask, sNormSpecFaces[i], normspec_count[i], FALSE, FALSE, rigged);
|
||||
geometryBytes += genDrawInfo(group, pbr_mask | extra_mask, sPbrFaces[i], pbr_count[i], FALSE, FALSE, rigged);
|
||||
|
||||
// for rigged set, add weights and disable alpha sorting (rigged items use depth buffer)
|
||||
extra_mask |= LLVertexBuffer::MAP_WEIGHT4;
|
||||
|
|
|
|||
Loading…
Reference in New Issue