public void Update(rthsMeshData md, SkinnedMeshRenderer smr, bool useShadowSettings, bool useDeformData) { rthsInstanceFlag flags = ToFlags(smr.receiveShadows, smr.shadowCastingMode, useShadowSettings); if (useDeformData) { var bones = smr.bones; if (bones.Length > 0) { // skinned var rootBone = smr.rootBone; var rootMatrix = rootBone != null ? rootBone.localToWorldMatrix : Matrix4x4.identity; Update(md, flags, rootMatrix, smr.gameObject); instData.SetBones(bones); } else { // non-skinned Update(md, flags, smr.localToWorldMatrix, smr.gameObject); } instData.SetBlendshapeWeights(smr); } else { Update(md, flags, smr.localToWorldMatrix, smr.gameObject); } }
public void Update(rthsMeshData md, rthsInstanceFlag flags, Matrix4x4 trans, GameObject go) { if (instData && meshData != md) { instData.Release(); } meshData = md; if (!instData) { instData = rthsMeshInstanceData.Create(md); instData.name = go.name; } instData.transform = trans; instData.flags = flags; instData.layer = go.layer; }
static rthsInstanceFlag ToFlags(bool receiveShadows, ShadowCastingMode mode, bool useShadowSettings) { rthsInstanceFlag ret = 0; if (!useShadowSettings) { ret |= rthsInstanceFlag.ReceiveShadows; ret |= rthsInstanceFlag.CastShadows; } else { if (receiveShadows) { ret |= rthsInstanceFlag.ReceiveShadows; } switch (mode) { case ShadowCastingMode.Off: break; case ShadowCastingMode.On: ret |= rthsInstanceFlag.CastShadows; ret |= rthsInstanceFlag.CullBackShadow; break; case ShadowCastingMode.TwoSided: ret |= rthsInstanceFlag.CastShadows; break; case ShadowCastingMode.ShadowsOnly: ret |= rthsInstanceFlag.ShadowsOnly; ret |= rthsInstanceFlag.CastShadows; break; } } return(ret); }
[DllImport(Lib.name)] static extern void rthsMeshInstanceSetFlags(IntPtr self, rthsInstanceFlag flags);
public void Update(rthsMeshData md, MeshRenderer mr, bool useShadowSettings) { rthsInstanceFlag flags = ToFlags(mr.receiveShadows, mr.shadowCastingMode, useShadowSettings); Update(md, flags, mr.localToWorldMatrix, mr.gameObject); }