Пример #1
0
 private void DrawMeshContainer(MeshContainerDerived mesh, FrameDerived frame, Device device)
 {
     if (mesh.SkinInformation != null)
     {
         int attribldPrev = -1;
         for (int iattrib = 0; iattrib < mesh.numberAttributes; iattrib++)
         {
             int numBlend            = 0;
             BoneCombination[] bones = mesh.bones;
             for (int i = 0; i < mesh.numberInfluences; i++)
             {
                 if (bones[iattrib].BoneId[i] != -1)
                 {
                     numBlend = i;
                 }
             }
             if (device.DeviceCaps.MaxVertexBlendMatrices >= numBlend + 1)
             {
                 Matrix[]       offsetMatrices = mesh.offsetMatrices;
                 FrameDerived[] frameMatrices  = mesh.frameMatrices;
                 for (int i = 0; i < mesh.numberInfluences; i++)
                 {
                     int matrixlndex = bones[iattrib].BoneId[i];
                     if (matrixlndex != -1)
                     {
                         Matrix tempMatrix = offsetMatrices[matrixlndex] *
                                             frameMatrices[matrixlndex].combinedTransformationMatrix;
                         device.Transform.SetWorldMatrixByIndex(i, tempMatrix);
                     }
                 }
                 device.RenderState.VertexBlend = (VertexBlend)numBlend;
                 if ((attribldPrev != bones[iattrib].AttributeId) ||
                     (attribldPrev == -1))
                 {
                     device.Material = mesh.GetMaterials()[
                         bones[iattrib].AttributeId].Material3D;
                     device.SetTexture(0, mesh.meshTextures[
                                           bones[iattrib].AttributeId]);
                     attribldPrev = bones[iattrib].AttributeId;
                 }
                 mesh.MeshData.Mesh.DrawSubset(iattrib);
             }
         }
     }
     else
     {
         device.Transform.World = frame.combinedTransformationMatrix;
         ExtendedMaterial[] mtrl = mesh.GetMaterials();
         for (int iMaterial = 0; iMaterial < mtrl.Length; iMaterial++)
         {
             device.Material = mtrl[iMaterial].Material3D;
             device.SetTexture(0, mesh.meshTextures[iMaterial]);
             mesh.MeshData.Mesh.DrawSubset(iMaterial);
         }
     }
 }
        public override MeshContainer CreateMeshContainer(string name, MeshData meshData, ExtendedMaterial[] materials, EffectInstance[] effectInstances, GraphicsStream adjacency, SkinInformation skinInfo)
        {
            if (meshData.Mesh == null)
            {
                throw new ArgumentException();
            }
            if (meshData.Mesh.VertexFormat == VertexFormats.None)
            {
                throw new ArgumentException();
            }
            MeshContainerDerived mesh = new MeshContainerDerived();

            mesh.Name = name;
            int    numFaces = meshData.Mesh.NumberFaces;
            Device dev      = meshData.Mesh.Device;

            if ((meshData.Mesh.VertexFormat & VertexFormats.Normal) == 0)
            {
                Mesh tempMesh = meshData.Mesh.Clone(meshData.Mesh.Options.Value, meshData.Mesh.VertexFormat | VertexFormats.Normal, dev);
                meshData.Mesh = tempMesh;
                meshData.Mesh.ComputeNormals();
            }
            mesh.SetMaterials(materials);
            mesh.SetAdjacency(adjacency);
            Texture[] meshTextures = new Texture[materials.Length];

            for (int i = 0; i < materials.Length; i++)
            {
                if (!string.IsNullOrEmpty(materials[i].TextureFilename))
                {
                    meshTextures[i] = TextureLoader.FromStream(dev, ResourcesLoader.LoadStream(materials[i].TextureFilename));
                }
            }
            mesh.meshTextures = meshTextures;
            mesh.MeshData     = meshData;

            if (skinInfo != null)
            {
                mesh.SkinInformation = skinInfo;
                int      numBones       = skinInfo.NumberBones;
                Matrix[] offsetMatrices = new Matrix[numBones];

                for (int i = 0; i < numBones; i++)
                {
                    offsetMatrices[i] = skinInfo.GetBoneOffsetMatrix(i);
                }
                mesh.offsetMatrices = offsetMatrices;
                MeshContainerDerived.GenerateSkinnedMesh(mesh);
            }
            return(mesh);
        }
Пример #3
0
        private void DrawFrame(FrameDerived frame, Device device)
        {
            MeshContainerDerived mesh = (MeshContainerDerived)frame.MeshContainer;

            while (mesh != null)
            {
                DrawMeshContainer(mesh, frame, device);
                mesh = (MeshContainerDerived)mesh.NextContainer;
            }
            if (frame.FrameSibling != null)
            {
                DrawFrame((FrameDerived)frame.FrameSibling, device);
            }
            if (frame.FrameFirstChild != null)
            {
                DrawFrame((FrameDerived)frame.FrameFirstChild, device);
            }
        }
Пример #4
0
        public void SetupBoneMatrices(MeshContainerDerived mesh)
        {
            if (mesh.SkinInformation != null)
            {
                int            numBones      = mesh.SkinInformation.NumberBones;
                FrameDerived[] frameMatrices = new FrameDerived[numBones];

                for (int i = 0; i < numBones; i++)
                {
                    FrameDerived frame = (FrameDerived)Frame.Find(rootFrame.FrameHierarchy, mesh.SkinInformation.GetBoneName(i));
                    if (frame == null)
                    {
                        throw new ArgumentException();
                    }
                    frameMatrices[i] = frame;
                }
                mesh.frameMatrices = frameMatrices;
            }
        }
Пример #5
0
        public static void GenerateSkinnedMesh(MeshContainerDerived mesh)
        {
            if (mesh.SkinInformation == null)
            {
                throw new ArgumentException();
            }

            int numInfl = 0;

            BoneCombination[] bones;

            MeshData m = mesh.MeshData;

            m.Mesh = mesh.SkinInformation.ConvertToBlendedMesh(m.Mesh, MeshFlags.Managed | MeshFlags.OptimizeVertexCache, mesh.GetAdjacencyStream(), out numInfl, out bones);

            mesh.numberInfluences = numInfl;
            mesh.bones            = bones;
            mesh.numberAttributes = bones.Length;
            mesh.MeshData         = m;
        }