static public Entity CreateDrawModelEntityComponents ( this GameObjectConversionSystem gcs, GameObject topGameObject, Mesh mesh, Material mat, BoneType boneType, int boneLength, int instanceDataVectorLength = 0 ) { var em = gcs.DstEntityManager; setShaderProps_(em, mat, mesh, boneLength); var drawModelEntity = createDrawModelEntity_(gcs, topGameObject); initInfomationData_(em, drawModelEntity, mesh.bounds, boneLength, boneType, instanceDataVectorLength); initResourceData_(em, drawModelEntity, mat, mesh); return(drawModelEntity); void setShaderProps_(EntityManager em_, Material mat_, Mesh mesh_, int boneLength_) { var sys = em_.World.GetExistingSystem <DrawBufferManagementSystem>(); var boneVectorBuffer = sys.GetSingleton <DrawSystem.ComputeTransformBufferData>().Transforms; mat_.SetBuffer("BoneVectorBuffer", boneVectorBuffer); mat_.SetInt("BoneLengthEveryInstance", boneLength_); //mat_.SetInt( "BoneVectorOffset", 0 );// 毎フレームのセットが必要なので、ここではやらない } Entity createDrawModelEntity_ (GameObjectConversionSystem gcs_, GameObject top_) { var em_ = gcs_.DstEntityManager; var drawModelArchetype = em_.CreateArchetype( typeof(DrawModel.BoneVectorSettingData), typeof(DrawModel.InstanceCounterData), typeof(DrawModel.VectorBufferData), typeof(DrawModel.VectorLengthData), typeof(DrawModel.BoundingBoxData), typeof(DrawModel.GeometryData), typeof(DrawModel.ComputeArgumentsBufferData) ); var ent = em_.CreateEntity(drawModelArchetype); gcs.AddToModelEntityDictionary(top_, ent); em_.SetName_(ent, $"{top_.name} model"); return(ent); } void initInfomationData_ ( EntityManager em_, Entity ent_, Bounds bbox_, int boneLength_, BoneType boneType_, int instanceDataVectorLength_ ) { em_.SetComponentData(ent_, new DrawModel.BoneVectorSettingData { BoneLength = boneLength_, VectorLengthInBone = (int)boneType_, } ); em_.SetComponentData(ent_, new DrawModel.BoundingBoxData { LocalBbox = new AABB { Center = (float3)bbox_.center, // + meshpos_, Extents = (float3)bbox_.extents, } } ); em_.SetComponentData(ent_, new DrawModel.VectorLengthData { VectorLengthOfInstanceAdditionalData = instanceDataVectorLength_, VecotrLengthPerInstance = (int)boneType_ * boneLength_ + instanceDataVectorLength_, } ); Debug.Log($"{boneType_} {boneLength_} {instanceDataVectorLength_}"); } void initResourceData_ (EntityManager em_, Entity ent_, Material mat_, Mesh mesh_) { em_.SetComponentData(ent_, new DrawModel.GeometryData { Mesh = mesh_, Material = mat_, } ); em_.SetComponentData(ent_, new DrawModel.ComputeArgumentsBufferData { InstanceArgumentsBuffer = ComputeShaderUtility.CreateIndirectArgumentsBuffer(), } ); } }