Skip to content

Commit

Permalink
[090] Chunk Renderer umgemodelt
Browse files Browse the repository at this point in the history
  • Loading branch information
tomwendel_cp committed Mar 7, 2015
1 parent 2099576 commit 18409e8
Show file tree
Hide file tree
Showing 8 changed files with 257 additions and 87 deletions.
157 changes: 119 additions & 38 deletions OctoAwesome/OctoAwesome.Model/Coordinate.cs
Expand Up @@ -6,70 +6,151 @@

namespace OctoAwesome.Model
{
/// <summary>
/// Datenstruktur zur genauen Position von Spiel-Elementen innerhalb der OctoAwesome Welt.
/// </summary>
public struct Coordinate
{
public int Planet;

public Index3 Block;
private Index3 block;

public Vector3 Position;
private Vector3 position;

public Coordinate(int planet, Index3 block, Vector3 position)
{
Planet = planet;
Block = block;
Position = position;
this.block = block;
this.position = position;
this.Normalize();
}

public Vector3 AsVector3()
/// <summary>
/// Gibt den Index des Chunks zurück oder legt diesen fest.
/// </summary>
public Index3 ChunkIndex
{
return new Vector3(
Block.X + Position.X,
Block.Y + Position.Y,
Block.Z + Position.Z);
get
{
return new Index3(
(int)(block.X / Chunk.CHUNKSIZE_X),
(int)(block.Y / Chunk.CHUNKSIZE_Y),
(int)(block.Z / Chunk.CHUNKSIZE_Z));
}
set
{
Vector3 localPosition = new Vector3(
block.X % Chunk.CHUNKSIZE_X + position.X,
block.Y % Chunk.CHUNKSIZE_Y + position.Y,
block.Z % Chunk.CHUNKSIZE_Z + position.Z);
}
}

public Index3 AsChunk()
/// <summary>
/// Gibt den globalen Index (Planet-Koordinaten) des Blockes zurück oder legt diesen fest.
/// </summary>
public Index3 GlobalBlockIndex
{
return new Index3(
(int)(Block.X / Chunk.CHUNKSIZE_X),
(int)(Block.Y / Chunk.CHUNKSIZE_Y),
(int)(Block.Z / Chunk.CHUNKSIZE_Z));
get { return block; }
set { block = value; }
}

public Index3 AsLocalBlock()
/// <summary>
/// Gibt den lokalen Index des Blocks (Chunk-Koordinaten) zurück oder legt diesen fest.
/// </summary>
public Index3 LocalBlockIndex
{
return new Index3(
Block.X % Chunk.CHUNKSIZE_X,
Block.Y % Chunk.CHUNKSIZE_Y,
Block.Z % Chunk.CHUNKSIZE_Z);
get
{
return new Index3(
block.X % Chunk.CHUNKSIZE_X,
block.Y % Chunk.CHUNKSIZE_Y,
block.Z % Chunk.CHUNKSIZE_Z);
}
set
{
Index3 chunk = ChunkIndex;
GlobalBlockIndex = chunk + value;
Normalize();
}
}

public Vector3 AsLocalPosition()
/// <summary>
/// Gibt die globale Position (Planet-Koordinaten) als Vektor zurück oder legt diesen fest.
/// </summary>
public Vector3 GlobalPosition
{
return new Vector3(
Block.X % Chunk.CHUNKSIZE_X + Position.X,
Block.Y % Chunk.CHUNKSIZE_Y + Position.Y,
Block.Z % Chunk.CHUNKSIZE_Z + Position.Z);
get
{
return new Vector3(
block.X + position.X,
block.Y + position.Y,
block.Z + position.Z);
}
set
{
position = GlobalPosition;
Normalize();
}
}

/// <summary>
/// Gibt die lokale Position (Chunk-Koordinaten) als Vektor zurück oder legt diese fest.
/// </summary>
public Vector3 LocalPosition
{
get
{
Index3 blockIndex = LocalBlockIndex;
return new Vector3(
blockIndex.X + position.X,
blockIndex.Y + position.Y,
blockIndex.Z + position.Z);
}
set
{
Index3 chunkIndex = ChunkIndex;
block = new Index3(
chunkIndex.X * Chunk.CHUNKSIZE_X,
chunkIndex.Y * Chunk.CHUNKSIZE_Y,
chunkIndex.Z * Chunk.CHUNKSIZE_Z);
position = value;
Normalize();
}
}

/// <summary>
/// Gibt die Position innerhalb des aktuellen Blockes zurück oder legt diese fest.
/// </summary>
public Vector3 BlockPosition
{
get { return position; }
set
{
position = value;
Normalize();
}
}

/// <summary>
/// Normalisiert die vorhandenen Parameter auf den Position-Wertebereich von [0...1] und die damit verbundene Verschiebung im Block.
/// </summary>
public void Normalize()
{
Block.X += (int)Math.Floor(Position.X);
Position.X = (Position.X >= 0) ? (Position.X = Position.X % 1) : (1f + (Position.X % 1));
block.X += (int)Math.Floor(position.X);
position.X = (position.X >= 0) ? (position.X = position.X % 1) : (1f + (position.X % 1));

Block.Y += (int)Math.Floor(Position.Y);
Position.Y = (Position.Y >= 0) ? (Position.Y = Position.Y % 1) : (1f + (Position.Y % 1));
block.Y += (int)Math.Floor(position.Y);
position.Y = (position.Y >= 0) ? (position.Y = position.Y % 1) : (1f + (position.Y % 1));

Block.Z += (int)Math.Floor(Position.Z);
Position.Z = (Position.Z >= 0) ? (Position.Z = Position.Z % 1) : (1f + (Position.Z % 1));
block.Z += (int)Math.Floor(position.Z);
position.Z = (position.Z >= 0) ? (position.Z = position.Z % 1) : (1f + (position.Z % 1));
}

public static Coordinate operator +(Coordinate i1, Coordinate i2)
{
Vector3 position = i1.Position + i2.Position;
Index3 block = i1.Block + i2.Block;
Vector3 position = i1.position + i2.position;
Index3 block = i1.block + i2.block;

if (i1.Planet != i2.Planet)
throw new NotSupportedException();
Expand All @@ -81,8 +162,8 @@ public void Normalize()

public static Coordinate operator +(Coordinate i1, Vector3 i2)
{
Vector3 position = i1.Position + i2;
Index3 block = i1.Block;
Vector3 position = i1.position + i2;
Index3 block = i1.block;

Coordinate result = new Coordinate(i1.Planet, block, position);
result.Normalize();
Expand All @@ -91,11 +172,11 @@ public void Normalize()

public override string ToString()
{
return
return
"(" + Planet + "/" +
(Block.X + Position.X).ToString("0.00") + "/" +
(Block.Y + Position.Y).ToString("0.00") + "/" +
(Block.Z + Position.Z).ToString("0.00") + ")";
(block.X + position.X).ToString("0.00") + "/" +
(block.Y + position.Y).ToString("0.00") + "/" +
(block.Z + position.Z).ToString("0.00") + ")";
}
}
}
27 changes: 27 additions & 0 deletions OctoAwesome/OctoAwesome.Model/Index3.cs
Expand Up @@ -24,5 +24,32 @@ public Index3(int x, int y, int z)
{
return new Index3(i1.X + i2.X, i1.Y + i2.Y, i1.Z + i2.Z);
}

public static bool operator ==(Index3 i1, Index3 i2)
{
return i1.Equals(i2);
}

public static bool operator !=(Index3 i1, Index3 i2)
{
return !i1.Equals(i2);
}

public override string ToString()
{
return "(" + X.ToString() + "/" + Y.ToString() + "/" + Z.ToString() + ")";
}

public override bool Equals(object obj)
{
if (!(obj is Index3))
return false;

Index3 other = (Index3)obj;
return (
other.X == this.X &&
other.Y == this.Y &&
other.Z == this.Z);
}
}
}
8 changes: 4 additions & 4 deletions OctoAwesome/OctoAwesome.Model/Planet.cs
Expand Up @@ -50,15 +50,15 @@ public IChunk GetChunk(Index3 index)
public IBlock GetBlock(Index3 index)
{
Coordinate coordinate = new Coordinate(0, index, Vector3.Zero);
IChunk chunk = GetChunk(coordinate.AsChunk());
return chunk.GetBlock(coordinate.AsLocalBlock());
IChunk chunk = GetChunk(coordinate.ChunkIndex);
return chunk.GetBlock(coordinate.LocalBlockIndex);
}

public void SetBlock(Index3 index, IBlock block, TimeSpan time)
{
Coordinate coordinate = new Coordinate(0, index, Vector3.Zero);
IChunk chunk = GetChunk(coordinate.AsChunk());
chunk.SetBlock(coordinate.AsLocalBlock(), block, time);
IChunk chunk = GetChunk(coordinate.ChunkIndex);
chunk.SetBlock(coordinate.LocalBlockIndex, block, time);
}
}
}
36 changes: 18 additions & 18 deletions OctoAwesome/OctoAwesome.Model/World.cs
Expand Up @@ -48,23 +48,23 @@ public void Update(GameTime frameTime)
Player.OnGround = false;

int minx = (int)Math.Min(
Player.Position.AsVector3().X - Player.Radius,
Player.Position.AsVector3().X - Player.Radius + move.X);
Player.Position.GlobalPosition.X - Player.Radius,
Player.Position.GlobalPosition.X - Player.Radius + move.X);
int maxx = (int)Math.Max(
Player.Position.AsVector3().X + Player.Radius,
Player.Position.AsVector3().X + Player.Radius + move.X);
Player.Position.GlobalPosition.X + Player.Radius,
Player.Position.GlobalPosition.X + Player.Radius + move.X);
int miny = (int)Math.Min(
Player.Position.AsVector3().Y - Player.Radius,
Player.Position.AsVector3().Y - Player.Radius + move.Y);
Player.Position.GlobalPosition.Y - Player.Radius,
Player.Position.GlobalPosition.Y - Player.Radius + move.Y);
int maxy = (int)Math.Max(
Player.Position.AsVector3().Y + Player.Radius,
Player.Position.AsVector3().Y + Player.Radius + move.Y);
Player.Position.GlobalPosition.Y + Player.Radius,
Player.Position.GlobalPosition.Y + Player.Radius + move.Y);
int minz = (int)Math.Min(
Player.Position.AsVector3().Z,
Player.Position.AsVector3().Z + move.Z);
Player.Position.GlobalPosition.Z,
Player.Position.GlobalPosition.Z + move.Z);
int maxz = (int)Math.Max(
Player.Position.AsVector3().Z + Player.Height,
Player.Position.AsVector3().Z + Player.Height + move.Z);
Player.Position.GlobalPosition.Z + Player.Height,
Player.Position.GlobalPosition.Z + Player.Height + move.Z);

bool collision = false;
int loops = 0;
Expand All @@ -73,13 +73,13 @@ public void Update(GameTime frameTime)
{
BoundingBox playerBox = new BoundingBox(
new Vector3(
Player.Position.AsVector3().X + move.X - Player.Radius,
Player.Position.AsVector3().Y + move.Y - Player.Radius,
Player.Position.AsVector3().Z + move.Z),
Player.Position.GlobalPosition.X + move.X - Player.Radius,
Player.Position.GlobalPosition.Y + move.Y - Player.Radius,
Player.Position.GlobalPosition.Z + move.Z),
new Vector3(
Player.Position.AsVector3().X + move.X + Player.Radius,
Player.Position.AsVector3().Y + move.Y + Player.Radius,
Player.Position.AsVector3().Z + move.Z + Player.Height));
Player.Position.GlobalPosition.X + move.X + Player.Radius,
Player.Position.GlobalPosition.Y + move.Y + Player.Radius,
Player.Position.GlobalPosition.Z + move.Z + Player.Height));

collision = false;
float min = 1f;
Expand Down
15 changes: 13 additions & 2 deletions OctoAwesome/OctoAwesomeDX/Components/ChunkRenderer.cs
Expand Up @@ -23,10 +23,9 @@ internal sealed class ChunkRenderer : IDisposable
private int indexCount;
private TimeSpan lastReset;

public ChunkRenderer(GraphicsDevice graphicsDevice, Matrix projection, IChunk chunk, Texture2D textures)
public ChunkRenderer(GraphicsDevice graphicsDevice, Matrix projection, Texture2D textures)
{
this.graphicsDevice = graphicsDevice;
this.chunk = chunk;
this.textures = textures;

effect = new BasicEffect(graphicsDevice);
Expand All @@ -36,6 +35,12 @@ public ChunkRenderer(GraphicsDevice graphicsDevice, Matrix projection, IChunk ch

effect.EnableDefaultLighting();

// RegenerateVertexBuffer();
}

public void SetChunk(IChunk chunk)
{
this.chunk = chunk;
RegenerateVertexBuffer();
}

Expand All @@ -47,6 +52,9 @@ public void Update()

public void Draw(Matrix view)
{
if (chunk == null)
return;

effect.World = Matrix.CreateTranslation(
chunk.Index.X * Chunk.CHUNKSIZE_X,
chunk.Index.Y * Chunk.CHUNKSIZE_Y,
Expand Down Expand Up @@ -77,6 +85,9 @@ public void RegenerateVertexBuffer()
ib = null;
}

if (chunk == null)
return;

List<VertexPositionNormalTexture> vertices = new List<VertexPositionNormalTexture>();
List<int> index = new List<int>();

Expand Down
12 changes: 6 additions & 6 deletions OctoAwesome/OctoAwesomeDX/Components/EgoCameraComponent.cs
Expand Up @@ -27,9 +27,9 @@ public override void Initialize()
public override void Update(GameTime gameTime)
{
CameraPosition = new Vector3(
world.World.Player.Position.AsVector3().X,
world.World.Player.Position.AsVector3().Y,
world.World.Player.Position.AsVector3().Z + 3.2f);
world.World.Player.Position.GlobalPosition.X,
world.World.Player.Position.GlobalPosition.Y,
world.World.Player.Position.GlobalPosition.Z + 3.2f);
CameraUpVector = new Vector3(0, 0, 1f);

float height = (float)Math.Sin(world.World.Player.Tilt);
Expand All @@ -46,9 +46,9 @@ public override void Update(GameTime gameTime)
View = Matrix.CreateLookAt(
CameraPosition,
new Vector3(
world.World.Player.Position.AsVector3().X + lookX,
world.World.Player.Position.AsVector3().Y + lookY,
world.World.Player.Position.AsVector3().Z + 3.2f + height),
world.World.Player.Position.GlobalPosition.X + lookX,
world.World.Player.Position.GlobalPosition.Y + lookY,
world.World.Player.Position.GlobalPosition.Z + 3.2f + height),
CameraUpVector);

float centerX = GraphicsDevice.Viewport.Width / 2;
Expand Down

0 comments on commit 18409e8

Please sign in to comment.