add TilePrefab
This commit is contained in:
parent
7118479528
commit
4a1d80ce4f
|
@ -211,6 +211,8 @@
|
||||||
<Compile Include="TileMap\Lighting\SimpleTileMapLighter.cs" />
|
<Compile Include="TileMap\Lighting\SimpleTileMapLighter.cs" />
|
||||||
<Compile Include="TileMap\Lighting\LitChunkVertexGenerator.cs" />
|
<Compile Include="TileMap\Lighting\LitChunkVertexGenerator.cs" />
|
||||||
<Compile Include="TileMap\Lighting\LightSpreadingTileMapLighter.cs" />
|
<Compile Include="TileMap\Lighting\LightSpreadingTileMapLighter.cs" />
|
||||||
|
<Compile Include="TileMap\Prefabs\TilePrefab.cs" />
|
||||||
|
<Compile Include="TileMap\Rotation.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -238,6 +240,7 @@
|
||||||
<Folder Include="TileMap\" />
|
<Folder Include="TileMap\" />
|
||||||
<Folder Include="TileMap\Meshes\" />
|
<Folder Include="TileMap\Meshes\" />
|
||||||
<Folder Include="TileMap\Lighting\" />
|
<Folder Include="TileMap\Lighting\" />
|
||||||
|
<Folder Include="TileMap\Prefabs\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Resources\Fonts\Vera.ttf" />
|
<EmbeddedResource Include="Resources\Fonts\Vera.ttf" />
|
||||||
|
|
252
Blarg.GameFramework/TileMap/Prefabs/TilePrefab.cs
Normal file
252
Blarg.GameFramework/TileMap/Prefabs/TilePrefab.cs
Normal file
|
@ -0,0 +1,252 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Blarg.GameFramework.TileMap.Prefabs
|
||||||
|
{
|
||||||
|
public class TilePrefab : TileContainer, TileRawDataContainer
|
||||||
|
{
|
||||||
|
Tile[] _data;
|
||||||
|
int _width;
|
||||||
|
int _height;
|
||||||
|
int _depth;
|
||||||
|
BoundingBox _bounds;
|
||||||
|
|
||||||
|
Rotation _rotation;
|
||||||
|
int _rotationWidth;
|
||||||
|
int _rotationDepth;
|
||||||
|
int _rotationXOffset;
|
||||||
|
int _rotationZOffset;
|
||||||
|
int _rotationXMultiplier;
|
||||||
|
int _rotationZMultiplier;
|
||||||
|
int _rotationXPreMultiplier;
|
||||||
|
int _rotationZPreMultiplier;
|
||||||
|
BoundingBox _rotationBounds;
|
||||||
|
|
||||||
|
public override int Width
|
||||||
|
{
|
||||||
|
get { return _width; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int Height
|
||||||
|
{
|
||||||
|
get { return _height; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int Depth
|
||||||
|
{
|
||||||
|
get { return _depth; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int MinX
|
||||||
|
{
|
||||||
|
get { return 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int MinY
|
||||||
|
{
|
||||||
|
get { return 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int MinZ
|
||||||
|
{
|
||||||
|
get { return 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int MaxX
|
||||||
|
{
|
||||||
|
get { return _width - 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int MaxY
|
||||||
|
{
|
||||||
|
get { return _height - 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int MaxZ
|
||||||
|
{
|
||||||
|
get { return _depth - 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Vector3 Position
|
||||||
|
{
|
||||||
|
get { return Vector3.Zero; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundingBox Bounds
|
||||||
|
{
|
||||||
|
get { return _bounds; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public Rotation Rotation
|
||||||
|
{
|
||||||
|
get { return _rotation; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int RotatedWidth
|
||||||
|
{
|
||||||
|
get { return _rotationWidth; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int RotatedDepth
|
||||||
|
{
|
||||||
|
get { return _rotationDepth; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundingBox RotatedBounds
|
||||||
|
{
|
||||||
|
get { return _rotationBounds; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tile[] Data
|
||||||
|
{
|
||||||
|
get { return _data; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public TilePrefab(int width, int height, int depth)
|
||||||
|
{
|
||||||
|
if (width <= 0)
|
||||||
|
throw new ArgumentException("width");
|
||||||
|
if (height <= 0)
|
||||||
|
throw new ArgumentException("height");
|
||||||
|
if (depth <= 0)
|
||||||
|
throw new ArgumentException("depth");
|
||||||
|
|
||||||
|
_bounds = new BoundingBox();
|
||||||
|
_bounds.Min.Set(Vector3.Zero);
|
||||||
|
_bounds.Max.Set(width, height, depth);
|
||||||
|
|
||||||
|
int numTiles = width * height * depth;
|
||||||
|
_data = new Tile[numTiles];
|
||||||
|
for (int i = 0; i < numTiles; ++i)
|
||||||
|
_data[i] = new Tile();
|
||||||
|
|
||||||
|
Rotate(Rotation.Rotation0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Tile Get(int x, int y, int z)
|
||||||
|
{
|
||||||
|
int index = GetIndexOf(x, y, z);
|
||||||
|
return _data[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Tile GetSafe(int x, int y, int z)
|
||||||
|
{
|
||||||
|
if (!IsWithinLocalBounds(x, y, z))
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return Get(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetIndexOf(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return (y * _width * _depth) + (z * _width) + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Rotate(Rotation rotation)
|
||||||
|
{
|
||||||
|
_rotation = rotation;
|
||||||
|
|
||||||
|
switch (rotation)
|
||||||
|
{
|
||||||
|
case Rotation.Rotation0:
|
||||||
|
_rotationWidth = _width;
|
||||||
|
_rotationDepth = _depth;
|
||||||
|
_rotationXOffset = 0;
|
||||||
|
_rotationZOffset = 0;
|
||||||
|
_rotationXMultiplier = 1;
|
||||||
|
_rotationZMultiplier = _rotationWidth;
|
||||||
|
_rotationXPreMultiplier = 1;
|
||||||
|
_rotationZPreMultiplier = 1;
|
||||||
|
_rotationBounds.Min.Set(Vector3.Zero);
|
||||||
|
_rotationBounds.Max.Set(_rotationWidth, _height, _rotationDepth);
|
||||||
|
break;
|
||||||
|
case Rotation.Rotation90:
|
||||||
|
_rotationWidth = _depth;
|
||||||
|
_rotationDepth = _width;
|
||||||
|
_rotationXOffset = _rotationWidth - 1;
|
||||||
|
_rotationZOffset = 0;
|
||||||
|
_rotationXMultiplier = _rotationDepth;
|
||||||
|
_rotationZMultiplier = 1;
|
||||||
|
_rotationXPreMultiplier = -1;
|
||||||
|
_rotationZPreMultiplier = 1;
|
||||||
|
_rotationBounds.Min.Set(Vector3.Zero);
|
||||||
|
_rotationBounds.Max.Set(_rotationWidth, _height, _rotationDepth);
|
||||||
|
break;
|
||||||
|
case Rotation.Rotation180:
|
||||||
|
_rotationWidth = _width;
|
||||||
|
_rotationDepth = _depth;
|
||||||
|
_rotationXOffset = _rotationWidth - 1;
|
||||||
|
_rotationZOffset = _rotationDepth - 1;
|
||||||
|
_rotationXMultiplier = 1;
|
||||||
|
_rotationZMultiplier = _rotationWidth;
|
||||||
|
_rotationXPreMultiplier = -1;
|
||||||
|
_rotationZPreMultiplier = -1;
|
||||||
|
_rotationBounds.Min.Set(Vector3.Zero);
|
||||||
|
_rotationBounds.Max.Set(_rotationWidth, _height, _rotationDepth);
|
||||||
|
break;
|
||||||
|
case Rotation.Rotation270:
|
||||||
|
_rotationWidth = _depth;
|
||||||
|
_rotationDepth = _width;
|
||||||
|
_rotationXOffset = 0;
|
||||||
|
_rotationZOffset = _rotationDepth - 1;
|
||||||
|
_rotationXMultiplier = _rotationDepth;
|
||||||
|
_rotationZMultiplier = 1;
|
||||||
|
_rotationXPreMultiplier = 1;
|
||||||
|
_rotationZPreMultiplier = -1;
|
||||||
|
_rotationBounds.Min.Set(Vector3.Zero);
|
||||||
|
_rotationBounds.Max.Set(_rotationWidth, _height, _rotationDepth);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PlaceIn(TileContainer destination, int minX, int minY, int minZ, Rotation rotation, bool copyEmptyTiles = false)
|
||||||
|
{
|
||||||
|
if (destination == null)
|
||||||
|
throw new ArgumentNullException("destination");
|
||||||
|
|
||||||
|
if (_rotation != rotation)
|
||||||
|
Rotate(rotation);
|
||||||
|
if (!((minX + _rotationWidth) < destination.Width))
|
||||||
|
throw new ArgumentException("Destination not large enough.");
|
||||||
|
if (!((minY + _height) < destination.Height))
|
||||||
|
throw new ArgumentException("Destination not large enough.");
|
||||||
|
if (!((minZ + _rotationDepth) < destination.Depth))
|
||||||
|
throw new ArgumentException("Destination not large enough.");
|
||||||
|
|
||||||
|
for (int y = 0; y < _height; ++y)
|
||||||
|
{
|
||||||
|
for (int z = 0; z < _rotationDepth; ++z)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < _rotationWidth; ++x)
|
||||||
|
{
|
||||||
|
var sourceTile = GetWithRotation(x, y, z);
|
||||||
|
if (!copyEmptyTiles && sourceTile.IsEmptySpace)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// copy it right away, any modifications that we need to do as part of this copy
|
||||||
|
// should only be done against destTile (leave the source data intact! herp derp, references!)
|
||||||
|
var destTile = destination.Get(minX + x, minY + y, minZ + z);
|
||||||
|
destTile.Set(sourceTile);
|
||||||
|
|
||||||
|
if (destTile.IsRotated)
|
||||||
|
destTile.RotateClockwise((int)rotation / 90);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tile GetWithRotation(int x, int y, int z)
|
||||||
|
{
|
||||||
|
int index = GetIndexOfWithRotation(x, y, z);
|
||||||
|
return _data[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetIndexOfWithRotation(int x, int y, int z)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(y * _rotationWidth * _rotationDepth)
|
||||||
|
+ ((_rotationZPreMultiplier * z + _rotationZOffset) * _rotationZMultiplier)
|
||||||
|
+ ((_rotationXPreMultiplier * x + _rotationXOffset) * _rotationXMultiplier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
13
Blarg.GameFramework/TileMap/Rotation.cs
Normal file
13
Blarg.GameFramework/TileMap/Rotation.cs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Blarg.GameFramework.TileMap
|
||||||
|
{
|
||||||
|
public enum Rotation
|
||||||
|
{
|
||||||
|
Rotation0 = 0,
|
||||||
|
Rotation90 = 90,
|
||||||
|
Rotation180 = 180,
|
||||||
|
Rotation270 = 270
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in a new issue