Implemented PBR repeats per meter
parent
3e5f4fd0c4
commit
3dc6c22401
|
|
@ -162,6 +162,36 @@ void LLPanelFace::updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*
|
|||
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&select_func);
|
||||
}
|
||||
|
||||
void LLPanelFace::updateSelectedGLTFMaterialsWithScale(std::function<void(LLGLTFMaterial*, const F32, const F32)> func)
|
||||
{
|
||||
struct LLSelectedTEGLTFMaterialFunctor : public LLSelectedTEFunctor
|
||||
{
|
||||
LLSelectedTEGLTFMaterialFunctor(std::function<void(LLGLTFMaterial*, const F32, const F32)> func) : mFunc(func) {}
|
||||
virtual ~LLSelectedTEGLTFMaterialFunctor() {};
|
||||
bool apply(LLViewerObject* object, S32 face) override
|
||||
{
|
||||
LLGLTFMaterial new_override;
|
||||
const LLTextureEntry* tep = object->getTE(face);
|
||||
if (tep->getGLTFMaterialOverride())
|
||||
{
|
||||
new_override = *tep->getGLTFMaterialOverride();
|
||||
}
|
||||
|
||||
U32 s_axis = VX;
|
||||
U32 t_axis = VY;
|
||||
LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);
|
||||
mFunc(&new_override, object->getScale().mV[s_axis], object->getScale().mV[t_axis]);
|
||||
LLGLTFMaterialList::queueModify(object, face, &new_override);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::function<void(LLGLTFMaterial*, const F32, const F32)> mFunc;
|
||||
} select_func(func);
|
||||
|
||||
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&select_func);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void readSelectedGLTFMaterial(std::function<T(const LLGLTFMaterial*)> func, T& value, bool& identical, bool has_tolerance, T tolerance)
|
||||
{
|
||||
|
|
@ -182,6 +212,36 @@ void readSelectedGLTFMaterial(std::function<T(const LLGLTFMaterial*)> func, T& v
|
|||
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&select_func, value, has_tolerance, tolerance);
|
||||
}
|
||||
|
||||
void getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo channel, F32& repeats, bool& identical)
|
||||
{
|
||||
// The All channel should read base color values
|
||||
if (channel == LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_COUNT)
|
||||
channel = LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR;
|
||||
|
||||
struct LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor : public LLSelectedTEGetFunctor<F32>
|
||||
{
|
||||
LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor(LLGLTFMaterial::TextureInfo channel) : mChannel(channel) {}
|
||||
virtual ~LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor() {};
|
||||
F32 get(LLViewerObject* object, S32 face) override
|
||||
{
|
||||
const LLTextureEntry* tep = object->getTE(face);
|
||||
const LLGLTFMaterial* render_material = tep->getGLTFRenderMaterial();
|
||||
if (!render_material)
|
||||
return 0.f;
|
||||
|
||||
U32 s_axis = VX;
|
||||
U32 t_axis = VY;
|
||||
LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);
|
||||
F32 repeats_u = render_material->mTextureTransform[mChannel].mScale[VX] / object->getScale().mV[s_axis];
|
||||
F32 repeats_v = render_material->mTextureTransform[mChannel].mScale[VY] / object->getScale().mV[t_axis];
|
||||
return llmax(repeats_u, repeats_v);
|
||||
}
|
||||
|
||||
LLGLTFMaterial::TextureInfo mChannel;
|
||||
} max_repeats_func(channel);
|
||||
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&max_repeats_func, repeats);
|
||||
}
|
||||
|
||||
BOOST_STATIC_ASSERT(MATTYPE_DIFFUSE == LLRender::DIFFUSE_MAP && MATTYPE_NORMAL == LLRender::NORMAL_MAP && MATTYPE_SPECULAR == LLRender::SPECULAR_MAP);
|
||||
|
||||
//
|
||||
|
|
@ -322,6 +382,7 @@ bool LLPanelFace::postBuild()
|
|||
|
||||
getChildSetCommitCallback(mPBRScaleU, "gltfTextureScaleU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleU(); });
|
||||
getChildSetCommitCallback(mPBRScaleV, "gltfTextureScaleV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleV(); });
|
||||
getChildSetCommitCallback(mPBRRepeat, "gltfRptctrl", [&](LLUICtrl*, const LLSD&) { onCommitGLTFRepeatsPerMeter(); });
|
||||
getChildSetCommitCallback(mPBRRotate, "gltfTextureRotation", [&](LLUICtrl*, const LLSD&) { onCommitGLTFRotation(); });
|
||||
getChildSetCommitCallback(mPBROffsetU, "gltfTextureOffsetU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetU(); });
|
||||
getChildSetCommitCallback(mPBROffsetV, "gltfTextureOffsetV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetV(); });
|
||||
|
|
@ -1591,36 +1652,57 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
F32 repeats_norm = 1.f;
|
||||
F32 repeats_spec = 1.f;
|
||||
|
||||
F32 repeats_pbr_basecolor = 1.f;
|
||||
F32 repeats_pbr_metallic_roughness = 1.f;
|
||||
F32 repeats_pbr_normal = 1.f;
|
||||
F32 repeats_pbr_emissive = 1.f;
|
||||
|
||||
bool identical_diff_repeats = false;
|
||||
bool identical_norm_repeats = false;
|
||||
bool identical_spec_repeats = false;
|
||||
|
||||
LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats);
|
||||
LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats);
|
||||
LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats);
|
||||
bool identical_pbr_basecolor_repeats = false;
|
||||
bool identical_pbr_metallic_roughness_repeats = false;
|
||||
bool identical_pbr_normal_repeats = false;
|
||||
bool identical_pbr_emissive_repeats = false;
|
||||
|
||||
{
|
||||
LLSpinCtrl* repeats_spin_ctrl = nullptr;
|
||||
S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0;
|
||||
bool enabled = editable && (index != 1);
|
||||
bool identical_repeats = true;
|
||||
S32 material_selection = mComboMatMedia->getCurrentIndex();
|
||||
F32 repeats = 1.0f;
|
||||
|
||||
U32 material_type = MATTYPE_DIFFUSE;
|
||||
if (material_selection == MATMEDIA_MATERIAL)
|
||||
LLRender::eTexIndex material_channel = LLRender::DIFFUSE_MAP;
|
||||
if (material_selection != MATMEDIA_PBR)
|
||||
{
|
||||
material_type = mRadioMaterialType->getSelectedIndex();
|
||||
repeats_spin_ctrl = mTexRepeat;
|
||||
material_channel = getMatTextureChannel();
|
||||
LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats);
|
||||
LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats);
|
||||
LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats);
|
||||
}
|
||||
else if (material_selection == MATMEDIA_PBR)
|
||||
{
|
||||
repeats_spin_ctrl = mPBRRepeat;
|
||||
enabled = editable && has_pbr_material;
|
||||
material_type = mRadioPbrType->getSelectedIndex();
|
||||
material_channel = getPBRTextureChannel();
|
||||
|
||||
getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR,
|
||||
repeats_pbr_basecolor, identical_pbr_basecolor_repeats);
|
||||
getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS,
|
||||
repeats_pbr_metallic_roughness, identical_pbr_metallic_roughness_repeats);
|
||||
getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_NORMAL,
|
||||
repeats_pbr_normal, identical_pbr_normal_repeats);
|
||||
getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_EMISSIVE,
|
||||
repeats_pbr_emissive, identical_pbr_emissive_repeats);
|
||||
}
|
||||
|
||||
switch (material_type)
|
||||
switch (material_channel)
|
||||
{
|
||||
default:
|
||||
case MATTYPE_DIFFUSE:
|
||||
case LLRender::DIFFUSE_MAP:
|
||||
if (material_selection != MATMEDIA_PBR)
|
||||
{
|
||||
enabled = editable && !id.isNull();
|
||||
|
|
@ -1628,7 +1710,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
identical_repeats = identical_diff_repeats;
|
||||
repeats = repeats_diff;
|
||||
break;
|
||||
case MATTYPE_SPECULAR:
|
||||
case LLRender::SPECULAR_MAP:
|
||||
if (material_selection != MATMEDIA_PBR)
|
||||
{
|
||||
enabled = (editable && ((shiny == SHINY_TEXTURE) && !specmap_id.isNull()));
|
||||
|
|
@ -1636,7 +1718,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
identical_repeats = identical_spec_repeats;
|
||||
repeats = repeats_spec;
|
||||
break;
|
||||
case MATTYPE_NORMAL:
|
||||
case LLRender::NORMAL_MAP:
|
||||
if (material_selection != MATMEDIA_PBR)
|
||||
{
|
||||
enabled = (editable && ((bumpy == BUMPY_TEXTURE) && !normmap_id.isNull()));
|
||||
|
|
@ -1644,6 +1726,23 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
identical_repeats = identical_norm_repeats;
|
||||
repeats = repeats_norm;
|
||||
break;
|
||||
case LLRender::NUM_TEXTURE_CHANNELS:
|
||||
case LLRender::BASECOLOR_MAP:
|
||||
identical_repeats = identical_pbr_basecolor_repeats;
|
||||
repeats = repeats_pbr_basecolor;
|
||||
break;
|
||||
case LLRender::METALLIC_ROUGHNESS_MAP:
|
||||
identical_repeats = identical_pbr_metallic_roughness_repeats;
|
||||
repeats = repeats_pbr_metallic_roughness;
|
||||
break;
|
||||
case LLRender::GLTF_NORMAL_MAP:
|
||||
identical_repeats = identical_pbr_normal_repeats;
|
||||
repeats = repeats_pbr_normal;
|
||||
break;
|
||||
case LLRender::EMISSIVE_MAP:
|
||||
identical_repeats = identical_pbr_emissive_repeats;
|
||||
repeats = repeats_pbr_emissive;
|
||||
break;
|
||||
}
|
||||
|
||||
bool repeats_tentative = !identical_repeats;
|
||||
|
|
@ -1651,14 +1750,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
if (force_set_values)
|
||||
{
|
||||
// onCommit, previosly edited element updates related ones
|
||||
mTexRepeat->forceSetValue(editable ? repeats : 1.0f);
|
||||
repeats_spin_ctrl->forceSetValue(editable ? repeats : 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
mTexRepeat->setValue(editable ? repeats : 1.0f);
|
||||
repeats_spin_ctrl->setValue(editable ? repeats : 1.0f);
|
||||
}
|
||||
mTexRepeat->setTentative(LLSD(repeats_tentative));
|
||||
mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled);
|
||||
repeats_spin_ctrl->setTentative(LLSD(repeats_tentative));
|
||||
repeats_spin_ctrl->setEnabled(!identical_planar_texgen && enabled);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1804,6 +1903,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
}
|
||||
mLabelColorTransp->setEnabled(false);
|
||||
mTexRepeat->setEnabled(false);
|
||||
mPBRRepeat->setEnabled(false);
|
||||
mLabelTexGen->setEnabled(false);
|
||||
mLabelShininess->setEnabled(false);
|
||||
mLabelBumpiness->setEnabled(false);
|
||||
|
|
@ -1999,6 +2099,7 @@ void LLPanelFace::updateVisibilityGLTF(LLViewerObject* objectp /*= nullptr */)
|
|||
mPBRRotate->setVisible(show_pbr);
|
||||
mPBROffsetU->setVisible(show_pbr);
|
||||
mPBROffsetV->setVisible(show_pbr);
|
||||
mPBRRepeat->setVisible(show_pbr);
|
||||
}
|
||||
|
||||
void LLPanelFace::updateCopyTexButton()
|
||||
|
|
@ -3693,6 +3794,21 @@ void LLPanelFace::onCommitRepeatsPerMeter()
|
|||
updateUI(true);
|
||||
}
|
||||
|
||||
// Commit the number of GLTF repeats per meter
|
||||
void LLPanelFace::onCommitGLTFRepeatsPerMeter()
|
||||
{
|
||||
F32 repeats_per_meter = (F32)mPBRRepeat->getValue().asReal();
|
||||
|
||||
LLGLTFMaterial::TextureInfo material_type = getPBRTextureInfo();
|
||||
updateGLTFTextureTransformWithScale(material_type, [&](LLGLTFMaterial::TextureTransform* new_transform, F32 scale_s, F32 scale_t)
|
||||
{
|
||||
new_transform->mScale.mV[VX] = scale_s * repeats_per_meter;
|
||||
new_transform->mScale.mV[VY] = scale_t * repeats_per_meter;
|
||||
});
|
||||
|
||||
updateUI(true);
|
||||
}
|
||||
|
||||
struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
|
||||
{
|
||||
virtual bool apply(LLViewerObject* object, S32 te)
|
||||
|
|
@ -4642,6 +4758,29 @@ void LLPanelFace::updateGLTFTextureTransform(std::function<void(LLGLTFMaterial::
|
|||
}
|
||||
}
|
||||
|
||||
void LLPanelFace::updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function<void(LLGLTFMaterial::TextureTransform*, const F32, const F32)> edit)
|
||||
{
|
||||
if (texture_info == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT)
|
||||
{
|
||||
updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t)
|
||||
{
|
||||
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
|
||||
{
|
||||
LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[(LLGLTFMaterial::TextureInfo)i];
|
||||
edit(&new_transform, scale_s, scale_t);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t)
|
||||
{
|
||||
LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[texture_info];
|
||||
edit(&new_transform, scale_s, scale_t);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelFace::setMaterialOverridesFromSelection()
|
||||
{
|
||||
const LLGLTFMaterial::TextureInfo texture_info = getPBRTextureInfo();
|
||||
|
|
@ -4728,6 +4867,12 @@ void LLPanelFace::setMaterialOverridesFromSelection()
|
|||
mPBRRotate->setTentative(!rotation_same);
|
||||
mPBROffsetU->setTentative(!offset_u_same);
|
||||
mPBROffsetV->setTentative(!offset_v_same);
|
||||
|
||||
F32 repeats = 1.f;
|
||||
bool identical = false;
|
||||
getSelectedGLTFMaterialMaxRepeats(getPBRDropChannel(), repeats, identical);
|
||||
mPBRRepeat->forceSetValue(repeats);
|
||||
mPBRRepeat->setTentative(!identical || !scale_u_same || !scale_v_same);
|
||||
}
|
||||
|
||||
void LLPanelFace::Selection::connect()
|
||||
|
|
|
|||
|
|
@ -250,6 +250,7 @@ protected:
|
|||
void onCommitGLTFRotation();
|
||||
void onCommitGLTFTextureOffsetU();
|
||||
void onCommitGLTFTextureOffsetV();
|
||||
void onCommitGLTFRepeatsPerMeter();
|
||||
|
||||
void onClickAutoFix();
|
||||
void onAlignTexture();
|
||||
|
|
@ -358,6 +359,7 @@ private:
|
|||
LLButton* mDelMedia { nullptr };
|
||||
LLSpinCtrl* mPBRScaleU { nullptr };
|
||||
LLSpinCtrl* mPBRScaleV { nullptr };
|
||||
LLSpinCtrl* mPBRRepeat { nullptr };
|
||||
LLSpinCtrl* mPBRRotate { nullptr };
|
||||
LLSpinCtrl* mPBROffsetU { nullptr };
|
||||
LLSpinCtrl* mPBROffsetV { nullptr };
|
||||
|
|
@ -551,7 +553,9 @@ private:
|
|||
void updateVisibilityGLTF(LLViewerObject* objectp = nullptr);
|
||||
|
||||
void updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*)> func);
|
||||
void updateSelectedGLTFMaterialsWithScale(std::function<void(LLGLTFMaterial*, const F32, const F32)> func);
|
||||
void updateGLTFTextureTransform(std::function<void(LLGLTFMaterial::TextureTransform*)> edit);
|
||||
void updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function<void(LLGLTFMaterial::TextureTransform*, const F32, const F32)> edit);
|
||||
|
||||
void setMaterialOverridesFromSelection();
|
||||
|
||||
|
|
|
|||
|
|
@ -985,6 +985,19 @@
|
|||
max_val="100"
|
||||
name="gltfTextureScaleV"
|
||||
width="265" />
|
||||
<spinner
|
||||
decimal_digits="1"
|
||||
follows="left|top"
|
||||
height="19"
|
||||
initial_value=""
|
||||
label="Repeats per meter"
|
||||
layout="topleft"
|
||||
label_width="205"
|
||||
left="10"
|
||||
max_val="100"
|
||||
min_val="-100"
|
||||
name="gltfRptctrl"
|
||||
width="265" />
|
||||
<spinner
|
||||
follows="left|top"
|
||||
height="19"
|
||||
|
|
|
|||
Loading…
Reference in New Issue