191 lines
11 KiB
C#
191 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
|
|
|
|
namespace VoxelIsometricRenderer
|
|
{
|
|
public static class PlayerObject
|
|
{
|
|
static int BlockID = 0;
|
|
static int VoxelID = 0;
|
|
static float PositionX = 0;
|
|
static float PositionY = 0;
|
|
static float PositionZ = 0;
|
|
static int BlockposX = 5;
|
|
static int BlockposY = 16;
|
|
static int BlockposZ =5;
|
|
static float PrecisePositionX = 0.0f;
|
|
static float PrecisePositionY = 0.0f;
|
|
static float PrecisePositionZ = 0.0f;
|
|
static Rectangle CameraCentre = new Rectangle(0,0,100,100);
|
|
static int[] LastPositions = new int[] { 0, -192 };
|
|
static Rectangle PlayerPosition = new Rectangle(0,0,100,100);
|
|
public static int GetVoxelID()
|
|
{
|
|
return VoxelID;
|
|
}
|
|
public static void Draw(Graphics g)
|
|
{
|
|
Chunk PlayerChunk = ChunkRegistry.FetchChunk(String.Format("x={0};y={1};z={2}", (int)Math.Floor(BlockposX / (double)ChunkRegistry.FetchDimensions()[0]), (int)Math.Floor(BlockposY / (double)ChunkRegistry.FetchDimensions()[1]), (int)Math.Floor(BlockposZ / (double)ChunkRegistry.FetchDimensions()[2])));
|
|
BlockRegistry.RenderBlock(g, BlockID, BlockposX, BlockposY, BlockposZ, PlayerChunk != null ? PlayerChunk.SkyLightHeightMap[Math.Max(BlockposX - (PlayerChunk.ChunkPos[0] * ChunkRegistry.FetchDimensions()[0]), 0), Math.Max(BlockposY - (PlayerChunk.ChunkPos[1] * ChunkRegistry.FetchDimensions()[1]), 0), Math.Max(BlockposZ - (PlayerChunk.ChunkPos[2] * ChunkRegistry.FetchDimensions()[2]), 0)] : 1);
|
|
int[] Positions = BlockRegistry.GetDrawLocation(BlockposX, BlockposY, BlockposZ, PositionX, PositionY, PositionZ);
|
|
if (Positions[0] != LastPositions[0] || Positions[1] != LastPositions[1])
|
|
{
|
|
//MessageBox.Show(Positions[0] + "_" + Positions[1]);
|
|
LastPositions = Positions;
|
|
}
|
|
PlayerPosition = new Rectangle(Positions[0] + (int)(Terrain4.width / (2 * TextureManager.RenderScale)), Positions[1] + (int)(Terrain4.height / (2 * TextureManager.RenderScale)), TextureManager.VoxelSize, TextureManager.VoxelSize);
|
|
g.DrawRectangle(new Pen(Brushes.Blue), PlayerPosition);
|
|
g.DrawRectangle(new Pen(Brushes.Red), CameraCentre);
|
|
}
|
|
public static void UpdateCamera()
|
|
{
|
|
if (!CameraCentre.IntersectsWith(PlayerPosition))
|
|
{
|
|
float YPosition = PositionY;
|
|
float XPosition = PositionX;
|
|
float ZPosition = PositionZ;
|
|
int[] Positions = BlockRegistry.GetDrawLocation(BlockposX, BlockposY, BlockposZ, PositionX, PositionY + 1, PositionZ);
|
|
Rectangle NextPosition = new Rectangle(Positions[0] + (int)(Terrain4.width / (2 * TextureManager.RenderScale)), Positions[1] + (int)(Terrain4.height / (2 * TextureManager.RenderScale)), TextureManager.VoxelSize, TextureManager.VoxelSize);
|
|
int[] PositionsX = BlockRegistry.GetDrawLocation(BlockposX, BlockposY, BlockposZ, PositionX + 1, PositionY, PositionZ - 1);
|
|
Rectangle NextPositionX = new Rectangle(PositionsX[0] + (int)(Terrain4.width / (2 * TextureManager.RenderScale)), PositionsX[1] + (int)(Terrain4.height / (2 * TextureManager.RenderScale)), TextureManager.VoxelSize, TextureManager.VoxelSize);
|
|
if (LightingManager.Square(CameraCentre.Y - PlayerPosition.Y) > LightingManager.Square(CameraCentre.Y - NextPosition.Y) && !CameraCentre.Contains(CameraCentre.X, PlayerPosition.Y))
|
|
{
|
|
float Iterator = 0;
|
|
//while (!CameraCentre.Contains(CameraCentre.X,NextPosition.Y) && Iterator < 2)
|
|
{
|
|
Iterator+= LightingManager.Square(CameraCentre.Y - NextPosition.Y) <= 10000 ? 0.1f : 1;
|
|
Positions = BlockRegistry.GetDrawLocation(BlockposX, BlockposY, BlockposZ, PositionX, PositionY + Iterator, PositionZ);
|
|
NextPosition = new Rectangle(Positions[0] + (int)(Terrain4.width / (2 * TextureManager.RenderScale)), Positions[1] + (int)(Terrain4.height / (2 * TextureManager.RenderScale)), TextureManager.VoxelSize, TextureManager.VoxelSize);
|
|
}
|
|
YPosition += Iterator;
|
|
}
|
|
else if (LightingManager.Square(CameraCentre.Y - PlayerPosition.Y) < LightingManager.Square(CameraCentre.Y - NextPosition.Y))
|
|
{
|
|
float Iterator = 0;
|
|
//while (!CameraCentre.Contains(CameraCentre.X, NextPosition.Y) && Iterator > -2)
|
|
{
|
|
Iterator-= LightingManager.Square(CameraCentre.Y - NextPosition.Y) <= 10000 ? 0.1f : 1;
|
|
Positions = BlockRegistry.GetDrawLocation(BlockposX, BlockposY, BlockposZ, PositionX, PositionY + Iterator, PositionZ);
|
|
NextPosition = new Rectangle(Positions[0] + (int)(Terrain4.width / (2 * TextureManager.RenderScale)), Positions[1] + (int)(Terrain4.height / (2 * TextureManager.RenderScale)), TextureManager.VoxelSize, TextureManager.VoxelSize);
|
|
}
|
|
YPosition += Iterator;
|
|
}
|
|
if (LightingManager.Square(CameraCentre.X - PlayerPosition.X) < LightingManager.Square(CameraCentre.X - NextPositionX.X) && !CameraCentre.Contains(PlayerPosition.X, CameraCentre.Y))
|
|
{
|
|
float IteratorX = 0;
|
|
float IteratorZ = 0;
|
|
//while (!CameraCentre.Contains(NextPositionX.X, CameraCentre.Y) && IteratorX > -2 && IteratorZ < 2)
|
|
{
|
|
IteratorX-= LightingManager.Square(CameraCentre.X - NextPositionX.X) <= 10000 ? 0.1f : 1;
|
|
IteratorZ+= LightingManager.Square(CameraCentre.X - NextPositionX.X) <= 10000 ? 0.1f : 1;
|
|
PositionsX = BlockRegistry.GetDrawLocation(BlockposX, BlockposY, BlockposZ, PositionX + IteratorX, PositionY, PositionZ + IteratorZ);
|
|
NextPositionX = new Rectangle(PositionsX[0] + (int)(Terrain4.width / (2 * TextureManager.RenderScale)), PositionsX[1] + (int)(Terrain4.height / (2 * TextureManager.RenderScale)), TextureManager.VoxelSize, TextureManager.VoxelSize);
|
|
}
|
|
XPosition += IteratorX;
|
|
ZPosition += IteratorZ;
|
|
}
|
|
else if (PlayerPosition.X < CameraCentre.X)
|
|
{
|
|
float IteratorX = 0;
|
|
float IteratorZ = 0;
|
|
//while (!CameraCentre.Contains(NextPositionX.X, CameraCentre.Y) && IteratorZ > -1 && IteratorX < 1)
|
|
{
|
|
IteratorX+= LightingManager.Square(CameraCentre.X - NextPositionX.X) <= 10000 ? 0.1f : 1;
|
|
IteratorZ -= LightingManager.Square(CameraCentre.X - NextPositionX.X) <= 10000 ? 0.1f : 1;
|
|
PositionsX = BlockRegistry.GetDrawLocation(BlockposX, BlockposY, BlockposZ, PositionX + IteratorX, PositionY, PositionZ + IteratorZ);
|
|
NextPositionX = new Rectangle(PositionsX[0] + (int)(Terrain4.width / (2 * TextureManager.RenderScale)), PositionsX[1] + (int)(Terrain4.height / (2 * TextureManager.RenderScale)), TextureManager.VoxelSize, TextureManager.VoxelSize);
|
|
}
|
|
XPosition += IteratorX;
|
|
ZPosition += IteratorZ;
|
|
}
|
|
|
|
PositionX = XPosition;
|
|
PositionY = YPosition;
|
|
PositionZ = ZPosition;
|
|
}
|
|
}
|
|
public static void UpdateCameraCentre(int Width, int Height)
|
|
{
|
|
CameraCentre = new Rectangle((int)((Width/(2 * TextureManager.RenderScale)) - TextureManager.VoxelSize/6), (int)((Height/ (2 * TextureManager.RenderScale)) - (TextureManager.VoxelSize/6)), (int)(TextureManager.VoxelSize/3), (int)(TextureManager.VoxelSize/3));
|
|
}
|
|
public static void CreatePlayer(int[] Faces, int RenderType, BlockState blockState)
|
|
{
|
|
Voxel voxel = new Voxel(RenderType, Faces[0], Faces[1], Faces[2], Faces[3], Faces[4], Faces[5], blockState.hasBlocksLight());
|
|
int index = VoxelRegistry.VoxelExists(voxel);
|
|
if (index == -1)
|
|
{
|
|
index = VoxelRegistry.IndexVoxel(voxel);
|
|
}
|
|
VoxelID = index;
|
|
Block newBlock = new Block(index, BlockstateRegistry.GetBlockstateIndex(blockState), -1);
|
|
int x = BlockposX;
|
|
int y = BlockposY;
|
|
int z = BlockposZ;
|
|
BlockID = BlockRegistry.CheckInBlock(newBlock, x, y, z);
|
|
}
|
|
public static float[] GetCameraPos()
|
|
{
|
|
return new float[] { PositionX, PositionY, PositionZ };
|
|
}
|
|
public static int[] GetPos()
|
|
{
|
|
return new int[] { BlockposX, BlockposY, BlockposZ };
|
|
}
|
|
public static float[] GetPresicePos()
|
|
{
|
|
return new float[] { PrecisePositionX, PrecisePositionY, PrecisePositionZ };
|
|
}
|
|
public static void SetPos(int[] pos, bool Reoccure)
|
|
{
|
|
BlockposX = pos[0];
|
|
BlockposY = pos[1];
|
|
BlockposZ = pos[2];
|
|
if (Reoccure) SetPrecisePos(new float[] { pos[0], pos[1], pos[2] },false);
|
|
}
|
|
public static void SetPrecisePos(float[] pos, bool Reoccure)
|
|
{
|
|
PrecisePositionX = pos[0];
|
|
PrecisePositionY = pos[1];
|
|
PrecisePositionZ = pos[2];
|
|
if(Reoccure)SetPos(new int[] {(int)pos[0], (int)pos[1],(int)pos[2] },false);
|
|
}
|
|
public static void IncrementPos(int Axis, int Increment) { IncrementPos(Axis, Increment, true); }
|
|
public static void IncrementPos(int Axis, int Increment,bool Reoccure)
|
|
{
|
|
switch (Axis)
|
|
{
|
|
case 0: BlockposX += Increment; break;
|
|
case 1: BlockposY += Increment; break;
|
|
case 2: BlockposZ += Increment; break;
|
|
}
|
|
if (Reoccure) SetPrecisePos(new float[] { (float)BlockposX, (float)BlockposY, (float)BlockposZ },false);
|
|
}
|
|
public static void IncrementPrecisePos(int Axis, float Increment, bool Reoccure)
|
|
{
|
|
switch (Axis)
|
|
{
|
|
case 0: PrecisePositionX += Increment; break;
|
|
case 1: PrecisePositionY += Increment; break;
|
|
case 2: PrecisePositionZ += Increment; break;
|
|
}
|
|
if (Reoccure) SetPos(new int[] {(int)PrecisePositionX, (int)PrecisePositionY, (int)PrecisePositionZ },false);
|
|
}
|
|
public static void SetSpecificPos(int Axis, int Pos, bool Reoccure)
|
|
{
|
|
switch (Axis)
|
|
{
|
|
case 0: BlockposX = Pos; break;
|
|
case 1: BlockposY = Pos; break;
|
|
case 2: BlockposZ = Pos; break;
|
|
}
|
|
if (Reoccure) SetPrecisePos(new float[] { BlockposX, BlockposY, BlockposZ },false);
|
|
}
|
|
}
|
|
}
|