diff --git a/ClassicalSharp/2D/Drawing/IsometricBlockDrawer.cs b/ClassicalSharp/2D/Drawing/IsometricBlockDrawer.cs deleted file mode 100644 index 0300497df..000000000 --- a/ClassicalSharp/2D/Drawing/IsometricBlockDrawer.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using ClassicalSharp.GraphicsAPI; -using ClassicalSharp.Model; -using OpenTK; - -namespace ClassicalSharp { - - public static class IsometricBlockDrawer { - - static BlockInfo info; - static ModelCache cache; - static TerrainAtlas2D atlas; - static int index; - static float scale; - static Vector3 minBB, maxBB; - const float invElemSize = TerrainAtlas2D.invElementSize; - static bool fullBright; - - static FastColour colNormal, colXSide, colZSide, colYBottom; - static float cosX, sinX, cosY, sinY; - static IsometricBlockDrawer() { - colNormal = FastColour.White; - FastColour.GetShaded( colNormal, ref colXSide, ref colZSide, ref colYBottom ); - - cosX = (float)Math.Cos( 26.565f * Utils.Deg2Rad ); - sinX = (float)Math.Sin( 26.565f * Utils.Deg2Rad ); - cosY = (float)Math.Cos( -45f * Utils.Deg2Rad ); - sinY = (float)Math.Sin( -45f * Utils.Deg2Rad ); - } - - public static void Draw( Game game, byte block, float size, float x, float y ) { - info = game.BlockInfo; - cache = game.ModelCache; - atlas = game.TerrainAtlas; - minBB = info.MinBB[block]; - maxBB = info.MaxBB[block]; - fullBright = info.FullBright[block]; - if( info.IsSprite[block] ) { - minBB = Vector3.Zero; maxBB = Vector3.One; - } - if( info.IsAir[block] ) return; - index = 0; - - // isometric coords size: cosY * -scale - sinY * scale - // we need to divide by (2 * cosY), as the calling function expects size to be in pixels. - scale = size / (2 * cosY); - // screen to isometric coords (cos(-x) = cos(x), sin(-x) = -sin(x)) - pos.X = x; pos.Y = y; pos.Z = 0; - pos = Utils.RotateY( Utils.RotateX( pos, cosX, -sinX ), cosY, -sinY ); - - if( info.IsSprite[block] ) { - XQuad( block, 0f, TileSide.Right ); - ZQuad( block, 0f, TileSide.Back ); - } else { - XQuad( block, Make( maxBB.X ), TileSide.Left ); - ZQuad( block, Make( minBB.Z ), TileSide.Back ); - YQuad( block, Make( maxBB.Y ), TileSide.Top ); - } - - for( int i = 0; i < index; i++ ) - TransformVertex( ref cache.vertices[i] ); - game.Graphics.UpdateDynamicIndexedVb( DrawMode.Triangles, cache.vb, - cache.vertices, index, index * 6 / 4 ); - } - - static void TransformVertex( ref VertexPos3fTex2fCol4b vertex ) { - Vector3 p = new Vector3( vertex.X, vertex.Y, vertex.Z ); - //p = Utils.RotateY( p - pos, time ) + pos; - // See comment in IGraphicsApi.Draw2DTexture() - p.X -= 0.5f; p.Y -= 0.5f; - p = Utils.RotateX( Utils.RotateY( p, cosY, sinY ), cosX, sinX ); - vertex.X = p.X; vertex.Y = p.Y; vertex.Z = p.Z; - } - - static Vector3 pos = Vector3.Zero; - static void YQuad( byte block, float y, int side ) { - int texId = info.GetTextureLoc( block, side ); - TextureRec rec = atlas.GetTexRec( texId ); - FastColour col = colNormal; - float uOrigin = rec.U1, vOrigin = rec.V1; - - rec.U1 = uOrigin + minBB.Z * invElemSize; - rec.U2 = uOrigin + maxBB.Z * invElemSize * 15.99f/16f; - rec.V1 = vOrigin + minBB.X * invElemSize; - rec.V2 = vOrigin + maxBB.X * invElemSize * 15.99f/16f; - - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( minBB.X ), pos.Y + y, - pos.Z + Make( minBB.Z ), rec.U2, rec.V2, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( minBB.X ), pos.Y + y, - pos.Z + Make( maxBB.Z ), rec.U1, rec.V2, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( maxBB.X ), pos.Y + y, - pos.Z + Make( maxBB.Z ), rec.U1, rec.V1, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( maxBB.X ), pos.Y + y, - pos.Z + Make( minBB.Z ), rec.U2, rec.V1, col ); - } - - static void ZQuad( byte block, float z, int side ) { - int texId = info.GetTextureLoc( block, side ); - TextureRec rec = atlas.GetTexRec( texId ); - FastColour col = fullBright ? colNormal : colZSide; - float uOrigin = rec.U1, vOrigin = rec.V1; - - rec.U1 = uOrigin + minBB.X * invElemSize; - rec.U2 = uOrigin + maxBB.X * invElemSize * 15.99f/16f; - rec.V1 = vOrigin + (1 - maxBB.Y) * invElemSize; - rec.V2 = vOrigin + (1 - minBB.Y) * invElemSize; - - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( minBB.X ), pos.Y + Make( minBB.Y ), - pos.Z + z, rec.U2, rec.V2, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( minBB.X ), pos.Y + Make( maxBB.Y ), - pos.Z + z, rec.U2, rec.V1, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( maxBB.X ), pos.Y + Make( maxBB.Y ), - pos.Z + z, rec.U1, rec.V1, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + Make( maxBB.X ), pos.Y + Make( minBB.Y ), - pos.Z + z, rec.U1, rec.V2, col ); - } - - static float Make( float value ) { - return scale - (scale * value * 2); - } - - static void XQuad( byte block, float x, int side ) { - int texId = info.GetTextureLoc( block, side ); - TextureRec rec = atlas.GetTexRec( texId ); - FastColour col = fullBright ? colNormal : colXSide; - float uOrigin = rec.U1, vOrigin = rec.V1; - - rec.U1 = uOrigin + minBB.Z * invElemSize; - rec.U2 = uOrigin + maxBB.Z * invElemSize * 15.99f/16f; - rec.V1 = vOrigin + (1 - maxBB.Y) * invElemSize; - rec.V2 = vOrigin + (1 - minBB.Y) * invElemSize * 15.99f/16f; - - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + x, pos.Y + Make( minBB.Y ), - pos.Z + Make( minBB.Z ), rec.U2, rec.V2, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + x, pos.Y + Make( maxBB.Y ), - pos.Z + Make( minBB.Z ), rec.U2, rec.V1, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + x, pos.Y + Make( maxBB.Y ), - pos.Z + Make( maxBB.Z ), rec.U1, rec.V1, col ); - cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + x, pos.Y + Make( minBB.Y ), - pos.Z + Make( maxBB.Z ), rec.U1, rec.V2, col ); - } - } -} \ No newline at end of file diff --git a/ClassicalSharp/2D/Utils/FastBitmap.cs b/ClassicalSharp/2D/Utils/FastBitmap.cs index cd55c77e6..e6987ea2d 100644 --- a/ClassicalSharp/2D/Utils/FastBitmap.cs +++ b/ClassicalSharp/2D/Utils/FastBitmap.cs @@ -1,10 +1,11 @@ // ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT using System; using System.Drawing; -using System.Drawing.Imaging; #if ANDROID using Android.Graphics; using Java.Nio; +#else +using System.Drawing.Imaging; #endif namespace ClassicalSharp { @@ -40,7 +41,11 @@ namespace ClassicalSharp { public Bitmap Bitmap; public bool ReadOnly; + #if !ANDROID BitmapData data; + #else + ByteBuffer data; + #endif byte* scan0Byte; public bool IsLocked { get { return data != null; } } diff --git a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs index 0ee4209f0..6a9e88f3e 100644 --- a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs +++ b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs @@ -1,8 +1,12 @@ // ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT using System; using System.Drawing; -using System.Drawing.Imaging; using OpenTK; +#if ANDROID +using Android.Graphics; +#else +using System.Drawing.Imaging; +#endif namespace ClassicalSharp.GraphicsAPI { diff --git a/ClassicalSharp/GraphicsAPI/OpenGLESApi.cs b/ClassicalSharp/GraphicsAPI/OpenGLESApi.cs index 091c511e9..f6a1cbf2e 100644 --- a/ClassicalSharp/GraphicsAPI/OpenGLESApi.cs +++ b/ClassicalSharp/GraphicsAPI/OpenGLESApi.cs @@ -213,7 +213,7 @@ namespace ClassicalSharp.GraphicsAPI { GL.DrawElements( modeMappings[(int)mode], indicesCount, indexType, zero ); } - public override void SetDynamicVbData( DrawMode mode, int id, T[] vertices, int count ) { + public override void SetDynamicVbData( int id, T[] vertices, int count ) { GL.BindBuffer( All.ArrayBuffer, id ); GL.BufferSubData( All.ArrayBuffer, IntPtr.Zero, new IntPtr( count * batchStride ), vertices ); } @@ -335,18 +335,17 @@ namespace ClassicalSharp.GraphicsAPI { #endregion - public override void BeginFrame( AndroidGameView game ) { + public override void BeginFrame( Game game ) { } - public override void EndFrame( AndroidGameView game ) { - game.SwapBuffers(); + public override void EndFrame( Game game ) { + game.window.SwapBuffers(); } - public override void SetVSync( AndroidGameView game, bool value ) { + public override void SetVSync( Game game, bool value ) { //game.VSync = value; TODO: vsync } - bool isIntelRenderer; protected override void MakeApiInfo() { string vendor = GL.GetString( All.Vendor ); string renderer = GL.GetString( All.Renderer ); @@ -362,18 +361,10 @@ namespace ClassicalSharp.GraphicsAPI { "Max 2D texture dimensions: " + MaxTextureDimensions, "Depth buffer bits: " + depthBits, }; - isIntelRenderer = renderer.Contains( "Intel" ); } - public override void WarnIfNecessary( Chat chat ) { - if( !isIntelRenderer ) return; - - chat.Add( "&cIntel graphics cards are known to have issues with the OpenGL build." ); - chat.Add( "&cVSync may not work, and you may see disappearing clouds and map edges." ); - chat.Add( " " ); - chat.Add( "&cFor Windows, try downloading the Direct3D 9 build as it doesn't have" ); - chat.Add( "&cthese problems. Alternatively, the disappearing graphics can be" ); - chat.Add( "&cpartially fixed by typing \"/client render legacy\" into chat." ); + public override bool WarnIfNecessary( Chat chat ) { + return false; } // Based on http://www.opentk.com/doc/graphics/save-opengl-rendering-to-disk @@ -395,7 +386,7 @@ namespace ClassicalSharp.GraphicsAPI { } } - public override void OnWindowResize( AndroidGameView game ) { + public override void OnWindowResize( Game game ) { GL.Viewport( 0, 0, game.Width, game.Height ); } diff --git a/ClassicalSharp/TexturePack/TextureCache.cs b/ClassicalSharp/TexturePack/TextureCache.cs index 05ef5c118..2cddf6f30 100644 --- a/ClassicalSharp/TexturePack/TextureCache.cs +++ b/ClassicalSharp/TexturePack/TextureCache.cs @@ -1,11 +1,12 @@ // ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT using System; using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.Text; #if ANDROID using Android.Graphics; +#else +using System.Drawing.Imaging; #endif namespace ClassicalSharp.TexturePack {