private void CheckAmbientAndCorrection() { if (_editor == null) { return; } if (!_editor._isAmbientCorrectionOption) { //Ambient 보정 옵션이 False이면 처리를 안함 return; } //현재 Ambient 색상과 모드를 확인하자 UnityEngine.Rendering.AmbientMode ambientMode = RenderSettings.ambientMode; Color ambientColor = RenderSettings.ambientLight; if (ambientMode == UnityEngine.Rendering.AmbientMode.Flat && ambientColor.r <= 0.001f && ambientColor.g <= 0.001f && ambientColor.b <= 0.001f) { //Ambient가 검은색이다. return; } //이전 ////Ambient 색상을 바꿀 것인지 물어보자 #region [미사용 코드] //int iBtn = EditorUtility.DisplayDialogComplex( // _editor.GetText(TEXT.DLG_AmbientColorCorrection_Title), // _editor.GetText(TEXT.DLG_AmbientColorCorrection_Body), // _editor.GetText(TEXT.Okay), // _editor.GetText(TEXT.DLG_AmbientColorCorrection_Ignore), // _editor.GetText(TEXT.Cancel) // ); //if(iBtn == 0) //{ // //색상을 바꾸자 // MakeAmbientLightToBlack(); //} //else if(iBtn == 1) //{ // //무시하자 // _editor._isAmbientCorrectionOption = false; // _editor.SaveEditorPref(); //} #endregion //조건문 추가 19.6.22 : 현재의 기본 Material Set이 Ambient Color 색상이 검은색을 필요로할 경우 if (_targetPortrait != null) { apMaterialSet defaultMatSet = _targetPortrait.GetDefaultMaterialSet(); if (defaultMatSet != null) { if (!defaultMatSet._isNeedToSetBlackColoredAmbient) { //현재의 Default MatSet이 검은색을 필요로 하지 않는 경우 return; } } } //이후 : 별도의 다이얼로그 표시 apDialog_AmbientCorrection.ShowDialog(_editor, (int)position.x, (int)position.y); }
// Bake //--------------------------------------------------- #if UNITY_EDITOR public void Bake(apTransform_Mesh srcMeshTransform, apPortrait portrait, bool isLinearSpace, int textureDataID, apMaterialLibrary materialLibrary) { Clear(); //1. 기본 텍스쳐를 만든다. Texture2D mainTex = null; if (srcMeshTransform._mesh != null && srcMeshTransform._mesh.LinkedTextureData != null) { mainTex = srcMeshTransform._mesh.LinkedTextureData._image; } if (mainTex == null) { return; } //2. Shader를 연결한다. Shader targetShader = null; apMaterialSet srcMatSet = null; apMaterialSet defaultMatSet = portrait.GetDefaultMaterialSet(); apMaterialSet libraryMatSet = materialLibrary.Presets[0]; //<<Library의 첫번째 프리셋 bool isClippedChild = srcMeshTransform._isClipping_Child; if (srcMeshTransform._isCustomShader) { //2-1. Custom Shader를 사용하는 경우 targetShader = srcMeshTransform._customShader; } else { srcMatSet = srcMeshTransform._linkedMaterialSet; if (srcMatSet == null) { srcMatSet = defaultMatSet; } if (srcMatSet == null) { srcMatSet = libraryMatSet; } if (srcMatSet == null) { return; } //조건에 맞는 Shader를 받아오자 targetShader = srcMatSet.GetShader(srcMeshTransform._shaderType, isClippedChild, isLinearSpace); //만약 현재 Material Set에 Shader가 없다면, Default Shader에서 가져오자. if (targetShader == null) { targetShader = defaultMatSet.GetShader(srcMeshTransform._shaderType, isClippedChild, isLinearSpace); } } if (targetShader == null) { //Shader가 없으면 Material Liabrary에서 가져오자 targetShader = libraryMatSet.GetShader(srcMeshTransform._shaderType, isClippedChild, isLinearSpace); } if (targetShader == null || mainTex == null) { return; } // 일단 MainTex와 Shader를 연결하자 _isBaked = true; _mainTex = mainTex; _textureID = textureDataID; _shader = targetShader; //3. 프로퍼티 List <Property_Float> list_Float = new List <Property_Float>(); List <Property_Int> list_Int = new List <Property_Int>(); List <Property_Vector> list_Vector = new List <Property_Vector>(); List <Property_Texture> list_Texture = new List <Property_Texture>(); List <Property_Color> list_Color = new List <Property_Color>(); //테스트를 위해서 Material을 생성 Material mat_Test = new Material(_shader); //3-1. 먼저 MaterialSet의 정보를 리스트로 저장한다. if (srcMatSet != null) { for (int iSrcProp = 0; iSrcProp < srcMatSet._propertySets.Count; iSrcProp++) { apMaterialSet.PropertySet srcProp = srcMatSet._propertySets[iSrcProp]; if (srcProp._isReserved || !srcProp._isOptionEnabled) { continue; } if (string.Equals(srcProp._name, "_Color") || string.Equals(srcProp._name, "_MainTex") || string.Equals(srcProp._name, "_MaskTex") || string.Equals(srcProp._name, "_MaskScreenSpaceOffset") || string.IsNullOrEmpty(srcProp._name)) { //이 값은 사용할 수 없다. Reserved임 continue; } //프로퍼티가 있는 경우에만 bool isHasProp = mat_Test.HasProperty(srcProp._name); if (!isHasProp) { //없는 Property. continue; } switch (srcProp._propType) { case apMaterialSet.SHADER_PROP_TYPE.Float: AddProperty_Float(list_Float, srcProp._name, srcProp._value_Float); break; case apMaterialSet.SHADER_PROP_TYPE.Int: AddProperty_Int(list_Int, srcProp._name, srcProp._value_Int); break; case apMaterialSet.SHADER_PROP_TYPE.Vector: AddProperty_Vector(list_Vector, srcProp._name, srcProp._value_Vector); break; case apMaterialSet.SHADER_PROP_TYPE.Texture: if (srcProp._isCommonTexture) { //공통 텍스쳐인 경우 AddProperty_Texture(list_Texture, srcProp._name, srcProp._value_CommonTexture); } else { //TextureData에 해당하는 정보가 있는지 확인하자. //없어도 null값을 넣는다. (null로 초기화하고 싶을 때도 있겠징...) apMaterialSet.PropertySet.ImageTexturePair imgTexPair = srcProp._imageTexturePairs.Find(delegate(apMaterialSet.PropertySet.ImageTexturePair a) { return(a._textureDataID == textureDataID); }); if (imgTexPair != null) { AddProperty_Texture(list_Texture, srcProp._name, imgTexPair._textureAsset); } else { AddProperty_Texture(list_Texture, srcProp._name, null); } } break; case apMaterialSet.SHADER_PROP_TYPE.Color: AddProperty_Color(list_Color, srcProp._name, srcProp._value_Color); break; } } } //3-2. MeshTransform의 속성에 Overwrite 설정이 있을 수도 있다. if (srcMeshTransform._customMaterialProperties != null && srcMeshTransform._customMaterialProperties.Count > 0) { for (int iSrcProp = 0; iSrcProp < srcMeshTransform._customMaterialProperties.Count; iSrcProp++) { apTransform_Mesh.CustomMaterialProperty srcProp = srcMeshTransform._customMaterialProperties[iSrcProp]; if (string.Equals(srcProp._name, "_Color") || string.Equals(srcProp._name, "_MainTex") || string.Equals(srcProp._name, "_MaskTex") || string.Equals(srcProp._name, "_MaskScreenSpaceOffset") || string.IsNullOrEmpty(srcProp._name)) { //이 값은 사용할 수 없다. Reserved임 continue; } //프로퍼티가 있는 경우에만 bool isHasProp = mat_Test.HasProperty(srcProp._name); if (!isHasProp) { //없는 Property. continue; } //이름을 비교하여, 기존의 값이 있다면 덮어 씌우고, 없으면 새로 만들기 switch (srcProp._propType) { case apTransform_Mesh.CustomMaterialProperty.SHADER_PROP_TYPE.Float: AddProperty_Float(list_Float, srcProp._name, srcProp._value_Float); break; case apTransform_Mesh.CustomMaterialProperty.SHADER_PROP_TYPE.Int: AddProperty_Int(list_Int, srcProp._name, srcProp._value_Int); break; case apTransform_Mesh.CustomMaterialProperty.SHADER_PROP_TYPE.Vector: AddProperty_Vector(list_Vector, srcProp._name, srcProp._value_Vector); break; case apTransform_Mesh.CustomMaterialProperty.SHADER_PROP_TYPE.Texture: AddProperty_Texture(list_Texture, srcProp._name, srcProp._value_Texture); break; case apTransform_Mesh.CustomMaterialProperty.SHADER_PROP_TYPE.Color: AddProperty_Color(list_Color, srcProp._name, srcProp._value_Color); break; } } } UnityEngine.Object.DestroyImmediate(mat_Test); //리스트의 값을 변수로 저장한다. if (list_Float.Count > 0) { //정렬부터 list_Float.Sort(delegate(Property_Float a, Property_Float b) { return(string.Compare(a._name, b._name)); }); //값 복사 _props_Float = new Property_Float[list_Float.Count]; for (int i = 0; i < list_Float.Count; i++) { _props_Float[i] = list_Float[i]; } } if (list_Int.Count > 0) { //정렬부터 list_Int.Sort(delegate(Property_Int a, Property_Int b) { return(string.Compare(a._name, b._name)); }); //값 복사 _props_Int = new Property_Int[list_Int.Count]; for (int i = 0; i < list_Int.Count; i++) { _props_Int[i] = list_Int[i]; } } if (list_Vector.Count > 0) { //정렬부터 list_Vector.Sort(delegate(Property_Vector a, Property_Vector b) { return(string.Compare(a._name, b._name)); }); //값 복사 _props_Vector = new Property_Vector[list_Vector.Count]; for (int i = 0; i < list_Vector.Count; i++) { _props_Vector[i] = list_Vector[i]; } } if (list_Texture.Count > 0) { //정렬부터 list_Float.Sort(delegate(Property_Float a, Property_Float b) { return(string.Compare(a._name, b._name)); }); //값 복사 _props_Texture = new Property_Texture[list_Texture.Count]; for (int i = 0; i < list_Texture.Count; i++) { _props_Texture[i] = list_Texture[i]; } } if (list_Color.Count > 0) { //정렬부터 list_Float.Sort(delegate(Property_Float a, Property_Float b) { return(string.Compare(a._name, b._name)); }); //값 복사 _props_Color = new Property_Color[list_Color.Count]; for (int i = 0; i < list_Color.Count; i++) { _props_Color[i] = list_Color[i]; } } }