Finish arbitary scaled models in CustomModel (Thanks 123DMWM), closes #150.

This commit is contained in:
UnknownShadow200 2016-05-09 12:26:07 +10:00
parent 7271985f13
commit 1ac2e63f13
7 changed files with 31 additions and 20 deletions

View File

@ -60,7 +60,7 @@ namespace ClassicalSharp.Entities {
void FindHighestFree( ref Vector3 spawn ) {
BlockInfo info = game.BlockInfo;
Vector3 size = entity.Model.CollisionSize;
Vector3 size = entity.CollisionSize;
BoundingBox bb = entity.CollisionBounds;
Vector3I P = Vector3I.Floor( spawn );
int bbMax = Utils.Floor( size.Y );

View File

@ -11,7 +11,9 @@ namespace ClassicalSharp.Entities {
/// <summary> Returns the bounding box that contains the model, assuming it is not rotated. </summary>
public BoundingBox PickingBounds {
get { UpdateModel(); return Model.PickingBounds.Offset( Position ); }
get { UpdateModel(); BoundingBox bb = Model.PickingBounds;
return bb.Scale( ModelScale ).Offset( Position );
}
}
/// <summary> Bounding box of the model that collision detection

View File

@ -48,7 +48,7 @@ namespace ClassicalSharp.Entities {
/// <summary> Returns the size of the model that is used for collision detection. </summary>
public Vector3 CollisionSize {
get { UpdateModel(); return Model.CollisionSize; }
get { UpdateModel(); return Model.CollisionSize * ModelScale; }
}
void UpdateModel() {
@ -72,7 +72,8 @@ namespace ClassicalSharp.Entities {
/// <summary> Gets the position of the player's eye in the world. </summary>
public Vector3 EyePosition {
get { return new Vector3( Position.X, Position.Y + Model.GetEyeY( this ), Position.Z ); }
get { return new Vector3( Position.X,
Position.Y + Model.GetEyeY( this ) * ModelScale, Position.Z ); }
}
/// <summary> Gets the block just underneath the player's feet position. </summary>

View File

@ -47,7 +47,7 @@ namespace ClassicalSharp.Entities {
if( !float.TryParse( scale, out value ) || float.IsNaN( value ) )
return;
Utils.Clamp( ref value, 0.1f, Model.MaxScale );
Utils.Clamp( ref value, 0.25f, Model.MaxScale );
ModelScale = value;
}
@ -77,7 +77,7 @@ namespace ClassicalSharp.Entities {
IGraphicsApi api = game.Graphics;
api.BindTexture( nameTex.ID );
Vector3 pos = Position; pos.Y += Model.NameYOffset;
Vector3 pos = Position; pos.Y += Model.NameYOffset * ModelScale;
Vector3 p111, p121, p212, p222;
FastColour col = FastColour.White;

View File

@ -212,6 +212,7 @@ namespace ClassicalSharp.Model {
for( int i = 0; i < index; i++ ) {
VertexP3fT2fC4b v = cache.vertices[i];
float t = cosYaw * v.X - sinYaw * v.Z; v.Z = sinYaw * v.X + cosYaw * v.Z; v.X = t; // Inlined RotY
v.X *= scale; v.Y *= scale; v.Z *= scale;
v.X += pos.X; v.Y += pos.Y; v.Z += pos.Z;
cache.vertices[i] = v;
}

View File

@ -25,6 +25,8 @@ namespace ClassicalSharp.Model {
offset = 0.5f * 0.5f;
}
public override float MaxScale { get { return 3; } }
public override float NameYOffset { get { return 1.3875f; } }
public override float GetEyeY( Entity entity ) { return 14/16f; }
@ -40,28 +42,30 @@ namespace ClassicalSharp.Model {
public class GiantModel : HumanoidModel {
const float scale = 2f;
const float size = 2f;
public GiantModel( Game window ) : base( window ) { }
protected override void MakeDescriptions() {
base.MakeDescriptions();
head = head.Scale( scale ); torso = torso.Scale( scale );
lLeg = lLeg.Scale( scale ); rLeg = rLeg.Scale( scale );
lArm = lArm.Scale( scale ); rArm = rArm.Scale( scale );
offset = 0.5f * scale;
head = head.Scale( size ); torso = torso.Scale( size );
lLeg = lLeg.Scale( size ); rLeg = rLeg.Scale( size );
lArm = lArm.Scale( size ); rArm = rArm.Scale( size );
offset = 0.5f * size;
}
public override float NameYOffset { get { return 2 * scale + 0.1375f; } }
public override float MaxScale { get { return 1; } }
public override float GetEyeY( Entity entity ) { return base.GetEyeY( entity ) * scale; }
public override float NameYOffset { get { return 2 * size + 0.1375f; } }
public override float GetEyeY( Entity entity ) { return base.GetEyeY( entity ) * size; }
public override Vector3 CollisionSize {
get { return new Vector3( 8/16f * scale + 0.6f/16f,
28.1f/16f * scale, 8/16f * scale + 0.6f/16f ); }
get { return new Vector3( 8/16f * size + 0.6f/16f,
28.1f/16f * size, 8/16f * size + 0.6f/16f ); }
}
public override BoundingBox PickingBounds {
get { return base.PickingBounds.Scale( scale ); }
get { return base.PickingBounds.Scale( size ); }
}
}
}

View File

@ -37,8 +37,8 @@ namespace ClassicalSharp.Model {
/// <summary> Vertical offset from the model's feet/base that the model's eye is located. </summary>
public abstract float GetEyeY( Entity entity );
/// <sumary> The maximum scale the entity can have (for collisions and rendering). </summary>
public virtual float MaxScale { get { return 1; } }
/// <summary> The maximum scale the entity can have (for collisions and rendering). </summary>
public virtual float MaxScale { get { return 2; } }
/// <summary> The size of the bounding box that is used when
/// performing collision detection for this model. </summary>
@ -50,7 +50,7 @@ namespace ClassicalSharp.Model {
protected Vector3 pos;
protected float cosYaw, sinYaw, cosHead, sinHead;
protected float uScale, vScale;
protected float uScale, vScale, scale;
/// <summary> Renders the model based on the given entity's position and orientation. </summary>
public void Render( Player p ) {
@ -60,6 +60,7 @@ namespace ClassicalSharp.Model {
World map = game.World;
col = game.World.IsLit( Vector3I.Floor( p.EyePosition ) ) ? map.Sunlight : map.Shadowlight;
uScale = 1 / 64f; vScale = 1 / 32f;
scale = p.ModelScale;
cols[0] = col;
cols[1] = FastColour.Scale( col, FastColour.ShadeYBottom );
@ -105,6 +106,7 @@ namespace ClassicalSharp.Model {
for( int i = 0; i < part.Count; i++ ) {
ModelVertex v = vertices[part.Offset + i];
float t = cosYaw * v.X - sinYaw * v.Z; v.Z = sinYaw * v.X + cosYaw * v.Z; v.X = t; // Inlined RotY
v.X *= scale; v.Y *= scale; v.Z *= scale;
v.X += pos.X; v.Y += pos.Y; v.Z += pos.Z;
FastColour col = part.Count == boxVertices ?
@ -161,6 +163,7 @@ namespace ClassicalSharp.Model {
t = cosYaw * tX - sinYaw * tZ; tZ = sinYaw * tX + cosYaw * tZ; tX = t; // Inlined RotY
v.X += tX; v.Y += y; v.Z += tZ;
}
v.X *= scale; v.Y *= scale; v.Z *= scale;
v.X += pos.X; v.Y += pos.Y; v.Z += pos.Z;
FastColour col = part.Count == boxVertices ?