140 lines
2.9 KiB
C#
140 lines
2.9 KiB
C#
using System;
|
|
using System.IO;
|
|
using UnityEngine;
|
|
|
|
[Serializable]
|
|
public class buffer_class
|
|
{
|
|
public FileStream file;
|
|
|
|
public Vector2 resolution;
|
|
|
|
public byte[] bytes;
|
|
|
|
public ulong length;
|
|
|
|
public Vector2 size;
|
|
|
|
public tile_class tiles;
|
|
|
|
public ulong pos;
|
|
|
|
public ulong row;
|
|
|
|
public Rect innerRect;
|
|
|
|
public Rect outerRect;
|
|
|
|
public Vector2 offset;
|
|
|
|
public int radius;
|
|
|
|
public buffer_class()
|
|
{
|
|
tiles = new tile_class();
|
|
}
|
|
|
|
public virtual void init()
|
|
{
|
|
tiles.x = (int)Mathf.Ceil(resolution.x / size.x);
|
|
tiles.y = (int)Mathf.Ceil(resolution.x / size.y);
|
|
row = (ulong)(resolution.x * 3f);
|
|
}
|
|
|
|
public virtual void getRects(tile_class tile)
|
|
{
|
|
int num = radius + 20;
|
|
innerRect.x = (float)tile.x * size.x - 5f;
|
|
innerRect.y = (float)tile.y * size.y - 5f;
|
|
innerRect.width = size.x + 10f;
|
|
innerRect.height = size.y + 10f;
|
|
if (!(innerRect.xMin >= 0f))
|
|
{
|
|
innerRect.xMin = 0f;
|
|
}
|
|
if (!(innerRect.yMin >= 0f))
|
|
{
|
|
innerRect.yMin = 0f;
|
|
}
|
|
if (!(innerRect.xMax <= resolution.x))
|
|
{
|
|
innerRect.xMax = resolution.x;
|
|
}
|
|
if (!(innerRect.yMax <= resolution.y))
|
|
{
|
|
innerRect.yMax = resolution.y;
|
|
}
|
|
outerRect.xMin = innerRect.xMin - (float)num;
|
|
outerRect.yMin = innerRect.yMin - (float)num;
|
|
outerRect.xMax = innerRect.xMax + (float)num;
|
|
outerRect.yMax = innerRect.yMax + (float)num;
|
|
if (!(outerRect.xMin >= 0f))
|
|
{
|
|
outerRect.xMin = 0f;
|
|
}
|
|
else if (!(outerRect.xMax <= resolution.x))
|
|
{
|
|
outerRect.xMax = resolution.x;
|
|
}
|
|
if (!(outerRect.yMin >= 0f))
|
|
{
|
|
outerRect.yMin = 0f;
|
|
}
|
|
else if (!(outerRect.yMax <= resolution.y))
|
|
{
|
|
outerRect.yMax = resolution.y;
|
|
}
|
|
length = (ulong)(outerRect.width * outerRect.height * 3f);
|
|
offset.x = innerRect.x - outerRect.x;
|
|
offset.y = innerRect.y - outerRect.y;
|
|
if (bytes == null)
|
|
{
|
|
bytes = new byte[(uint)length];
|
|
}
|
|
if ((ulong)bytes.Length != length)
|
|
{
|
|
bytes = new byte[(uint)length];
|
|
}
|
|
}
|
|
|
|
public virtual void read()
|
|
{
|
|
for (int i = 0; (float)i < outerRect.height; i++)
|
|
{
|
|
pos = (ulong)((float)(long)row * outerRect.y + (float)((long)row * (long)i) + outerRect.x * 3f);
|
|
file.Seek((long)pos, SeekOrigin.Begin);
|
|
file.Read(bytes, (int)(outerRect.width * (float)i * 3f), (int)(outerRect.width * 3f));
|
|
}
|
|
}
|
|
|
|
public virtual void write()
|
|
{
|
|
for (int i = 0; (float)i < innerRect.height; i++)
|
|
{
|
|
pos = (ulong)((float)(long)row * innerRect.y + (float)((long)row * (long)i) + innerRect.x * 3f);
|
|
file.Seek((long)pos, SeekOrigin.Begin);
|
|
file.Write(bytes, (int)(outerRect.width * (float)i * 3f + outerRect.width * 3f * offset.y + offset.x * 3f), (int)(innerRect.width * 3f));
|
|
}
|
|
}
|
|
|
|
public virtual void copy_bytes(byte[] bytes1, byte[] bytes2)
|
|
{
|
|
ulong num = 0uL;
|
|
while ((long)num < (long)bytes1.Length)
|
|
{
|
|
bytes2[(uint)num] = bytes1[(uint)num];
|
|
num++;
|
|
}
|
|
}
|
|
|
|
public virtual void clear_bytes()
|
|
{
|
|
ulong num = 0uL;
|
|
while ((long)num < (long)bytes.Length)
|
|
{
|
|
bytes[(uint)num] = 0;
|
|
num++;
|
|
}
|
|
}
|
|
}
|