public virtual void AddPrimitive( uint nodeIndex, string meshName, Mesh mesh, int[] materialIndices, uint[] joints = null, int primitiveNumeration = 0 ) { GameObject meshGo; if (primitiveNumeration == 0) { // Use Node GameObject for first Primitive meshGo = nodes[nodeIndex]; } else { meshGo = new GameObject($"{meshName ?? "Primitive"}_{primitiveNumeration}"); meshGo.transform.SetParent(nodes[nodeIndex].transform, false); } Renderer renderer; if (joints == null) { var mf = meshGo.AddComponent <MeshFilter>(); mf.mesh = mesh; var mr = meshGo.AddComponent <MeshRenderer>(); renderer = mr; } else { var smr = meshGo.AddComponent <SkinnedMeshRenderer>(); var bones = new Transform[joints.Length]; for (var j = 0; j < bones.Length; j++) { var jointIndex = joints[j]; bones[j] = nodes[jointIndex].transform; } smr.bones = bones; smr.sharedMesh = mesh; renderer = smr; } var materials = new Material[materialIndices.Length]; for (var index = 0; index < materials.Length; index++) { var material = gltf.GetMaterial(materialIndices[index]) ?? gltf.GetDefaultMaterial(); materials[index] = material; } renderer.sharedMaterials = materials; }
/// <inheritdoc /> public virtual void AddPrimitive( uint nodeIndex, string meshName, Mesh mesh, int[] materialIndices, uint[] joints = null, uint?rootJoint = null, float[] morphTargetWeights = null, int primitiveNumeration = 0 ) { if ((settings.mask & ComponentType.Mesh) == 0) { return; } GameObject meshGo; if (primitiveNumeration == 0) { // Use Node GameObject for first Primitive meshGo = nodes[nodeIndex]; } else { meshGo = new GameObject(meshName); meshGo.transform.SetParent(nodes[nodeIndex].transform, false); meshGo.layer = settings.layer; } Renderer renderer; var hasMorphTargets = mesh.blendShapeCount > 0; if (joints == null && !hasMorphTargets) { var mf = meshGo.AddComponent <MeshFilter>(); mf.mesh = mesh; var mr = meshGo.AddComponent <MeshRenderer>(); renderer = mr; } else { var smr = meshGo.AddComponent <SkinnedMeshRenderer>(); smr.updateWhenOffscreen = settings.skinUpdateWhenOffscreen; if (joints != null) { var bones = new Transform[joints.Length]; for (var j = 0; j < bones.Length; j++) { var jointIndex = joints[j]; bones[j] = nodes[jointIndex].transform; } smr.bones = bones; if (rootJoint.HasValue) { smr.rootBone = nodes[rootJoint.Value].transform; } } smr.sharedMesh = mesh; if (morphTargetWeights != null) { for (var i = 0; i < morphTargetWeights.Length; i++) { var weight = morphTargetWeights[i]; smr.SetBlendShapeWeight(i, weight); } } renderer = smr; } var materials = new Material[materialIndices.Length]; for (var index = 0; index < materials.Length; index++) { var material = gltf.GetMaterial(materialIndices[index]) ?? gltf.GetDefaultMaterial(); materials[index] = material; } renderer.sharedMaterials = materials; }
public virtual void AddPrimitive( uint nodeIndex, string meshName, Mesh mesh, int[] materialIndices, uint[] joints = null, uint?rootJoint = null, float[] morphTargetWeights = null, int primitiveNumeration = 0 ) { if ((settings.mask & ComponentType.Mesh) == 0) { return; } Entity node; if (primitiveNumeration == 0) { // Use Node GameObject for first Primitive node = nodes[nodeIndex]; } else { node = entityManager.CreateEntity(nodeArcheType); entityManager.SetComponentData(node, new Translation { Value = new float3(0, 0, 0) }); entityManager.SetComponentData(node, new Rotation { Value = quaternion.identity }); entityManager.SetComponentData(node, new Parent { Value = nodes[nodeIndex] }); } var hasMorphTargets = mesh.blendShapeCount > 0; for (var index = 0; index < materialIndices.Length; index++) { var material = gltf.GetMaterial(materialIndices[index]) ?? gltf.GetDefaultMaterial(); RenderMeshUtility.AddComponents(node, entityManager, new RenderMeshDescription(mesh, material, layer: settings.layer, subMeshIndex: index)); if (joints != null || hasMorphTargets) { if (joints != null) { var bones = new Entity[joints.Length]; for (var j = 0; j < bones.Length; j++) { var jointIndex = joints[j]; bones[j] = nodes[jointIndex]; } // TODO: Store bone entities array somewhere (pendant to SkinnedMeshRenderer.bones) } if (morphTargetWeights != null) { for (var i = 0; i < morphTargetWeights.Length; i++) { var weight = morphTargetWeights[i]; // TODO set blend shape weight in proper component (pendant to SkinnedMeshRenderer.SetBlendShapeWeight(i, weight); ) } } } } }