//============================================================ 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); }
//============================================================ 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); }
//============================================================ 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); }
//============================================================ 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); }
//============================================================ 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); }