mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-29 16:43:00 -04:00
166 lines
7.4 KiB
C#
166 lines
7.4 KiB
C#
using OpenTK;
|
|
using System;
|
|
using System.Drawing;
|
|
using ClassicalSharp.GraphicsAPI;
|
|
using ClassicalSharp.Renderers;
|
|
|
|
namespace ClassicalSharp.Model {
|
|
|
|
public class BlockModel : IModel {
|
|
|
|
byte block = (byte)Block.Air;
|
|
public BlockModel( Game window ) : base( window ) {
|
|
vertices = new VertexPos3fTex2fCol4b[6 * 6];
|
|
}
|
|
|
|
public override float NameYOffset {
|
|
get { return blockHeight + 0.075f; }
|
|
}
|
|
|
|
protected override void DrawPlayerModel( Player player, PlayerRenderer renderer ) {
|
|
graphics.Texturing = true;
|
|
graphics.AlphaTest = true;
|
|
block = Byte.Parse( player.ModelName );
|
|
if( block == 0 ) {
|
|
blockHeight = 1;
|
|
return;
|
|
}
|
|
|
|
graphics.Bind2DTexture( window.TerrainAtlasTexId );
|
|
blockHeight = window.BlockInfo.BlockHeight( block );
|
|
atlas = window.TerrainAtlas;
|
|
BlockInfo = window.BlockInfo;
|
|
index = 0;
|
|
if( BlockInfo.IsSprite( block ) ) {
|
|
DrawSprite();
|
|
graphics.DrawVertices( DrawMode.Triangles, vertices, 6 * 2 );
|
|
} else {
|
|
DrawTopFace();
|
|
DrawLeftFace();
|
|
DrawRightFace();
|
|
DrawFrontFace();
|
|
DrawBackFace();
|
|
DrawBottomFace();
|
|
graphics.DrawVertices( DrawMode.Triangles, vertices, 6 * 6 );
|
|
}
|
|
}
|
|
float blockHeight;
|
|
TextureAtlas2D atlas;
|
|
BlockInfo BlockInfo;
|
|
|
|
public override void Dispose() {
|
|
}
|
|
|
|
void DrawTopFace() {
|
|
int texId = BlockInfo.GetOptimTextureLoc( block, TileSide.Top );
|
|
TextureRectangle rec = atlas.GetTexRec( texId );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, -0.5f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, -0.5f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0.5f, rec.U2, rec.V2, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0.5f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, 0.5f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, -0.5f, rec.U1, rec.V1, col );
|
|
}
|
|
|
|
void DrawBottomFace() {
|
|
int texId = BlockInfo.GetOptimTextureLoc( block, TileSide.Bottom );
|
|
TextureRectangle rec = atlas.GetTexRec( texId );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, -0.5f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, -0.5f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, 0.5f, rec.U2, rec.V2, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, 0.5f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, 0.5f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, -0.5f, rec.U1, rec.V1, col );
|
|
}
|
|
|
|
void DrawBackFace() {
|
|
int texId = BlockInfo.GetOptimTextureLoc( block, TileSide.Back );
|
|
TextureRectangle rec = atlas.GetTexRec( texId );
|
|
if( blockHeight != 1 ) {
|
|
rec.V2 = rec.V1 + blockHeight * atlas.invVerElementSize;
|
|
}
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, 0.5f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, 0.5f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0.5f, rec.U2, rec.V1, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0.5f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, 0.5f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, 0.5f, rec.U1, rec.V2, col );
|
|
}
|
|
|
|
void DrawFrontFace() {
|
|
int texId = BlockInfo.GetOptimTextureLoc( block, TileSide.Front );
|
|
TextureRectangle rec = atlas.GetTexRec( texId );
|
|
if( blockHeight != 1 ) {
|
|
rec.V2 = rec.V1 + blockHeight * atlas.invVerElementSize;
|
|
}
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, -0.5f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, -0.5f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, -0.5f, rec.U1, rec.V1, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, -0.5f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, -0.5f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, -0.5f, rec.U2, rec.V2, col );
|
|
}
|
|
|
|
void DrawLeftFace() {
|
|
int texId = BlockInfo.GetOptimTextureLoc( block, TileSide.Left );
|
|
TextureRectangle rec = atlas.GetTexRec( texId );
|
|
if( blockHeight != 1 ) {
|
|
rec.V2 = rec.V1 + blockHeight * atlas.invVerElementSize;
|
|
}
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, -0.5f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, -0.5f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, 0.5f, rec.U2, rec.V1, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, 0.5f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, 0.5f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, -0.5f, rec.U1, rec.V2, col );
|
|
}
|
|
|
|
void DrawRightFace() {
|
|
int texId = BlockInfo.GetOptimTextureLoc( block, TileSide.Right );
|
|
TextureRectangle rec = atlas.GetTexRec( texId );
|
|
if( blockHeight != 1 ) {
|
|
rec.V2 = rec.V1 + blockHeight * atlas.invVerElementSize;
|
|
}
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, -0.5f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, -0.5f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0.5f, rec.U1, rec.V1, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0.5f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, 0.5f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, -0.5f, rec.U2, rec.V2, col );
|
|
}
|
|
|
|
void DrawSprite() {
|
|
int texId = BlockInfo.GetOptimTextureLoc( block, TileSide.Right );
|
|
TextureRectangle rec = atlas.GetTexRec( texId );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, 0f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f + blockHeight, 0f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0f, rec.U1, rec.V1, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f + blockHeight, 0f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, 0f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, 0f, rec.U2, rec.V2, col );
|
|
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0f, 0f, -0.5f, rec.U1, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0f, 0f + blockHeight, -0.5f, rec.U1, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0f, 0f + blockHeight, 0.5f, rec.U2, rec.V1, col );
|
|
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0f, 0f + blockHeight, 0.5f, rec.U2, rec.V1, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0f, 0f, 0.5f, rec.U2, rec.V2, col );
|
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0f, 0f, -0.5f, rec.U1, rec.V2, col );
|
|
}
|
|
}
|
|
} |