public MaterialUnit(apOptMaterialInfo srcMatInfo)
            {
                _texture = null;
                _shader  = null;

                _isUseMaterialInfo = true;
                _materialInfo      = new apOptMaterialInfo();
                _materialInfo.MakeFromSrc(srcMatInfo);

                //_texture = _materialInfo._mainTex;
                //_shader = _materialInfo._shader;

                _material = new Material(_materialInfo._shader);
                _material.SetColor("_Color", new Color(0.5f, 0.5f, 0.5f, 1.0f));
                _material.SetTexture("_MainTex", _materialInfo._mainTex);

                //Material Info에 저장된 초기 설정값을 적용한다.
                _materialInfo.SetMaterialProperties(_material);



                if (_linkedPortraits == null)
                {
                    _linkedPortraits = new List <apPortrait>();
                }
                _linkedPortraits.Clear();

                //Debug.Log("신형 Shared Material 생성");
            }
예제 #2
0
        // Make from Src : Batched / Shared Material에서 만들때는 이 함수를 이용하자
        //---------------------------------------------------
        public void MakeFromSrc(apOptMaterialInfo srcMatInfo)
        {
            Clear();

            _isBaked   = true;
            _mainTex   = srcMatInfo._mainTex;
            _textureID = srcMatInfo._textureID;
            _shader    = srcMatInfo._shader;


            if (srcMatInfo.NumProp_Float > 0)
            {
                _props_Float = new Property_Float[srcMatInfo.NumProp_Float];
                for (int i = 0; i < srcMatInfo.NumProp_Float; i++)
                {
                    Property_Float srcProp = srcMatInfo._props_Float[i];
                    _props_Float[i] = new Property_Float(srcProp._name, srcProp._value);
                }
            }

            if (srcMatInfo.NumProp_Int > 0)
            {
                _props_Int = new Property_Int[srcMatInfo.NumProp_Int];
                for (int i = 0; i < srcMatInfo.NumProp_Int; i++)
                {
                    Property_Int srcProp = srcMatInfo._props_Int[i];
                    _props_Int[i] = new Property_Int(srcProp._name, srcProp._value);
                }
            }

            if (srcMatInfo.NumProp_Vector > 0)
            {
                _props_Vector = new Property_Vector[srcMatInfo.NumProp_Vector];
                for (int i = 0; i < srcMatInfo.NumProp_Vector; i++)
                {
                    Property_Vector srcProp = srcMatInfo._props_Vector[i];
                    _props_Vector[i] = new Property_Vector(srcProp._name, srcProp._value);
                }
            }

            if (srcMatInfo.NumProp_Texture > 0)
            {
                _props_Texture = new Property_Texture[srcMatInfo.NumProp_Texture];
                for (int i = 0; i < srcMatInfo.NumProp_Texture; i++)
                {
                    Property_Texture srcProp = srcMatInfo._props_Texture[i];
                    _props_Texture[i] = new Property_Texture(srcProp._name, srcProp._value);
                }
            }

            if (srcMatInfo.NumProp_Color > 0)
            {
                _props_Color = new Property_Color[srcMatInfo.NumProp_Color];
                for (int i = 0; i < srcMatInfo.NumProp_Color; i++)
                {
                    Property_Color srcProp = srcMatInfo._props_Color[i];
                    _props_Color[i] = new Property_Color(srcProp._name, srcProp._value);
                }
            }
        }
예제 #3
0
 public Material GetSharedMaterial_MatInfo(apOptMaterialInfo matInfo)
 {
     if (_parentPortrait == null)
     {
         //아직 연결이 안되었다.
         return(null);
     }
     return(apOptSharedMaterial.I.GetSharedMaterial_MatInfo(matInfo, _parentPortrait));
 }
예제 #4
0
            public ClippedMatMeshSet(apOptMaterialInfo matInfo, apOptMesh clippedMesh, Material clippedMaterial)
            {
                _matInfo     = matInfo;
                _clippedMesh = clippedMesh;

                //Reset용으로 등록 당시의 재질을 저장해야한다.
                //여기서 _MaskTex, _MaskTex_L, _MaskTex_R, _MaskScreenSpaceOffset은 복구해서는 안된다.
                _material_Original = new Material(clippedMaterial);
            }
예제 #5
0
 /// <summary>
 /// 이 재질이 요구 사항에 맞는가?
 /// Material Info를 사용하지 않는 경우 (이전 버전)
 /// </summary>
 public bool IsEqualMaterial_MatInfo(apOptMaterialInfo matInfo)
 {
     if (!IsUseMaterialInfo)
     {
         //Material Info를 사용하지 않는다면 이 재질은 요구사항에 맞지 않다.
         return(false);
     }
     return(apOptMaterialInfo.IsSameInfo(MaterialInfo, matInfo));
 }
            public bool IsEqualMaterialInfo(apOptMaterialInfo matInfo)
            {
                if (!_isUseMaterialInfo)
                {
                    //Material Info를 사용하지 않는다.
                    return(false);
                }

                return(apOptMaterialInfo.IsSameInfo(_materialInfo, matInfo));
            }
예제 #7
0
            //추가 19.6.15 : MaterialInfo를 이용한 생성
            public MaterialUnit(int uniqueID, apOptMaterialInfo srcMaterialInfo)
            {
                _uniqueID = uniqueID;

                //Material Info를 활용하는 경우 이 변수들은 사용하지 않는다.
                //_texture = texture;
                //_textureID = textureID;
                //_shader = shader;

                _materialInfo    = new apOptMaterialInfo[1];
                _materialInfo[0] = new apOptMaterialInfo();
                _materialInfo[0].MakeFromSrc(srcMaterialInfo);

                _textureID = _materialInfo[0]._textureID;
            }
예제 #8
0
        /// <summary>
        /// Batched Material을 만들거나, 동일한 Material를 리턴하는 함수.
        /// v1.1.7 또는 그 이후 버전을 위한 함수이며 Material Info를 이용한다.
        /// </summary>
        /// <param name="srcMatInfo"></param>
        /// <returns></returns>
        public MaterialUnit MakeBatchedMaterial_MatInfo(apOptMaterialInfo srcMatInfo)
        {
            MaterialUnit result = _matUnits.Find(delegate(MaterialUnit a)
            {
                return(a.IsEqualMaterial_MatInfo(srcMatInfo));
            });

            if (result != null)
            {
                return(result);
            }

            //새로 만들자
            int newID = _matUnits.Count + 1;

            result = new MaterialUnit(newID, srcMatInfo);
            _matUnits.Add(result);

            return(result);
        }
            public MaterialUnit(Texture texture, Shader shader)
            {
                //구형 버전이다. (Material Info 사용 안함)
                _texture = texture;
                _shader  = shader;

                _isUseMaterialInfo = false;
                _materialInfo      = null;

                _material = new Material(_shader);
                _material.SetColor("_Color", new Color(0.5f, 0.5f, 0.5f, 1.0f));
                _material.SetTexture("_MainTex", _texture);

                if (_linkedPortraits == null)
                {
                    _linkedPortraits = new List <apPortrait>();
                }
                _linkedPortraits.Clear();

                //Debug.Log("구형 Shared Material 생성");
            }
예제 #10
0
            public void MakeMaterial()
            {
                if (!IsUseMaterialInfo)
                {
                    //이전 버전으로 만드는 경우
                    _material = new Material(_shader);

                    _shaderID_MainTex = Shader.PropertyToID("_MainTex");
                    _shaderID_Color   = Shader.PropertyToID("_Color");

                    _material.SetTexture(_shaderID_MainTex, _texture);
                    _material.SetColor(_shaderID_Color, new Color(0.5f, 0.5f, 0.5f, 1.0f));
                }
                else
                {
                    //변경 19.6.15 : MaterialInfo를 이용하여 만드는 경우
                    apOptMaterialInfo matInfo = MaterialInfo;

                    _material = new Material(matInfo._shader);

                    _shaderID_MainTex = Shader.PropertyToID("_MainTex");
                    _shaderID_Color   = Shader.PropertyToID("_Color");

                    _material.SetTexture(_shaderID_MainTex, matInfo._mainTex);
                    _material.SetColor(_shaderID_Color, new Color(0.5f, 0.5f, 0.5f, 1.0f));

                    //속성대로 초기화
                    matInfo.SetMaterialProperties(_material);
                }

                //복원용 재질
                _material_Original = new Material(_material);


                ResetRequestProperties();
            }
예제 #11
0
        // Functions
        //---------------------------------------------------
        public static bool IsSameInfo(apOptMaterialInfo infoA, apOptMaterialInfo infoB)
        {
            if (infoA._mainTex != infoB._mainTex ||
                infoA._textureID != infoB._textureID ||
                infoA._shader != infoB._shader ||

                infoA.NumProp_Float != infoB.NumProp_Float ||
                infoA.NumProp_Int != infoB.NumProp_Int ||
                infoA.NumProp_Vector != infoB.NumProp_Vector ||
                infoA.NumProp_Texture != infoB.NumProp_Texture ||
                infoA.NumProp_Color != infoB.NumProp_Color)
            {
                //기본 속성에서 차이가 있다.
                return(false);
            }

            //이제 상세 설정이 모두 동일한지 확인해야한다.
            //하나라도 다르면 패스
            //이름이나 속성을 순서대로 비교해서 하나라도 다르면 다른 것이다.
            //정렬을 했기 때문에 순서대로 비교하면 된다.

            int numFloat   = infoA.NumProp_Float;
            int numInt     = infoA.NumProp_Int;
            int numVector  = infoA.NumProp_Vector;
            int numTexture = infoA.NumProp_Texture;
            int numColor   = infoA.NumProp_Color;

            //1. Float
            if (numFloat > 0)
            {
                Property_Float propA = null;
                Property_Float propB = null;
                for (int i = 0; i < numFloat; i++)
                {
                    propA = infoA._props_Float[i];
                    propB = infoB._props_Float[i];
                    if (!string.Equals(propA._name, propB._name))
                    {
                        return(false);
                    }

                    if (Mathf.Abs(propA._value - propB._value) > 0.0001f)
                    {
                        return(false);
                    }
                }
            }

            //2. Int
            if (numInt > 0)
            {
                Property_Int propA = null;
                Property_Int propB = null;
                for (int i = 0; i < numInt; i++)
                {
                    propA = infoA._props_Int[i];
                    propB = infoB._props_Int[i];
                    if (!string.Equals(propA._name, propB._name))
                    {
                        return(false);
                    }

                    if (propA._value != propB._value)
                    {
                        return(false);
                    }
                }
            }

            //3. Vector
            if (numVector > 0)
            {
                Property_Vector propA = null;
                Property_Vector propB = null;
                for (int i = 0; i < numVector; i++)
                {
                    propA = infoA._props_Vector[i];
                    propB = infoB._props_Vector[i];
                    if (!string.Equals(propA._name, propB._name))
                    {
                        return(false);
                    }

                    if (Mathf.Abs(propA._value.x - propB._value.x) > 0.0001f ||
                        Mathf.Abs(propA._value.y - propB._value.y) > 0.0001f ||
                        Mathf.Abs(propA._value.z - propB._value.z) > 0.0001f ||
                        Mathf.Abs(propA._value.w - propB._value.w) > 0.0001f)
                    {
                        return(false);
                    }
                }
            }

            //4. Texture
            if (numTexture > 0)
            {
                Property_Texture propA = null;
                Property_Texture propB = null;
                for (int i = 0; i < numTexture; i++)
                {
                    propA = infoA._props_Texture[i];
                    propB = infoB._props_Texture[i];
                    if (!string.Equals(propA._name, propB._name))
                    {
                        return(false);
                    }

                    if (propA._value != propB._value)
                    {
                        return(false);
                    }
                }
            }


            //5. Color
            if (numColor > 0)
            {
                Property_Color propA = null;
                Property_Color propB = null;
                for (int i = 0; i < numColor; i++)
                {
                    propA = infoA._props_Color[i];
                    propB = infoB._props_Color[i];
                    if (!string.Equals(propA._name, propB._name))
                    {
                        return(false);
                    }

                    if (Mathf.Abs(propA._value.r - propB._value.r) > 0.001f ||
                        Mathf.Abs(propA._value.g - propB._value.g) > 0.001f ||
                        Mathf.Abs(propA._value.b - propB._value.b) > 0.001f ||
                        Mathf.Abs(propA._value.a - propB._value.a) > 0.001f)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
        /// <summary>
        /// Material Info를 이용하여 Shared Material을 가져오거나 만드는 함수 (v1.1.7)
        /// </summary>
        /// <param name="portrait"></param>
        /// <returns></returns>
        public Material GetSharedMaterial_MatInfo(apOptMaterialInfo matInfo, apPortrait portrait)
        {
#if UNITY_EDITOR
            if (UnityEditor.BuildPipeline.isBuildingPlayer)
            {
                return(null);
            }
#endif

            MaterialUnit matUnit = null;

            if (_matUnits_MatInfo.ContainsKey(matInfo._mainTex))
            {
                if (_matUnits_MatInfo[matInfo._mainTex].ContainsKey(matInfo._shader))
                {
                    List <MaterialUnit> matUnitList = _matUnits_MatInfo[matInfo._mainTex][matInfo._shader];

                    matUnit = matUnitList.Find(delegate(MaterialUnit a)
                    {
                        return(a.IsEqualMaterialInfo(matInfo));
                    });
                }
            }

            //새로 만들어야 한다.
            if (matUnit == null)
            {
                //새로운 Material Unit 생성
                matUnit = new MaterialUnit(matInfo);

                List <MaterialUnit> matUnitList = null;
                Dictionary <Shader, List <MaterialUnit> > shader2MatUnitList = null;

                if (_matUnits_MatInfo.ContainsKey(matInfo._mainTex))
                {
                    shader2MatUnitList = _matUnits_MatInfo[matInfo._mainTex];
                }
                else
                {
                    shader2MatUnitList = new Dictionary <Shader, List <MaterialUnit> >();
                    _matUnits_MatInfo.Add(matInfo._mainTex, shader2MatUnitList);
                }

                if (shader2MatUnitList.ContainsKey(matInfo._shader))
                {
                    matUnitList = shader2MatUnitList[matInfo._shader];
                }
                else
                {
                    matUnitList = new List <MaterialUnit>();
                    shader2MatUnitList.Add(matInfo._shader, matUnitList);
                }

                matUnitList.Add(matUnit);

                //Debug.Log(">> (!) 새로운 Material 리턴");
            }

            //Portrait 등록
            matUnit.LinkPortrait(portrait);

            List <MaterialUnit> matUnitList_InPortrait = null;
            if (!_portrait2MatUnits_MatInfo.ContainsKey(portrait))
            {
                _portrait2MatUnits_MatInfo.Add(portrait, new List <MaterialUnit>());
            }
            matUnitList_InPortrait = _portrait2MatUnits_MatInfo[portrait];
            if (!matUnitList_InPortrait.Contains(matUnit))
            {
                matUnitList_InPortrait.Add(matUnit);
            }

            //Shader Material 반환
            return(matUnit._material);
        }