该项目的目的是同时测试和演示来自 Unity DOTS 技术堆栈的多个新包。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

226 行
9.4 KiB

//using System.Collections.Generic;
//using Unity.Animation;
//using Unity.Animation.Hybrid;
//using Unity.Entities;
//using Unity.Rendering;
//using Unity.Mathematics;
//using Unity.Sample.Core;
//using Unity.Transforms;
//using UnityEngine;
//using Skeleton = Unity.Animation.Hybrid.Skeleton;
//
//#if UNITY_EDITOR
//[UpdateInGroup(typeof(GameObjectAfterConversionGroup))]
//public class PartConversion : GameObjectConversionSystem
//{
// private EntityQuery PartQuery;
//
// protected override void OnCreate()
// {
// base.OnCreate();
//
// PartQuery = GetEntityQuery(typeof(PartAuthoring));
// }
//
// protected override void OnUpdate()
// {
// var partAuthorings = PartQuery.ToComponentArray<PartAuthoring>();
//
// foreach (var partAuthoring in partAuthorings)
// {
// GameDebug.Log("Converting PartAuthoring GO:" + partAuthoring.gameObject);
//
// var partEntity = GetPrimaryEntity(partAuthoring.gameObject);
// DstEntityManager.AddComponent<Part.Owner>(partEntity);
//
// if (partAuthoring.RigDefinition != null)
// {
// var rig = RigDefinitionAsset.ConvertRig(partAuthoring.RigDefinition);
//
// DstEntityManager.AddComponentData(partEntity,Part.Owner.Default);
//
// ConvertSkinnedMeshRenderes(partAuthoring, partEntity, partAuthoring.RigDefinition, DstEntityManager,
// this);
//
// var rigSkeleton = partAuthoring.RigDefinition.GetComponent<Skeleton>();
// GameDebug.Assert(rigSkeleton != null,"RigDefinition:"+ partAuthoring.RigDefinition + " does not have Skeleton component");
// GameDebug.Assert(partAuthoring.RigDefinition != null,"RigDefinition property is not set");
//
// var gameObject = partAuthoring.gameObject;
//
// var partAttachment = new Part.Attachment
// {
// Part = partEntity,
// };
//
// // Find all local bones defined in rig
// var localBoneList = new List<Transform>();
// for (int nBone = 0; nBone < rigSkeleton.Bones.Length; nBone++)
// {
// var rigBone = MapTransform(gameObject.transform, rigSkeleton.Bones[nBone]);
// if (rigBone == null)
// {
// GameDebug.LogError("Failed to map:" + rigSkeleton.Bones[nBone]);
// }
//
// localBoneList.Add(rigBone);
// }
//
// // Find objects attached to bones
// for (int nBone = 0; nBone < localBoneList.Count; nBone++)
// {
// var localBone = localBoneList[nBone];
// for (int nChild = 0; nChild < localBone.childCount; nChild++)
// {
// var child = localBone.GetChild(nChild);
// if (localBoneList.Contains(child))
// {
// // GameDebug.Log("bone" + child + " should not be attached");
// continue;
// }
//
// var childEntity = GetPrimaryEntity(child.gameObject);
//
// DstEntityManager.AddComponentData(childEntity, partAttachment);
//
// // Remove from parent
// if(DstEntityManager.HasComponent<Parent>(childEntity))
// DstEntityManager.RemoveComponent<Parent>(childEntity);
// if(DstEntityManager.HasComponent<LocalToParent>(childEntity))
// DstEntityManager.RemoveComponent<LocalToParent>(childEntity);
// if(!DstEntityManager.HasComponent<Static>(childEntity))
// DstEntityManager.AddComponent<Static>(childEntity);
//
// // Add rig attacher
// var boneRef = RuntimeBoneReference.Default;
// boneRef.BoneIndex = nBone;
// boneRef.ReferenceRig = rig;
// RigAttacher.AddRigAttacher(childEntity, DstEntityManager, boneRef);
//
// // DstEntityManager.GetBuffer<Part.Attachment>(partEntity).Add(new Part.Attachment
// // {
// // Entity = childEntity,
// // });
//
// GameDebug.Log(" Found attrachment:{0} on bone:{1} rig:{2}", child,boneRef.BoneIndex,partAuthoring.RigDefinition);
//
// // TODO (mogensh) delete all skeleton bone entities. Throw error if they contain components!!
// }
// }
// }
// }
//
//
// }
//
// public static void ConvertSkinnedMeshRenderes(PartAuthoring partAuthoring, Entity entity, Skeleton RigDefinition,
// EntityManager dstManager, GameObjectConversionSystem conversionSystem)
// {
// dstManager.AddBuffer<Part.SkinnedMeshRendererElement>(entity);
//
// var skinnedMeshRenderers = partAuthoring.GetComponentsInChildren<SkinnedMeshRenderer>();
//
//
// foreach (var meshRenderer in skinnedMeshRenderers)
// {
// // TODO (mogensh) why not just keep entity already created for meshRenderer gameobject ??
// var skinEntity = conversionSystem.CreateAdditionalEntity(meshRenderer);
//#if UNITY_EDITOR
// dstManager.SetName(skinEntity, "Entity " + skinEntity.Index + " Skin_" + meshRenderer.gameObject.name);
//#endif
//
// var skinRendererBuffer = dstManager.GetBuffer<Part.SkinnedMeshRendererElement>(entity);
// skinRendererBuffer.Add(new Part.SkinnedMeshRendererElement { entity = skinEntity, });
//
// //var rigEntity = GetPrimaryEntity(src.Rig);
// //DstEntityManager.AddComponentData(entity, new SkinnedMeshComponentData { RigEntity = rigEntity });
// dstManager.AddComponentData(skinEntity, new SkinnedMeshRigEntity());
// dstManager.AddComponentData(skinEntity, new LocalToWorld());
// dstManager.AddComponentData(skinEntity, new BoneIndexOffset());
//
// dstManager.AddBuffer<SkinnedMeshToRigIndex>(skinEntity);
// dstManager.AddBuffer<BindPose>(skinEntity);
// dstManager.AddBuffer<SkinMatrix>(skinEntity);
//
// var skeletonIndexArray = dstManager.GetBuffer<SkinnedMeshToRigIndex>(skinEntity);
// var bindPoseArray = dstManager.GetBuffer<BindPose>(skinEntity);
// var skinMatrices = dstManager.GetBuffer<SkinMatrix>(skinEntity);
//
// var smBones = meshRenderer.bones;
// skeletonIndexArray.ResizeUninitialized(smBones.Length);
// bindPoseArray.ResizeUninitialized(smBones.Length);
// skinMatrices.ResizeUninitialized(smBones.Length);
//
// //GameDebug.Log("skin smBones");
// //for (int i = 0; i < smBones.Length; i++)
// //{
// // var relativePath = RigGenerator.ComputeRelativePath(smBones[i], transform);
// // var id = (StringHash)relativePath;
// // GameDebug.Log(" " + i + ":" + id.Id + " path:" + relativePath);
// //}
//
// for (int j = 0; j != smBones.Length; ++j)
// {
// var remap = new SkinnedMeshToRigIndex { Value = -1 };
//
// var smBoneRelativePath = RigGenerator.ComputeRelativePath(smBones[j], partAuthoring.transform);
// var smBoneId = (StringHash)smBoneRelativePath;
//
// for (int k = 0; k != RigDefinition.Bones.Length; ++k)
// {
// var relativePath = RigGenerator.ComputeRelativePath(RigDefinition.Bones[k], RigDefinition.transform);
// var id = (StringHash)relativePath;
//
// if (smBoneId.Equals(id))
// {
// remap.Value = k;
// break;
// }
// }
// skeletonIndexArray[j] = remap;
//
// var bindPose = meshRenderer.sharedMesh.bindposes[j];
// bindPoseArray[j] = new BindPose { Value = bindPose };
//
// var skinMat = math.mul(meshRenderer.bones[j].localToWorldMatrix, bindPose);
// skinMatrices[j] = new SkinMatrix { Value = new float3x4(skinMat.c0.xyz, skinMat.c1.xyz, skinMat.c2.xyz, skinMat.c3.xyz) };
// }
//
// foreach (var rendererEntity in conversionSystem.GetEntities(meshRenderer))
// {
// if (dstManager.HasComponent<SkinnedEntityReference>(rendererEntity))
// {
// dstManager.SetComponentData(rendererEntity, new SkinnedEntityReference { Value = skinEntity });
// }
// }
// }
// }
//
//
//
//
// Transform MapTransform(Transform root, Transform path)
// {
// var pathList = new List<Transform>();
// do
// {
// pathList.Add(path);
// path = path.parent;
// } while (path != null);
//
//
// var mapped = root;
// for (int i = pathList.Count - 2; i >= 0; i--)
// {
// mapped = mapped.Find(pathList[i].name);
// if (mapped == null)
// {
// return null;
// }
//
// }
// return mapped;
// }
//}
//
//#endif