# Conflicts:
#	indra/newview/app_settings/settings.xml
#	indra/newview/app_settings/shaders/class1/objects/previewV.glsl
#	indra/newview/featuretable.txt
#	indra/newview/featuretable_mac.txt
#	indra/newview/llmodelpreview.cpp
#	indra/newview/llviewerobject.cpp
#	indra/newview/llviewershadermgr.cpp
master
Ansariel 2023-07-04 14:18:58 +02:00
commit 1d8360e8bb
13 changed files with 153 additions and 111 deletions

View File

@ -13743,7 +13743,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.4</real>
<real>0.5</real>
</map>
<key>RenderShaderLODThreshold</key>
<map>

View File

@ -84,6 +84,7 @@ void main()
color.rgb += rainbow(optic_d);
color.rgb += halo_22;
color.rgb *= 2.;
color.rgb = clamp(color.rgb, vec3(0), vec3(5));
frag_data[0] = vec4(0);
frag_data[1] = vec4(0);

View File

@ -26,7 +26,6 @@
uniform mat3 normal_matrix;
uniform mat4 texture_matrix0;
uniform vec4 ambient_color; // <FS:Beq/> add ambient color to preview shader
uniform mat4 modelview_matrix;
uniform mat4 modelview_projection_matrix;
in vec3 position;
@ -55,14 +54,27 @@ float calcDirectionalLight(vec3 n, vec3 l)
//====================================================================================================
#ifdef HAS_SKIN
mat4 getObjectSkinnedTransform();
uniform mat4 modelview_matrix;
uniform mat4 projection_matrix;
#endif
void main()
{
//transform vertex
vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
vec3 norm;
#ifdef HAS_SKIN
mat4 mat = getObjectSkinnedTransform();
mat = modelview_matrix * mat;
vec4 pos = mat * vec4(position.xyz, 1.0);
gl_Position = projection_matrix * pos;
norm = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz);
#else
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
norm = normalize(normal_matrix * normal);
#endif
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
vec3 norm = normalize(normal_matrix * normal);
vec4 col = ambient_color; // <FS:Beq/> add ambient color to preview shader

View File

@ -364,7 +364,8 @@ return texCUBE(envMap, ReflDirectionWS);
// dir - ray direction in clip space
// i - probe index in refBox/refSphere
// d - distance to nearest wall in clip space
vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d)
// scale - scale of box, default 1.0
vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d, float scale)
{
// Intersection with OBB convert to unit box space
// Transform in local unit parallax cube space (scaled and rotated)
@ -375,7 +376,7 @@ vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d)
d = 1.0-max(max(abs(PositionLS.x), abs(PositionLS.y)), abs(PositionLS.z));
vec3 Unitary = vec3(1.0f, 1.0f, 1.0f);
vec3 Unitary = vec3(scale);
vec3 FirstPlaneIntersect = (Unitary - PositionLS) / RayLS;
vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS;
vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect);
@ -387,6 +388,11 @@ vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d)
return IntersectPositionCS;
}
vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d)
{
return boxIntersect(origin, dir, i, d, 1.0);
}
void debugBoxCol(vec3 ro, vec3 rd, float t, vec3 p, inout vec4 col)
{
vec3 v = ro + rd * t;
@ -531,7 +537,7 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int
if (refIndex[i].w < 0)
{
float d = 0.0;
v = boxIntersect(pos, dir, i, d);
v = boxIntersect(pos, dir, i, d, 3.0);
w = max(d, 0.001);
}
else

View File

@ -1,4 +1,4 @@
version 57
version 58
// The version number above should be incremented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@ -163,7 +163,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 1
//
// Medium High Graphics Settings (deferred enabled)
// Medium High Graphics Settings
//
list MidHigh
RenderAnisotropic 1 1
@ -192,7 +192,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 2
//
// High Graphics Settings (deferred + SSAO)
// High Graphics Settings (SSAO + sun shadows)
//
list High
RenderAnisotropic 1 1
@ -212,7 +212,7 @@ RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
RenderShadowDetail 1 1
WLSkyDetail 1 96
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1
@ -221,7 +221,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 3
//
// High Ultra Graphics Settings (deferred + SSAO)
// High Ultra Graphics Settings (deferred + SSAO + all shadows)
//
list HighUltra
RenderAnisotropic 1 1
@ -241,7 +241,7 @@ RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
RenderShadowDetail 1 2
WLSkyDetail 1 96
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1

View File

@ -1,4 +1,4 @@
version 44
version 45
// The version number above should be incremented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@ -163,7 +163,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 1
//
// Medium High Graphics Settings (deferred enabled)
// Medium High Graphics Settings
//
list MidHigh
RenderAnisotropic 1 1
@ -192,7 +192,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 2
//
// High Graphics Settings (deferred + SSAO)
// High Graphics Settings (SSAO + sun shadows)
//
list High
RenderAnisotropic 1 1
@ -212,7 +212,7 @@ RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
RenderShadowDetail 1 1
WLSkyDetail 1 96
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1
@ -221,7 +221,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 3
//
// High Ultra Graphics Settings (deferred + SSAO)
// High Ultra Graphics Settings (deferred + SSAO + all shadows)
//
list HighUltra
RenderAnisotropic 1 1
@ -241,7 +241,7 @@ RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
RenderShadowDetail 1 2
WLSkyDetail 1 96
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1

View File

@ -1,4 +1,4 @@
version 52
version 53
// The version number above should be incremented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@ -161,7 +161,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 0
//
// Medium High Graphics Settings (deferred enabled)
// Medium High Graphics Settings
//
list MidHigh
RenderAnisotropic 1 1
@ -190,7 +190,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 0
//
// High Graphics Settings (deferred + SSAO)
// High Graphics Settings (SSAO + sun shadows)
//
list High
RenderAnisotropic 1 1
@ -210,7 +210,7 @@ RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
RenderShadowDetail 1 1
WLSkyDetail 1 96
RenderFSAASamples 1 2
RenderReflectionsEnabled 1 1
@ -219,7 +219,7 @@ RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 1
//
// High Ultra Graphics Settings (deferred + SSAO)
// High Ultra Graphics Settings (SSAO + all shadows)
//
list HighUltra
RenderAnisotropic 1 1
@ -238,7 +238,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
RenderShadowDetail 1 0
RenderShadowDetail 1 2
RenderUseAdvancedAtmospherics 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 2

View File

@ -3749,6 +3749,16 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
base_iter++;
bool skinned = include_skin_weights && !mdl->mSkinWeights.empty();
LLMatrix4a mat_normal;
if (skinned)
{
glh::matrix4f m((F32*)mdl->mSkinInfo.mBindShapeMatrix.getF32ptr());
m = m.inverse().transpose();
mat_normal.loadu(m.m);
}
S32 num_faces = mdl->getNumVolumeFaces();
for (S32 i = 0; i < num_faces; ++i)
{
@ -3763,7 +3773,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
LLVertexBuffer* vb = NULL;
bool skinned = include_skin_weights && !mdl->mSkinWeights.empty();
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
@ -3803,6 +3813,15 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
LLVector4a::memcpyNonAliased16((F32*)vertex_strider.get(), (F32*)vf.mPositions, num_vertices * 4 * sizeof(F32));
if (skinned)
{
for (U32 i = 0; i < num_vertices; ++i)
{
LLVector4a* v = (LLVector4a*)vertex_strider.get();
mdl->mSkinInfo.mBindShapeMatrix.affineTransform(*v, *v);
vertex_strider++;
}
}
if (vf.mTexCoords)
{
vb->getTexCoord0Strider(tc_strider);
@ -3813,7 +3832,25 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
if (vf.mNormals)
{
vb->getNormalStrider(normal_strider);
LLVector4a::memcpyNonAliased16((F32*)normal_strider.get(), (F32*)vf.mNormals, num_vertices * 4 * sizeof(F32));
if (skinned)
{
F32* normals = (F32*)normal_strider.get();
LLVector4a* src = vf.mNormals;
LLVector4a* end = src + num_vertices;
while (src < end)
{
LLVector4a normal;
mat_normal.rotate(*src++, normal);
normal.store4a(normals);
normals += 4;
}
}
else
{
LLVector4a::memcpyNonAliased16((F32*)normal_strider.get(), (F32*)vf.mNormals, num_vertices * 4 * sizeof(F32));
}
}
if (skinned)
@ -4353,7 +4390,7 @@ BOOL LLModelPreview::render()
refresh();
}
gObjectPreviewProgram.bind();
gObjectPreviewProgram.bind(skin_weight);
gGL.loadIdentity();
gPipeline.enableLightsPreview();
@ -4429,11 +4466,11 @@ BOOL LLModelPreview::render()
}
gGL.pushMatrix();
LLMatrix4 mat = instance.mTransform;
gGL.multMatrix((GLfloat*)mat.mMatrix);
U32 num_models = mVertexBuffer[mPreviewLOD][model].size();
for (U32 i = 0; i < num_models; ++i)
{
@ -4794,80 +4831,43 @@ BOOL LLModelPreview::render()
{
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
const LLVolumeFace& face = model->getVolumeFace(i);
model->mSkinInfo.updateHash();
LLRenderPass::uploadMatrixPalette(mPreviewAvatar, &model->mSkinInfo);
LLStrider<LLVector3> position;
buffer->getVertexStrider(position);
// <FS:Ansariel> Vectorized Weight4Strider and ClothWeightStrider by Drake Arconis
//LLStrider<LLVector4> weight;
LLStrider<LLVector4a> weight;
buffer->getWeight4Strider(weight);
//quick 'n dirty software vertex skinning
//build matrix palette
LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
LLSkinningUtil::initSkinningMatrixPalette(mat, joint_count,
skin, getPreviewAvatar());
const LLMatrix4a& bind_shape_matrix = skin->mBindShapeMatrix;
U32 max_joints = LLSkinningUtil::getMaxJointCount();
for (U32 j = 0; j < buffer->getNumVerts(); ++j)
{
LLMatrix4a final_mat;
// <FS:Ansariel> Vectorized Weight4Strider and ClothWeightStrider by Drake Arconis
//F32 *wptr = weight[j].mV;
F32 *wptr = weight[j].getF32ptr();
// </FS:Ansariel>
LLSkinningUtil::getPerVertexSkinMatrix(wptr, mat, true, final_mat, max_joints);
//VECTORIZE THIS
LLVector4a& v = face.mPositions[j];
LLVector4a t;
LLVector4a dst;
bind_shape_matrix.affineTransform(v, t);
final_mat.affineTransform(t, dst);
position[j][0] = dst[0];
position[j][1] = dst[1];
position[j][2] = dst[2];
}
// <FS:ND> FIRE-13465 Make sure there's a material set before dereferencing it
if( instance.mModel->mMaterialList.size() > i &&
instance.mMaterial.end() != instance.mMaterial.find( instance.mModel->mMaterialList[ i ] ) )
{
// </FS:ND>
llassert(model->mMaterialList.size() > i);
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];
buffer->unmapBuffer();
buffer->setBuffer();
gGL.diffuseColor4fv(material.mDiffuseColor.mV);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// Find the tex for this material, bind it, and add it to our set
//
LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material);
if (tex)
if (textures)
{
mTextureSet.insert(tex);
}
} else // <FS:ND> FIRE-13465 Make sure there's a material set before dereferencing it, if none, set buffer type and unbind texture.
{
buffer->setBuffer();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
} // </FS:ND>
int materialCnt = instance.mModel->mMaterialList.size();
if (i < materialCnt)
{
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];
gGL.diffuseColor4fv(material.mDiffuseColor.mV);
// Find the tex for this material, bind it, and add it to our set
//
LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material);
if (tex)
{
mTextureSet.insert(tex);
}
}
}
else
{
// <FS:Beq> restore behaviour removed by lab
//gGL.diffuseColor4fv(PREVIEW_BASE_COL.mV);
gGL.diffuseColor4fv(base_col().mV);
}
buffer->setBuffer();
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
if (edges)
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// <FS:Beq> restore behaviour removed by lab
// gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV);
// gGL.setLineWidth(PREVIEW_EDGE_WIDTH);

View File

@ -253,6 +253,10 @@ void LLReflectionMapManager::update()
if (probe != mDefaultProbe)
{
if (probe->mViewerObject) //make sure probes track the viewer objects they are attached to
{
probe->mOrigin.load3(probe->mViewerObject->getPositionAgent().mV);
}
d.setSub(camera_pos, probe->mOrigin);
probe->mDistance = d.getLength3().getF32() - probe->mRadius;
}

View File

@ -1327,7 +1327,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
LL_INFOS() << "Full:" << getID() << LL_ENDL;
#endif
//clear cost and linkset cost
mCostStale = true;
setObjectCostStale();
if (isSelected())
{
gFloaterTools->dirty();
@ -1889,7 +1889,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
#ifdef DEBUG_UPDATE_TYPE
LL_INFOS() << "CompFull:" << getID() << LL_ENDL;
#endif
mCostStale = true;
setObjectCostStale();
if (isSelected())
{
@ -3933,6 +3933,16 @@ void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
}
}
void LLViewerObject::setObjectCostStale()
{
mCostStale = true;
// *NOTE: This is harmlessly redundant for Blinn-Phong material updates, as
// the root prim currently gets set stale anyway due to other property
// updates. But it is needed for GLTF material ID updates.
// -Cosmic,2023-06-27
getRootEdit()->mCostStale = true;
}
void LLViewerObject::setObjectCost(F32 cost)
{
mObjectCost = cost;
@ -6982,7 +6992,7 @@ void LLViewerObject::setPhysicsShapeType(U8 type)
if (type != mPhysicsShapeType)
{
mPhysicsShapeType = type;
mCostStale = true;
setObjectCostStale();
}
}
@ -7492,6 +7502,12 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat
LLGLTFMaterialList::queueApply(this, te, id);
}
}
if (!update_server)
{
// Land impact may have changed
setObjectCostStale();
}
}
void LLViewerObject::setRenderMaterialIDs(const LLUUID& id)

View File

@ -654,6 +654,7 @@ public:
std::vector<LLVector3> mUnselectedChildrenPositions ;
private:
void setObjectCostStale();
bool isAssetInInventory(LLViewerInventoryItem* item);
ExtraParameter* createNewParameterEntry(U16 param_type);

View File

@ -92,6 +92,7 @@ LLGLSLShader gCopyDepthProgram;
//object shaders
LLGLSLShader gObjectPreviewProgram;
LLGLSLShader gSkinnedObjectPreviewProgram;
LLGLSLShader gPhysicsPreviewProgram;
LLGLSLShader gObjectFullbrightAlphaMaskProgram;
LLGLSLShader gSkinnedObjectFullbrightAlphaMaskProgram;
@ -252,7 +253,6 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gWaterProgram);
mShaderList.push_back(&gWaterEdgeProgram);
mShaderList.push_back(&gAvatarEyeballProgram);
mShaderList.push_back(&gObjectPreviewProgram);
mShaderList.push_back(&gImpostorProgram);
mShaderList.push_back(&gObjectBumpProgram);
mShaderList.push_back(&gSkinnedObjectBumpProgram);
@ -2891,20 +2891,16 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
gObjectPreviewProgram.mName = "Preview Shader"; // <FS:Beq> update preview shader name
gObjectPreviewProgram.mFeatures.calculatesLighting = false;
gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false;
gObjectPreviewProgram.mFeatures.hasGamma = false;
gObjectPreviewProgram.mFeatures.hasAtmospherics = false;
gObjectPreviewProgram.mFeatures.hasLighting = false;
gObjectPreviewProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectPreviewProgram.mName = "Object Preview Shader";
gObjectPreviewProgram.mFeatures.disableTextureIndex = true;
gObjectPreviewProgram.mShaderFiles.clear();
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER));
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewF.glsl", GL_FRAGMENT_SHADER));
gObjectPreviewProgram.mShaderLevel = mShaderLevel[SHADER_OBJECT];
success = make_rigged_variant(gObjectPreviewProgram, gSkinnedObjectPreviewProgram);
success = gObjectPreviewProgram.createShader(NULL, NULL);
gObjectPreviewProgram.mFeatures.hasLighting = true;
gSkinnedObjectPreviewProgram.mFeatures.hasLighting = true;
}
if (success)

View File

@ -10816,8 +10816,11 @@ public:
{
LLSpatialGroup* group = (LLSpatialGroup*)state->getListener(0);
group->setState(LLSpatialGroup::GEOM_DIRTY);
gPipeline.markRebuild(group);
if (group->getSpatialPartition()->mRenderByGroup)
{
group->setState(LLSpatialGroup::GEOM_DIRTY);
gPipeline.markRebuild(group);
}
for (LLSpatialGroup::bridge_list_t::iterator i = group->mBridgeList.begin(); i != group->mBridgeList.end(); ++i)
{
@ -10839,6 +10842,9 @@ void LLPipeline::rebuildDrawInfo()
LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_VOLUME);
dirty.traverse(part->mOctree);
part = region->getSpatialPartition(LLViewerRegion::PARTITION_BRIDGE);
dirty.traverse(part->mOctree);
}
}