128 lines
3.9 KiB
C#
128 lines
3.9 KiB
C#
![]() |
using UnityEngine;
|
|||
|
using UnityEngine.Serialization;
|
|||
|
|
|||
|
namespace RayFire
|
|||
|
{
|
|||
|
[System.Serializable]
|
|||
|
public class RFSurface
|
|||
|
{
|
|||
|
[FormerlySerializedAs ("innerMaterial")]
|
|||
|
public Material iMat;
|
|||
|
[FormerlySerializedAs ("outerMaterial")]
|
|||
|
public Material oMat;
|
|||
|
[FormerlySerializedAs ("mappingScale")]
|
|||
|
public float mScl;
|
|||
|
public bool uvE;
|
|||
|
public Vector2 uvC;
|
|||
|
public bool cE;
|
|||
|
public Color cC;
|
|||
|
|
|||
|
/// /////////////////////////////////////////////////////////
|
|||
|
/// Constructor
|
|||
|
/// /////////////////////////////////////////////////////////
|
|||
|
|
|||
|
// Constructor
|
|||
|
public RFSurface()
|
|||
|
{
|
|||
|
InitValues();
|
|||
|
}
|
|||
|
|
|||
|
void InitValues()
|
|||
|
{
|
|||
|
iMat = null;
|
|||
|
oMat = null;
|
|||
|
mScl = 0.1f;
|
|||
|
uvE = false;
|
|||
|
uvC = Vector2.zero;
|
|||
|
cE = false;
|
|||
|
}
|
|||
|
|
|||
|
// Pool Reset
|
|||
|
public void GlobalReset()
|
|||
|
{
|
|||
|
InitValues();
|
|||
|
}
|
|||
|
|
|||
|
// Copy from
|
|||
|
public void CopyFrom(RFSurface source)
|
|||
|
{
|
|||
|
iMat = source.iMat;
|
|||
|
oMat = source.oMat;
|
|||
|
mScl = source.mScl;
|
|||
|
uvE = source.uvE;
|
|||
|
uvC = source.uvC;
|
|||
|
cE = source.cE;
|
|||
|
cC = source.cC;
|
|||
|
}
|
|||
|
|
|||
|
/// /////////////////////////////////////////////////////////
|
|||
|
/// Methods
|
|||
|
/// /////////////////////////////////////////////////////////
|
|||
|
|
|||
|
// Set material to fragment by it's interior properties and parent material
|
|||
|
public static void SetMaterial(RFDictionary[] origSubMeshIdsRF, Material[] sharedMaterials, RFSurface interior, MeshRenderer targetRend, int i, int amount)
|
|||
|
{
|
|||
|
if (origSubMeshIdsRF != null && origSubMeshIdsRF.Length == amount)
|
|||
|
{
|
|||
|
Material[] mats = new Material[origSubMeshIdsRF[i].values.Length];
|
|||
|
for (int j = 0; j < origSubMeshIdsRF[i].values.Length; j++)
|
|||
|
{
|
|||
|
int matId = origSubMeshIdsRF[i].values[j];
|
|||
|
if (matId < sharedMaterials.Length)
|
|||
|
{
|
|||
|
if (interior.oMat == null)
|
|||
|
mats[j] = sharedMaterials[matId];
|
|||
|
else
|
|||
|
mats[j] = interior.oMat;
|
|||
|
}
|
|||
|
else
|
|||
|
mats[j] = interior.iMat;
|
|||
|
}
|
|||
|
|
|||
|
targetRend.sharedMaterials = mats;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Get inner faces sub mesh id
|
|||
|
public static int SetInnerSubId(RayfireRigid scr)
|
|||
|
{
|
|||
|
// No inner material
|
|||
|
if (scr.materials.iMat == null)
|
|||
|
return 0;
|
|||
|
|
|||
|
// Get materials
|
|||
|
Material[] mats = scr.skr != null
|
|||
|
? scr.skr.sharedMaterials
|
|||
|
: scr.meshRenderer.sharedMaterials;
|
|||
|
|
|||
|
// Get outer id if outer already has it
|
|||
|
for (int i = 0; i < mats.Length; i++)
|
|||
|
if (mats[i] == scr.materials.iMat)
|
|||
|
return i;
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
// Get inner faces sub mesh id
|
|||
|
public static int SetInnerSubId(RayfireShatter scr)
|
|||
|
{
|
|||
|
// No inner material
|
|||
|
if (scr.material.iMat == null)
|
|||
|
return 0;
|
|||
|
|
|||
|
// Get materials
|
|||
|
Material[] mats = scr.skinnedMeshRend != null
|
|||
|
? scr.skinnedMeshRend.sharedMaterials
|
|||
|
: scr.meshRenderer.sharedMaterials;
|
|||
|
|
|||
|
// Get outer id if outer already has it
|
|||
|
for (int i = 0; i < mats.Length; i++)
|
|||
|
if (mats[i] == scr.material.iMat)
|
|||
|
return i;
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|