示例#1
0
        void AddAsteroidToBuffer(StaticAsteroid ast, Material mat)
        {
            var model     = ast.Drawable as ModelFile;
            var l0        = model.Levels[0];
            var vertType  = l0.Mesh.VertexBuffer.VertexType.GetType();
            var transform = ast.RotationMatrix * Matrix4.CreateTranslation(ast.Position * field.CubeSize);
            var norm      = transform;

            norm.Invert();
            norm.Transpose();
            int vertOffset = verts.Count;

            for (int i = 0; i < l0.Mesh.VertexCount; i++)
            {
                VertexPositionNormalColorTexture vert;
                if (vertType == typeof(VertexPositionNormalColorTexture))
                {
                    vert = l0.Mesh.verticesVertexPositionNormalColorTexture[i];
                }
                else if (vertType == typeof(VertexPositionNormalTexture))
                {
                    var v = l0.Mesh.verticesVertexPositionNormalTexture[i];
                    vert = new VertexPositionNormalColorTexture(
                        v.Position,
                        v.Normal,
                        Color4.White,
                        v.TextureCoordinate);
                }
                else if (vertType == typeof(VertexPositionNormalTextureTwo))
                {
                    var v = l0.Mesh.verticesVertexPositionNormalTextureTwo[i];
                    vert = new VertexPositionNormalColorTexture(
                        v.Position,
                        v.Normal,
                        Color4.White,
                        v.TextureCoordinate);
                }
                else if (vertType == typeof(VertexPositionNormalDiffuseTextureTwo))
                {
                    var v = l0.Mesh.verticesVertexPositionNormalDiffuseTextureTwo[i];
                    vert = new VertexPositionNormalColorTexture(
                        v.Position,
                        v.Normal,
                        v.Diffuse,
                        v.TextureCoordinate);
                }
                else
                {
                    throw new NotImplementedException("Asteroids: " + vertType.FullName);
                }
                vert.Position = VectorMath.Transform(vert.Position, transform);
                vert.Normal   = (norm * new Vector4(vert.Normal, 0)).Xyz;
                verts.Add(vert);
            }
            for (int i = l0.StartMesh; i < l0.StartMesh + l0.MeshCount; i++)
            {
                var m          = l0.Mesh.Meshes[i];
                var baseVertex = vertOffset + l0.StartVertex + m.StartVertex;
                int indexStart = m.TriangleStart;
                int indexCount = m.NumRefVertices;
                for (int j = indexStart; j < indexStart + indexCount; j++)
                {
                    var idx = baseVertex + l0.Mesh.Indices[j];
                    if (idx > ushort.MaxValue)
                    {
                        throw new Exception();
                    }
                    indices.Add((ushort)idx);
                }
            }
        }
示例#2
0
        void AddAsteroidToBuffer(StaticAsteroid ast, Material mat, bool singleMat)
        {
            var model = (ModelFile)ast.Drawable.LoadFile(sys.ResourceManager);

            model.Initialize(sys.ResourceManager);
            var l0        = model.Levels[0];
            var vertType  = l0.Mesh.VertexBuffer.VertexType.GetType();
            var transform = ast.RotationMatrix * Matrix4x4.CreateTranslation(ast.Position * field.CubeSize);
            var norm      = transform;

            Matrix4x4.Invert(norm, out norm);
            norm = Matrix4x4.Transpose(norm);
            int vertOffset = verts.Count;

            for (int i = 0; i < l0.Mesh.VertexCount; i++)
            {
                VertexPositionNormalDiffuseTexture vert;
                if (vertType == typeof(VertexPositionNormalDiffuseTexture))
                {
                    vert = l0.Mesh.verticesVertexPositionNormalDiffuseTexture[i];
                }
                else if (vertType == typeof(VertexPositionNormalTexture))
                {
                    var v = l0.Mesh.verticesVertexPositionNormalTexture[i];
                    vert = new VertexPositionNormalDiffuseTexture(
                        v.Position,
                        v.Normal,
                        (uint)Color4.White.ToArgb(),
                        v.TextureCoordinate);
                }
                else if (vertType == typeof(VertexPositionNormalTextureTwo))
                {
                    var v = l0.Mesh.verticesVertexPositionNormalTextureTwo[i];
                    vert = new VertexPositionNormalDiffuseTexture(
                        v.Position,
                        v.Normal,
                        (uint)Color4.White.ToArgb(),
                        v.TextureCoordinate);
                }
                else if (vertType == typeof(VertexPositionNormalDiffuseTextureTwo))
                {
                    var v = l0.Mesh.verticesVertexPositionNormalDiffuseTextureTwo[i];
                    vert = new VertexPositionNormalDiffuseTexture(
                        v.Position,
                        v.Normal,
                        v.Diffuse,
                        v.TextureCoordinate);
                }
                else
                {
                    throw new NotImplementedException("Asteroids: " + vertType.FullName);
                }
                vert.Position = Vector3.Transform(vert.Position, transform);
                vert.Normal   = Vector3.TransformNormal(vert.Normal, norm);
                verts.Add(vert);
            }
            for (int i = l0.StartMesh; i < l0.StartMesh + l0.MeshCount; i++)
            {
                var m = l0.Mesh.Meshes[i];
                if (m.Material != mat && !singleMat)
                {
                    continue;
                }
                var baseVertex = vertOffset + l0.StartVertex + m.StartVertex;
                int indexStart = m.TriangleStart;
                int indexCount = m.NumRefVertices;
                for (int j = indexStart; j < indexStart + indexCount; j++)
                {
                    var idx = baseVertex + l0.Mesh.Indices[j];
                    if (idx > ushort.MaxValue)
                    {
                        throw new Exception();
                    }
                    indices.Add((ushort)idx);
                }
            }
        }