public Texture(TextureMeta meta) : this(meta.Width, meta.Height) { // TODO: Complete member initialization savedMeta = meta; PixelInternalFormat = meta.PixelInternalFormat; Quality = meta.Quality; }
/// <summary> /// Loads a TextureArray in to GPU memory /// </summary> /// <param name="meta"></param> public void Load(TextureMeta meta) { PixelInternalFormat = meta.PixelInternalFormat; Quality = meta.Quality; // Get last bound texture Texture last = null; Bound.TryGetValue(TextureTarget, out last); // Bind current texture Bind(); Width = meta.Width; Height = meta.Height; string[] files = meta.FileName.Split(','); int filesCount = files.Length; GL.TexImage3D(TextureTarget, 0, PixelInternalFormat, Width, Height, filesCount, 0, meta.PixelFormat, meta.PixelType, IntPtr.Zero); for (int i = 0; i < filesCount; i++) { using(var bmp = new Bitmap(files[i])) { BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexSubImage3D(TextureTarget, 0, 0, 0, i, Width, Height, 1, meta.PixelFormat, meta.PixelType, bitmapData.Scan0); bmp.UnlockBits(bitmapData); } } // Restore previous state if (last != null) last.Bind(); else UnBind(); }
public virtual void SaveAs(string filename, ImageFormat format) { TextureMeta meta = new TextureMeta(); meta.Quality = Quality; meta.PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Bgra; meta.PixelType = PixelType.UnsignedByte; meta.PreMipmapped = false; meta.Precompressed = false; var bytes = GetPixels(meta); var bmp = new Bitmap(Width, Height, Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0)); bmp.Save(filename, format); }
public virtual void Load(byte[] rawBytes, TextureMeta meta) { if (meta.Type != TextureType.Texture2D) { throw new ArgumentException("Texture type must be Texture2D. Texture class does not support loading other types."); } savedMeta = meta; Width = meta.Width; Height = meta.Height; PixelInternalFormat = meta.PixelInternalFormat; int levels = 1; if(meta.PreMipmapped) { int size = Math.Max(Width, Height); levels += (int)Math.Floor(Math.Log(size, 2)); } Bind(); int bpp = 0; int w = Width; int h = Height; if (!meta.Precompressed) { bpp = GetBpp(meta.PixelFormat); if (bpp == 0) throw new NotImplementedException("The selected PixelFormat used for loading texture to file not yet supported."); } int srcOffset = 0; GL.TexParameter(TextureTarget, TextureParameterName.TextureMaxLevel, levels - 1); for(int i = 0; i < levels; i++) { // How many bytes on this level? int amount = w * h * bpp; // Copy bytes to separate buffer var levelBytes = new byte[amount]; Array.Copy(rawBytes, srcOffset, levelBytes, 0, amount); //Buffer.BlockCopy(rawBytes, srcOffset, levelBytes, 0, amount); // Upload bytes to the GPU if(meta.Precompressed) { GL.CompressedTexImage2D(TextureTarget, i, this.PixelInternalFormat, w, h, 0, levelBytes.Length, levelBytes); } else { GL.TexImage2D(TextureTarget, i, this.PixelInternalFormat, w, h, 0, meta.PixelFormat, meta.PixelType, levelBytes); } // Move offset and calculate next level size srcOffset += amount; w = w > 1 ? w / 2 : 1; h = h > 1 ? h / 2 : 1; } Quality.PregeneratedMipmaps = true; }
/// <summary> /// Saves the bytes of a texture in to a file specified by TextureMeta. Quality settings, PixelType and PixelInternalFormat /// will be changed in the TextureMeta object. If Precompressed flag is set to true in the TextureMeta object, the compressed /// data will be saved if the texture is compressed in memory. /// </summary> /// <param name="meta">The texture metadata object</param> public virtual byte[] GetPixels(TextureMeta meta) { meta.Quality = Quality; meta.PixelType = PixelType.UnsignedByte; Time.StartTimer("Texture.GetBytes()", "GPU Data Transfer"); // Get last bound texture Texture last = null; Bound.TryGetValue(TextureTarget, out last); // Bind current texture Bind(); int w = Width; // Width of the image int h = Height; // Height of the image int bpp = 0; // Bytes per pixel for uncompressed textures int levels = 1; // Mipmap levels, default = no mipmaps, just one texture level // Get the internal format int format; GL.GetTexLevelParameter(TextureTarget, 0, GetTextureParameter.TextureInternalFormat, out format); meta.PixelInternalFormat = (OpenTK.Graphics.OpenGL.PixelInternalFormat)format; // Check for texture compression if(meta.Precompressed) { // Find out if the texture is actually compressed in memory so we can save the compressed bytes int compression = 0; GL.GetTexLevelParameter(TextureTarget, 0, GetTextureParameter.TextureCompressed, out compression); if (compression == 0) meta.Precompressed = false; } // If texture is not compressed, get correct amount of bytes per pixel if(!meta.Precompressed) { bpp = GetBpp(meta.PixelFormat); if(bpp == 0) throw new NotImplementedException("The selected PixelFormat used for saving texture to file not yet supported."); } // Check if mipmaps are enabled if (meta.PreMipmapped) { meta.PreMipmapped = Quality.Mipmaps; } // If mipmap saving is enabled, get how many levels there are in the texture if (meta.PreMipmapped) { int size = Math.Max(Width, Height); levels += (int)Math.Floor(Math.Log(size, 2)); } var levelBytes = new byte[levels][]; int rawDataSize = 0; for(int i = 0; i < levels; i++) { // Get the non-compressed byte array size var levelSize = w * h * bpp; // Find out the correct byte array size for compressed texture if (meta.Precompressed) { GL.GetTexLevelParameter(TextureTarget, i, GetTextureParameter.TextureCompressedImageSize, out levelSize); } // Allocate the byte array var data = new byte[levelSize]; // Get the texture bytes from the GPU if (meta.Precompressed) { GL.GetCompressedTexImage(TextureTarget, i, data); } else { GL.GetTexImage(TextureTarget, i, meta.PixelFormat, meta.PixelType, data); } levelBytes[i] = data; rawDataSize += levelSize; // Calculate next level size w = w > 1 ? w / 2 : 1; h = h > 1 ? h / 2 : 1; } var rawdata = new byte[rawDataSize]; int offset = 0; for (int i = 0; i < levels; i++) { int blocksize = levelBytes[i].Length; Array.Copy(levelBytes[i], 0, rawdata, offset, blocksize); offset += blocksize; } // Restore previous state if (last != null) last.Bind(); else UnBind(); Time.StopTimer("Texture.GetBytes()"); return rawdata; }
protected override void OnLoad(EventArgs e) { Debug.WriteLine("OnLoad()"); /*thread = new Thread(new ThreadStart(() => { view = WebCore.CreateWebView(Width, Height, WebViewType.Offscreen); //WebCore.AutoUpdatePeriod = 30; view.IsTransparent = true; finishedLoading = false; var path = Path.Combine(new String[] { Directory.GetCurrentDirectory(), "TestWebPages\\index.html" }); path = "http://lasoft.fi/"; // Load some content. view.Source = new Uri(path); // Handle the LoadingFrameComplete event. // For this example, we use a lambda expression. view.LoadingFrameComplete += (s, eargs) => { if (!eargs.IsMainFrame) return; UploadWebpageToGPU((WebView)s); finishedLoading = true; }; if (WebCore.UpdateState == WebCoreUpdateState.NotUpdating) WebCore.Run(); })); thread.Start();*/ GPUCapabilities.Initialize(); Debug.WriteLine("GPUCapabilities.Version=" + GPUCapabilities.Version); Debug.WriteLine("GPUCapabilities.GLSL=" + GPUCapabilities.GLSL); Debug.WriteLine("GPUCapabilities.Instancing=" + GPUCapabilities.Instancing); Debug.WriteLine("GPUCapabilities.MaxVaryingFloats=" + GPUCapabilities.MaxVaryingFloats); Debug.WriteLine("GPUCapabilities.MaxVaryingVectors=" + GPUCapabilities.MaxVaryingVectors); Debug.WriteLine("GPUCapabilities.SeamlessCubemaps=" + GPUCapabilities.SeamlessCubemaps); Debug.WriteLine("GPUCapabilities.TextureCompression=" + GPUCapabilities.TextureCompression); Debug.WriteLine("GPUCapabilities.AnisotrophicFiltering=" + GPUCapabilities.AnisotrophicFiltering); Debug.WriteLine("GPUCapabilities.MaxAnisotrophyLevel=" + GPUCapabilities.MaxAnisotrophyLevel); if (GPUCapabilities.SeamlessCubemaps) GL.Enable(EnableCap.TextureCubeMapSeamless); GLState.DepthTest = true; GLState.AlphaBleding = true; GLState.CullFace = true; SceneManager.Initialize(500, 5, 20, Vector3.Zero); SceneManager.CullByObject = false; renderQueue = new RenderQueue(); renderQueue.AllowInstancing = true; viewPort = new Vector2(Width, Height); camera = new Hatzap.Camera(this); camera.SetAsCurrent(); camera.Position = new Vector3(0, 1, 1); camera.Target = new Vector3(-1, 0, 0); camera.Update(0); camera.DirectionLock = true; camera.Rotate(new Vector2(-(float)Math.PI / 2.5f, 0)); // Now camera.Position changes whenever Target changes, and the camera angle stays locked. // Camera's distance from it's target can be controlled from camera.Distance property now. FontCollection fonts = new FontCollection(); fonts.Fonts.Add(new FontInfo() { FontFamily = "OpenSans-Regular", FontDataFile = "Assets/Fonts/OpenSans-Regular.ttf_sdf.txt", FontTextureFile = "Assets/Fonts/OpenSans-Regular.ttf_sdf.png" }); XML.Write.ToFile(fonts, "Assets/Fonts/collection.xml"); //Console.WriteLine("Test test ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"); FontManager.LoadCollection(fonts); ShaderCollection collection = new ShaderCollection(); collection.ShaderPrograms.Add(new ShaderProgramInfo() { Shaders = new List<ShaderInfo>(new[]{ new ShaderInfo() { Path = "Assets/Shaders/Model.vert", Type = ShaderType.VertexShader },new ShaderInfo() { Path = "Assets/Shaders/Model.frag", Type = ShaderType.FragmentShader }}), Name = "Model" }); collection.ShaderPrograms.Add(new ShaderProgramInfo() { Shaders = new List<ShaderInfo>(new[]{ new ShaderInfo() { Path = "Assets/Shaders/Text.vert", Type = ShaderType.VertexShader },new ShaderInfo() { Path = "Assets/Shaders/Text.frag", Type = ShaderType.FragmentShader }}), Name = "Text" }); collection.ShaderPrograms.Add(new ShaderProgramInfo() { Shaders = new List<ShaderInfo>(new[]{ new ShaderInfo() { Path = "Assets/Shaders/Gui.vert", Type = ShaderType.VertexShader },new ShaderInfo() { Path = "Assets/Shaders/Gui.frag", Type = ShaderType.FragmentShader }}), Name = "Gui" }); collection.ShaderPrograms.Add(new ShaderProgramInfo() { Shaders = new List<ShaderInfo>(new[]{ new ShaderInfo() { Path = "Assets/Shaders/GuiImage.vert", Type = ShaderType.VertexShader },new ShaderInfo() { Path = "Assets/Shaders/GuiImage.frag", Type = ShaderType.FragmentShader }}), Name = "Gui.Image" }); collection.ShaderPrograms.Add(new ShaderProgramInfo() { Shaders = new List<ShaderInfo>(new[]{ new ShaderInfo() { Path = "Assets/Shaders/SimpleModel2.vert", Type = ShaderType.VertexShader },new ShaderInfo() { Path = "Assets/Shaders/SimpleModel2.frag", Type = ShaderType.FragmentShader },/*new ShaderInfo() { Path = "Assets/Shaders/SimpleModel.geom", Type = ShaderType.GeometryShader }*/}), Name = "SimpleModel" }); collection.ShaderPrograms.Add(new ShaderProgramInfo() { Shaders = new List<ShaderInfo>(new[]{ new ShaderInfo() { Path = "Assets/Shaders/SimpleModel2.vert", Type = ShaderType.VertexShader },new ShaderInfo() { Path = "Assets/Shaders/SimpleModel1.frag", Type = ShaderType.FragmentShader },/*new ShaderInfo() { Path = "Assets/Shaders/SimpleModel.geom", Type = ShaderType.GeometryShader }*/}), Name = "Textureless" }); //XML.Write.ToFile(collection, "Assets/Shaders/collection.xml"); ShaderManager.LoadCollection(collection); Time.Initialize(); UserInput.Initialize(this, typeof(AccurateMouse), typeof(Hatzap.Input.Keyboard)); UserInput.Mouse.ClickInterval = 0.5f; GuiRoot.Initialize(this); GuiRoot.Root.Texture = new TextureArray(); TextureMeta guiTextureMeta = new TextureMeta() { FileName = "Assets/Textures/greySheet.png", Width = 512, Height = 512, PixelInternalFormat = PixelInternalFormat.Rgba, PixelFormat = PixelFormat.Bgra, PixelType = PixelType.UnsignedByte, Precompressed = false, Quality = new TextureQuality() { Anisotrophy = 0, Filtering = TextureFiltering.Nearest, TextureWrapMode_S = OpenTK.Graphics.OpenGL.TextureWrapMode.Clamp, TextureWrapMode_T = OpenTK.Graphics.OpenGL.TextureWrapMode.Clamp, }, }; GuiRoot.Root.Texture.Load(guiTextureMeta); ElementCollection guiElements = new ElementCollection() { Elements = new List<WidgetInfo> { new WidgetInfo(){ WidgetType = typeof(Button).ToString(), Slices = new List<GuiTextureRegion> { new GuiTextureRegion() { // Top left Offset = new Vector2(49,433), Size = new Vector2(6,4), Page = 0 }, new GuiTextureRegion() { // Top center Offset = new Vector2(55,433), Size = new Vector2(37,4), Page = 0 }, new GuiTextureRegion() { // Top Right Offset = new Vector2(92,433), Size = new Vector2(6,4), Page = 0 }, new GuiTextureRegion() { // Middle left Offset = new Vector2(49,437), Size = new Vector2(6,36), Page = 0 }, new GuiTextureRegion() { // Middle center Offset = new Vector2(55,437), Size = new Vector2(37,36), Page = 0 }, new GuiTextureRegion() { // Middle right Offset = new Vector2(92,437), Size = new Vector2(6,36), Page = 0 }, new GuiTextureRegion() { // Bottom left Offset = new Vector2(49,473), Size = new Vector2(6,5), Page = 0 }, new GuiTextureRegion() { // Bottom center Offset = new Vector2(55,473), Size = new Vector2(37,5), Page = 0 }, new GuiTextureRegion() { // Bottom right Offset = new Vector2(92,473), Size = new Vector2(6,5), Page = 0 }, }, }, new WidgetInfo(){ WidgetType = typeof(Window).ToString(), Slices = new List<GuiTextureRegion> { new GuiTextureRegion() { // Top left Offset = new Vector2(190,98), Size = new Vector2(7,5), Page = 0 }, new GuiTextureRegion() { // Top center Offset = new Vector2(195,98), Size = new Vector2(86,5), Page = 0 }, new GuiTextureRegion() { // Top Right Offset = new Vector2(283,98), Size = new Vector2(7,5), Page = 0 }, new GuiTextureRegion() { // Middle left Offset = new Vector2(190,103), Size = new Vector2(7,89), Page = 0 }, new GuiTextureRegion() { // Middle center Offset = new Vector2(197,103), Size = new Vector2(86,89), Page = 0 }, new GuiTextureRegion() { // Middle right Offset = new Vector2(283,103), Size = new Vector2(7,89), Page = 0 }, new GuiTextureRegion() { // Middle left Offset = new Vector2(190,103), Size = new Vector2(7,89), Page = 0 }, new GuiTextureRegion() { // Middle center Offset = new Vector2(197,103), Size = new Vector2(86,89), Page = 0 }, new GuiTextureRegion() { // Middle right Offset = new Vector2(283,103), Size = new Vector2(7,89), Page = 0 }, new GuiTextureRegion() { // Bottom left Offset = new Vector2(190,192), Size = new Vector2(7,6), Page = 0 }, new GuiTextureRegion() { // Bottom center Offset = new Vector2(197,192), Size = new Vector2(86,6), Page = 0 }, new GuiTextureRegion() { // Bottom right Offset = new Vector2(283,192), Size = new Vector2(7,6), Page = 0 } }, }, new WidgetInfo(){ WidgetType = typeof(Panel).ToString(), Slices = new List<GuiTextureRegion> { new GuiTextureRegion() { // Top left Offset = new Vector2(190,98), Size = new Vector2(7,5), Page = 0 }, new GuiTextureRegion() { // Top center Offset = new Vector2(195,98), Size = new Vector2(86,5), Page = 0 }, new GuiTextureRegion() { // Top Right Offset = new Vector2(283,98), Size = new Vector2(7,5), Page = 0 }, new GuiTextureRegion() { // Middle left Offset = new Vector2(190,103), Size = new Vector2(7,89), Page = 0 }, new GuiTextureRegion() { // Middle center Offset = new Vector2(197,103), Size = new Vector2(86,89), Page = 0 }, new GuiTextureRegion() { // Middle right Offset = new Vector2(283,103), Size = new Vector2(7,89), Page = 0 }, new GuiTextureRegion() { // Bottom left Offset = new Vector2(190,192), Size = new Vector2(7,6), Page = 0 }, new GuiTextureRegion() { // Bottom center Offset = new Vector2(197,192), Size = new Vector2(86,6), Page = 0 }, new GuiTextureRegion() { // Bottom right Offset = new Vector2(283,192), Size = new Vector2(7,6), Page = 0 } }, }, } }; XML.Write.ToFile(guiElements, "Assets/Gui/elements.xml"); GridContainer mainGuiGrid = new GridContainer(); mainGuiGrid.Columns = 1; mainGuiGrid.Rows = 3; mainGuiGrid.CellWidths.Add(1280); mainGuiGrid.RowHeights.Add(30); mainGuiGrid.RowHeights.Add(0); mainGuiGrid.RowHeights.Add(30); mainGuiGrid.Anchor = new Anchor(); mainGuiGrid.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; mainGuiGrid.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; mainGuiGrid.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; mainGuiGrid.Anchor.Directions[AnchorDirection.Bottom] = AnchorType.Snap; mainGuiGrid.Position = new Vector2(0, 0); mainGuiGrid.Size = new Vector2(400, 200); Panel leftPanel = new Panel(); leftPanel.Anchor = new Anchor(); leftPanel.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; leftPanel.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; leftPanel.Anchor.Directions[AnchorDirection.Bottom] = AnchorType.Snap; leftPanel.Position = new Vector2(100, 100); leftPanel.Size = new Vector2(300, 10); leftPanel.Color = new Vector4(0.1f, 0.1f, 0.1f, 1f); leftPanel.RightAnchorOffset = -10.0f; leftPanel.TextureRegion = guiElements.GetInfo(leftPanel).Slices.ToArray(); Panel menuBar = new Panel(); menuBar.Anchor = new Anchor(); menuBar.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; menuBar.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; menuBar.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; menuBar.Position = new Vector2(100, 100); menuBar.Size = new Vector2(300, 30); menuBar.Color = new Vector4(0.1f, 0.1f, 0.1f, 1f); menuBar.TextureRegion = guiElements.GetInfo(leftPanel).Slices.ToArray(); Panel bottomBar = new Panel(); bottomBar.Anchor = new Anchor(); bottomBar.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; bottomBar.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; bottomBar.Anchor.Directions[AnchorDirection.Bottom] = AnchorType.Snap; bottomBar.Position = new Vector2(0, 690); bottomBar.Size = new Vector2(0, 30); bottomBar.Color = new Vector4(0.1f, 0.1f, 0.1f, 1f); bottomBar.TextureRegion = guiElements.GetInfo(leftPanel).Slices.ToArray(); #region StackContainer test StackContainer stack = new StackContainer(); { Button btn = new Button(); Button btn2 = new Button(); Button btn3 = new Button(); Button btn4 = new Button(); stack.AddChildWidget(btn); stack.AddChildWidget(btn2); stack.AddChildWidget(btn3); stack.AddChildWidget(btn4); btn.Color = new Vector4(1.5f, 1.5f, 1.5f, 1); btn.Text = "Button 1"; btn.TextColor = new Vector4(0, 0, 0, 1); btn.OnClick += (m) => { //btn.Text = "Clicked " + m.ToString(); }; btn.Anchor = new Anchor(); btn.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; btn.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; btn.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; btn.Position = new Vector2(100, 100); btn.Size = new Vector2(150, 50); btn.TextureRegion = guiElements.Elements[0].Slices.ToArray(); btn2.Color = new Vector4(0.2f, 0.2f, 0.2f, 1); btn2.Text = "Button 2"; btn2.OnClick += (m) => { btn2.Text = "Clicked " + m.ToString(); }; btn2.Anchor = new Anchor(); btn2.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; btn2.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; btn2.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; btn2.Position = new Vector2(300, 100); btn2.Size = new Vector2(150, 50); btn2.TextureRegion = guiElements.Elements[0].Slices.ToArray(); btn3.Text = "Button 3"; btn3.OnClick += (m) => { var r = new Hatzap.Utilities.Random(); btn3.Color = new Vector4((float)r.NextDouble(), (float)r.NextDouble(), (float)r.NextDouble(), 1); //btn3.Z = btn4.Z + 1; }; btn3.Anchor = new Anchor(); btn3.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; btn3.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; btn3.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; btn3.Position = new Vector2(100, 200); btn3.Size = new Vector2(150, 50); btn3.TextureRegion = guiElements.Elements[0].Slices.ToArray(); btn4.Color = new Vector4(1, 1, 1, 0.5f); btn4.Text = "Button 4"; btn4.OnClick += (m) => { //btn4.Text = "Clicked " + m.ToString(); //btn4.Z = btn3.Z + 1; }; btn4.Anchor = new Anchor(); btn4.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; btn4.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; btn4.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; btn4.Position = new Vector2(150, 200); btn4.Size = new Vector2(150, 50); btn4.TextureRegion = guiElements.GetInfo(btn4).Slices.ToArray(); } stack.Anchor = new Anchor(); stack.Anchor.Directions[AnchorDirection.Left] = AnchorType.Snap; stack.Anchor.Directions[AnchorDirection.Top] = AnchorType.Snap; stack.Anchor.Directions[AnchorDirection.Right] = AnchorType.Snap; stack.Anchor.Directions[AnchorDirection.Bottom] = AnchorType.Snap; stack.RightAnchorOffset = 5; stack.LeftAnchorOffset = 5; stack.TopAnchorOffset = 5; #endregion var image = new Hatzap.Gui.Widgets.Image(); var lblText = new Label(); Window window = new Window(); window.TextureRegion = guiElements.GetInfo(window).Slices.ToArray(); window.Position = new Vector2(1200, 600); window.Size = new Vector2(300, 200); window.TitleHeight = 20; window.TitleColor = new Vector4(79f / 255f / 0.5f, 193f / 255f / 0.5f, 233f / 255f / 0.5f, 1f); window.Color = new Vector4(1f / (210f / 255f), 1f / (210f / 255f), 1f / (210f / 255f), 1f); leftPanel.AddChildWidget(stack); mainGuiGrid.AddChildWidget(menuBar); mainGuiGrid.AddChildWidget(leftPanel); mainGuiGrid.AddChildWidget(bottomBar); GuiRoot.Root.AddWidget(mainGuiGrid); UserInput.Keyboard.CaptureText = true; modelShader = ShaderManager.Get("Model"); textShader = ShaderManager.Get("Text"); //Create a new importer AssimpContext importer = new AssimpContext(); //This is how we add a configuration (each config is its own class) //NormalSmoothingAngleConfig config = new NormalSmoothingAngleConfig(66.0f); //importer.SetConfig(config); var flags = PostProcessPreset.TargetRealTimeMaximumQuality | PostProcessSteps.Triangulate | PostProcessSteps.SortByPrimitiveType | PostProcessSteps.FlipUVs; //Import the model. All configs are set. The model //is imported, loaded into managed memory. Then the unmanaged memory is released, and everything is reset. Scene model = importer.ImportFile("Assets/Models/cube.fbx", flags); mesh = new Hatzap.Models.Mesh(); Assimp.Mesh aMesh = null; foreach (var item in model.Meshes) { if (item.PrimitiveType != Assimp.PrimitiveType.Triangle) continue; aMesh = item; break; } if (aMesh != null) { //mesh.AssimpMesh = aMesh; } else { Debug.WriteLine("ERROR: No triangle meshes found in imported model."); } //End of example importer.Dispose(); TextureMeta shipTextureMeta = new TextureMeta() { FileName = "Assets/Textures/sh3.jpg,Assets/Textures/sh3_n.png,Assets/Textures/sh3_s.jpg", PixelInternalFormat = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext, PixelFormat = PixelFormat.Bgra, PixelType = PixelType.UnsignedByte, Width = 1024, Height = 1024, Quality = new TextureQuality() { Filtering = TextureFiltering.Trilinear, Anisotrophy = 32, Mipmaps = true, TextureWrapMode_S = OpenTK.Graphics.OpenGL.TextureWrapMode.Repeat, TextureWrapMode_T = OpenTK.Graphics.OpenGL.TextureWrapMode.Repeat } }; shipTexture = new TextureArray(); shipTexture.Load(shipTextureMeta); font = FontManager.Get("OpenSans-Regular"); fpsText = new GuiText(); fpsText.Font = font; fpsText.FontSize = 8f; fpsText.Weight = 1.2f; fpsText.Smooth = 2.5f; fpsText.LineHeight = 50.0f; fpsText.Color = new Vector4(1, 1, 1, 1); fpsText.Text = "FPS: Calculating.."; int n = 5; int sizeScale = 7; var rand = new Hatzap.Utilities.Random(); for (int x = -n; x <= n; x++) { for (int y = -n; y <= n; y++) { Hatzap.Models.Material spaceShipMaterial = new Hatzap.Models.Material(); bool transparent = rand.NextDouble() < 0.5; float transparency = (float)rand.NextDouble(); transparency += 0.05f; if (!(transparency < 1.0f)) { transparency = 1.0f; transparent = false; } spaceShipMaterial.Transparent = transparent; spaceShipMaterial.UniformData = new List<IUniformData> { new UniformDataVector4() { Name = "Color", Data = new Vector4((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble(), transparency) } }; for (int z = -n; z <= n; z++) { var spaceShip = new Model(); spaceShip.Texture = shipTexture; //spaceShip.Shader = ShaderManager.Get("Textureless"); spaceShip.Shader = ShaderManager.Get("Model"); spaceShip.Mesh = mesh; spaceShip.Transform.Static = true; spaceShip.Transform.Position = new Vector3((x + (float)(rand.NextDouble() - 0.5)) * sizeScale, (y + (float)(rand.NextDouble() - 0.5)) * sizeScale, (z + (float)(rand.NextDouble() - 0.5)) * sizeScale); spaceShip.Transform.Rotation = Quaternion.FromEulerAngles(x * 360.0f / n / (float)Math.PI, y * 360.0f / n / (float)Math.PI, z * 360.0f / n / (float)Math.PI); spaceShip.Material = spaceShipMaterial; SceneManager.Insert(spaceShip); } } } Debug.WriteLine("OnLoad() ends"); base.OnLoad(e); }
public override void Load(byte[] rawBytes, TextureMeta meta) { if (meta.Type != TextureType.TextureCubemap) { throw new ArgumentException("Texture type must be TextureCubemap. CubeTexture class does not support loading other types."); } Width = meta.Width; Height = meta.Height; PixelInternalFormat = meta.PixelInternalFormat; int levels = 1; if (meta.PreMipmapped) { int size = Math.Max(Width, Height); levels += (int)Math.Floor(Math.Log(size, 2)); } Bind(); int bpp = 0; int w = Width; int h = Height; if (!meta.Precompressed) { bpp = GetBpp(meta.PixelFormat); if (bpp == 0) throw new NotImplementedException("The selected PixelFormat used for loading texture to file not yet supported."); } int srcOffset = 0; GL.TexParameter(TextureTarget, TextureParameterName.TextureMaxLevel, levels - 1); for (int i = 0; i < levels; i++) { // How many bytes on this level? int amount = w * h * bpp; // Copy bytes to separate buffer var levelBytes = new byte[amount]; for (var direction = 0; direction < 6; direction++ ) { Array.Copy(rawBytes, srcOffset, levelBytes, 0, amount); //Buffer.BlockCopy(rawBytes, srcOffset, levelBytes, 0, amount); // Upload bytes to the GPU TextureTarget directionTarget; switch (direction) { case 0: directionTarget = TextureTarget.TextureCubeMapNegativeX; break; case 1: directionTarget = TextureTarget.TextureCubeMapNegativeY; break; case 2: directionTarget = TextureTarget.TextureCubeMapNegativeZ; break; case 3: directionTarget = TextureTarget.TextureCubeMapPositiveX; break; case 4: directionTarget = TextureTarget.TextureCubeMapPositiveY; break; case 5: directionTarget = TextureTarget.TextureCubeMapPositiveZ; break; default: goto case 0; } GL.TexImage2D(directionTarget, i, this.PixelInternalFormat, w, h, 0, meta.PixelFormat, meta.PixelType, levelBytes); // Move offse srcOffset += amount; } // Calculate next size w = w > 1 ? w / 2 : 1; h = h > 1 ? h / 2 : 1; } Quality.PregeneratedMipmaps = true; }
public CubeTexture(TextureMeta meta) : base(meta) { }
public TextureArray(TextureMeta meta) : base(meta) { this.TextureTarget = TextureTarget.Texture2DArray; Depth = meta.Depth; }