예제 #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VertexCompressor"/> class.
 /// </summary>
 /// <param name="info">The compression info to use.</param>
 public VertexCompressor(GeometryCompressionInfo info)
 {
     _info   = info;
     _xScale = info.PositionMaxX - info.PositionMinX;
     _yScale = info.PositionMaxY - info.PositionMinY;
     _zScale = info.PositionMaxZ - info.PositionMinZ;
     _uScale = info.TextureMaxU - info.TextureMinU;
     _vScale = info.TextureMaxV - info.TextureMinV;
 }
예제 #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VertexCompressor"/> class.
 /// </summary>
 /// <param name="info">The compression info to use.</param>
 public VertexCompressor(GeometryCompressionInfo info)
 {
     _info = info;
     _xScale = info.PositionMaxX - info.PositionMinX;
     _yScale = info.PositionMaxY - info.PositionMinY;
     _zScale = info.PositionMaxZ - info.PositionMinZ;
     _uScale = info.TextureMaxU - info.TextureMinU;
     _vScale = info.TextureMaxV - info.TextureMinV;
 }
예제 #3
0
        private GeometryCompressionInfo BuildCompressionInfo()
        {
            var result = new GeometryCompressionInfo();

            foreach (var mesh in Meshes)
            {
                // TODO: Refactor how vertices work, this is just ugly

                IEnumerable <Vector4> positions = null;
                IEnumerable <Vector2> texCoords = null;
                if (mesh.RigidVertices != null)
                {
                    positions = mesh.RigidVertices.Select(v => v.Position);
                    texCoords = mesh.RigidVertices.Select(v => v.Texcoord);
                }
                else if (mesh.SkinnedVertices != null)
                {
                    positions = mesh.SkinnedVertices.Select(v => v.Position);
                    texCoords = mesh.SkinnedVertices.Select(v => v.Texcoord);
                }

                if (positions != null)
                {
                    result.PositionMinX = Math.Min(result.PositionMinX, positions.Min(v => v.X));
                    result.PositionMinY = Math.Min(result.PositionMinY, positions.Min(v => v.Y));
                    result.PositionMinZ = Math.Min(result.PositionMinZ, positions.Min(v => v.Z));
                    result.PositionMaxX = Math.Max(result.PositionMaxX, positions.Max(v => v.X));
                    result.PositionMaxY = Math.Max(result.PositionMaxY, positions.Max(v => v.Y));
                    result.PositionMaxZ = Math.Max(result.PositionMaxZ, positions.Max(v => v.Z));
                }
                if (texCoords != null)
                {
                    result.TextureMinU = Math.Min(result.TextureMinU, texCoords.Min(v => v.X));
                    result.TextureMinV = Math.Min(result.TextureMinV, texCoords.Min(v => v.Y));
                    result.TextureMaxU = Math.Max(result.TextureMaxU, texCoords.Max(v => v.X));
                    result.TextureMaxV = Math.Max(result.TextureMaxV, texCoords.Max(v => v.Y));
                }
            }
            _model.Geometry.Compression = new List <GeometryCompressionInfo> {
                result
            };
            return(result);
        }