Fix isometric blocks not respecting fullbright (Thanks Empy), fix 'stepping/walking' physics not working with custom stairs.

This commit is contained in:
UnknownShadow200 2015-12-28 22:12:23 +11:00
parent 998768b9f7
commit 09757d6316
3 changed files with 28 additions and 22 deletions

View File

@ -14,6 +14,7 @@ namespace ClassicalSharp {
static float scale; static float scale;
static Vector3 minBB, maxBB; static Vector3 minBB, maxBB;
const float invElemSize = TerrainAtlas2D.invElementSize; const float invElemSize = TerrainAtlas2D.invElementSize;
static bool fullBright;
static FastColour colNormal, colXSide, colZSide, colYBottom; static FastColour colNormal, colXSide, colZSide, colYBottom;
static float cosX, sinX, cosY, sinY; static float cosX, sinX, cosY, sinY;
@ -33,6 +34,7 @@ namespace ClassicalSharp {
atlas = game.TerrainAtlas; atlas = game.TerrainAtlas;
minBB = info.MinBB[block]; minBB = info.MinBB[block];
maxBB = info.MaxBB[block]; maxBB = info.MaxBB[block];
fullBright = info.FullBright[block];
if( info.IsSprite[block] ) { if( info.IsSprite[block] ) {
minBB = Vector3.Zero; maxBB = Vector3.One; minBB = Vector3.Zero; maxBB = Vector3.One;
} }
@ -94,7 +96,7 @@ namespace ClassicalSharp {
static void ZQuad( byte block, float z, int side ) { static void ZQuad( byte block, float z, int side ) {
int texId = info.GetTextureLoc( block, side ); int texId = info.GetTextureLoc( block, side );
TextureRec rec = atlas.GetTexRec( texId ); TextureRec rec = atlas.GetTexRec( texId );
FastColour col = colZSide; FastColour col = fullBright ? colNormal : colZSide;
float uOrigin = rec.U1, vOrigin = rec.V1; float uOrigin = rec.U1, vOrigin = rec.V1;
rec.U1 = uOrigin + minBB.X * invElemSize; rec.U1 = uOrigin + minBB.X * invElemSize;
@ -119,7 +121,7 @@ namespace ClassicalSharp {
static void XQuad( byte block, float x, int side ) { static void XQuad( byte block, float x, int side ) {
int texId = info.GetTextureLoc( block, side ); int texId = info.GetTextureLoc( block, side );
TextureRec rec = atlas.GetTexRec( texId ); TextureRec rec = atlas.GetTexRec( texId );
FastColour col = colXSide; FastColour col = fullBright ? colNormal : colXSide;
float uOrigin = rec.U1, vOrigin = rec.V1; float uOrigin = rec.U1, vOrigin = rec.V1;
rec.U1 = uOrigin + minBB.Z * invElemSize; rec.U1 = uOrigin + minBB.Z * invElemSize;

View File

@ -92,8 +92,7 @@ namespace ClassicalSharp {
for( int y = min.Y; y <= max.Y; y++ ) { for( int y = min.Y; y <= max.Y; y++ ) {
for( int z = min.Z; z <= max.Z; z++ ) { for( int z = min.Z; z <= max.Z; z++ ) {
for( int x = min.X; x <= max.X; x++ ) { for( int x = min.X; x <= max.X; x++ ) {
byte blockId = GetPhysicsBlockId( x, y, z ); byte blockId = GetPhysicsBlockId( x, y, z );
if( !GetBoundingBox( blockId, x, y, z, ref blockBB ) ) continue; if( !GetBoundingBox( blockId, x, y, z, ref blockBB ) ) continue;
if( !entityExtentBB.Intersects( blockBB ) ) continue; // necessary for some non whole blocks. (slabs) if( !entityExtentBB.Intersects( blockBB ) ) continue; // necessary for some non whole blocks. (slabs)
@ -133,22 +132,22 @@ namespace ClassicalSharp {
Position.Y = blockBB.Min.Y - size.Y - Adjustment; Position.Y = blockBB.Min.Y - size.Y - Adjustment;
ClipY( ref size, ref entityBB, ref entityExtentBB ); ClipY( ref size, ref entityBB, ref entityExtentBB );
} else if( finalBB.Min.X + Adjustment >= blockBB.Max.X ) { } else if( finalBB.Min.X + Adjustment >= blockBB.Max.X ) {
if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { if( !wasOn || !DidSlide( blockBB, ref size, finalBB, ref entityBB, ref entityExtentBB ) ) {
Position.X = blockBB.Max.X + size.X / 2 + Adjustment; Position.X = blockBB.Max.X + size.X / 2 + Adjustment;
ClipX( ref size, ref entityBB, ref entityExtentBB ); ClipX( ref size, ref entityBB, ref entityExtentBB );
} }
} else if( finalBB.Max.X - Adjustment <= blockBB.Min.X ) { } else if( finalBB.Max.X - Adjustment <= blockBB.Min.X ) {
if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { if( !wasOn || !DidSlide( blockBB, ref size, finalBB, ref entityBB, ref entityExtentBB ) ) {
Position.X = blockBB.Min.X - size.X / 2 - Adjustment; Position.X = blockBB.Min.X - size.X / 2 - Adjustment;
ClipX( ref size, ref entityBB, ref entityExtentBB ); ClipX( ref size, ref entityBB, ref entityExtentBB );
} }
} else if( finalBB.Min.Z + Adjustment >= blockBB.Max.Z ) { } else if( finalBB.Min.Z + Adjustment >= blockBB.Max.Z ) {
if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { if( !wasOn || !DidSlide( blockBB, ref size, finalBB, ref entityBB, ref entityExtentBB ) ) {
Position.Z = blockBB.Max.Z + size.Z / 2 + Adjustment; Position.Z = blockBB.Max.Z + size.Z / 2 + Adjustment;
ClipZ( ref size, ref entityBB, ref entityExtentBB ); ClipZ( ref size, ref entityBB, ref entityExtentBB );
} }
} else if( finalBB.Max.Z - Adjustment <= blockBB.Min.Z ) { } else if( finalBB.Max.Z - Adjustment <= blockBB.Min.Z ) {
if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { if( !wasOn || !DidSlide( blockBB, ref size,finalBB, ref entityBB, ref entityExtentBB ) ) {
Position.Z = blockBB.Min.Z - size.Z / 2 - Adjustment; Position.Z = blockBB.Min.Z - size.Z / 2 - Adjustment;
ClipZ( ref size, ref entityBB, ref entityExtentBB ); ClipZ( ref size, ref entityBB, ref entityExtentBB );
} }
@ -156,20 +155,25 @@ namespace ClassicalSharp {
} }
} }
bool DidSlide( ref BoundingBox blockBB, ref Vector3 size, ref BoundingBox finalBB, bool DidSlide( BoundingBox blockBB, ref Vector3 size, BoundingBox finalBB,
ref BoundingBox entityBB, ref BoundingBox entityExtentBB ) { ref BoundingBox entityBB, ref BoundingBox entityExtentBB ) {
float yDist = blockBB.Max.Y - entityBB.Min.Y; float yDist = blockBB.Max.Y - entityBB.Min.Y;
if( yDist > 0 && yDist <= StepSize + 0.01f ) { if( yDist > 0 && yDist <= StepSize + 0.01f ) {
// Adjust entity bounding box to include the block being tested float blockXMin = blockBB.Min.X, blockZMin = blockBB.Min.Z;
BoundingBox adjFinalBB = finalBB; blockBB.Min.X = Math.Max( blockBB.Min.X, blockBB.Max.X - size.X / 2 );
adjFinalBB.Min.X = Math.Min( finalBB.Min.X, blockBB.Min.X + Adjustment ); blockBB.Max.X = Math.Min( blockBB.Max.X, blockXMin + size.X / 2 );
adjFinalBB.Max.X = Math.Max( finalBB.Max.X, blockBB.Max.X - Adjustment ); blockBB.Min.Z = Math.Max( blockBB.Min.Z, blockBB.Max.Z - size.Z / 2 );
adjFinalBB.Min.Y = blockBB.Max.Y + Adjustment; blockBB.Max.Z = Math.Min( blockBB.Max.Z, blockZMin + size.Z / 2 );
adjFinalBB.Max.Y = adjFinalBB.Min.Y + size.Y;
adjFinalBB.Min.Z = Math.Min( finalBB.Min.Z, blockBB.Min.Z + Adjustment );
adjFinalBB.Max.Z = Math.Max( finalBB.Max.Z, blockBB.Max.Z - Adjustment );
if( !CanSlideThrough( ref adjFinalBB ) ) BoundingBox adjBB = finalBB;
adjBB.Min.X = Math.Min( finalBB.Min.X, blockBB.Min.X + Adjustment );
adjBB.Max.X = Math.Max( finalBB.Max.X, blockBB.Max.X - Adjustment );
adjBB.Min.Y = blockBB.Max.Y + Adjustment;
adjBB.Max.Y = adjBB.Min.Y + size.Y;
adjBB.Min.Z = Math.Min( finalBB.Min.Z, blockBB.Min.Z + Adjustment );
adjBB.Max.Z = Math.Max( finalBB.Max.Z, blockBB.Max.Z - Adjustment );
if( !CanSlideThrough( ref adjBB ) )
return false; return false;
Position.Y = blockBB.Max.Y + Adjustment; Position.Y = blockBB.Max.Y + Adjustment;
onGround = true; onGround = true;
@ -191,8 +195,8 @@ namespace ClassicalSharp {
Vector3 min = new Vector3( x, y, z ) + info.MinBB[block]; Vector3 min = new Vector3( x, y, z ) + info.MinBB[block];
Vector3 max = new Vector3( x, y, z ) + info.MaxBB[block]; Vector3 max = new Vector3( x, y, z ) + info.MaxBB[block];
BoundingBox blockBB = new BoundingBox( min, max ); BoundingBox blockBB = new BoundingBox( min, max );
if( !blockBB.Intersects( adjFinalBB ) ) if( !blockBB.Intersects( adjFinalBB ) )
continue; continue;
if( info.CollideType[GetPhysicsBlockId( x, y, z )] == BlockCollideType.Solid ) if( info.CollideType[GetPhysicsBlockId( x, y, z )] == BlockCollideType.Solid )
return false; return false;

View File

@ -53,7 +53,7 @@ namespace ClassicalSharp.Model {
} }
public override Vector3 CollisionSize { public override Vector3 CollisionSize {
get { return new Vector3( 8/16f, 28.5f/16f, 8/16f ); } get { return new Vector3( 8/16f - 0.005f, 28.5f/16f - 0.005f, 8/16f - 0.005f ); }
} }
public override BoundingBox PickingBounds { public override BoundingBox PickingBounds {