Пример #1
0
        //============================================================
        public void LoadResource(FDrGeometry geometry)
        {
            // 创建数据
            int         faceCount = geometry.FaceList.Count;
            FByteStream vertexs   = new FByteStream(4 * 10 * 3 * faceCount);
            FByteStream faces     = new FByteStream(3 * faceCount);

            for (int f = 0; f < faceCount; f++)
            {
                FDrFace face = geometry.FaceList[f];
                for (int n = 0; n < 3; n++)
                {
                    // 输出顶点数据
                    FDrVertex vertex = geometry.VertexList[face.VertexIndex[n]];
                    FDrCoord  coord  = geometry.CoordList[face.CoordIndex[n]];
                    float     coordX = coord.Coord.X;
                    float     coordY = coord.Coord.Y + 1.0f;
                    if (geometry.Channels.Count > 1)
                    {
                        FDrChannelFace channelFace  = geometry.Channels[2].Indexs[face.Index];
                        SFloatPoint3   channelPoint = channelFace.Points[n];
                        coordX = channelPoint.X;
                        coordY = channelPoint.Y;
                    }
                    FDrColor color = geometry.ColorList[face.ColorIndex[n]];
                    vertexs.WriteFloat(vertex.Position.X);
                    vertexs.WriteFloat(vertex.Position.Y);
                    vertexs.WriteFloat(vertex.Position.Z);
                    vertexs.WriteFloat(1.0f);
                    vertexs.WriteFloat(coordX);
                    vertexs.WriteFloat(coordY);
                    vertexs.WriteFloat(color.Color.R);
                    vertexs.WriteFloat(color.Color.G);
                    vertexs.WriteFloat(color.Color.B);
                    vertexs.WriteFloat(1.0f);
                    // 输出索引数据
                    faces.WriteInt32(3 * f + n);
                }
            }
            // 创建顶点流
            _vertexBuffer        = new FDxVertexBuffer();
            _vertexBuffer.Device = _device;
            _vertexBuffer.UploadNormal(10, vertexs.Memory, 0, vertexs.Length);
            // 创建索引流
            _faceBuffer        = new FDxFaceBuffer();
            _faceBuffer.Device = _device;
            _faceBuffer.Upload32(faces.Memory, 0, faces.Length);
        }
Пример #2
0
        //============================================================
        public void LoadResource()
        {
            // 创建数据
            FByteStream vertexs = new FByteStream();

            float[] vertexData = new float[] {
                -1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,
                1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f,
                1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f,
                -1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
            };
            foreach (float value in vertexData)
            {
                vertexs.WriteFloat(value);
            }
            // 输出索引数据
            FByteStream faces = new FByteStream();

            int[] faceData = new int[] {
                0, 1, 2,
                0, 2, 3,
            };
            foreach (int value in faceData)
            {
                faces.WriteInt32(value);
            }
            // 创建顶点流
            _vertexBuffer        = new FDxVertexBuffer();
            _vertexBuffer.Device = _device;
            _vertexBuffer.UploadNormal(6, vertexs.Memory, 0, vertexs.Length);
            // 创建索引流
            _faceBuffer        = new FDxFaceBuffer();
            _faceBuffer.Device = _device;
            _faceBuffer.Upload32(faces.Memory, 0, faces.Length);
        }
Пример #3
0
        //============================================================
        public void Setup()
        {
            //------------------------------------------------------------
            float[] vertexData = new float[] {
                -1, 1, 0, 1, 0, 0,
                1, 1, 0, 1, 1, 0,
                1, -1, 0, 1, 1, 1,
                -1, -1, 0, 1, 0, 1
            };
            FByteStream vertexStream = new FByteStream();

            foreach (float value in vertexData)
            {
                vertexStream.WriteFloat(value);
            }
            // 创建顶点缓冲
            _vertexBuffer        = new FDxVertexBuffer();
            _vertexBuffer.Device = _device;
            _vertexBuffer.Upload5(6, vertexStream.Memory, 0, vertexStream.Length);
            //------------------------------------------------------------
            int[]       faceData   = new int[] { 0, 1, 2, 0, 2, 3 };
            FByteStream faceStream = new FByteStream();

            foreach (int value in faceData)
            {
                faceStream.WriteInt32(value);
            }
            // 创建面缓冲
            _faceBuffer        = new FDxFaceBuffer();
            _faceBuffer.Device = _device;
            _faceBuffer.Upload(faceStream.Memory, 0, faceStream.Length);
        }
Пример #4
0
        //============================================================
        public void LoadResource(FDrGeometry geometry)
        {
            // 创建数据
            int         faceCount = geometry.FaceList.Count;
            FByteStream vertexs   = new FByteStream(4 * 10 * 3 * faceCount);
            FByteStream faces     = new FByteStream(3 * faceCount);

            for (int f = 0; f < faceCount; f++)
            {
                FDrFace face = geometry.FaceList[f];
                for (int n = 0; n < 3; n++)
                {
                    // 输出顶点数据
                    FDrVertex vertex = geometry.VertexList[face.VertexIndex[n]];
                    FDrCoord  coord  = geometry.CoordList[face.CoordIndex[n]];
                    FDrNormal normal = geometry.NormalList[face.NormalIndex[n]];
                    vertexs.WriteFloat(vertex.Position.X);
                    vertexs.WriteFloat(vertex.Position.Y);
                    vertexs.WriteFloat(vertex.Position.Z);
                    vertexs.WriteFloat(1.0f);
                    vertexs.WriteFloat(coord.Coord.X);
                    vertexs.WriteFloat(coord.Coord.Y + 1);
                    vertexs.WriteFloat(normal.Direction.X);
                    vertexs.WriteFloat(normal.Direction.Y);
                    vertexs.WriteFloat(normal.Direction.Z);
                    vertexs.WriteFloat(1.0f);
                    // 输出索引数据
                    faces.WriteInt32(3 * f + n);
                }
            }
            // 创建顶点流
            _vertexBuffer        = new FDxVertexBuffer();
            _vertexBuffer.Device = _device;
            _vertexBuffer.UploadNormal(10, vertexs.Memory, 0, vertexs.Length);
            // 创建索引流
            _faceBuffer        = new FDxFaceBuffer();
            _faceBuffer.Device = _device;
            _faceBuffer.Upload32(faces.Memory, 0, faces.Length);
        }
Пример #5
0
        //============================================================
        public void Unserialize(IInput input)
        {
            _name         = input.ReadString();
            _materialName = input.ReadString();
            _effectName   = input.ReadString();
            // 读取矩阵
            _localMatrix.Unserialize(input);
            _worldMatrix.Unserialize(input);
            // 读取轮廓
            _outlineMin.Unserialize(input);
            _outlineMax.Unserialize(input);
            // 读取标识
            int flag = input.ReadInt16();

            _vertexPosition   = input.ReadInt8();
            _vertexColor      = input.ReadInt8();
            _vertexCoord      = input.ReadInt8();
            _vertexNormal     = input.ReadInt8();
            _vertexBinormal   = input.ReadInt8();
            _vertexTangent    = input.ReadInt8();
            _vertexBoneIndex  = input.ReadInt8();
            _vertexBoneWeight = input.ReadInt8();
            // 读取顶点
            int vertexCount = input.ReadInt32();

            _vertexSize = input.ReadUint8();
            _vertexSize = 20;
            for (int n = 0; n < vertexCount; n++)
            {
                // 输出顶点
                if (-1 != _vertexPosition)
                {
                    _vertexBuffer.WriteFloat(input.ReadFloat());
                    _vertexBuffer.WriteFloat(input.ReadFloat());
                    _vertexBuffer.WriteFloat(input.ReadFloat());
                    _vertexBuffer.WriteFloat(1.0f);
                }
                // 输出颜色
                if (-1 != _vertexColor)
                {
                    _vertexBuffer.WriteFloat((float)input.ReadUint8() / 255);
                    _vertexBuffer.WriteFloat((float)input.ReadUint8() / 255);
                    _vertexBuffer.WriteFloat((float)input.ReadUint8() / 255);
                    _vertexBuffer.WriteFloat((float)input.ReadUint8() / 255);
                }
                else
                {
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                }
                // 输出坐标
                if (-1 != _vertexCoord)
                {
                    _vertexBuffer.WriteFloat(input.ReadFloat());
                    _vertexBuffer.WriteFloat(input.ReadFloat());
                }
                else
                {
                    _vertexBuffer.WriteFloat(0.0f);
                    _vertexBuffer.WriteFloat(0.0f);
                }
                // 输出法线,副法线,切线
                if (-1 != _vertexNormal)
                {
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                    _vertexBuffer.WriteFloat(input.ReadUint8());
                }
                else
                {
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                }
                if (-1 != _vertexBinormal)
                {
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                }
                else
                {
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                }
                if (-1 != _vertexTangent)
                {
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                    _vertexBuffer.WriteFloat(((float)input.ReadUint8() / 255 - 0.5f) * 2.0f);
                }
                else
                {
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                    _vertexBuffer.WriteFloat(1.0f);
                }
                // 使用两条管道,每条管道4个数据,前管道为索引内容,后管道为权重
                if (-1 != _vertexBoneIndex)
                {
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                }
                if (-1 != _vertexBoneWeight)
                {
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                    //_vertexBuffer.WriteFloat(input.ReadFloat());
                }
            }
            // 读取面索引
            int faceCount = input.ReadInt32();

            for (int n = 0; n < faceCount; n++)
            {
                _faceBuffer.WriteUint32(input.ReadUint16());
                _faceBuffer.WriteUint32(input.ReadUint16());
                _faceBuffer.WriteUint32(input.ReadUint16());
            }
            // 读取骨骼列表
            int boneCount = input.ReadUint8();

            for (int n = 0; n < boneCount; n++)
            {
                input.ReadUint8();
            }
            // 读取骨骼列表
            _track.Unserialize(input);
        }