Merge branch 'DRTVWR-559' of https://bitbucket.org/lindenlab/viewer
commit
cea42d25d1
|
|
@ -61,8 +61,10 @@ public:
|
|||
// get a UUID based on a hash of this LLGLTFMaterial
|
||||
LLUUID getHash() const
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
|
||||
LLMD5 md5;
|
||||
md5.update((unsigned char*) this, sizeof(this));
|
||||
md5.finalize();
|
||||
LLUUID id;
|
||||
md5.raw_digest(id.mData);
|
||||
return id;
|
||||
|
|
|
|||
|
|
@ -1715,6 +1715,8 @@ BOOL LLNetworkData::isValid(U16 param_type, U32 size)
|
|||
return (size == 4);
|
||||
case PARAMS_RENDER_MATERIAL:
|
||||
return (size > 1);
|
||||
case PARAMS_REFLECTION_PROBE:
|
||||
return (size == 9);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ void main()
|
|||
vec3 lv =(light [ light_idx ].xyz - pos);
|
||||
calcHalfVectors(lv, n, v, h, l, nh, nl, nv, vh, lightDist);
|
||||
|
||||
if (nl > 0.0 || nv > 0.0)
|
||||
if (nl > 0.0)
|
||||
{
|
||||
float dist = lightDist / lightSize;
|
||||
float dist_atten = 1.0 - (dist + falloff)/(1.0 + falloff);
|
||||
|
|
|
|||
|
|
@ -38,6 +38,21 @@
|
|||
#define DEBUG_SPOT_SPEC_POS 0
|
||||
#define DEBUG_SPOT_REFLECTION 0
|
||||
|
||||
#define DEBUG_PBR_LIGHT_H 0 // Half vector
|
||||
#define DEBUG_PBR_LIHGT_L 0 // Light vector
|
||||
#define DEBUG_PBR_LIGHT_NH 0 // dot(n,h)
|
||||
#define DEBUG_PBR_LIGHT_NL 0 // doh(n,l)
|
||||
#define DEBUG_PBR_LIGHT_NV 0 // doh(n,v)
|
||||
#define DEBUG_PBR_LIGHT_VH 0 // doh(v,h)
|
||||
#define DEBUG_PBR_LIGHT_DIFFUSE_COLOR 0 // non PBR spotlight
|
||||
#define DEBUG_PBR_LIGHT_SPECULAR_COLOR 0 // non PBR spotlight
|
||||
#define DEBUG_PBR_LIGHT_INTENSITY 0 // Light intensity
|
||||
#define DEBUG_PBR_LIGHT_INTENSITY_NL 0 // Light intensity * dot(n,l)
|
||||
#define DEBUG_PBR_LIGHT_BRDF_DIFFUSE 0
|
||||
#define DEBUG_PBR_LIGHT_BRDF_SPECULAR 0
|
||||
#define DEBUG_PBR_LIGHT_BRDF_FINAL 0 // BRDF Diffuse + BRDF Specular
|
||||
#define DEBUG_PBR_SHADOW 0 // Show inverted shadow
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
|
|
@ -96,6 +111,13 @@ void initMaterial( vec3 diffuse, vec3 packedORM, out float alphaRough, out vec3
|
|||
vec3 srgb_to_linear(vec3 cs);
|
||||
vec4 texture2DLodSpecular(vec2 tc, float lod);
|
||||
|
||||
vec3 colorized_dot(float x)
|
||||
{
|
||||
if (x > 0.0) return vec3( 0, x, 0 );
|
||||
if (x < 0.0) return vec3( x, 0, 0 );
|
||||
return vec3( 0, 0, 1 );
|
||||
}
|
||||
|
||||
vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
|
|
@ -174,12 +196,8 @@ void main()
|
|||
dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
|
||||
slit = getProjectedLightSpecularColor( pos, n );
|
||||
|
||||
// vec3 intensity = getLightIntensitySpot( color, size, lightDist, v );
|
||||
colorDiffuse = shadow * dlit * nl * dist_atten;
|
||||
colorSpec = shadow * slit * nl * dist_atten;
|
||||
|
||||
// colorDiffuse *= BRDFLambertian ( reflect0, reflect90, c_diff , specWeight, vh );
|
||||
// colorSpec *= BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh );
|
||||
colorDiffuse = shadow * dist_atten * nl * (dlit*0.5 + BRDFLambertian ( reflect0, reflect90, c_diff , specWeight, vh ));
|
||||
colorSpec = shadow * dist_atten * nl * (slit + BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh ));
|
||||
|
||||
#if DEBUG_PBR_SPOT_DIFFUSE
|
||||
colorDiffuse = dlit.rgb; colorSpec = vec3(0);
|
||||
|
|
@ -212,6 +230,65 @@ void main()
|
|||
colorDiffuse = vec3(0.5); colorSpec = vec3(0);
|
||||
#endif
|
||||
|
||||
#if DEBUG_PBR_LIGHT_H
|
||||
colorDiffuse = h*0.5 + 0.5; colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIHGT_L
|
||||
colorDiffuse = l*0.5 + 0.5; colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_NH
|
||||
colorDiffuse = colorized_dot(nh); colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_NL
|
||||
colorDiffuse = colorized_dot(nl); colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_NV
|
||||
colorDiffuse = colorized_dot(nv); colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_VH
|
||||
colorDiffuse = colorized_dot(vh); colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_DIFFUSE_COLOR
|
||||
colorDiffuse = dlit;
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_SPECULAR_COLOR
|
||||
colorDiffuse = slit;
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_INTENSITY
|
||||
colorDiffuse = getLightIntensitySpot( color, size, lightDist, v ); colorSpec = vec3(0);
|
||||
// colorDiffuse = nl * dist_atten;
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_INTENSITY_NL
|
||||
colorDiffuse = getLightIntensitySpot( color, size, lightDist, v ) * nl; colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_BRDF_DIFFUSE
|
||||
vec3 c_diff, reflect0, reflect90;
|
||||
float alphaRough, specWeight;
|
||||
initMaterial( diffuse, packedORM, alphaRough, c_diff, reflect0, reflect90, specWeight );
|
||||
|
||||
colorDiffuse = BRDFLambertian ( reflect0, reflect90, c_diff , specWeight, vh );
|
||||
colorSpec = vec3(0);
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_BRDF_SPECULAR
|
||||
vec3 c_diff, reflect0, reflect90;
|
||||
float alphaRough, specWeight;
|
||||
initMaterial( diffuse, packedORM, alphaRough, c_diff, reflect0, reflect90, specWeight );
|
||||
|
||||
colorDiffuse = vec3(0);
|
||||
colorSpec = BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh );
|
||||
#endif
|
||||
#if DEBUG_PBR_LIGHT_BRDF_FINAL
|
||||
vec3 c_diff, reflect0, reflect90;
|
||||
float alphaRough, specWeight;
|
||||
initMaterial( diffuse, packedORM, alphaRough, c_diff, reflect0, reflect90, specWeight );
|
||||
colorDiffuse = nl * BRDFLambertian ( reflect0, reflect90, c_diff , specWeight, vh );
|
||||
colorSpec = nl * BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh );
|
||||
#endif
|
||||
#if DEBUG_PBR_SHADOW
|
||||
colorDiffuse = 1.0 - vec3(shadow);
|
||||
colorSpec = vec3(0);
|
||||
#endif
|
||||
|
||||
final_color = colorDiffuse + colorSpec;
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ void main()
|
|||
float alphaRough, specWeight;
|
||||
initMaterial( diffuse, packedORM, alphaRough, c_diff, reflect0, reflect90, specWeight );
|
||||
|
||||
if (nl > 0.0 || nv > 0.0)
|
||||
if (nl > 0.0)
|
||||
{
|
||||
vec3 intensity = dist_atten * getLightIntensityPoint(color, size, lightDist);
|
||||
colorDiffuse += intensity * nl * BRDFLambertian (reflect0, reflect90, c_diff , specWeight, vh);
|
||||
|
|
|
|||
|
|
@ -167,15 +167,8 @@ void main()
|
|||
dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
|
||||
slit = getProjectedLightSpecularColor( pos, n );
|
||||
|
||||
// vec3 intensity = getLightIntensitySpot( color, size, lightDist, v );
|
||||
// colorDiffuse = shadow * dlit * nl;
|
||||
// colorSpec = shadow * slit * nl;
|
||||
|
||||
// colorDiffuse *= BRDFLambertian ( reflect0, reflect90, c_diff , specWeight, vh );
|
||||
// colorSpec *= BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh );
|
||||
|
||||
colorDiffuse = shadow * dlit * nl * dist_atten;
|
||||
colorSpec = shadow * slit * nl * dist_atten;
|
||||
colorDiffuse = shadow * dist_atten * nl * (dlit*0.5 + BRDFLambertian ( reflect0, reflect90, c_diff , specWeight, vh ));
|
||||
colorSpec = shadow * dist_atten * nl * (slit + BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh ));
|
||||
|
||||
#if DEBUG_PBR_SPOT_DIFFUSE
|
||||
colorDiffuse = dlit.rgb; colorSpec = vec3(0);
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ RenderGamma 1 0
|
|||
RenderGlowResolutionPow 1 9
|
||||
RenderGround 1 1
|
||||
RenderMaxPartCount 1 8192
|
||||
RenderObjectBump 1 1
|
||||
RenderLocalLights 1 1
|
||||
RenderReflectionDetail 1 4
|
||||
RenderTerrainDetail 1 1
|
||||
|
|
|
|||
|
|
@ -645,8 +645,8 @@ static void settings_to_globals()
|
|||
static void settings_modify()
|
||||
{
|
||||
LLPipeline::sRenderTransparentWater = gSavedSettings.getBOOL("RenderTransparentWater");
|
||||
LLPipeline::sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
|
||||
LLPipeline::sRenderDeferred = LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred");
|
||||
LLPipeline::sRenderBump = TRUE; // FALSE is deprecated -- gSavedSettings.getBOOL("RenderObjectBump");
|
||||
LLPipeline::sRenderDeferred = TRUE; // FALSE is deprecated -- LLPipeline::sRenderBump&& gSavedSettings.getBOOL("RenderDeferred");
|
||||
// LLRenderTarget::sUseFBO = LLPipeline::sRenderDeferred;
|
||||
// [RLVa:KB] - @setsphere
|
||||
LLRenderTarget::sUseFBO = LLPipeline::sRenderDeferred || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture);
|
||||
|
|
|
|||
|
|
@ -695,6 +695,7 @@ void LLDrawPoolBump::endBump(U32 pass)
|
|||
|
||||
S32 LLDrawPoolBump::getNumDeferredPasses()
|
||||
{
|
||||
#if 0 //DEPRECATED -- RenderObjectBump should always be TRUE
|
||||
// <FS:PP> Attempt to speed up things a little
|
||||
// if (gSavedSettings.getBOOL("RenderObjectBump"))
|
||||
static LLCachedControl<bool> RenderObjectBump(gSavedSettings, "RenderObjectBump");
|
||||
|
|
@ -707,6 +708,9 @@ S32 LLDrawPoolBump::getNumDeferredPasses()
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLDrawPoolBump::renderDeferred(S32 pass)
|
||||
|
|
|
|||
|
|
@ -2086,8 +2086,7 @@ void LLFloaterPreference::onUpdatePopupFilter()
|
|||
|
||||
void LLFloaterPreference::refreshEnabledState()
|
||||
{
|
||||
// <FS:Ansariel> Improved graphics preferences
|
||||
LLCheckBoxCtrl* ctrl_pbr = getChild<LLCheckBoxCtrl>("UsePBRShaders");
|
||||
LLCheckBoxCtrl* ctrl_pbr = getChild<LLCheckBoxCtrl>("UsePBRShaders");
|
||||
|
||||
F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
|
||||
|
||||
|
|
@ -2150,8 +2149,7 @@ void LLFloaterPreference::refreshEnabledState()
|
|||
sky->setEnabled(TRUE);
|
||||
|
||||
//PBR
|
||||
BOOL deferred = gSavedSettings.getBOOL("RenderDeferred");
|
||||
ctrl_pbr->setEnabled(deferred && LLFeatureManager::getInstance()->isFeatureAvailable("RenderPBR"));
|
||||
ctrl_pbr->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("RenderPBR"));
|
||||
|
||||
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
|
||||
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
|
||||
|
|
@ -2260,58 +2258,10 @@ void LLAvatarComplexityControls::setIndirectMaxArc()
|
|||
void LLFloaterPreference::disableUnavailableSettings()
|
||||
{
|
||||
LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
|
||||
// <FS:Ansariel> Doesn't exist anymore
|
||||
//LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth");
|
||||
//LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
|
||||
//LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
|
||||
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
|
||||
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
|
||||
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
|
||||
LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
|
||||
|
||||
// disabled windlight
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
|
||||
{
|
||||
// <FS:Ansariel> Doesn't exist anymore
|
||||
//ctrl_wind_light->setEnabled(FALSE);
|
||||
//ctrl_wind_light->setValue(FALSE);
|
||||
|
||||
sky->setEnabled(FALSE);
|
||||
|
||||
//deferred needs windlight, disable deferred
|
||||
ctrl_shadows->setEnabled(FALSE);
|
||||
ctrl_shadows->setValue(0);
|
||||
|
||||
ctrl_ssao->setEnabled(FALSE);
|
||||
ctrl_ssao->setValue(FALSE);
|
||||
|
||||
ctrl_dof->setEnabled(FALSE);
|
||||
ctrl_dof->setValue(FALSE);
|
||||
|
||||
// <FS:Ansariel> Doesn't exist anymore
|
||||
//ctrl_deferred->setEnabled(FALSE);
|
||||
//ctrl_deferred->setValue(FALSE);
|
||||
}
|
||||
|
||||
// disabled deferred
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") ||
|
||||
!gGLManager.mHasFramebufferObject)
|
||||
{
|
||||
ctrl_shadows->setEnabled(FALSE);
|
||||
ctrl_shadows->setValue(0);
|
||||
|
||||
ctrl_ssao->setEnabled(FALSE);
|
||||
ctrl_ssao->setValue(FALSE);
|
||||
|
||||
ctrl_dof->setEnabled(FALSE);
|
||||
ctrl_dof->setValue(FALSE);
|
||||
|
||||
// <FS:Ansariel> Doesn't exist anymore
|
||||
//ctrl_deferred->setEnabled(FALSE);
|
||||
//ctrl_deferred->setValue(FALSE);
|
||||
}
|
||||
|
||||
// disabled deferred SSAO
|
||||
// disabled deferred SSAO
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))
|
||||
{
|
||||
ctrl_ssao->setEnabled(FALSE);
|
||||
|
|
|
|||
|
|
@ -99,13 +99,13 @@ static void set_from_model(LLGLTFMaterial* mat, tinygltf::Model& model)
|
|||
}
|
||||
|
||||
mat->setAlphaMode(material_in.alphaMode);
|
||||
mat->mAlphaCutoff = material_in.alphaCutoff;
|
||||
mat->mAlphaCutoff = llclamp((F32)material_in.alphaCutoff, 0.f, 1.f);
|
||||
|
||||
mat->mAlbedoColor = get_color(material_in.pbrMetallicRoughness.baseColorFactor);
|
||||
mat->mEmissiveColor = get_color(material_in.emissiveFactor);
|
||||
|
||||
mat->mMetallicFactor = material_in.pbrMetallicRoughness.metallicFactor;
|
||||
mat->mRoughnessFactor = material_in.pbrMetallicRoughness.roughnessFactor;
|
||||
mat->mMetallicFactor = llclamp((F32)material_in.pbrMetallicRoughness.metallicFactor, 0.f, 1.f);
|
||||
mat->mRoughnessFactor = llclamp((F32)material_in.pbrMetallicRoughness.roughnessFactor, 0.f, 1.f);
|
||||
|
||||
mat->mDoubleSided = material_in.doubleSided;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ const std::string MATERIAL_NORMAL_DEFAULT_NAME = "Normal";
|
|||
const std::string MATERIAL_METALLIC_DEFAULT_NAME = "Metallic Roughness";
|
||||
const std::string MATERIAL_EMISSIVE_DEFAULT_NAME = "Emissive";
|
||||
|
||||
|
||||
class LLMaterialEditorCopiedCallback : public LLInventoryCallback
|
||||
{
|
||||
public:
|
||||
|
|
@ -164,6 +165,15 @@ void LLMaterialEditor::onClickCloseBtn(bool app_quitting)
|
|||
}
|
||||
}
|
||||
|
||||
void LLMaterialEditor::onClose(bool app_quitting)
|
||||
{
|
||||
// todo: will only revert whatever was recently selected,
|
||||
// Later should work based of tools floater
|
||||
LLSelectMgr::getInstance()->selectionRevertGLTFMaterials();
|
||||
|
||||
LLPreview::onClose(app_quitting);
|
||||
}
|
||||
|
||||
LLUUID LLMaterialEditor::getAlbedoId()
|
||||
{
|
||||
return mAlbedoTextureCtrl->getValue().asUUID();
|
||||
|
|
@ -1341,34 +1351,39 @@ void LLMaterialEditor::importMaterial()
|
|||
(new LLMaterialFilePicker(this))->getFile();
|
||||
}
|
||||
|
||||
class LLRemderMaterialFunctor : public LLSelectedTEFunctor
|
||||
{
|
||||
public:
|
||||
LLRemderMaterialFunctor(LLGLTFMaterial *mat, const LLUUID &id)
|
||||
: mMat(mat), mMatId(id)
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool apply(LLViewerObject* objectp, S32 te)
|
||||
{
|
||||
if (objectp && objectp->permModify() && objectp->getVolume())
|
||||
{
|
||||
LLVOVolume* vobjp = (LLVOVolume*)objectp;
|
||||
vobjp->setRenderMaterialID(te, mMatId);
|
||||
vobjp->getTE(te)->setGLTFMaterial(mMat);
|
||||
vobjp->updateTEMaterialTextures(te);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
private:
|
||||
LLPointer<LLGLTFMaterial> mMat;
|
||||
LLUUID mMatId;
|
||||
};
|
||||
|
||||
void LLMaterialEditor::applyToSelection()
|
||||
{
|
||||
// Todo: fix this, this is a hack, not a proper live preview
|
||||
LLViewerObject* objectp = LLSelectMgr::instance().getSelection()->getFirstObject();
|
||||
if (objectp && objectp->getVolume() && objectp->permModify())
|
||||
{
|
||||
LLGLTFMaterial* mat = new LLGLTFMaterial();
|
||||
getGLTFMaterial(mat);
|
||||
LLVOVolume* vobjp = (LLVOVolume*)objectp;
|
||||
for (int i = 0; i < vobjp->getNumTEs(); ++i)
|
||||
{
|
||||
// this is here just to prevent material from immediately resetting
|
||||
if (mAssetID.notNull())
|
||||
{
|
||||
vobjp->setRenderMaterialID(i, mAssetID);
|
||||
}
|
||||
else
|
||||
{
|
||||
const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98");
|
||||
vobjp->setRenderMaterialID(i, placeholder);
|
||||
}
|
||||
|
||||
vobjp->getTE(i)->setGLTFMaterial(mat);
|
||||
vobjp->updateTEMaterialTextures(i);
|
||||
}
|
||||
|
||||
vobjp->markForUpdate(TRUE);
|
||||
}
|
||||
LLPointer<LLGLTFMaterial> mat = new LLGLTFMaterial();
|
||||
getGLTFMaterial(mat);
|
||||
const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98");
|
||||
LLUUID asset_id = mAssetID.notNull() ? mAssetID : placeholder;
|
||||
LLRemderMaterialFunctor mat_func(mat, asset_id);
|
||||
LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
|
||||
selected_objects->applyToTEs(&mat_func);
|
||||
}
|
||||
|
||||
void LLMaterialEditor::getGLTFMaterial(LLGLTFMaterial* mat)
|
||||
|
|
|
|||
|
|
@ -103,6 +103,8 @@ public:
|
|||
BOOL postBuild() override;
|
||||
void onClickCloseBtn(bool app_quitting = false) override;
|
||||
|
||||
void onClose(bool app_quitting) override;
|
||||
|
||||
LLUUID getAlbedoId();
|
||||
void setAlbedoId(const LLUUID& id);
|
||||
void setAlbedoUploadId(const LLUUID& id);
|
||||
|
|
|
|||
|
|
@ -2022,6 +2022,32 @@ BOOL LLSelectMgr::selectionRevertTextures()
|
|||
return revert_successful;
|
||||
}
|
||||
|
||||
void LLSelectMgr::selectionRevertGLTFMaterials()
|
||||
{
|
||||
struct f : public LLSelectedTEFunctor
|
||||
{
|
||||
LLObjectSelectionHandle mSelectedObjects;
|
||||
f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {}
|
||||
bool apply(LLViewerObject* object, S32 te)
|
||||
{
|
||||
if (object->permModify())
|
||||
{
|
||||
LLSelectNode* nodep = mSelectedObjects->findNode(object);
|
||||
if (nodep && te < (S32)nodep->mSavedGLTFMaterials.size())
|
||||
{
|
||||
LLUUID id = nodep->mSavedGLTFMaterials[te];
|
||||
object->setRenderMaterialID(te, id);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} setfunc(mSelectedObjects);
|
||||
getSelection()->applyToTEs(&setfunc);
|
||||
|
||||
LLSelectMgrSendFunctor sendfunc;
|
||||
getSelection()->applyToObjects(&sendfunc);
|
||||
}
|
||||
|
||||
void LLSelectMgr::selectionSetBumpmap(U8 bumpmap, const LLUUID &image_id)
|
||||
{
|
||||
struct f : public LLSelectedTEFunctor
|
||||
|
|
@ -5720,6 +5746,17 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
|
|||
// this should be the only place that saved textures is called
|
||||
node->saveTextures(texture_ids);
|
||||
}
|
||||
|
||||
if (can_copy && can_transfer && node->getObject()->getVolume())
|
||||
{
|
||||
uuid_vec_t material_ids;
|
||||
LLVOVolume* vobjp = (LLVOVolume*)node->getObject();
|
||||
for (int i = 0; i < vobjp->getNumTEs(); ++i)
|
||||
{
|
||||
material_ids.push_back(vobjp->getRenderMaterialID(i));
|
||||
}
|
||||
node->savedGLTFMaterials(material_ids);
|
||||
}
|
||||
}
|
||||
|
||||
node->mValid = TRUE;
|
||||
|
|
@ -6483,6 +6520,7 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)
|
|||
}
|
||||
|
||||
saveTextures(nodep.mSavedTextures);
|
||||
savedGLTFMaterials(nodep.mSavedGLTFMaterials);
|
||||
}
|
||||
|
||||
LLSelectNode::~LLSelectNode()
|
||||
|
|
@ -6598,6 +6636,20 @@ void LLSelectNode::saveTextures(const uuid_vec_t& textures)
|
|||
}
|
||||
}
|
||||
|
||||
void LLSelectNode::savedGLTFMaterials(const uuid_vec_t& materials)
|
||||
{
|
||||
if (mObject.notNull())
|
||||
{
|
||||
mSavedGLTFMaterials.clear();
|
||||
|
||||
for (uuid_vec_t::const_iterator materials_it = materials.begin();
|
||||
materials_it != materials.end(); ++materials_it)
|
||||
{
|
||||
mSavedGLTFMaterials.push_back(*materials_it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
|
||||
{
|
||||
mTextureScaleRatios.clear();
|
||||
|
|
|
|||
|
|
@ -205,6 +205,7 @@ public:
|
|||
void saveColors();
|
||||
void saveShinyColors();
|
||||
void saveTextures(const uuid_vec_t& textures);
|
||||
void savedGLTFMaterials(const uuid_vec_t& materials);
|
||||
void saveTextureScaleRatios(LLRender::eTexIndex index_to_query);
|
||||
|
||||
BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const;
|
||||
|
|
@ -242,6 +243,7 @@ public:
|
|||
std::vector<LLColor4> mSavedColors;
|
||||
std::vector<LLColor4> mSavedShinyColors;
|
||||
uuid_vec_t mSavedTextures;
|
||||
uuid_vec_t mSavedGLTFMaterials;
|
||||
std::vector<LLVector3> mTextureScaleRatios;
|
||||
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
|
||||
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
|
||||
|
|
@ -682,6 +684,7 @@ public:
|
|||
void selectionRevertColors();
|
||||
void selectionRevertShinyColors();
|
||||
BOOL selectionRevertTextures();
|
||||
void selectionRevertGLTFMaterials();
|
||||
void selectionSetBumpmap( U8 bumpmap, const LLUUID &image_id );
|
||||
void selectionSetTexGen( U8 texgen );
|
||||
void selectionSetShiny( U8 shiny, const LLUUID &image_id );
|
||||
|
|
|
|||
|
|
@ -547,6 +547,21 @@ static bool handleRenderLocalLightsChanged(const LLSD& newvalue)
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool handleRenderPBRChanged(const LLSD& newvalue)
|
||||
{
|
||||
if (gPipeline.isInit())
|
||||
{
|
||||
LLPipeline::refreshCachedSettings();
|
||||
gPipeline.updateRenderDeferred();
|
||||
gPipeline.releaseGLBuffers();
|
||||
gPipeline.createGLBuffers();
|
||||
gPipeline.resetVertexBuffers();
|
||||
LLViewerShaderMgr::instance()->setShaders();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#if 0 // DEPRECATED
|
||||
// NOTE: may be triggered by RenderDeferred OR RenderPBR changing, don't trust "newvalue"
|
||||
static bool handleRenderDeferredChanged(const LLSD& newvalue)
|
||||
{
|
||||
|
|
@ -584,6 +599,7 @@ static bool handleRenderBumpChanged(const LLSD& newval)
|
|||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool handleRenderDebugPipelineChanged(const LLSD& newvalue)
|
||||
{
|
||||
|
|
@ -1166,7 +1182,7 @@ void settings_setup_listeners()
|
|||
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
|
||||
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
gSavedSettings.getControl("RenderGlowResolutionPow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
|
||||
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
// DEPRECATED -- gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
|
||||
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
|
||||
|
|
@ -1182,7 +1198,7 @@ void settings_setup_listeners()
|
|||
gSavedSettings.getControl("RenderDebugTextureBind")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
|
||||
gSavedSettings.getControl("RenderAutoMaskAlphaDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
|
||||
gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
|
||||
gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleRenderBumpChanged, _2));
|
||||
// DEPRECATED - gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleRenderBumpChanged, _2));
|
||||
gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
|
||||
gSavedSettings.getControl("RenderVSyncEnable")->getSignal()->connect(boost::bind(&handleVSyncChanged, _2));
|
||||
gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
|
||||
|
|
@ -1191,8 +1207,8 @@ void settings_setup_listeners()
|
|||
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
|
||||
gSavedSettings.getControl("RenderResolutionMultiplier")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
|
||||
// [/SL:KB]
|
||||
gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
|
||||
gSavedSettings.getControl("RenderPBR")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
|
||||
// DEPRECATED - gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
|
||||
gSavedSettings.getControl("RenderPBR")->getSignal()->connect(boost::bind(&handleRenderPBRChanged, _2));
|
||||
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
|
||||
|
|
|
|||
|
|
@ -2659,21 +2659,6 @@ class LLAdvancedEnableRenderDeferred: public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////
|
||||
// Enable Advanced Lighting Model sub-options
|
||||
/////////////////////////////////////
|
||||
class LLAdvancedEnableRenderDeferredOptions: public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
bool new_value = gGLManager.mHasFramebufferObject && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1 &&
|
||||
LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0 && gSavedSettings.getBOOL("RenderDeferred");
|
||||
return new_value;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
//////////////////
|
||||
// ADMIN STATUS //
|
||||
//////////////////
|
||||
|
|
@ -12080,9 +12065,7 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLAdvancedCheckWireframe(), "Advanced.CheckWireframe");
|
||||
// Develop > Render
|
||||
view_listener_t::addMenu(new LLAdvancedEnableObjectObjectOcclusion(), "Advanced.EnableObjectObjectOcclusion");
|
||||
view_listener_t::addMenu(new LLAdvancedEnableRenderFBO(), "Advanced.EnableRenderFBO");
|
||||
view_listener_t::addMenu(new LLAdvancedEnableRenderDeferred(), "Advanced.EnableRenderDeferred");
|
||||
view_listener_t::addMenu(new LLAdvancedEnableRenderDeferredOptions(), "Advanced.EnableRenderDeferredOptions");
|
||||
|
||||
view_listener_t::addMenu(new LLAdvancedToggleRandomizeFramerate(), "Advanced.ToggleRandomizeFramerate");
|
||||
view_listener_t::addMenu(new LLAdvancedCheckRandomizeFramerate(), "Advanced.CheckRandomizeFramerate");
|
||||
view_listener_t::addMenu(new LLAdvancedTogglePeriodicSlowFrame(), "Advanced.TogglePeriodicSlowFrame");
|
||||
|
|
|
|||
|
|
@ -5076,7 +5076,14 @@ void LLViewerObject::updateTEMaterialTextures(U8 te)
|
|||
|
||||
auto fetch_texture = [](const LLUUID& id)
|
||||
{
|
||||
return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_ALM, LLViewerTexture::LOD_TEXTURE);
|
||||
LLViewerFetchedTexture* img = nullptr;
|
||||
if (id.notNull())
|
||||
{
|
||||
img = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_ALM, LLViewerTexture::LOD_TEXTURE);
|
||||
img->addTextureStats(64.f * 64.f, TRUE);
|
||||
}
|
||||
|
||||
return img;
|
||||
};
|
||||
|
||||
LLGLTFMaterial* mat = getTE(te)->getGLTFMaterial();
|
||||
|
|
|
|||
|
|
@ -500,12 +500,12 @@ void LLViewerShaderMgr::setShaders()
|
|||
|
||||
llassert((gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 10));
|
||||
|
||||
bool canRenderDeferred = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
|
||||
bool hasWindLightShaders = LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders");
|
||||
//bool canRenderDeferred = true; // DEPRECATED -- LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
|
||||
//bool hasWindLightShaders = true; // DEPRECATED -- LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders");
|
||||
S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
|
||||
bool pbr = gSavedSettings.getBOOL("RenderPBR");
|
||||
bool doingWindLight = hasWindLightShaders && gSavedSettings.getBOOL("WindLightUseAtmosShaders");
|
||||
bool useRenderDeferred = doingWindLight && canRenderDeferred && gSavedSettings.getBOOL("RenderDeferred");
|
||||
bool doingWindLight = true; //DEPRECATED -- hasWindLightShaders&& gSavedSettings.getBOOL("WindLightUseAtmosShaders");
|
||||
bool useRenderDeferred = true; //DEPRECATED -- doingWindLight&& canRenderDeferred&& gSavedSettings.getBOOL("RenderDeferred");
|
||||
|
||||
S32 light_class = 3;
|
||||
S32 interface_class = 2;
|
||||
|
|
@ -682,67 +682,24 @@ void LLViewerShaderMgr::setShaders()
|
|||
|
||||
if (loadShadersObject())
|
||||
{ //hardware skinning is enabled and rigged attachment shaders loaded correctly
|
||||
BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth");
|
||||
|
||||
// cloth is a class3 shader
|
||||
S32 avatar_class = avatar_cloth ? 3 : 1;
|
||||
S32 avatar_class = 1;
|
||||
|
||||
// Set the actual level
|
||||
mShaderLevel[SHADER_AVATAR] = avatar_class;
|
||||
|
||||
loaded = loadShadersAvatar();
|
||||
llassert(loaded);
|
||||
|
||||
if (mShaderLevel[SHADER_AVATAR] != avatar_class)
|
||||
{
|
||||
if(llmax(mShaderLevel[SHADER_AVATAR]-1,0) >= 3)
|
||||
{
|
||||
avatar_cloth = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
avatar_cloth = false;
|
||||
}
|
||||
gSavedSettings.setBOOL("RenderAvatarCloth", avatar_cloth);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ //hardware skinning not possible, neither is deferred rendering
|
||||
mShaderLevel[SHADER_AVATAR] = 0;
|
||||
mShaderLevel[SHADER_DEFERRED] = 0;
|
||||
|
||||
gSavedSettings.setBOOL("RenderDeferred", FALSE);
|
||||
gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
|
||||
|
||||
loadShadersAvatar(); // unloads
|
||||
|
||||
loaded = loadShadersObject();
|
||||
llassert(loaded);
|
||||
llassert(false); // SHOULD NOT BE POSSIBLE
|
||||
}
|
||||
}
|
||||
|
||||
if (!loaded)
|
||||
{ //some shader absolutely could not load, try to fall back to a simpler setting
|
||||
if (gSavedSettings.getBOOL("WindLightUseAtmosShaders"))
|
||||
{ //disable windlight and try again
|
||||
gSavedSettings.setBOOL("WindLightUseAtmosShaders", FALSE);
|
||||
LL_WARNS() << "Falling back to no windlight shaders." << LL_ENDL;
|
||||
reentrance = false;
|
||||
setShaders();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
llassert(loaded);
|
||||
|
||||
if (loaded && !loadShadersDeferred())
|
||||
{ //everything else succeeded but deferred failed, disable deferred and try again
|
||||
gSavedSettings.setBOOL("RenderDeferred", FALSE);
|
||||
LL_WARNS() << "Falling back to no deferred shaders." << LL_ENDL;
|
||||
reentrance = false;
|
||||
setShaders();
|
||||
return;
|
||||
}
|
||||
loaded = loaded && loadShadersDeferred();
|
||||
llassert(loaded);
|
||||
|
||||
if (gViewerWindow)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2015,8 +2015,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)
|
|||
gSavedSettings.getBOOL("RenderVSyncEnable"),
|
||||
!gHeadlessClient,
|
||||
p.ignore_pixel_depth,
|
||||
//gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
|
||||
gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples"), //don't use window level anti-aliasing if FBOs are enabled
|
||||
//0); //don't use window level anti-aliasing
|
||||
0, //don't use window level anti-aliasing
|
||||
useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
|
||||
if (NULL == mWindow)
|
||||
|
|
|
|||
|
|
@ -477,7 +477,7 @@ void LLPipeline::init()
|
|||
gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
|
||||
gOctreeMinSize = gSavedSettings.getF32("OctreeMinimumNodeSize");
|
||||
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
|
||||
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
|
||||
sRenderBump = TRUE; // DEPRECATED -- gSavedSettings.getBOOL("RenderObjectBump");
|
||||
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
|
||||
LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
|
||||
// <FS:Ansariel> Vertex Array Objects are required in OpenGL core profile
|
||||
|
|
@ -597,8 +597,8 @@ void LLPipeline::init()
|
|||
connectRefreshCachedSettingsSafe("RenderAvatarMaxNonImpostors");
|
||||
connectRefreshCachedSettingsSafe("RenderDelayVBUpdate");
|
||||
connectRefreshCachedSettingsSafe("UseOcclusion");
|
||||
connectRefreshCachedSettingsSafe("WindLightUseAtmosShaders");
|
||||
connectRefreshCachedSettingsSafe("RenderDeferred");
|
||||
// DEPRECATED -- connectRefreshCachedSettingsSafe("WindLightUseAtmosShaders");
|
||||
// DEPRECATED -- connectRefreshCachedSettingsSafe("RenderDeferred");
|
||||
connectRefreshCachedSettingsSafe("RenderPBR");
|
||||
connectRefreshCachedSettingsSafe("RenderDeferredSunWash");
|
||||
connectRefreshCachedSettingsSafe("RenderFSAASamples");
|
||||
|
|
@ -1156,7 +1156,7 @@ void LLPipeline::updateRenderTransparentWater()
|
|||
//static
|
||||
void LLPipeline::updateRenderBump()
|
||||
{
|
||||
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
|
||||
sRenderBump = TRUE; // DEPRECATED -- gSavedSettings.getBOOL("RenderObjectBump");
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
@ -1166,8 +1166,7 @@ void LLPipeline::updateRenderDeferred()
|
|||
RenderDeferred &&
|
||||
LLRenderTarget::sUseFBO &&
|
||||
LLPipeline::sRenderBump &&
|
||||
WindLightUseAtmosShaders &&
|
||||
(bool) LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
|
||||
WindLightUseAtmosShaders;
|
||||
sRenderPBR = sRenderDeferred && gSavedSettings.getBOOL("RenderPBR");
|
||||
|
||||
exoPostProcess::instance().ExodusRenderPostUpdate(); // <FS:CR> Import Vignette from Exodus
|
||||
|
|
@ -1203,8 +1202,8 @@ void LLPipeline::refreshCachedSettings()
|
|||
&& gSavedSettings.getBOOL("UseOcclusion")
|
||||
&& gGLManager.mHasOcclusionQuery) ? 2 : 0;
|
||||
|
||||
WindLightUseAtmosShaders = gSavedSettings.getBOOL("WindLightUseAtmosShaders");
|
||||
RenderDeferred = gSavedSettings.getBOOL("RenderDeferred");
|
||||
WindLightUseAtmosShaders = TRUE; // DEPRECATED -- gSavedSettings.getBOOL("WindLightUseAtmosShaders");
|
||||
RenderDeferred = TRUE; // DEPRECATED -- gSavedSettings.getBOOL("RenderDeferred");
|
||||
RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
|
||||
RenderFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
|
||||
RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");
|
||||
|
|
@ -3963,6 +3962,7 @@ void LLPipeline::touchTextures(LLDrawInfo* info)
|
|||
touchTexture(info->mTexture, info->mVSize);
|
||||
touchTexture(info->mSpecularMap, info->mVSize);
|
||||
touchTexture(info->mNormalMap, info->mVSize);
|
||||
touchTexture(info->mEmissiveMap, info->mVSize);
|
||||
}
|
||||
|
||||
void LLPipeline::postSort(LLCamera& camera)
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@
|
|||
layout="topleft"
|
||||
left_delta="0"
|
||||
top_pad="5"
|
||||
min_val="0"
|
||||
max_val="1"
|
||||
name="transparency"
|
||||
width="64"
|
||||
|
|
@ -169,6 +170,7 @@
|
|||
layout="topleft"
|
||||
left_delta="0"
|
||||
top_pad="5"
|
||||
min_val="0"
|
||||
max_val="1"
|
||||
name="alpha cutoff"
|
||||
width="64"
|
||||
|
|
@ -245,6 +247,7 @@
|
|||
layout="topleft"
|
||||
left_delta="0"
|
||||
top_pad="5"
|
||||
min_val="0"
|
||||
max_val="1"
|
||||
name="metalness factor"
|
||||
width="64"
|
||||
|
|
@ -270,7 +273,7 @@
|
|||
layout="topleft"
|
||||
left_delta="0"
|
||||
top_pad="5"
|
||||
|
||||
min_val="0"
|
||||
max_val="1"
|
||||
name="roughness factor"
|
||||
width="64"
|
||||
|
|
|
|||
|
|
@ -4399,18 +4399,6 @@
|
|||
</menu_item_check>
|
||||
<menu_item_separator />
|
||||
|
||||
<menu_item_check
|
||||
label="Advanced Lighting Model"
|
||||
name="Advanced Lighting Model">
|
||||
<menu_item_check.on_check
|
||||
function="CheckControl"
|
||||
parameter="RenderDeferred" />
|
||||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="RenderDeferred" />
|
||||
<menu_item_check.on_enable
|
||||
function="Advanced.EnableRenderDeferred" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label=" Shadows from Sun/Moon/Projectors"
|
||||
name="Shadows from Sun/Moon/Projectors">
|
||||
|
|
|
|||
Loading…
Reference in New Issue