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 생성"); }
// 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); } } }
public Material GetSharedMaterial_MatInfo(apOptMaterialInfo matInfo) { if (_parentPortrait == null) { //아직 연결이 안되었다. return(null); } return(apOptSharedMaterial.I.GetSharedMaterial_MatInfo(matInfo, _parentPortrait)); }
public ClippedMatMeshSet(apOptMaterialInfo matInfo, apOptMesh clippedMesh, Material clippedMaterial) { _matInfo = matInfo; _clippedMesh = clippedMesh; //Reset용으로 등록 당시의 재질을 저장해야한다. //여기서 _MaskTex, _MaskTex_L, _MaskTex_R, _MaskScreenSpaceOffset은 복구해서는 안된다. _material_Original = new Material(clippedMaterial); }
/// <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)); }
//추가 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; }
/// <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 생성"); }
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(); }
// 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); }