#contents ---- * 参考 [#p9921999] * Translucency Lighting Modeを追加してみた [#a6152198] + COLOR(#3030c0){Editor\MaterialEditor\Private\MaterialEditorInstanceDetailCustomization.cpp} -- FMaterialInstanceParameterDetails::CreateBasePropertyOverrideWidgets #code(c,nomenu){{ TAttribute<bool> IsOverrideOpacityClipMaskValueEnabled = TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateSP(this, &FMaterialInstanceParameterDetails::OverrideOpacityClipMaskValueEnabled)); TAttribute<bool> IsOverrideBlendModeEnabled = TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateSP(this, &FMaterialInstanceParameterDetails::OverrideBlendModeEnabled)); TAttribute<bool> IsOverrideShadingModelEnabled = TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateSP(this, &FMaterialInstanceParameterDetails::OverrideShadingModelEnabled)); // start ------- TAttribute<bool> IsOverrideTranslucencyLightingModeEnabled = TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateSP(this, &FMaterialInstanceParameterDetails::OverrideTranslucencyLightingModeEnabled)); // end --------- TAttribute<bool> IsOverrideTwoSidedEnabled = TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateSP(this, &FMaterialInstanceParameterDetails::OverrideTwoSidedEnabled)); TAttribute<bool> IsOverrideDitheredLODTransitionEnabled = TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateSP(this, &FMaterialInstanceParameterDetails::OverrideDitheredLODTransitionEnabled)); }} #code(c,nomenu){{ TSharedRef<IPropertyHandle> BasePropertyOverridePropery = DetailLayout.GetProperty("BasePropertyOverrides"); TSharedPtr<IPropertyHandle> OpacityClipMaskValueProperty = BasePropertyOverridePropery->GetChildHandle("OpacityMaskClipValue"); TSharedPtr<IPropertyHandle> BlendModeProperty = BasePropertyOverridePropery->GetChildHandle("BlendMode"); TSharedPtr<IPropertyHandle> ShadingModelProperty = BasePropertyOverridePropery->GetChildHandle("ShadingModel"); // start ------- TSharedPtr<IPropertyHandle> TranslucencyLightingModeProperty = BasePropertyOverridePropery->GetChildHandle("TranslucencyLightingMode"); // end --------- TSharedPtr<IPropertyHandle> TwoSidedProperty = BasePropertyOverridePropery->GetChildHandle("TwoSided"); TSharedPtr<IPropertyHandle> DitheredLODTransitionProperty = BasePropertyOverridePropery->GetChildHandle("DitheredLODTransition"); }} #code(c,nomenu){{ IDetailPropertyRow& ShadingModelPropertyRow = BasePropertyOverrideGroup.AddPropertyRow(ShadingModelProperty.ToSharedRef()); ShadingModelPropertyRow .DisplayName(ShadingModelProperty->GetPropertyDisplayName()) .ToolTip(ShadingModelProperty->GetToolTipText()) .EditCondition(IsOverrideShadingModelEnabled, FOnBooleanValueChanged::CreateSP(this, &FMaterialInstanceParameterDetails::OnOverrideShadingModelChanged)); // start ------- IDetailPropertyRow& TranslucencyLightingModePropertyRow = BasePropertyOverrideGroup.AddPropertyRow(TranslucencyLightingModeProperty.ToSharedRef()); TranslucencyLightingModePropertyRow .DisplayName(TranslucencyLightingModeProperty->GetPropertyDisplayName()) .ToolTip(TranslucencyLightingModeProperty->GetToolTipText()) .EditCondition(IsOverrideTranslucencyLightingModeEnabled, FOnBooleanValueChanged::CreateSP(this, &FMaterialInstanceParameterDetails::OnOverrideTranslucencyLightingModeChanged)); // end --------- }} -- メソッド追加 #code(c,nomenu){{ // start ------- bool FMaterialInstanceParameterDetails::OverrideTranslucencyLightingModeEnabled() const { return MaterialEditorInstance->BasePropertyOverrides.bOverride_TranslucencyLightingMode; } // end --------- }} #code(c,nomenu){{ // start ------- void FMaterialInstanceParameterDetails::OnOverrideTranslucencyLightingModeChanged(bool NewValue) { MaterialEditorInstance->BasePropertyOverrides.bOverride_TranslucencyLightingMode = NewValue; MaterialEditorInstance->PostEditChange(); FEditorSupportDelegates::RedrawAllViewports.Broadcast(); } // end --------- }} + COLOR(#3030c0){Editor\MaterialEditor\Private\MaterialEditorInstanceDetailCustomization.h} -- FMaterialInstanceParameterDetails #code(c,nomenu){{ bool OverrideOpacityClipMaskValueEnabled() const; bool OverrideBlendModeEnabled() const; bool OverrideShadingModelEnabled() const; // start ------- bool OverrideTranslucencyLightingModeEnabled() const; // end --------- bool OverrideTwoSidedEnabled() const; bool OverrideDitheredLODTransitionEnabled() const; }} #code(c,nomenu){{ void OnOverrideOpacityClipMaskValueChanged(bool NewValue); void OnOverrideBlendModeChanged(bool NewValue); void OnOverrideShadingModelChanged(bool NewValue); // start ------- void OnOverrideTranslucencyLightingModeChanged(bool NewValue); // end --------- void OnOverrideTwoSidedChanged(bool NewValue); void OnOverrideDitheredLODTransitionChanged(bool NewValue); }} + COLOR(#3030c0){Runtime\Engine\Classes\Materials\Material.h} -- UMaterial #code(c,nomenu){{ ENGINE_API virtual float GetOpacityMaskClipValue() const override; ENGINE_API virtual EBlendMode GetBlendMode() const override; ENGINE_API virtual EMaterialShadingModel GetShadingModel() const override; // start ------- ENGINE_API virtual enum ETranslucencyLightingMode GetTranslucencyLightingMode() const override; // end --------- ENGINE_API virtual bool IsTwoSided() const override; ENGINE_API virtual bool IsDitheredLODTransition() const override; }} + COLOR(#3030c0){Runtime\Engine\Classes\Materials\MaterialInstance.h} -- UMaterialInstance #code(c,nomenu){{ float OpacityMaskClipValue; TEnumAsByte<EBlendMode> BlendMode; TEnumAsByte<EMaterialShadingModel> ShadingModel; // start ------- TEnumAsByte<enum ETranslucencyLightingMode> TranslucencyLightingMode; // end --------- uint32 TwoSided : 1; uint32 DitheredLODTransition : 1; }} #code(c,nomenu){{ ENGINE_API virtual float GetOpacityMaskClipValue() const override; ENGINE_API virtual EBlendMode GetBlendMode() const override; ENGINE_API virtual EMaterialShadingModel GetShadingModel() const override; // start ------- ENGINE_API virtual enum ETranslucencyLightingMode GetTranslucencyLightingMode() const override; // end --------- ENGINE_API virtual bool IsTwoSided() const override; ENGINE_API virtual bool IsDitheredLODTransition() const override; ENGINE_API virtual bool IsMasked() const override;; }} + COLOR(#3030c0){Runtime\Engine\Classes\Materials\MaterialInstanceBasePropertyOverrides.h} -- FMaterialInstanceBasePropertyOverrides #code(c,nomenu){{ /** Enables override of the two sided property. */ UPROPERTY(EditAnywhere, Category = Material) bool bOverride_TwoSided; // start ------- /** Enables override of the two sided property. */ UPROPERTY(EditAnywhere, Category = Material) bool bOverride_TranslucencyLightingMode; // end --------- }} #code(c,nomenu){{ /** The shading model */ UPROPERTY(EditAnywhere, Category = Material, meta = (editcondition = "bOverride_ShadingModel")) TEnumAsByte<EMaterialShadingModel> ShadingModel; // start ------- /** The shading model */ UPROPERTY(EditAnywhere, Category = Material, meta = (editcondition = "bOverride_TranslucencyLightingMode")) TEnumAsByte<enum ETranslucencyLightingMode> TranslucencyLightingMode; // end --------- }} + COLOR(#3030c0){Runtime\Engine\Classes\Materials\MaterialInstanceDynamic.h} -- UMaterialInstanceDynamic #code(c,nomenu){{ //Material base property overrides. MIDs cannot override these so they just grab from their parent. virtual float GetOpacityMaskClipValue() const override; virtual EBlendMode GetBlendMode() const override; virtual EMaterialShadingModel GetShadingModel() const override; // start ------- virtual enum ETranslucencyLightingMode GetTranslucencyLightingMode() const override; // end --------- virtual bool IsTwoSided() const override; virtual bool IsDitheredLODTransition() const override; virtual bool IsMasked() const override; }} + COLOR(#3030c0){Runtime\Engine\Classes\Materials\MaterialInterface.h} -- UMaterialInterface #code(c,nomenu){{ ENGINE_API virtual float GetOpacityMaskClipValue() const; ENGINE_API virtual EBlendMode GetBlendMode() const; ENGINE_API virtual EMaterialShadingModel GetShadingModel() const; // start ------- ENGINE_API virtual enum ETranslucencyLightingMode GetTranslucencyLightingMode() const; // end --------- ENGINE_API virtual bool IsTwoSided() const; ENGINE_API virtual bool IsDitheredLODTransition() const; ENGINE_API virtual bool IsTranslucencyWritingCustomDepth() const; ENGINE_API virtual bool IsMasked() const; ENGINE_API virtual bool IsDeferredDecal() const; }} + COLOR(#3030c0){Runtime\Engine\Private\Materials\Material.cpp} -- メソッド追加 #code(c,nomenu){{ // start ------- ETranslucencyLightingMode UMaterial::GetTranslucencyLightingMode() const { return TranslucencyLightingMode; } // end --------- }} + COLOR(#3030c0){Runtime\Engine\Private\Materials\MaterialInstance.cpp} -- メソッド追加 #code(c,nomenu){{ // start ------- ETranslucencyLightingMode UMaterialInstanceDynamic::GetTranslucencyLightingMode() const { return Parent ? Parent->GetTranslucencyLightingMode() : TLM_VolumetricNonDirectional; } // end --------- }} #code(c,nomenu){{ // start ------- ETranslucencyLightingMode UMaterialInstance::GetTranslucencyLightingMode() const { return TranslucencyLightingMode; } // end --------- }} -- UMaterialInstance::UpdateOverridableBaseProperties #code(c,nomenu){{ OpacityMaskClipValue = 0.0f; BlendMode = BLEND_Opaque; ShadingModel = MSM_DefaultLit; // start ------- TranslucencyLightingMode = TLM_VolumetricNonDirectional; // end --------- TwoSided = 0; DitheredLODTransition = 0; }} #code(c,nomenu){{ if (BasePropertyOverrides.bOverride_ShadingModel) { ShadingModel = BasePropertyOverrides.ShadingModel; } else { ShadingModel = Parent->GetShadingModel(); } // start ------- if (BasePropertyOverrides.bOverride_TranslucencyLightingMode) { TranslucencyLightingMode = BasePropertyOverrides.TranslucencyLightingMode; } else { TranslucencyLightingMode = Parent->GetTranslucencyLightingMode(); } // end --------- }} -- UMaterialInstance::Serialize --- 「VER_LIC_COM04_VER01」は自分の改造バージョンを記述する→[[エンジン改造-アセットのエンジンバージョン管理]] #code(c,nomenu){{ // unrelated but closest change to bug if( Ar.UE4Ver() < VER_UE4_STATIC_SHADOW_DEPTH_MAPS ) { // switched enum order switch( BasePropertyOverrides.ShadingModel ) { case MSM_Unlit: BasePropertyOverrides.ShadingModel = MSM_DefaultLit; break; case MSM_DefaultLit: BasePropertyOverrides.ShadingModel = MSM_Unlit; break; } } // start ------- if( Ar.LicenseeUE4Ver() >= VER_LIC_COM04_VER01) { Ar << BasePropertyOverrides.bOverride_TranslucencyLightingMode << BasePropertyOverrides.TranslucencyLightingMode; } // end --------- }} -- UMaterialInstance::GetBasePropertyOverridesHash #code(c,nomenu){{ EMaterialShadingModel UsedShadingModel = GetShadingModel(); if (UsedShadingModel != Mat->GetShadingModel()) { const FString HashString = TEXT("bOverride_ShadingModel"); Hash.UpdateWithString(*HashString, HashString.Len()); Hash.Update((const uint8*)&UsedShadingModel, sizeof(UsedShadingModel)); bHasOverrides = true; } // start ------- ETranslucencyLightingMode UsedTranslucencyLightingMode = GetTranslucencyLightingMode(); if (UsedTranslucencyLightingMode != Mat->GetTranslucencyLightingMode()) { const FString HashString = TEXT("bOverride_TranslucencyLightingMode"); Hash.UpdateWithString(*HashString, HashString.Len()); Hash.Update((const uint8*)&UsedTranslucencyLightingMode, sizeof(UsedTranslucencyLightingMode)); bHasOverrides = true; } // end --------- }} -- UMaterialInstance::HasOverridenBaseProperties #code(c,nomenu){{ if (Parent && Material && Material->bUsedAsSpecialEngineMaterial == false && ((FMath::Abs(GetOpacityMaskClipValue() - Parent->GetOpacityMaskClipValue()) > SMALL_NUMBER) || (GetBlendMode() != Parent->GetBlendMode()) || (GetShadingModel() != Parent->GetShadingModel()) || // start ------- (GetTranslucencyLightingMode() != Parent->GetTranslucencyLightingMode()) || // end --------- (IsTwoSided() != Parent->IsTwoSided()) || (IsDitheredLODTransition() != Parent->IsDitheredLODTransition())) ) }} + COLOR(#3030c0){Runtime\Engine\Private\Materials\MaterialInterface.cpp} -- メソッド追加 #code(c,nomenu){{ // start ------- ETranslucencyLightingMode UMaterialInterface::GetTranslucencyLightingMode() const { return TLM_VolumetricNonDirectional; } // end --------- }} + COLOR(#3030c0){Runtime\Engine\Private\Materials\MaterialShared.cpp} -- FMaterialResource::GetTranslucencyLightingMode #code(c,nomenu){{ ETranslucencyLightingMode FMaterialResource::GetTranslucencyLightingMode() const { // start ------- return (ETranslucencyLightingMode)(MaterialInstance ? MaterialInstance->GetTranslucencyLightingMode() : Material->GetTranslucencyLightingMode()); // end --------- } }} -- FMaterialInstanceBasePropertyOverrides::FMaterialInstanceBasePropertyOverrides #code(c,nomenu){{ ,bOverride_ShadingModel(false) ,bOverride_DitheredLODTransition(false) ,bOverride_TwoSided(false) // start ------- ,bOverride_TranslucencyLightingMode(false) // end --------- ,OpacityMaskClipValue(.333333f) }} -- FMaterialInstanceBasePropertyOverrides::operator== #code(c,nomenu){{ bOverride_ShadingModel == Other.bOverride_ShadingModel && bOverride_TwoSided == Other.bOverride_TwoSided && bOverride_DitheredLODTransition == Other.bOverride_DitheredLODTransition && // start ------- bOverride_TranslucencyLightingMode == Other.bOverride_TranslucencyLightingMode && // end --------- OpacityMaskClipValue == Other.OpacityMaskClipValue && }} |