public override void WriteToStream(BinaryWriter writer, GameAsset asset)
        {
            Texture texture = (Texture)asset;

            int sizeInBytes = TextureHelper.GetSinglePixelSize(texture.PixelInternalFormat, texture.PixelType) * texture.Size.X * texture.Size.Y;

            GL.BindTexture(TextureTarget.Texture2D, texture.Handle);

            byte[] textureData = new byte[sizeInBytes];
            GL.GetTexImage(TextureTarget.Texture2D, 0, texture.PixelFormat, texture.PixelType, textureData);
            GL.BindTexture(TextureTarget.Texture2D, 0);

            //write to stream
            writer.Write(texture.Name);

            writer.Write((int)texture.MinFilter);
            writer.Write((int)texture.MagFilter);
            writer.Write((int)texture.WrapModeS);
            writer.Write((int)texture.WrapModeT);

            writer.Write((int)texture.PixelInternalFormat);
            writer.Write((int)texture.PixelFormat);
            writer.Write((int)texture.PixelType);

            writer.Write(texture.Size.X);
            writer.Write(texture.Size.Y);

            writer.Write(texture.IsResident);

            //buffer
            writer.Write(sizeInBytes);
            writer.Write(textureData);
        }
Beispiel #2
0
        internal static void Init()
        {
            string baseDir = Path.Combine(AppContext.BaseDirectory, "EngineAssets/Shaders/");

            GameAsset.SetNextID("single-color-shader");
            SingleColor = Shader.FromSourceFile("single-color",
                                                Path.Combine(baseDir, "single-color.vert"),
                                                Path.Combine(baseDir, "single-color.frag"));

            GameAsset.SetNextID("shadowmap-shader");
            ShadowMap = Shader.FromSourceFile("shadowmap",
                                              Path.Combine(baseDir, "shadowmap.vert"),
                                              Path.Combine(baseDir, "shadowmap.frag"));

            GameAsset.SetNextID("text-shader");
            Text = Shader.FromSourceFile("text",
                                         Path.Combine(baseDir, "text.vert"),
                                         Path.Combine(baseDir, "text.frag"));

            GameAsset.SetNextID("lit-shader");
            Lit = Shader.FromSourceFile("lit",
                                        Path.Combine(baseDir, "lit.vert"),
                                        Path.Combine(baseDir, "lit.frag"));

            GameAsset.SetNextID("skybox-shader");
            Skybox = Shader.FromSourceFile("skybox",
                                           Path.Combine(baseDir, "skybox.vert"),
                                           Path.Combine(baseDir, "skybox.frag"));
        }
        public override void WriteToStream(BinaryWriter writer, GameAsset asset)
        {
            Prefab prefab = (Prefab)asset;

            writer.Write(prefab.Name);
            RecursivelyWritePrefabEntity(writer, prefab.RootEntity);
        }
        public override void WriteToStream(BinaryWriter writer, GameAsset asset)
        {
            Material material = (Material)asset;

            writer.Write(material.Name);
            writer.Write(material.Shader.ID);

            Span <MaterialProperty> properties = material.MaterialProperties;

            writer.Write(properties.Length);
            foreach (MaterialProperty property in properties)
            {
                writer.Write(property.Name);
                writer.Write((int)property.PropertyType);
                switch (property.PropertyType)
                {
                case MaterialPropertyType.Int:
                    writer.Write(material.GetInt(property.Name));
                    break;

                case MaterialPropertyType.Float:
                    writer.Write(material.GetFloat(property.Name));
                    break;

                case MaterialPropertyType.Vector2:
                    WriteStruct(writer, material.GetVector2(property.Name));
                    break;

                case MaterialPropertyType.Vector3:
                    WriteStruct(writer, material.GetVector3(property.Name));
                    break;

                case MaterialPropertyType.Vector4:
                    WriteStruct(writer, material.GetVector4(property.Name));
                    break;

                case MaterialPropertyType.Matrix2:
                    WriteStruct(writer, material.GetMatrix2(property.Name));
                    break;

                case MaterialPropertyType.Matrix3:
                    WriteStruct(writer, material.GetMatrix3(property.Name));
                    break;

                case MaterialPropertyType.Matrix4:
                    WriteStruct(writer, material.GetMatrix4(property.Name));
                    break;

                case MaterialPropertyType.Texture:
                    Texture texture = material.GetTexture(property.Name);
                    writer.Write(texture != null ? texture.ID : string.Empty);
                    break;
                }
            }
        }
Beispiel #5
0
        public override void WriteToStream(BinaryWriter writer, GameAsset asset)
        {
            Mesh mesh = (Mesh)asset;

            //get arrays
            Vector3[] vertices = mesh.Vertices.ToArray();
            uint[]    indices  = mesh.Indices.ToArray();

            //get per vertex data
            GL.BindBuffer(BufferTarget.ArrayBuffer, mesh.VBO1);
            GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int perVertexBufferSize);

            byte[] perVertexBuffer = new byte[perVertexBufferSize];
            GL.GetBufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, perVertexBufferSize, perVertexBuffer);

            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);

            //write to stream
            writer.Write(mesh.Name);       //name

            writer.Write(vertices.Length); //vertices count

            byte[] vertexBytesBuffer = Helper.StructArrayToByteArray(vertices);
            writer.Write(vertexBytesBuffer);   //vertices

            writer.Write(indices.Length);      //indices count
            byte[] indexBytesBuffer = Helper.StructArrayToByteArray(indices);
            writer.Write(indexBytesBuffer);    //indices

            writer.Write(perVertexBufferSize); //per vertex buffer size
            writer.Write(perVertexBuffer);     //per vertex buffer

            //vertex attribs
            VertexAttrib[] attribs = mesh.VertexAttribs.ToArray();
            writer.Write(attribs.Length); //attribs count
            for (int i = 0; i < attribs.Length; i++)
            {
                VertexAttrib attrib = attribs[i];

                writer.Write((int)attrib.PointerType); //pointer type
                writer.Write(attrib.Size);             //size
                writer.Write(attrib.Normalized);       //normalized
            }
        }
Beispiel #6
0
        public static void SaveAssetsToFile(string path)
        {
            AssetSerializerPair[] serializableAssets = GetSerializableAssets();

            using (FileStream stream = new FileStream(path, FileMode.Create))
            {
                BinaryWriter writer = new BinaryWriter(stream);

                writer.Write(serializableAssets.Length); //assets count
                for (int i = 0; i < serializableAssets.Length; i++)
                {
                    AssetSerializerPair assetSerializerPair = serializableAssets[i];
                    GameAsset           asset = assetSerializerPair.Asset;

                    writer.Write(asset.ID);
                    writer.Write((int)asset.AssetType);                          //asset type
                    assetSerializerPair.Serializer.WriteToStream(writer, asset); //asset data
                }
            }
        }
Beispiel #7
0
        public static void LoadAssetsFromFile(string path)
        {
            using (FileStream stream = new FileStream(path, FileMode.Open))
            {
                BinaryReader reader = new BinaryReader(stream);

                int assetsCount = reader.ReadInt32();
                for (int i = 0; i < assetsCount; i++)
                {
                    string        id        = reader.ReadString();
                    GameAssetType assetType = (GameAssetType)reader.ReadInt32();

                    GameAssetSerializer serializer = GetSuitableSerializer(assetType);
                    if (serializer == null)
                    {
                        throw new Exception("No suitable serializer found!");
                    }

                    GameAsset.SetNextID(id);
                    serializer.ReadFromStream(reader);
                }
            }
        }
Beispiel #8
0
        private static void SerializeFields(FieldInfo[] fields, object obj, BinaryWriter writer)
        {
            writer.Write(fields.Length);

            foreach (FieldInfo field in fields)
            {
                writer.Write(field.Name);
                writer.Write(field.FieldType.AssemblyQualifiedName);

                //yandere dev moment
                if (field.FieldType == typeof(int))
                {
                    writer.Write((int)field.GetValue(obj));
                }
                else if (field.FieldType == typeof(float))
                {
                    writer.Write((float)field.GetValue(obj));
                }
                else if (!field.FieldType.IsClass)
                {
                    typeof(DataManager)
                    .GetMethod("WriteStruct", BindingFlags.Static | BindingFlags.NonPublic)
                    .MakeGenericMethod(field.FieldType)
                    .Invoke(null, new object[] { writer, field.GetValue(obj) });
                }
                else if (typeof(GameAsset).IsAssignableFrom(field.FieldType))
                {
                    GameAsset asset = (GameAsset)field.GetValue(obj);
                    writer.Write(asset.ID);
                }
                else if (field.FieldType.IsClass)
                {
                    throw new NotImplementedException();
                }
            }
        }
Beispiel #9
0
 public abstract void WriteToStream(BinaryWriter writer, GameAsset asset);
Beispiel #10
0
 public AssetSerializerPair(GameAsset asset, GameAssetSerializer serializer)
 {
     Asset      = asset;
     Serializer = serializer;
 }