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(Mesh mesh) { bool markDynamic = bakedMesh != null; if (meshData) { if (meshData.isRelocated) { Release(); if (s_dbgVerboseLog) { Debug.Log(String.Format("Relocated Mesh \"{0}\"\n", mesh.name)); } markDynamic = true; } } if (!meshData) { meshData = rthsMeshData.Create(); meshData.name = mesh.name; if (markDynamic) { meshData.MarkDynamic(); } meshData.SetGPUBuffers(mesh); meshData.SetBindpose(mesh.bindposes); #if UNITY_2019_1_OR_NEWER meshData.SetSkinWeights(mesh.GetBonesPerVertex(), mesh.GetAllBoneWeights()); #else meshData.SetSkinWeights(mesh.boneWeights); #endif int numBS = mesh.blendShapeCount; meshData.SetBlendshapeCount(numBS); if (numBS > 0) { var deltaPoints = new Vector3[mesh.vertexCount]; var deltaNormals = new Vector3[mesh.vertexCount]; var deltaTangents = new Vector3[mesh.vertexCount]; for (int bsi = 0; bsi < numBS; ++bsi) { int numFrames = mesh.GetBlendShapeFrameCount(bsi); for (int fi = 0; fi < numFrames; ++fi) { float weight = mesh.GetBlendShapeFrameWeight(bsi, fi); mesh.GetBlendShapeFrameVertices(bsi, fi, deltaPoints, deltaNormals, deltaTangents); meshData.AddBlendshapeFrame(bsi, deltaPoints, weight); } } } } }
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; }
public static rthsMeshInstanceData Create(rthsMeshData mesh) { return(new rthsMeshInstanceData { self = rthsMeshInstanceCreate(mesh) }); }
[DllImport(Lib.name)] static extern IntPtr rthsMeshInstanceCreate(rthsMeshData mesh);
public void Release() { instData.Release(); meshData = default(rthsMeshData); // Release() should not be called here useCount = 0; }
public void Update(rthsMeshData md, MeshRenderer mr, bool useShadowSettings) { rthsInstanceFlag flags = ToFlags(mr.receiveShadows, mr.shadowCastingMode, useShadowSettings); Update(md, flags, mr.localToWorldMatrix, mr.gameObject); }