Glatzemann c74b3c5767 - added some missing files from last commit
- fixed a bug in XNB-Header
2012-08-22 10:58:46 +00:00

230 lines
7.0 KiB
C#

#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ANX.Framework.Graphics;
#endregion
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license
namespace ANX.Framework.Content.Pipeline.Serialization.Compiler
{
public sealed class ContentWriter : BinaryWriter
{
private TargetPlatform targetPlatform;
private GraphicsProfile targetProfile;
private ContentCompiler compiler;
private MemoryStream headerData;
private MemoryStream contentData;
private Stream finalOutput;
private Boolean compressContent;
private string rootDirectory;
private string referenceRelocationPath;
const byte xnbFormatVersion = (byte)5;
char[] xnbMagicWord = new char[] { 'X', 'N', 'B' };
internal ContentWriter(ContentCompiler compiler, Stream output, TargetPlatform targetPlatform, GraphicsProfile targetProfile, bool compressContent, string rootDirectory, string referenceRelocationPath)
{
this.compiler = compiler;
this.targetPlatform = targetPlatform;
this.targetProfile = targetProfile;
this.compressContent = compressContent;
this.rootDirectory = rootDirectory;
this.referenceRelocationPath = referenceRelocationPath;
this.finalOutput = output;
this.headerData = new MemoryStream();
this.contentData = new MemoryStream();
this.OutStream = this.contentData;
}
public void Write(Color value)
{
base.Write(value.PackedValue);
}
public void Write(Matrix value)
{
base.Write(value.M11);
base.Write(value.M12);
base.Write(value.M13);
base.Write(value.M14);
base.Write(value.M21);
base.Write(value.M22);
base.Write(value.M23);
base.Write(value.M24);
base.Write(value.M31);
base.Write(value.M32);
base.Write(value.M33);
base.Write(value.M34);
base.Write(value.M41);
base.Write(value.M42);
base.Write(value.M43);
base.Write(value.M44);
}
public void Write(Quaternion value)
{
base.Write(value.X);
base.Write(value.Y);
base.Write(value.Z);
base.Write(value.W);
}
public void Write(Vector2 value)
{
base.Write(value.X);
base.Write(value.Y);
}
public void Write(Vector3 value)
{
base.Write(value.X);
base.Write(value.Y);
base.Write(value.Z);
}
public void Write(Vector4 value)
{
base.Write(value.X);
base.Write(value.Y);
base.Write(value.Z);
base.Write(value.W);
}
public void WriteExternalReference<T>(ExternalReference<T> reference)
{
throw new NotImplementedException();
}
public void WriteObject<T>(T value)
{
if (value == null)
{
base.Write7BitEncodedInt(0);
return;
}
ContentTypeWriter typeWriter = this.compiler.GetTypeWriter(value.GetType());
base.Write7BitEncodedInt(1);
//if (this.recurseDetector.ContainsKey(value))
//{
// throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.FoundCyclicReference, new object[]
// {
// value
// }));
//}
//this.recurseDetector.Add(value, true);
this.InvokeWriter<T>(value, typeWriter);
//this.recurseDetector.Remove(value);
}
private void InvokeWriter<T>(T value, ContentTypeWriter writer)
{
ContentTypeWriter<T> contentTypeWriter = writer as ContentTypeWriter<T>;
if (contentTypeWriter != null)
{
contentTypeWriter.Write(this, value);
return;
}
writer.Write(this, value);
}
public void WriteObject<T>(T value, ContentTypeWriter typeWriter)
{
throw new NotImplementedException();
}
public void WriteRawObject<T>(T value)
{
throw new NotImplementedException();
}
public void WriteRawObject<T>(T value, ContentTypeWriter typeWriter)
{
throw new NotImplementedException();
}
public void WriteSharedResource<T>(T value)
{
throw new NotImplementedException();
}
internal void FlushOutput()
{
//TODO: implement
//this.WriteSharedResources();
this.WriteHeader();
this.WriteFinalOutput();
}
private void WriteHeader()
{
this.OutStream = this.headerData;
//TODO: implement
//base.Write7BitEncodedInt(this.typeWriters.Count);
//foreach (ContentTypeWriter current in this.typeWriters)
//{
// this.Write(current.GetRuntimeReader(this.targetPlatform));
// this.Write(current.TypeVersion);
//}
//base.Write7BitEncodedInt(this.sharedResourceNames.Count);
}
private void WriteFinalOutput()
{
this.OutStream = this.finalOutput;
this.Write(xnbMagicWord);
this.Write((byte)this.targetPlatform);
if (this.compressContent)
{
throw new NotImplementedException();
//this.WriteCompressedOutput();
}
else
{
this.WriteUncompressedOutput();
}
}
private void WriteUncompressedOutput()
{
this.Write(xnbFormatVersion); // Version
byte flags = 0;
if (TargetProfile == GraphicsProfile.HiDef)
{
flags |= 0x01;
}
this.Write(flags);
this.Write(10 + this.headerData.Length + this.contentData.Length);
this.OutStream.Write(this.headerData.GetBuffer(), 0, (int)this.headerData.Length);
this.OutStream.Write(this.contentData.GetBuffer(), 0, (int)this.contentData.Length);
}
public TargetPlatform TargetPlatform
{
get
{
return targetPlatform;
}
}
public GraphicsProfile TargetProfile
{
get
{
return targetProfile;
}
}
}
}