示例#1
0
        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;
        }
示例#2
0
        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); )
                        }
                    }
                }
            }
        }