diff --git a/ClassicalSharp/2D/IsometricBlockDrawer.cs b/ClassicalSharp/2D/IsometricBlockDrawer.cs index 0dd768eff..ab1e10b74 100644 --- a/ClassicalSharp/2D/IsometricBlockDrawer.cs +++ b/ClassicalSharp/2D/IsometricBlockDrawer.cs @@ -57,8 +57,7 @@ namespace ClassicalSharp { Vector3 pos = new Vector3( vertex.X, vertex.Y, vertex.Z ); #if USE_DX // See comment in IGraphicsApi.Draw2DTexture() - pos.X -= 0.5f; - pos.Y -= 0.5f; + pos.X -= 0.5f; pos.Y -= 0.5f; #endif pos = Utils.RotateX( Utils.RotateY( pos, cosY, sinY ), cosX, sinX ); vertex.X = pos.X; vertex.Y = pos.Y; vertex.Z = pos.Z; @@ -67,7 +66,7 @@ namespace ClassicalSharp { static Vector3 pos = Vector3.Zero; static void DrawYFace( byte block, float y, int side ) { int texId = info.GetTextureLoc( block, side ); - TextureRectangle rec = atlas.GetTexRec( texId ); + TextureRec rec = atlas.GetTexRec( texId ); FastColour col = colNormal; cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X - scale, pos.Y - y, @@ -82,7 +81,7 @@ namespace ClassicalSharp { static void DrawZFace( byte block, float z, int side ) { int texId = info.GetTextureLoc( block, side ); - TextureRectangle rec = atlas.GetTexRec( texId ); + TextureRec rec = atlas.GetTexRec( texId ); if( blockHeight != 1 ) rec.V2 = rec.V1 + blockHeight * TerrainAtlas2D.invElementSize; FastColour col = colZSide; @@ -99,7 +98,7 @@ namespace ClassicalSharp { static void DrawXFace( byte block, float x, int side ) { int texId = info.GetTextureLoc( block, side ); - TextureRectangle rec = atlas.GetTexRec( texId ); + TextureRec rec = atlas.GetTexRec( texId ); if( blockHeight != 1 ) rec.V2 = rec.V1 + blockHeight * TerrainAtlas2D.invElementSize; FastColour col = colXSide; diff --git a/ClassicalSharp/2D/Screens/ChatScreen.cs b/ClassicalSharp/2D/Screens/ChatScreen.cs index 6a0d87229..e49bb0965 100644 --- a/ClassicalSharp/2D/Screens/ChatScreen.cs +++ b/ClassicalSharp/2D/Screens/ChatScreen.cs @@ -54,7 +54,7 @@ namespace ClassicalSharp { announcementFont = new Font( "Arial", 14 ); textInput = new TextInputWidget( game, chatFont, chatInputFont ); - textInput.ChatInputYOffset = ChatInputYOffset; + textInput.YOffset = ChatInputYOffset; status = new TextGroupWidget( game, 3, chatFont ); status.VerticalDocking = Docking.LeftOrTop; status.HorizontalDocking = Docking.BottomOrRight; diff --git a/ClassicalSharp/2D/Screens/FpsScreen.cs b/ClassicalSharp/2D/Screens/FpsScreen.cs index 1fc27a208..c7f91ceb3 100644 --- a/ClassicalSharp/2D/Screens/FpsScreen.cs +++ b/ClassicalSharp/2D/Screens/FpsScreen.cs @@ -1,25 +1,32 @@ using System; using System.Drawing; +using ClassicalSharp.GraphicsAPI; namespace ClassicalSharp { public class FpsScreen : Screen { - readonly Font font; + readonly Font font, posFont; StringBuffer text; + public FpsScreen( Game game ) : base( game ) { font = new Font( "Arial", 13 ); + posFont = new Font( "Arial", 12, FontStyle.Italic ); text = new StringBuffer( 96 ); } - TextWidget fpsTextWidget; - + TextWidget fpsTextWidget, hackStatesWidget; + Texture posTexture; public override void Render( double delta ) { UpdateFPS( delta ); - if( game.HideGui ) return; + if( game.HideGui || !game.ShowFPS ) return; graphicsApi.Texturing = true; fpsTextWidget.Render( delta ); + UpdateHackState( false ); + + DrawPosition(); + hackStatesWidget.Render( delta ); graphicsApi.Texturing = false; } @@ -51,11 +58,127 @@ namespace ClassicalSharp { fpsTextWidget = new TextWidget( game, font ); fpsTextWidget.Init(); fpsTextWidget.SetText( "FPS: no data yet" ); + MakePosTextWidget(); + + hackStatesWidget = new TextWidget( game, posFont ); + hackStatesWidget.YOffset = fpsTextWidget.Height + posHeight; + hackStatesWidget.Init(); + UpdateHackState( true ); } public override void Dispose() { font.Dispose(); + posFont.Dispose(); fpsTextWidget.Dispose(); + graphicsApi.DeleteTexture( ref posTexture ); + } + + void DrawPosition() { + int index = 0; + TextureRec xy = new TextureRec( 0, posTexture.Y1, baseWidth, posTexture.Height ); + TextureRec uv = new TextureRec( 0, 0, posTexture.U2, posTexture.V2 ); + IGraphicsApi.MakeQuad( xy, uv, game.ModelCache.vertices, ref index ); + + Vector3I pos = Vector3I.Floor( game.LocalPlayer.Position ); + curX = baseWidth; + AddChar( 13, ref index ); + AddInt( pos.X, ref index, true ); + AddInt( pos.Y, ref index, true ); + AddInt( pos.Z, ref index, false ); + AddChar( 14, ref index ); + + graphicsApi.BindTexture( posTexture.ID ); + graphicsApi.DrawDynamicIndexedVb( DrawMode.Triangles, + game.ModelCache.vb, game.ModelCache.vertices, index, index * 6 / 4 ); + } + + bool speeding, noclip, fly; + void UpdateHackState( bool force ) { + LocalPlayer p = game.LocalPlayer; + if( force || p.speeding != speeding || p.noClip != noclip || p.flying != fly ) { + speeding = p.speeding; noclip = p.noClip; fly = p.flying; + int index = 0; + text.Clear(); + + if( fly ) text.Append( ref index, "Fly ON " ); + if( speeding ) text.Append( ref index, "Speed ON " ); + if( noclip ) text.Append( ref index, "Noclip ON " ); + hackStatesWidget.SetText( text.GetString() ); + } + } + + const string possibleChars = "0123456789-, ()"; + int[] widths = new int[possibleChars.Length]; + int baseWidth, curX, posHeight; + float texWidth; + void MakePosTextWidget() { + DrawTextArgs args = new DrawTextArgs( "Feet pos: ", true ); + for( int i = 0; i < possibleChars.Length; i++ ) { + string text = new String( possibleChars[i], 1 ); + widths[i] = game.Drawer2D.MeasureSize( text, posFont, true ).Width; + } + + using( IDrawer2D drawer = game.Drawer2D ) { + Size size = game.Drawer2D.MeasureSize( args.Text, posFont, true ); + baseWidth = size.Width; + size.Width += 16 * possibleChars.Length; + posHeight = size.Height; + + using( Bitmap bmp = IDrawer2D.CreatePow2Bitmap( size ) ) { + drawer.SetBitmap( bmp ); + drawer.DrawText( posFont, ref args, 0, 0 ); + + for( int i = 0; i < possibleChars.Length; i++ ) { + args.Text = new String( possibleChars[i], 1 ); + drawer.DrawText( posFont, ref args, baseWidth + 16 * i, 0 ); + } + + int y = fpsTextWidget.Height; + posTexture = drawer.Make2DTexture( bmp, size, 0, y ); + posTexture.U2 = (float)baseWidth / bmp.Width; + posTexture.Width = baseWidth; + texWidth = bmp.Width; + } + } + } + + + void AddChar( int charIndex, ref int index ) { + int width = widths[charIndex]; + TextureRec xy = new TextureRec( curX, posTexture.Y1, width, posTexture.Height ); + TextureRec uv = new TextureRec( (baseWidth + charIndex * 16) / texWidth, 0, width / texWidth, posTexture.V2 ); + + curX += width; + IGraphicsApi.MakeQuad( xy, uv, game.ModelCache.vertices, ref index ); + } + + void AddInt( int value, ref int index, bool more ) { + if( value < 0 ) + AddChar( 10, ref index ); + + int count = 0; + value = Reverse( Math.Abs( value ), out count ); + for( int i = 0; i < count; i++ ) { + AddChar( value % 10, ref index ); value /= 10; + } + + if( more ) + AddChar( 11, ref index ); + } + + static int Reverse( int value, out int count ) { + int orig = value, reversed = 0; + count = 1; value /= 10; + while( value > 0 ) { + count++; value /= 10; + } + + for( int i = 0; i < count; i++ ) { + reversed *= 10; + reversed += orig % 10; + orig /= 10; + } + return reversed; } } } diff --git a/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs index 47e6dccaa..5d7060ff7 100644 --- a/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs @@ -14,9 +14,9 @@ namespace ClassicalSharp { INetworkProcessor network = game.Network; buttons = new ButtonWidget[] { - Make( -140, -50, "Use animations", Docking.Centre, OnWidgetClick, - g => g.Animations.Enabled ? "yes" : "no", - (g, v) => g.Animations.Enabled = v == "yes" ), + Make( -140, -50, "Show FPS", Docking.Centre, OnWidgetClick, + g => g.ShowFPS ? "yes" : "no", + (g, v) => g.ShowFPS = v == "yes" ), Make( -140, 0, "View distance", Docking.Centre, OnWidgetClick, g => g.ViewDistance.ToString(), diff --git a/ClassicalSharp/2D/Screens/NormalScreen.cs b/ClassicalSharp/2D/Screens/NormalScreen.cs index 56cb24dec..6b869664b 100644 --- a/ClassicalSharp/2D/Screens/NormalScreen.cs +++ b/ClassicalSharp/2D/Screens/NormalScreen.cs @@ -74,7 +74,7 @@ namespace ClassicalSharp { public override void Init() { playerFont = new Font( "Arial", 12 ); chat = new ChatScreen( game ); - const int blockSize = 32; + const int blockSize = 40; chat.ChatLogYOffset = blockSize + blockSize; chat.ChatInputYOffset = blockSize + blockSize / 2; chat.Init(); diff --git a/ClassicalSharp/2D/Texture.cs b/ClassicalSharp/2D/Texture.cs index 929fd03c0..dff2430b3 100644 --- a/ClassicalSharp/2D/Texture.cs +++ b/ClassicalSharp/2D/Texture.cs @@ -15,7 +15,7 @@ namespace ClassicalSharp { : this( id, x, y, width, height, 0, u2, 0, v2 ) { } - public Texture( int id, int x, int y, int width, int height, TextureRectangle rec ) + public Texture( int id, int x, int y, int width, int height, TextureRec rec ) : this( id, x, y, width, height, rec.U1, rec.U2, rec.V1, rec.V2 ) { } diff --git a/ClassicalSharp/2D/Widgets/TextInputWidget.cs b/ClassicalSharp/2D/Widgets/TextInputWidget.cs index c7561ef8f..a39dde0f0 100644 --- a/ClassicalSharp/2D/Widgets/TextInputWidget.cs +++ b/ClassicalSharp/2D/Widgets/TextInputWidget.cs @@ -20,7 +20,7 @@ namespace ClassicalSharp { Color backColour = Color.FromArgb( 120, 60, 60, 60 ); int caretPos = -1; int typingLogPos = 0; - public int ChatInputYOffset; + public int YOffset; internal StringBuffer chatInputText; readonly Font font, boldFont; @@ -57,7 +57,7 @@ namespace ClassicalSharp { void DrawString( Size size, string value, bool skipCheck ) { size.Height = Math.Max( size.Height, chatCaretTexture.Height ); - int y = game.Height - ChatInputYOffset - size.Height / 2; + int y = game.Height - YOffset - size.Height / 2; using( Bitmap bmp = IDrawer2D.CreatePow2Bitmap( size ) ) { using( IDrawer2D drawer = game.Drawer2D ) { diff --git a/ClassicalSharp/Blocks/BlockInfo.cs b/ClassicalSharp/Blocks/BlockInfo.cs index 1d5201797..432b57d30 100644 --- a/ClassicalSharp/Blocks/BlockInfo.cs +++ b/ClassicalSharp/Blocks/BlockInfo.cs @@ -28,7 +28,7 @@ namespace ClassicalSharp { /// Gets whether the given block blocks sunlight. public bool[] BlocksLight = new bool[BlocksCount]; - public bool[] EmitsLight = new bool[BlocksCount]; + public bool[] FullBright = new bool[BlocksCount]; public string[] Name = new string[BlocksCount]; @@ -90,8 +90,8 @@ namespace ClassicalSharp { MarkSprite( Block.Fire ); SetIsLiquid( Block.StillWater ); SetIsLiquid( Block.Water ); SetIsLiquid( Block.StillLava ); SetIsLiquid( Block.Lava ); - SetEmitsLight( Block.Lava, true ); SetEmitsLight( Block.StillLava, true ); - SetEmitsLight( Block.Magma, true ); SetEmitsLight( Block.Fire, true ); + SetFullBright( Block.Lava, true ); SetFullBright( Block.StillLava, true ); + SetFullBright( Block.Magma, true ); SetFullBright( Block.Fire, true ); SetupCullingCache(); } @@ -146,8 +146,8 @@ namespace ClassicalSharp { BlocksLight[(int)id] = blocks; } - void SetEmitsLight( Block id, bool emits ) { - EmitsLight[(int)id] = emits; + void SetFullBright( Block id, bool emits ) { + FullBright[(int)id] = emits; } public void ResetBlockInfo( byte id ) { @@ -158,7 +158,7 @@ namespace ClassicalSharp { IsLiquid[id] = false; Height[id] = 1; BlocksLight[id] = true; - EmitsLight[id] = false; + FullBright[id] = false; CullWithNeighbours[id] = true; Name[id] = "Invalid"; diff --git a/ClassicalSharp/Entities/LocalPlayer.cs b/ClassicalSharp/Entities/LocalPlayer.cs index 19ba53146..ecdee3863 100644 --- a/ClassicalSharp/Entities/LocalPlayer.cs +++ b/ClassicalSharp/Entities/LocalPlayer.cs @@ -189,7 +189,7 @@ namespace ClassicalSharp { Velocity.Y -= gravity; } - bool jumping, speeding, flying, noClip, flyingDown, flyingUp; + internal bool jumping, speeding, flying, noClip, flyingDown, flyingUp; public void ParseHackFlags( string name, string motd ) { string joined = name + motd; if( joined.Contains( "-hax" ) ) { diff --git a/ClassicalSharp/Entities/Particles/Particle.cs b/ClassicalSharp/Entities/Particles/Particle.cs index 3cf8ff201..20f50f8ae 100644 --- a/ClassicalSharp/Entities/Particles/Particle.cs +++ b/ClassicalSharp/Entities/Particles/Particle.cs @@ -7,7 +7,7 @@ namespace ClassicalSharp.Particles { public Vector3 Position; public Vector3 Velocity; - public TextureRectangle Rectangle; + public TextureRec Rectangle; public float Lifetime; protected Game game; protected Vector3 lastPos, nextPos; @@ -16,7 +16,7 @@ namespace ClassicalSharp.Particles { public abstract void Dispose(); - public Particle( Game game, Vector3 pos, Vector3 velocity, double lifetime, TextureRectangle rec ) { + public Particle( Game game, Vector3 pos, Vector3 velocity, double lifetime, TextureRec rec ) { this.game = game; Position = lastPos = nextPos = pos; Velocity = velocity; diff --git a/ClassicalSharp/Entities/Particles/ParticleManager.cs b/ClassicalSharp/Entities/Particles/ParticleManager.cs index 0c0463a52..c9f90d669 100644 --- a/ClassicalSharp/Entities/Particles/ParticleManager.cs +++ b/ClassicalSharp/Entities/Particles/ParticleManager.cs @@ -60,7 +60,7 @@ namespace ClassicalSharp.Particles { public void BreakBlockEffect( Vector3I position, byte block ) { Vector3 startPos = new Vector3( position.X, position.Y, position.Z ); int texLoc = game.BlockInfo.GetTextureLoc( block, TileSide.Left ); - TextureRectangle rec = game.TerrainAtlas.GetTexRec( texLoc ); + TextureRec rec = game.TerrainAtlas.GetTexRec( texLoc ); float invSize = TerrainAtlas2D.invElementSize; int cellsCountX = (int)( 0.25f / invSize ); @@ -78,7 +78,7 @@ namespace ClassicalSharp.Particles { double yOffset = rnd.NextDouble() - 0.125; double zOffset = rnd.NextDouble() - 0.125; Vector3 pos = startPos + new Vector3( (float)xOffset, (float)yOffset, (float)zOffset ); - TextureRectangle particleRec = rec; + TextureRec particleRec = rec; particleRec.U1 = (float)( rec.U1 + rnd.Next( 0, cellsCountX ) * elementXSize ); particleRec.V1 = (float)( rec.V1 + rnd.Next( 0, cellsCountY ) * elementYSize ); particleRec.U2 = particleRec.U1 + elementXSize; diff --git a/ClassicalSharp/Entities/Particles/TerrainParticle.cs b/ClassicalSharp/Entities/Particles/TerrainParticle.cs index daf8617ae..4e9400605 100644 --- a/ClassicalSharp/Entities/Particles/TerrainParticle.cs +++ b/ClassicalSharp/Entities/Particles/TerrainParticle.cs @@ -8,7 +8,7 @@ namespace ClassicalSharp.Particles { const float gravity = 3.4f; static Vector2 terrainSize = new Vector2( 1/8f, 1/8f ); - public TerrainParticle( Game game, Vector3 pos, Vector3 velocity, double lifetime, TextureRectangle rec ) + public TerrainParticle( Game game, Vector3 pos, Vector3 velocity, double lifetime, TextureRec rec ) : base( game, pos, velocity, lifetime, rec ) { } diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs index 2248e8cc9..fb3f5fbbc 100644 --- a/ClassicalSharp/Game/Game.cs +++ b/ClassicalSharp/Game/Game.cs @@ -67,7 +67,7 @@ namespace ClassicalSharp { public AsyncDownloader AsyncDownloader; public Matrix4 View, Projection; public int MouseSensitivity = 30; - public bool HideGui = false; + public bool HideGui = false, ShowFPS = true; public Animations Animations; internal int CloudsTextureId, RainTextureId, SnowTextureId; internal bool screenshotRequested; diff --git a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs index 60ee7ad23..e196597c6 100644 --- a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs +++ b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs @@ -208,10 +208,8 @@ namespace ClassicalSharp.GraphicsAPI { #if USE_DX // NOTE: see "https://msdn.microsoft.com/en-us/library/windows/desktop/bb219690(v=vs.85).aspx", // i.e. the msdn article called "Directly Mapping Texels to Pixels (Direct3D 9)" for why we have to do this. - x1 -= 0.5f; - x2 -= 0.5f; - y1 -= 0.5f; - y2 -= 0.5f; + x1 -= 0.5f; x2 -= 0.5f; + y1 -= 0.5f; y2 -= 0.5f; #endif texVerts[0] = new VertexPos3fTex2fCol4b( x1, y1, 0, tex.U1, tex.V1, col ); texVerts[1] = new VertexPos3fTex2fCol4b( x2, y1, 0, tex.U2, tex.V1, col ); @@ -221,6 +219,19 @@ namespace ClassicalSharp.GraphicsAPI { DrawDynamicIndexedVb( DrawMode.Triangles, texVb, texVerts, 4, 6 ); } + public static void MakeQuad( TextureRec xy, TextureRec uv, + VertexPos3fTex2fCol4b[] vertices, ref int index ) { + float x1 = xy.U1, y1 = xy.V1, x2 = xy.U2, y2 = xy.V2; + #if USE_DX + x1 -= 0.5f; x2 -= 0.5f; + y1 -= 0.5f; y2 -= 0.5f; + #endif + vertices[index++] = new VertexPos3fTex2fCol4b( x1, y1, 0, uv.U1, uv.V1, FastColour.White ); + vertices[index++] = new VertexPos3fTex2fCol4b( x2, y1, 0, uv.U2, uv.V1, FastColour.White ); + vertices[index++] = new VertexPos3fTex2fCol4b( x2, y2, 0, uv.U2, uv.V2, FastColour.White ); + vertices[index++] = new VertexPos3fTex2fCol4b( x1, y2, 0, uv.U1, uv.V2, FastColour.White ); + } + public void Draw2DTexture( ref Texture tex ) { Draw2DTexture( ref tex, FastColour.White ); } diff --git a/ClassicalSharp/Map/ChunkMeshBuilder.cs b/ClassicalSharp/Map/ChunkMeshBuilder.cs index af1e2077d..12fba2190 100644 --- a/ClassicalSharp/Map/ChunkMeshBuilder.cs +++ b/ClassicalSharp/Map/ChunkMeshBuilder.cs @@ -119,6 +119,7 @@ namespace ClassicalSharp { int index = ( ( yy << 8 ) + ( zz << 4 ) + xx ) * TileSide.Sides; if( info.IsSprite[tile] ) { + fullBright = info.FullBright[tile]; int count = counts[index + TileSide.Top]; if( count != 0 ) { blockHeight = info.Height[tile]; @@ -133,7 +134,7 @@ namespace ClassicalSharp { if( leftCount == 0 && rightCount == 0 && frontCount == 0 && backCount == 0 && bottomCount == 0 && topCount == 0 ) return; - emitsLight = info.EmitsLight[tile]; + fullBright = info.FullBright[tile]; blockHeight = info.Height[tile]; isTranslucent = info.IsTranslucent[tile]; @@ -181,7 +182,7 @@ namespace ClassicalSharp { } } else { X = x; Y = y; Z = z; - emitsLight = info.EmitsLight[tile]; + fullBright = info.FullBright[tile]; TestAndStretchZ( zz, countIndex, tile, chunkIndex, x, 0, TileSide.Left, -1 ); TestAndStretchZ( zz, countIndex, tile, chunkIndex, x, maxX, TileSide.Right, 1 ); TestAndStretchX( xx, countIndex, tile, chunkIndex, z, 0, TileSide.Front, -extChunkSize ); diff --git a/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs b/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs index a7fd29e26..8177a1213 100644 --- a/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs +++ b/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs @@ -9,7 +9,7 @@ namespace ClassicalSharp { DrawInfo[] drawInfoNormal, drawInfoTranslucent; TerrainAtlas1D atlas; int arraysCount = 0; - bool emitsLight; + bool fullBright; void TerrainAtlasChanged( object sender, EventArgs e ) { int newArraysCount = game.TerrainAtlas1D.TexIds.Length; @@ -71,22 +71,22 @@ namespace ClassicalSharp { bool IsLit( int x, int y, int z, int face ) { switch( face ) { case TileSide.Left: - return emitsLight || x <= 0 || y > map.heightmap[(z * width) + (x - 1)]; + return fullBright || x <= 0 || y > map.heightmap[(z * width) + (x - 1)]; case TileSide.Right: - return emitsLight || x >= maxX || y > map.heightmap[(z * width) + (x + 1)]; + return fullBright || x >= maxX || y > map.heightmap[(z * width) + (x + 1)]; case TileSide.Front: - return emitsLight || z <= 0 || y > map.heightmap[((z - 1) * width) + x]; + return fullBright || z <= 0 || y > map.heightmap[((z - 1) * width) + x]; case TileSide.Back: - return emitsLight || z >= maxZ || y > map.heightmap[((z + 1) * width) + x]; + return fullBright || z >= maxZ || y > map.heightmap[((z + 1) * width) + x]; case TileSide.Bottom: - return emitsLight || y <= 0 || (y - 1) > map.heightmap[(z * width) + x]; + return fullBright || y <= 0 || (y - 1) > map.heightmap[(z * width) + x]; case TileSide.Top: - return emitsLight || y >= maxY || y > map.heightmap[(z * width) + x]; + return fullBright || y >= maxY || y > map.heightmap[(z * width) + x]; } return true; } @@ -166,8 +166,8 @@ namespace ClassicalSharp { void DrawLeftFace( int count ) { int texId = info.GetTextureLoc( tile, TileSide.Left ); int i; - TextureRectangle rec = atlas.GetTexRec( texId, count, out i ); - FastColour col = emitsLight ? FastColour.White : + TextureRec rec = atlas.GetTexRec( texId, count, out i ); + FastColour col = fullBright ? FastColour.White : X > 0 ? (Y > map.heightmap[(Z * width) + (X - 1)] ? map.SunlightXSide : map.ShadowlightXSide) : map.SunlightXSide; if( blockHeight != 1 ) { rec.V2 = rec.V1 + blockHeight * invVerElementSize; @@ -183,8 +183,8 @@ namespace ClassicalSharp { void DrawRightFace( int count ) { int texId = info.GetTextureLoc( tile, TileSide.Right ); int i; - TextureRectangle rec = atlas.GetTexRec( texId, count, out i ); - FastColour col = emitsLight ? FastColour.White : + TextureRec rec = atlas.GetTexRec( texId, count, out i ); + FastColour col = fullBright ? FastColour.White : X < maxX ? (Y > map.heightmap[(Z * width) + (X + 1)] ? map.SunlightXSide : map.ShadowlightXSide) : map.SunlightXSide; if( blockHeight != 1 ) { rec.V2 = rec.V1 + blockHeight * invVerElementSize; @@ -200,8 +200,8 @@ namespace ClassicalSharp { void DrawBackFace( int count ) { int texId = info.GetTextureLoc( tile, TileSide.Back ); int i; - TextureRectangle rec = atlas.GetTexRec( texId, count, out i ); - FastColour col = emitsLight ? FastColour.White : + TextureRec rec = atlas.GetTexRec( texId, count, out i ); + FastColour col = fullBright ? FastColour.White : Z < maxZ ? (Y > map.heightmap[((Z + 1) * width) + X] ? map.SunlightZSide : map.ShadowlightZSide) : map.SunlightZSide; if( blockHeight != 1 ) { rec.V2 = rec.V1 + blockHeight * invVerElementSize; @@ -217,8 +217,8 @@ namespace ClassicalSharp { void DrawFrontFace( int count ) { int texId = info.GetTextureLoc( tile, TileSide.Front ); int i; - TextureRectangle rec = atlas.GetTexRec( texId, count, out i ); - FastColour col = emitsLight ? FastColour.White : + TextureRec rec = atlas.GetTexRec( texId, count, out i ); + FastColour col = fullBright ? FastColour.White : Z > 0 ? (Y > map.heightmap[((Z - 1) * width) + X] ? map.SunlightZSide : map.ShadowlightZSide) : map.SunlightZSide; if( blockHeight != 1 ) { rec.V2 = rec.V1 + blockHeight * invVerElementSize; @@ -234,9 +234,8 @@ namespace ClassicalSharp { void DrawBottomFace( int count ) { int texId = info.GetTextureLoc( tile, TileSide.Bottom ); int i; - TextureRectangle rec = atlas.GetTexRec( texId, count, out i ); - FastColour col = emitsLight ? FastColour.White : - Y > 0 ? ((Y - 1) > map.heightmap[(Z * width) + X] ? map.SunlightYBottom : map.ShadowlightYBottom) : map.SunlightYBottom; + TextureRec rec = atlas.GetTexRec( texId, count, out i ); + FastColour col = fullBright ? FastColour.White : ((Y - 1) > map.heightmap[(Z * width) + X] ? map.SunlightYBottom : map.ShadowlightYBottom); DrawInfo part = isTranslucent ? drawInfoTranslucent[i] : drawInfoNormal[i]; part.vertices[part.vIndex.bottom++] = new VertexPos3fTex2fCol4b( X + count, Y, Z + 1, rec.U2, rec.V2, col ); @@ -248,9 +247,8 @@ namespace ClassicalSharp { void DrawTopFace( int count ) { int texId = info.GetTextureLoc( tile, TileSide.Top ); int i; - TextureRectangle rec = atlas.GetTexRec( texId, count, out i ); - FastColour col = emitsLight ? FastColour.White : - Y < maxY ? (Y > map.heightmap[(Z * width) + X] ? map.Sunlight : map.Shadowlight) : map.Sunlight; + TextureRec rec = atlas.GetTexRec( texId, count, out i ); + FastColour col = fullBright ? FastColour.White : (Y > map.heightmap[(Z * width) + X] ? map.Sunlight : map.Shadowlight); DrawInfo part = isTranslucent ? drawInfoTranslucent[i] : drawInfoNormal[i]; part.vertices[part.vIndex.top++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z, rec.U2, rec.V1, col ); @@ -262,9 +260,8 @@ namespace ClassicalSharp { void DrawSprite( int count ) { int texId = info.GetTextureLoc( tile, TileSide.Right ); int i; - TextureRectangle rec = atlas.GetTexRec( texId, 1, out i ); - FastColour col = Y < maxY ? (emitsLight || Y > map.heightmap[(Z * width) + X] ? map.Sunlight : map.Shadowlight) - : map.Sunlight; + TextureRec rec = atlas.GetTexRec( texId, 1, out i ); + FastColour col = fullBright ? FastColour.White : (Y > map.heightmap[(Z * width) + X] ? map.Sunlight : map.Shadowlight); DrawInfo part = drawInfoNormal[i]; // Draw Z axis diff --git a/ClassicalSharp/Model/BlockModel.cs b/ClassicalSharp/Model/BlockModel.cs index a1531b0a8..2a64e873b 100644 --- a/ClassicalSharp/Model/BlockModel.cs +++ b/ClassicalSharp/Model/BlockModel.cs @@ -63,7 +63,7 @@ namespace ClassicalSharp.Model { void DrawYFace( float y, int side ) { int texId = BlockInfo.GetTextureLoc( block, side ); - TextureRectangle rec = atlas.GetTexRec( texId ); + TextureRec rec = atlas.GetTexRec( texId ); cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + -0.5f, pos.Y + y, pos.Z + -0.5f, rec.U1, rec.V1, col ); cache.vertices[index++] = new VertexPos3fTex2fCol4b( pos.X + 0.5f, pos.Y + y, pos.Z + -0.5f, rec.U2, rec.V1, col ); @@ -73,7 +73,7 @@ namespace ClassicalSharp.Model { void DrawZFace( float z, int side, bool swapU ) { int texId = BlockInfo.GetTextureLoc( block, side ); - TextureRectangle rec = atlas.GetTexRec( texId ); + TextureRec rec = atlas.GetTexRec( texId ); if( blockHeight != 1 ) { rec.V2 = rec.V1 + blockHeight * TerrainAtlas2D.invElementSize; } @@ -87,7 +87,7 @@ namespace ClassicalSharp.Model { void DrawXFace( float x, int side, bool swapU ) { int texId = BlockInfo.GetTextureLoc( block, side ); - TextureRectangle rec = atlas.GetTexRec( texId ); + TextureRec rec = atlas.GetTexRec( texId ); if( blockHeight != 1 ) { rec.V2 = rec.V1 + blockHeight * TerrainAtlas2D.invElementSize; } diff --git a/ClassicalSharp/Network/NetworkProcessor.CPE.cs b/ClassicalSharp/Network/NetworkProcessor.CPE.cs index ea12318c5..2c49e6a45 100644 --- a/ClassicalSharp/Network/NetworkProcessor.CPE.cs +++ b/ClassicalSharp/Network/NetworkProcessor.CPE.cs @@ -302,7 +302,7 @@ namespace ClassicalSharp { info.SetBottom( reader.ReadUInt8(), (Block)block ); info.BlocksLight[block] = reader.ReadUInt8() == 0; reader.ReadUInt8(); // walk sound, but we ignore this. - info.EmitsLight[block] = reader.ReadUInt8() != 0; + info.FullBright[block] = reader.ReadUInt8() != 0; byte shape = reader.ReadUInt8(); if( shape == 2 ) { diff --git a/ClassicalSharp/Rendering/MapEnvRenderer.cs b/ClassicalSharp/Rendering/MapEnvRenderer.cs index b6acf4f42..765c56f94 100644 --- a/ClassicalSharp/Rendering/MapEnvRenderer.cs +++ b/ClassicalSharp/Rendering/MapEnvRenderer.cs @@ -161,7 +161,7 @@ namespace ClassicalSharp { y2 = y1 + axisSize; if( y2 > endY ) y2 = endY; - TextureRectangle rec = new TextureRectangle( 0, 0, z2 - z1, y2 - y1 ); + TextureRec rec = new TextureRec( 0, 0, z2 - z1, y2 - y1 ); *vertices++ = new VertexPos3fTex2fCol4b( x, y1, z1, rec.U1, rec.V1, col ); *vertices++ = new VertexPos3fTex2fCol4b( x, y2, z1, rec.U1, rec.V2, col ); *vertices++ = new VertexPos3fTex2fCol4b( x, y2, z2, rec.U2, rec.V2, col ); @@ -180,7 +180,7 @@ namespace ClassicalSharp { y2 = y1 + axisSize; if( y2 > endY ) y2 = endY; - TextureRectangle rec = new TextureRectangle( 0, 0, x2 - x1, y2 - y1 ); + TextureRec rec = new TextureRec( 0, 0, x2 - x1, y2 - y1 ); *vertices++ = new VertexPos3fTex2fCol4b( x1, y1, z, rec.U1, rec.V1, col ); *vertices++ = new VertexPos3fTex2fCol4b( x1, y2, z, rec.U1, rec.V2, col ); *vertices++ = new VertexPos3fTex2fCol4b( x2, y2, z, rec.U2, rec.V2, col ); @@ -199,7 +199,7 @@ namespace ClassicalSharp { z2 = z1 + axisSize; if( z2 > endZ ) z2 = endZ; - TextureRectangle rec = new TextureRectangle( 0, 0, x2 - x1, z2 - z1 ); + TextureRec rec = new TextureRec( 0, 0, x2 - x1, z2 - z1 ); *vertices++ = new VertexPos3fTex2fCol4b( x1, y, z1, rec.U1, rec.V1, col ); *vertices++ = new VertexPos3fTex2fCol4b( x1, y, z2, rec.U1, rec.V2, col ); *vertices++ = new VertexPos3fTex2fCol4b( x2, y, z2, rec.U2, rec.V2, col ); diff --git a/ClassicalSharp/TexturePack/TerrainAtlas1D.cs b/ClassicalSharp/TexturePack/TerrainAtlas1D.cs index f3eb2bb37..69f48f6f9 100644 --- a/ClassicalSharp/TexturePack/TerrainAtlas1D.cs +++ b/ClassicalSharp/TexturePack/TerrainAtlas1D.cs @@ -17,10 +17,10 @@ namespace ClassicalSharp { this.graphics = graphics; } - public TextureRectangle GetTexRec( int texId, int uCount, out int index ) { + public TextureRec GetTexRec( int texId, int uCount, out int index ) { index = texId / usedElementsPerAtlas1D; int y = texId % usedElementsPerAtlas1D; - return new TextureRectangle( 0, y * invElementSize, uCount, invElementSize ); + return new TextureRec( 0, y * invElementSize, uCount, invElementSize ); } public int Get1DIndex( int texId ) { diff --git a/ClassicalSharp/TexturePack/TerrainAtlas2D.cs b/ClassicalSharp/TexturePack/TerrainAtlas2D.cs index 48dd6490f..76099ce70 100644 --- a/ClassicalSharp/TexturePack/TerrainAtlas2D.cs +++ b/ClassicalSharp/TexturePack/TerrainAtlas2D.cs @@ -59,10 +59,10 @@ namespace ClassicalSharp { } } - public TextureRectangle GetTexRec( int index ) { + public TextureRec GetTexRec( int index ) { int x = index & 0x0F; int y = index >> 4; - return new TextureRectangle( x * invElementSize, y * invElementSize, + return new TextureRec( x * invElementSize, y * invElementSize, invElementSize, invElementSize ); } diff --git a/ClassicalSharp/Utils/TextureRectangle.cs b/ClassicalSharp/Utils/TextureRectangle.cs index e29b410a0..27568488d 100644 --- a/ClassicalSharp/Utils/TextureRectangle.cs +++ b/ClassicalSharp/Utils/TextureRectangle.cs @@ -3,18 +3,18 @@ namespace ClassicalSharp { /// Stores the four texture coordinates that bound a textured quad. - public struct TextureRectangle { + public struct TextureRec { public float U1, V1, U2, V2; - public TextureRectangle( float u, float v, float uWidth, float vHeight ) { + public TextureRec( float u, float v, float uWidth, float vHeight ) { U1 = u; V1 = v; U2 = u + uWidth; V2 = v + vHeight; } - public static TextureRectangle FromPoints( float u1, float u2, float v1, float v2 ) { - TextureRectangle rec; + public static TextureRec FromPoints( float u1, float u2, float v1, float v2 ) { + TextureRec rec; rec.U1 = u1; rec.U2 = u2; rec.V1 = v1;