private static Entity GenerateMeshRendererEntity(GameObjectConversionSystem gsys, UnityEngine.SkinnedMeshRenderer uSkinnedMeshRenderer, Entity meshEntity, Entity materialEntity, int startIndex, int indexCount, bool createAdditionlEntity, bool canUseGPUSkinning, bool canUseCPUSkinning) { Entity primarySkinnedMeshRenderer = gsys.GetPrimaryEntity(uSkinnedMeshRenderer); Entity meshRendererEntity = primarySkinnedMeshRenderer; if (createAdditionlEntity) { meshRendererEntity = gsys.CreateAdditionalEntity(uSkinnedMeshRenderer); MeshRendererConversion.AddTransformComponent(gsys, primarySkinnedMeshRenderer, meshRendererEntity); } Unity.Tiny.Rendering.SkinnedMeshRenderer smr = new Unity.Tiny.Rendering.SkinnedMeshRenderer(); smr.sharedMesh = meshEntity; smr.material = materialEntity; smr.startIndex = startIndex; smr.indexCount = indexCount; smr.canUseGPUSkinning = canUseGPUSkinning; smr.canUseCPUSkinning = canUseCPUSkinning; smr.shadowCastingMode = (Unity.Tiny.Rendering.ShadowCastingMode)uSkinnedMeshRenderer.shadowCastingMode; smr.skinQuality = ConvertSkinQuality(uSkinnedMeshRenderer); gsys.DstEntityManager.AddComponentData(meshRendererEntity, smr); gsys.DstEntityManager.AddComponentData(meshRendererEntity, new WorldBounds()); return(meshRendererEntity); }
private static Entity ConvertOriginalSubMesh(GameObjectConversionSystem gsys, UnityEngine.SkinnedMeshRenderer uSkinnedMeshRenderer, UnityEngine.Mesh uMesh, Entity meshEntity, int subMeshIndex, Entity materialEntity) { int boneCount = uSkinnedMeshRenderer.bones.Length; bool canUseCPUSkinning = boneCount > 0; bool canUseGPUSkinning = boneCount > 0 && boneCount <= MeshSkinningConfig.GPU_SKINNING_MAX_BONES; int startIndex = Convert.ToUInt16(uMesh.GetIndexStart(subMeshIndex)); int indexCount = Convert.ToUInt16(uMesh.GetIndexCount(subMeshIndex)); Entity meshRendererEntity = GenerateMeshRendererEntity(gsys, uSkinnedMeshRenderer, meshEntity, materialEntity, startIndex, indexCount, subMeshIndex > 0, canUseGPUSkinning, canUseCPUSkinning); DynamicBuffer <SkinnedMeshBoneRef> smbrBuffer = gsys.DstEntityManager.AddBuffer <SkinnedMeshBoneRef>(meshRendererEntity); for (int i = 0; i < boneCount; i++) { smbrBuffer.Add(new SkinnedMeshBoneRef { bone = gsys.GetPrimaryEntity(uSkinnedMeshRenderer.bones[i]), }); } return(meshRendererEntity); }
private static void ConvertGPUSkinnedSubMesh(GameObjectConversionSystem gsys, UnityEngine.SkinnedMeshRenderer uSkinnedMeshRenderer, UnityEngine.Mesh uMesh, Entity meshEntity) { //Get the gpu draw range And calc the bone reference for the draw range var sharedMaterials = uSkinnedMeshRenderer.sharedMaterials; NativeArray <GPUSkinnedMeshDrawRange> gsmdrBuffer = gsys.DstEntityManager.GetBuffer <GPUSkinnedMeshDrawRange>(meshEntity).ToNativeArray(Allocator.Temp); NativeArray <OriginalVertexBoneIndex> ovbiBuffer = gsys.DstEntityManager.GetBuffer <OriginalVertexBoneIndex>(meshEntity).ToNativeArray(Allocator.Temp); SkinnedMeshRenderData skinnedMeshRenderData = gsys.DstEntityManager.GetComponentData <SkinnedMeshRenderData>(meshEntity); ref BlobArray <SkinnedMeshVertex> skinnedVertices = ref skinnedMeshRenderData.SkinnedMeshDataRef.Value.Vertices;
private static List <Entity> ConvertGPUSkinnedSubMesh(GameObjectConversionSystem gsys, UnityEngine.SkinnedMeshRenderer uSkinnedMeshRenderer, UnityEngine.Mesh uMesh, Entity meshEntity) { List <Entity> entities = new List <Entity>(); bool needGPUSkinningData = gsys.DstEntityManager.HasComponent <GPUSkinnedMeshDrawRange>(meshEntity); if (!needGPUSkinningData) { return(null); } //Get the gpu draw range And calc the bone reference for the draw range LitMeshRenderData litMeshRenderData = gsys.DstEntityManager.GetComponentData <LitMeshRenderData>(meshEntity); ref LitMeshData litMeshData = ref litMeshRenderData.Mesh.Value;
private static void ConvertOriginalSubMesh(GameObjectConversionSystem gsys, UnityEngine.SkinnedMeshRenderer uSkinnedMeshRenderer, UnityEngine.Mesh uMesh, Entity meshEntity, int subMeshIndex, Entity materialEntity) { int boneCount = uSkinnedMeshRenderer.bones.Length; bool canUseCPUSkinning = boneCount > 0; bool canUseGPUSkinning = boneCount > 0 && boneCount <= MeshSkinningConfig.GPU_SKINNING_MAX_BONES; int startIndex = Convert.ToUInt16(uMesh.GetIndexStart(subMeshIndex)); int indexCount = Convert.ToUInt16(uMesh.GetIndexCount(subMeshIndex)); Entity meshRendererEntity = GenerateMeshRendererEntity(gsys, uSkinnedMeshRenderer, meshEntity, materialEntity, startIndex, indexCount, subMeshIndex > 0, canUseGPUSkinning, canUseCPUSkinning); ConvertBlendShapeData(gsys, uSkinnedMeshRenderer, meshRendererEntity); DynamicBuffer <SkinnedMeshBoneRef> smbrBuffer = gsys.DstEntityManager.AddBuffer <SkinnedMeshBoneRef>(meshRendererEntity); for (int i = 0; i < boneCount; i++) { smbrBuffer.Add(new SkinnedMeshBoneRef { bone = gsys.GetPrimaryEntity(uSkinnedMeshRenderer.bones[i]), }); } var isLit = gsys.DstEntityManager.HasComponent <LitMaterial>(materialEntity); var isSimple = gsys.DstEntityManager.HasComponent <SimpleMaterial>(materialEntity); if (isLit || isSimple) { if (isLit) { gsys.DstEntityManager.AddComponent <LitMeshRenderer>(meshRendererEntity); } else if (isSimple) { gsys.DstEntityManager.AddComponent <SimpleMeshRenderer>(meshRendererEntity); } } }
private static void ConvertBlendShapeData(GameObjectConversionSystem gsys, UnityEngine.SkinnedMeshRenderer uSkinnedMeshRenderer, Entity meshRendererEntity) { Mesh uMesh = uSkinnedMeshRenderer.sharedMesh; if (uMesh.blendShapeCount <= 0) { return; } DynamicBuffer <BlendShapeWeight> blendShapeWeightsBuffer = gsys.DstEntityManager.AddBuffer <BlendShapeWeight>(meshRendererEntity); for (int shapeIndex = 0; shapeIndex < uMesh.blendShapeCount; shapeIndex++) { string blendShapeName = uMesh.GetBlendShapeName(shapeIndex); float curWeight = uSkinnedMeshRenderer.GetBlendShapeWeight(shapeIndex); BlendShapeWeight blendShapeWeight = new BlendShapeWeight(); blendShapeWeight.NameHash = BlendShapeChannel.GetNameHash(blendShapeName); blendShapeWeight.CurWeight = curWeight; blendShapeWeightsBuffer.Add(blendShapeWeight); } }