mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 03:28:20 +02:00
BeefySysLib point/rect updates, async pipe fixes
This commit is contained in:
parent
81a9478e77
commit
fe1aa3c26e
32 changed files with 282 additions and 120 deletions
|
@ -76,6 +76,9 @@ namespace System.IO
|
||||||
Platform.BfpFileCreateKind createKind = .CreateAlways;
|
Platform.BfpFileCreateKind createKind = .CreateAlways;
|
||||||
Platform.BfpFileCreateFlags createFlags = .Pipe;
|
Platform.BfpFileCreateFlags createFlags = .Pipe;
|
||||||
|
|
||||||
|
if (options.HasFlag(.AllowTimeouts))
|
||||||
|
createFlags |= .AllowTimeouts;
|
||||||
|
|
||||||
createKind = .OpenExisting;
|
createKind = .OpenExisting;
|
||||||
createFlags |= .Read;
|
createFlags |= .Read;
|
||||||
createFlags |= .Write;
|
createFlags |= .Write;
|
||||||
|
|
|
@ -392,8 +392,11 @@ namespace System.Net
|
||||||
service.sin_addr = address;
|
service.sin_addr = address;
|
||||||
service.sin_port = (uint16)htons((int16)port);
|
service.sin_port = (uint16)htons((int16)port);
|
||||||
|
|
||||||
if (bind(mHandle, &service, sizeof(SockAddr_in)) == SOCKET_ERROR)
|
int32 size = sizeof(SockAddr_in);
|
||||||
|
if (bind(mHandle, &service, size) == SOCKET_ERROR)
|
||||||
{
|
{
|
||||||
|
int err = WSAGetLastError();
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
return .Err;
|
return .Err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,11 @@ namespace System
|
||||||
public int32 Height => bottom - top;
|
public int32 Height => bottom - top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct Point : this(int32 x, int32 y)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
[CRepr]
|
[CRepr]
|
||||||
public struct OpenFileName
|
public struct OpenFileName
|
||||||
{
|
{
|
||||||
|
@ -1703,6 +1708,12 @@ namespace System
|
||||||
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
||||||
public static extern HWnd SetActiveWindow(HWnd wnd);
|
public static extern HWnd SetActiveWindow(HWnd wnd);
|
||||||
|
|
||||||
|
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
||||||
|
public static extern HWnd SetForegroundWindow(HWnd wnd);
|
||||||
|
|
||||||
|
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
||||||
|
public static extern HWnd GetForegroundWindow();
|
||||||
|
|
||||||
[CLink, CallingConvention(.Stdcall)]
|
[CLink, CallingConvention(.Stdcall)]
|
||||||
public static extern int CallWindowProcA(int wndProc, HWnd hWnd, int32 msg, int wParam, int lParam);
|
public static extern int CallWindowProcA(int wndProc, HWnd hWnd, int32 msg, int wParam, int lParam);
|
||||||
|
|
||||||
|
@ -1749,6 +1760,12 @@ namespace System
|
||||||
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
||||||
public static extern IntBool SetWindowPos(HWnd hWnd, HWnd hWndAfter, int x, int y, int cx, int cy, int flags);
|
public static extern IntBool SetWindowPos(HWnd hWnd, HWnd hWndAfter, int x, int y, int cx, int cy, int flags);
|
||||||
|
|
||||||
|
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
||||||
|
public static extern IntBool GetClientRect(HWnd hWnd, out Rect rect);
|
||||||
|
|
||||||
|
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
||||||
|
public static extern IntBool ClientToScreen(HWnd hWnd, ref Point rect);
|
||||||
|
|
||||||
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
[Import("user32.lib"), CLink, CallingConvention(.Stdcall)]
|
||||||
public static extern IntBool PostMessageW(HWnd hWnd, int32 msg, int wParam, int lParam);
|
public static extern IntBool PostMessageW(HWnd hWnd, int32 msg, int wParam, int lParam);
|
||||||
|
|
||||||
|
|
|
@ -587,15 +587,15 @@ BF_EXPORT void BF_CALLTYPE Gfx_ApplyEffect(TextureSegment* destTextureSegment, T
|
||||||
ImageData destImageData;
|
ImageData destImageData;
|
||||||
ImageData srcImageData;
|
ImageData srcImageData;
|
||||||
|
|
||||||
Rect srcRect = srcTextureSegment->GetRect();
|
RectF srcRect = srcTextureSegment->GetRect();
|
||||||
Rect destRect = destTextureSegment->GetRect();
|
RectF destRect = destTextureSegment->GetRect();
|
||||||
|
|
||||||
destTextureSegment->GetImageData(destImageData);
|
destTextureSegment->GetImageData(destImageData);
|
||||||
srcImageData.CreateNew(destImageData.mWidth, destImageData.mHeight);
|
srcImageData.CreateNew(destImageData.mWidth, destImageData.mHeight);
|
||||||
|
|
||||||
srcTextureSegment->GetImageData(srcImageData,
|
srcTextureSegment->GetImageData(srcImageData,
|
||||||
(int)(destRect.mWidth - srcRect.mWidth) / 2,
|
(int)(destRect.width - srcRect.width) / 2,
|
||||||
(int)(destRect.mHeight - srcRect.mHeight) / 2);
|
(int)(destRect.height - srcRect.height) / 2);
|
||||||
|
|
||||||
effect->Apply(NULL, &srcImageData, &destImageData);
|
effect->Apply(NULL, &srcImageData, &destImageData);
|
||||||
if (needsPremultiply)
|
if (needsPremultiply)
|
||||||
|
@ -831,10 +831,10 @@ BF_EXPORT void BF_CALLTYPE RenderState_SetWireframe(RenderState* renderState, bo
|
||||||
BF_EXPORT void BF_CALLTYPE RenderState_SetClip(RenderState* renderState, float x, float y, float width, float height)
|
BF_EXPORT void BF_CALLTYPE RenderState_SetClip(RenderState* renderState, float x, float y, float width, float height)
|
||||||
{
|
{
|
||||||
BF_ASSERT((width >= 0) && (height >= 0));
|
BF_ASSERT((width >= 0) && (height >= 0));
|
||||||
renderState->mClipRect.mX = x;
|
renderState->mClipRect.x = x;
|
||||||
renderState->mClipRect.mY = y;
|
renderState->mClipRect.y = y;
|
||||||
renderState->mClipRect.mWidth = width;
|
renderState->mClipRect.width = width;
|
||||||
renderState->mClipRect.mHeight = height;
|
renderState->mClipRect.height = height;
|
||||||
if (!renderState->mClipped)
|
if (!renderState->mClipped)
|
||||||
renderState->SetClipped(true);
|
renderState->SetClipped(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,13 +36,13 @@ int CachedDataStream::GetSize()
|
||||||
return mStream->GetSize();
|
return mStream->GetSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CachedDataStream::Read(void* ptr, int size)
|
int CachedDataStream::Read(void* ptr, int size)
|
||||||
{
|
{
|
||||||
Flush();
|
Flush();
|
||||||
mStream->Read(ptr, size);
|
return mStream->Read(ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CachedDataStream::Write(void* ptr, int size)
|
int CachedDataStream::Write(void* ptr, int size)
|
||||||
{
|
{
|
||||||
while (size > 0)
|
while (size > 0)
|
||||||
{
|
{
|
||||||
|
@ -59,6 +59,7 @@ void CachedDataStream::Write(void* ptr, int size)
|
||||||
size -= writeBytes;
|
size -= writeBytes;
|
||||||
mDataPtr += writeBytes;
|
mDataPtr += writeBytes;
|
||||||
}
|
}
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CachedDataStream::GetPos()
|
int CachedDataStream::GetPos()
|
||||||
|
|
|
@ -24,8 +24,8 @@ public:
|
||||||
|
|
||||||
virtual bool Eof() override;
|
virtual bool Eof() override;
|
||||||
virtual int GetSize() override;
|
virtual int GetSize() override;
|
||||||
virtual void Read(void* ptr, int size) override;
|
virtual int Read(void* ptr, int size) override;
|
||||||
virtual void Write(void* ptr, int size) override;
|
virtual int Write(void* ptr, int size) override;
|
||||||
|
|
||||||
virtual int GetPos() override;
|
virtual int GetPos() override;
|
||||||
virtual void Seek(int size) override;
|
virtual void Seek(int size) override;
|
||||||
|
|
|
@ -21,8 +21,8 @@ public:
|
||||||
|
|
||||||
virtual bool Eof() = 0;
|
virtual bool Eof() = 0;
|
||||||
virtual int GetSize() = 0;
|
virtual int GetSize() = 0;
|
||||||
virtual void Read(void* ptr, int size) = 0;
|
virtual int Read(void* ptr, int size) = 0;
|
||||||
virtual void Write(void* ptr, int size) = 0;
|
virtual int Write(void* ptr, int size) = 0;
|
||||||
virtual void WriteZeros(int size);
|
virtual void WriteZeros(int size);
|
||||||
virtual void Align(int size);
|
virtual void Align(int size);
|
||||||
|
|
||||||
|
|
|
@ -62,10 +62,12 @@ int FileHandleStream::GetSize()
|
||||||
return ::GetFileSize(mFileHandle, NULL);
|
return ::GetFileSize(mFileHandle, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileHandleStream::Read(void* ptr, int size)
|
int FileHandleStream::Read(void* ptr, int size)
|
||||||
{
|
{
|
||||||
if (mCacheBuffer != NULL)
|
if (mCacheBuffer != NULL)
|
||||||
{
|
{
|
||||||
|
int totalReadSize = 0;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
int buffOffset = mVFilePos - mCacheReadPos;
|
int buffOffset = mVFilePos - mCacheReadPos;
|
||||||
|
@ -74,7 +76,7 @@ void FileHandleStream::Read(void* ptr, int size)
|
||||||
// If inside
|
// If inside
|
||||||
memcpy(ptr, mCacheBuffer + buffOffset, size);
|
memcpy(ptr, mCacheBuffer + buffOffset, size);
|
||||||
mVFilePos += size;
|
mVFilePos += size;
|
||||||
return;
|
return size;
|
||||||
}
|
}
|
||||||
else if ((buffOffset >= 0) && (buffOffset < mCacheSize))
|
else if ((buffOffset >= 0) && (buffOffset < mCacheSize))
|
||||||
{
|
{
|
||||||
|
@ -84,6 +86,7 @@ void FileHandleStream::Read(void* ptr, int size)
|
||||||
|
|
||||||
ptr = (uint8*)ptr + subSize;
|
ptr = (uint8*)ptr + subSize;
|
||||||
size -= subSize;
|
size -= subSize;
|
||||||
|
totalReadSize += subSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
mCacheReadPos = mVFilePos & ~(4096 - 1);
|
mCacheReadPos = mVFilePos & ~(4096 - 1);
|
||||||
|
@ -95,7 +98,9 @@ void FileHandleStream::Read(void* ptr, int size)
|
||||||
// Zero out underflow bytes
|
// Zero out underflow bytes
|
||||||
memset((uint8*)ptr + aSize, 0, mCacheSize - aSize);
|
memset((uint8*)ptr + aSize, 0, mCacheSize - aSize);
|
||||||
}
|
}
|
||||||
|
totalReadSize += aSize;
|
||||||
}
|
}
|
||||||
|
return totalReadSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -106,12 +111,13 @@ void FileHandleStream::Read(void* ptr, int size)
|
||||||
// Zero out underflow bytes
|
// Zero out underflow bytes
|
||||||
memset((uint8*)ptr + aSize, 0, size - aSize);
|
memset((uint8*)ptr + aSize, 0, size - aSize);
|
||||||
}
|
}
|
||||||
|
return aSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileHandleStream::Write(void* ptr, int size)
|
int FileHandleStream::Write(void* ptr, int size)
|
||||||
{
|
{
|
||||||
::WriteFile(mFileHandle, ptr, size, NULL, NULL);
|
return (int)::WriteFile(mFileHandle, ptr, size, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int FileHandleStream::GetPos()
|
int FileHandleStream::GetPos()
|
||||||
|
|
|
@ -23,9 +23,9 @@ public:
|
||||||
bool Eof() override;
|
bool Eof() override;
|
||||||
int GetSize() override;
|
int GetSize() override;
|
||||||
using DataStream::Read;
|
using DataStream::Read;
|
||||||
void Read(void* ptr, int size) override;
|
int Read(void* ptr, int size) override;
|
||||||
using DataStream::Write;
|
using DataStream::Write;
|
||||||
void Write(void* ptr, int size) override;
|
int Write(void* ptr, int size) override;
|
||||||
|
|
||||||
int GetPos() override;
|
int GetPos() override;
|
||||||
void Seek(int size) override;
|
void Seek(int size) override;
|
||||||
|
|
|
@ -99,10 +99,12 @@ int FileStream::GetSize()
|
||||||
return aSize;
|
return aSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileStream::Read(void* ptr, int size)
|
int FileStream::Read(void* ptr, int size)
|
||||||
{
|
{
|
||||||
if (mCacheBuffer != NULL)
|
if (mCacheBuffer != NULL)
|
||||||
{
|
{
|
||||||
|
int totalReadSize = 0;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
int buffOffset = mVFilePos - mCacheReadPos;
|
int buffOffset = mVFilePos - mCacheReadPos;
|
||||||
|
@ -111,7 +113,7 @@ void FileStream::Read(void* ptr, int size)
|
||||||
// If inside
|
// If inside
|
||||||
memcpy(ptr, mCacheBuffer + buffOffset, size);
|
memcpy(ptr, mCacheBuffer + buffOffset, size);
|
||||||
mVFilePos += size;
|
mVFilePos += size;
|
||||||
return;
|
return size;
|
||||||
}
|
}
|
||||||
else if ((buffOffset >= 0) && (buffOffset < mCacheSize))
|
else if ((buffOffset >= 0) && (buffOffset < mCacheSize))
|
||||||
{
|
{
|
||||||
|
@ -121,6 +123,8 @@ void FileStream::Read(void* ptr, int size)
|
||||||
|
|
||||||
ptr = (uint8*) ptr + subSize;
|
ptr = (uint8*) ptr + subSize;
|
||||||
size -= subSize;
|
size -= subSize;
|
||||||
|
|
||||||
|
totalReadSize += subSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
mCacheReadPos = mVFilePos & ~(4096-1);
|
mCacheReadPos = mVFilePos & ~(4096-1);
|
||||||
|
@ -131,7 +135,11 @@ void FileStream::Read(void* ptr, int size)
|
||||||
// Zero out underflow bytes
|
// Zero out underflow bytes
|
||||||
memset((uint8*) ptr + aSize, 0, mCacheSize - aSize);
|
memset((uint8*) ptr + aSize, 0, mCacheSize - aSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
totalReadSize += aSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return totalReadSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -142,12 +150,13 @@ void FileStream::Read(void* ptr, int size)
|
||||||
memset((uint8*) ptr + aSize, 0, size - aSize);
|
memset((uint8*) ptr + aSize, 0, size - aSize);
|
||||||
mReadPastEnd = true;
|
mReadPastEnd = true;
|
||||||
}
|
}
|
||||||
|
return aSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileStream::Write(void* ptr, int size)
|
int FileStream::Write(void* ptr, int size)
|
||||||
{
|
{
|
||||||
fwrite(ptr, 1, size, mFP);
|
return (int)fwrite(ptr, 1, size, mFP);
|
||||||
}
|
}
|
||||||
|
|
||||||
int FileStream::GetPos()
|
int FileStream::GetPos()
|
||||||
|
@ -250,7 +259,7 @@ int SysFileStream::GetSize()
|
||||||
return (int)BfpFile_GetFileSize(mFile);
|
return (int)BfpFile_GetFileSize(mFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SysFileStream::Read(void* ptr, int size)
|
int SysFileStream::Read(void* ptr, int size)
|
||||||
{
|
{
|
||||||
int readSize = (int)BfpFile_Read(mFile, ptr, size, -1, NULL);
|
int readSize = (int)BfpFile_Read(mFile, ptr, size, -1, NULL);
|
||||||
if (readSize != size)
|
if (readSize != size)
|
||||||
|
@ -258,11 +267,12 @@ void SysFileStream::Read(void* ptr, int size)
|
||||||
// Zero out underflow bytes
|
// Zero out underflow bytes
|
||||||
memset((uint8*)ptr + readSize, 0, size - readSize);
|
memset((uint8*)ptr + readSize, 0, size - readSize);
|
||||||
}
|
}
|
||||||
|
return readSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SysFileStream::Write(void* ptr, int size)
|
int SysFileStream::Write(void* ptr, int size)
|
||||||
{
|
{
|
||||||
BfpFile_Write(mFile, ptr, size, -1, NULL);
|
return (int)BfpFile_Write(mFile, ptr, size, -1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SysFileStream::GetPos()
|
int SysFileStream::GetPos()
|
||||||
|
|
|
@ -28,9 +28,9 @@ public:
|
||||||
bool Eof() override;
|
bool Eof() override;
|
||||||
int GetSize() override;
|
int GetSize() override;
|
||||||
using DataStream::Read;
|
using DataStream::Read;
|
||||||
void Read(void* ptr, int size) override;
|
int Read(void* ptr, int size) override;
|
||||||
using DataStream::Write;
|
using DataStream::Write;
|
||||||
void Write(void* ptr, int size) override;
|
int Write(void* ptr, int size) override;
|
||||||
|
|
||||||
int GetPos() override;
|
int GetPos() override;
|
||||||
void Seek(int size) override;
|
void Seek(int size) override;
|
||||||
|
@ -67,9 +67,9 @@ public:
|
||||||
bool Eof() override;
|
bool Eof() override;
|
||||||
int GetSize() override;
|
int GetSize() override;
|
||||||
using DataStream::Read;
|
using DataStream::Read;
|
||||||
void Read(void* ptr, int size) override;
|
int Read(void* ptr, int size) override;
|
||||||
using DataStream::Write;
|
using DataStream::Write;
|
||||||
void Write(void* ptr, int size) override;
|
int Write(void* ptr, int size) override;
|
||||||
|
|
||||||
int GetPos() override;
|
int GetPos() override;
|
||||||
void Seek(int size) override;
|
void Seek(int size) override;
|
||||||
|
|
|
@ -44,17 +44,19 @@ int MemStream::GetSize()
|
||||||
return mSize;
|
return mSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemStream::Read(void* ptr, int size)
|
int MemStream::Read(void* ptr, int size)
|
||||||
{
|
{
|
||||||
memcpy(ptr, mData + mPos, size);
|
memcpy(ptr, mData + mPos, size);
|
||||||
mPos += size;
|
mPos += size;
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Beefy::MemStream::Write(void* ptr, int size)
|
int Beefy::MemStream::Write(void* ptr, int size)
|
||||||
{
|
{
|
||||||
memcpy(mData + mPos, ptr, size);
|
memcpy(mData + mPos, ptr, size);
|
||||||
mPos += size;
|
mPos += size;
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MemStream::GetPos()
|
int MemStream::GetPos()
|
||||||
|
@ -79,7 +81,7 @@ SafeMemStream::SafeMemStream(void* data, int size, bool freeMemory) : MemStream(
|
||||||
mFailed = false;
|
mFailed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SafeMemStream::Read(void* ptr, int size)
|
int SafeMemStream::Read(void* ptr, int size)
|
||||||
{
|
{
|
||||||
if (mPos + size > mSize)
|
if (mPos + size > mSize)
|
||||||
{
|
{
|
||||||
|
@ -91,6 +93,7 @@ void SafeMemStream::Read(void* ptr, int size)
|
||||||
memcpy(ptr, mData + mPos, size);
|
memcpy(ptr, mData + mPos, size);
|
||||||
}
|
}
|
||||||
mPos += size;
|
mPos += size;
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -110,16 +113,18 @@ int DynMemStream::GetSize()
|
||||||
return (int)mData.size();
|
return (int)mData.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynMemStream::Read(void* ptr, int size)
|
int DynMemStream::Read(void* ptr, int size)
|
||||||
{
|
{
|
||||||
memcpy(ptr, (uint8*)&mData.front() + mPos, size);
|
memcpy(ptr, (uint8*)&mData.front() + mPos, size);
|
||||||
mPos += size;
|
mPos += size;
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynMemStream::Write(void* ptr, int size)
|
int DynMemStream::Write(void* ptr, int size)
|
||||||
{
|
{
|
||||||
mData.Insert(mPos, (uint8*)ptr, size);
|
mData.Insert(mPos, (uint8*)ptr, size);
|
||||||
mPos += size;
|
mPos += size;
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynMemStream::Write(uint8 val)
|
void DynMemStream::Write(uint8 val)
|
||||||
|
|
|
@ -24,9 +24,9 @@ public:
|
||||||
bool Eof() override;
|
bool Eof() override;
|
||||||
int GetSize() override;
|
int GetSize() override;
|
||||||
using DataStream::Read;
|
using DataStream::Read;
|
||||||
void Read(void* ptr, int size) override;
|
int Read(void* ptr, int size) override;
|
||||||
using DataStream::Write;
|
using DataStream::Write;
|
||||||
void Write(void* ptr, int size) override;
|
int Write(void* ptr, int size) override;
|
||||||
|
|
||||||
int GetPos() override;
|
int GetPos() override;
|
||||||
void Seek(int size) override;
|
void Seek(int size) override;
|
||||||
|
@ -41,7 +41,7 @@ public:
|
||||||
SafeMemStream(void* data, int size, bool freeMemory);
|
SafeMemStream(void* data, int size, bool freeMemory);
|
||||||
|
|
||||||
using DataStream::Read;
|
using DataStream::Read;
|
||||||
void Read(void* ptr, int size) override;
|
int Read(void* ptr, int size) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DynMemStream : public DataStream
|
class DynMemStream : public DataStream
|
||||||
|
@ -56,9 +56,9 @@ public:
|
||||||
bool Eof() override;
|
bool Eof() override;
|
||||||
int GetSize() override;
|
int GetSize() override;
|
||||||
using DataStream::Read;
|
using DataStream::Read;
|
||||||
void Read(void* ptr, int size) override;
|
int Read(void* ptr, int size) override;
|
||||||
using DataStream::Write;
|
using DataStream::Write;
|
||||||
void Write(void* ptr, int size) override;
|
int Write(void* ptr, int size) override;
|
||||||
void Write(uint8 val) override;
|
void Write(uint8 val) override;
|
||||||
|
|
||||||
int GetPos() override;
|
int GetPos() override;
|
||||||
|
|
|
@ -201,7 +201,7 @@ public:
|
||||||
bool mClipped;
|
bool mClipped;
|
||||||
bool mTexWrap;
|
bool mTexWrap;
|
||||||
bool mWireframe;
|
bool mWireframe;
|
||||||
Rect mClipRect;
|
RectF mClipRect;
|
||||||
CullMode mCullMode;
|
CullMode mCullMode;
|
||||||
Topology3D mTopology;
|
Topology3D mTopology;
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ public:
|
||||||
virtual void SetTexWrap(bool wrap) { mTexWrap = wrap; }
|
virtual void SetTexWrap(bool wrap) { mTexWrap = wrap; }
|
||||||
virtual void SetWireframe(bool wireframe) { mWireframe = wireframe; }
|
virtual void SetWireframe(bool wireframe) { mWireframe = wireframe; }
|
||||||
virtual void SetClipped(bool clipped) { mClipped = clipped; }
|
virtual void SetClipped(bool clipped) { mClipped = clipped; }
|
||||||
virtual void SetClipRect(const Rect& rect) { mClipRect = rect; }
|
virtual void SetClipRect(const RectF& rect) { mClipRect = rect; }
|
||||||
virtual void SetWriteDepthBuffer(bool writeDepthBuffer) { mWriteDepthBuffer = writeDepthBuffer; }
|
virtual void SetWriteDepthBuffer(bool writeDepthBuffer) { mWriteDepthBuffer = writeDepthBuffer; }
|
||||||
virtual void SetDepthFunc(DepthFunc depthFunc) { mDepthFunc = depthFunc; }
|
virtual void SetDepthFunc(DepthFunc depthFunc) { mDepthFunc = depthFunc; }
|
||||||
virtual void SetTopology(Topology3D topology) { mTopology = topology; }
|
virtual void SetTopology(Topology3D topology) { mTopology = topology; }
|
||||||
|
|
|
@ -71,11 +71,11 @@ void TextureSegment::SetImageData(ImageData& imageData)
|
||||||
SetBits(0, 0, imageData.mWidth, imageData.mHeight, imageData.mStride, imageData.mBits);
|
SetBits(0, 0, imageData.mWidth, imageData.mHeight, imageData.mStride, imageData.mBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect TextureSegment::GetRect()
|
RectF TextureSegment::GetRect()
|
||||||
{
|
{
|
||||||
float x1 = mU1 * mTexture->mWidth;
|
float x1 = mU1 * mTexture->mWidth;
|
||||||
float x2 = mU2 * mTexture->mWidth;
|
float x2 = mU2 * mTexture->mWidth;
|
||||||
float y1 = mV1 * mTexture->mHeight;
|
float y1 = mV1 * mTexture->mHeight;
|
||||||
float y2 = mV2 * mTexture->mHeight;
|
float y2 = mV2 * mTexture->mHeight;
|
||||||
return Rect(x1, y1, x2 - x1, y2 - y1);
|
return RectF(x1, y1, x2 - x1, y2 - y1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ public:
|
||||||
void GetImageData(ImageData& imageData, int destX, int destY);
|
void GetImageData(ImageData& imageData, int destX, int destY);
|
||||||
void SetImageData(ImageData& imageData);
|
void SetImageData(ImageData& imageData);
|
||||||
|
|
||||||
Rect GetRect();
|
RectF GetRect();
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_BF_END;
|
NS_BF_END;
|
||||||
|
|
|
@ -737,9 +737,9 @@ void GLRenderDevice::PhysSetRenderState(RenderState* renderState)
|
||||||
if (renderState->mClipped)
|
if (renderState->mClipped)
|
||||||
{
|
{
|
||||||
glEnable(GL_SCISSOR_TEST);
|
glEnable(GL_SCISSOR_TEST);
|
||||||
glScissor((GLsizei)renderState->mClipRect.mX,
|
glScissor((GLsizei)renderState->mClipRect.x,
|
||||||
mPhysRenderWindow->mHeight - (GLsizei)renderState->mClipRect.mY - (GLsizei)renderState->mClipRect.mHeight,
|
mPhysRenderWindow->mHeight - (GLsizei)renderState->mClipRect.y - (GLsizei)renderState->mClipRect.height,
|
||||||
(GLsizei)renderState->mClipRect.mWidth, (GLsizei)renderState->mClipRect.mHeight);
|
(GLsizei)renderState->mClipRect.width, (GLsizei)renderState->mClipRect.height);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -762,11 +762,11 @@ void DXDrawBatch::Render(RenderDevice* renderDevice, RenderWindow* renderWindow)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((mRenderState->mClipped) &&
|
if ((mRenderState->mClipped) &&
|
||||||
((mRenderState->mClipRect.mWidth == 0) || (mRenderState->mClipRect.mHeight == 0)))
|
((mRenderState->mClipRect.width == 0) || (mRenderState->mClipRect.height == 0)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mRenderState->mClipped)
|
if (mRenderState->mClipped)
|
||||||
BF_ASSERT((mRenderState->mClipRect.mWidth > 0) && (mRenderState->mClipRect.mHeight > 0));
|
BF_ASSERT((mRenderState->mClipRect.width > 0) && (mRenderState->mClipRect.height > 0));
|
||||||
|
|
||||||
DXRenderDevice* aRenderDevice = (DXRenderDevice*)renderDevice;
|
DXRenderDevice* aRenderDevice = (DXRenderDevice*)renderDevice;
|
||||||
/*if ((mDrawLayer->mRenderWindow != NULL) && (aRenderDevice->mPhysRenderWindow != mDrawLayer->mRenderWindow))
|
/*if ((mDrawLayer->mRenderWindow != NULL) && (aRenderDevice->mPhysRenderWindow != mDrawLayer->mRenderWindow))
|
||||||
|
@ -931,10 +931,10 @@ void DXRenderDevice::PhysSetRenderState(RenderState* renderState)
|
||||||
if (renderState->mClipped)
|
if (renderState->mClipped)
|
||||||
{
|
{
|
||||||
D3D11_RECT rects[1];
|
D3D11_RECT rects[1];
|
||||||
rects[0].left = (int)renderState->mClipRect.mX;
|
rects[0].left = (int)renderState->mClipRect.x;
|
||||||
rects[0].right = (int) (renderState->mClipRect.mX + renderState->mClipRect.mWidth);
|
rects[0].right = (int) (renderState->mClipRect.x + renderState->mClipRect.width);
|
||||||
rects[0].top = (int) renderState->mClipRect.mY;
|
rects[0].top = (int) renderState->mClipRect.y;
|
||||||
rects[0].bottom = (int) (renderState->mClipRect.mY + renderState->mClipRect.mHeight);
|
rects[0].bottom = (int) (renderState->mClipRect.y + renderState->mClipRect.height);
|
||||||
mD3DDeviceContext->RSSetScissorRects(1, rects);
|
mD3DDeviceContext->RSSetScissorRects(1, rects);
|
||||||
}
|
}
|
||||||
setRasterizerState = true;
|
setRasterizerState = true;
|
||||||
|
@ -1383,9 +1383,9 @@ void DXRenderState::SetTexWrap(bool wrap)
|
||||||
InvalidateRasterizerState();
|
InvalidateRasterizerState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DXRenderState::SetClipRect(const Rect& rect)
|
void DXRenderState::SetClipRect(const RectF& rect)
|
||||||
{
|
{
|
||||||
BF_ASSERT((rect.mWidth >= 0) && (rect.mHeight >= 0));
|
BF_ASSERT((rect.width >= 0) && (rect.height >= 0));
|
||||||
mClipRect = rect;
|
mClipRect = rect;
|
||||||
InvalidateRasterizerState();
|
InvalidateRasterizerState();
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,7 +219,7 @@ public:
|
||||||
|
|
||||||
virtual void SetClipped(bool clipped);
|
virtual void SetClipped(bool clipped);
|
||||||
virtual void SetTexWrap(bool clipped);
|
virtual void SetTexWrap(bool clipped);
|
||||||
virtual void SetClipRect(const Rect& rect);
|
virtual void SetClipRect(const RectF& rect);
|
||||||
virtual void SetWriteDepthBuffer(bool writeDepthBuffer);
|
virtual void SetWriteDepthBuffer(bool writeDepthBuffer);
|
||||||
virtual void SetDepthFunc(DepthFunc depthFunc);
|
virtual void SetDepthFunc(DepthFunc depthFunc);
|
||||||
};
|
};
|
||||||
|
|
|
@ -3016,6 +3016,9 @@ BFP_EXPORT BfpFile* BFP_CALLTYPE BfpFile_Create(const char* path, BfpFileCreateK
|
||||||
if ((createFlags & BfpFileCreateFlag_NoBuffering) != 0)
|
if ((createFlags & BfpFileCreateFlag_NoBuffering) != 0)
|
||||||
desiredAccess |= FILE_FLAG_NO_BUFFERING;
|
desiredAccess |= FILE_FLAG_NO_BUFFERING;
|
||||||
|
|
||||||
|
if ((createFlags & BfpFileCreateFlag_AllowTimeouts) != 0)
|
||||||
|
attributes |= FILE_FLAG_OVERLAPPED;
|
||||||
|
|
||||||
HANDLE handle = ::CreateFileW(wPath.c_str(), desiredAccess, shareMode, NULL, creationDisposition, attributes, NULL);
|
HANDLE handle = ::CreateFileW(wPath.c_str(), desiredAccess, shareMode, NULL, creationDisposition, attributes, NULL);
|
||||||
if (handle == INVALID_HANDLE_VALUE)
|
if (handle == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
@ -3043,6 +3046,13 @@ BFP_EXPORT BfpFile* BFP_CALLTYPE BfpFile_Create(const char* path, BfpFileCreateK
|
||||||
|
|
||||||
BfpFile* bfpFile = new BfpFile();
|
BfpFile* bfpFile = new BfpFile();
|
||||||
bfpFile->mHandle = handle;
|
bfpFile->mHandle = handle;
|
||||||
|
|
||||||
|
if ((createFlags & BfpFileCreateFlag_AllowTimeouts) != 0)
|
||||||
|
bfpFile->mAsyncData = new BfpAsyncData();
|
||||||
|
|
||||||
|
if ((createFlags & BfpFileCreateFlag_Pipe) != 0)
|
||||||
|
bfpFile->mIsPipe = true;
|
||||||
|
|
||||||
return bfpFile;
|
return bfpFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,9 +34,9 @@ void BSpline2D::AddPt(float x, float y)
|
||||||
delete mUVals;
|
delete mUVals;
|
||||||
mUVals = NULL;
|
mUVals = NULL;
|
||||||
|
|
||||||
Point2D pt;
|
PointF pt;
|
||||||
pt.mX = x;
|
pt.x = x;
|
||||||
pt.mY = y;
|
pt.y = y;
|
||||||
mInputPoints.push_back(pt);
|
mInputPoints.push_back(pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,9 +44,8 @@ void BSpline2D::Calculate()
|
||||||
{
|
{
|
||||||
int n = (int) mInputPoints.size();
|
int n = (int) mInputPoints.size();
|
||||||
int t = 1;
|
int t = 1;
|
||||||
Point2D* control = &mInputPoints[0];
|
PointF* control = &mInputPoints[0];
|
||||||
|
|
||||||
|
|
||||||
mUVals=new int[n+t+1];
|
mUVals=new int[n+t+1];
|
||||||
compute_intervals(mUVals, n, t);
|
compute_intervals(mUVals, n, t);
|
||||||
|
|
||||||
|
@ -112,7 +111,7 @@ void BSpline2D::Evaluate(float pct, float* x, float* y)
|
||||||
int t = (int)mInputPoints.size() - 3; // ????
|
int t = (int)mInputPoints.size() - 3; // ????
|
||||||
t = 1;
|
t = 1;
|
||||||
|
|
||||||
Point2D* control = &mInputPoints[0];
|
PointF* control = &mInputPoints[0];
|
||||||
|
|
||||||
// initialize the variables that will hold our outputted point
|
// initialize the variables that will hold our outputted point
|
||||||
|
|
||||||
|
@ -122,8 +121,8 @@ void BSpline2D::Evaluate(float pct, float* x, float* y)
|
||||||
for (k=0; k<=n; k++)
|
for (k=0; k<=n; k++)
|
||||||
{
|
{
|
||||||
temp = blend(t,t,mUVals,pct); // same blend is used for each dimension coordinate
|
temp = blend(t,t,mUVals,pct); // same blend is used for each dimension coordinate
|
||||||
oX = oX + (control[k]).mX * temp;
|
oX = oX + (control[k]).x * temp;
|
||||||
oY = oY + (control[k]).mY * temp;
|
oY = oY + (control[k]).y * temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
*x = oX;
|
*x = oX;
|
||||||
|
|
|
@ -8,7 +8,7 @@ NS_BF_BEGIN;
|
||||||
class BSpline2D
|
class BSpline2D
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Array<Point2D> mInputPoints;
|
Array<PointF> mInputPoints;
|
||||||
int* mUVals;
|
int* mUVals;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
USING_NS_BF;
|
USING_NS_BF;
|
||||||
|
|
||||||
Point2D Beefy::CatmullRomEvaluate(Point2D &p0, Point2D &p1, Point2D &p2, Point2D &p3, float tension, float t)
|
PointF Beefy::CatmullRomEvaluate(PointF &p0, PointF &p1, PointF &p2, PointF &p3, float tension, float t)
|
||||||
{
|
{
|
||||||
float t2 = t * t;
|
float t2 = t * t;
|
||||||
float t3 = t2 * t;
|
float t3 = t2 * t;
|
||||||
|
@ -17,8 +17,8 @@ Point2D Beefy::CatmullRomEvaluate(Point2D &p0, Point2D &p1, Point2D &p2, Point2D
|
||||||
float b3 = s * (t3 - 2 * t2 + t) + (-2 * t3 + 3 * t2); // s(t3 - 2 t2 + t)P3 + (-2 t3 + 3 t2)P3
|
float b3 = s * (t3 - 2 * t2 + t) + (-2 * t3 + 3 * t2); // s(t3 - 2 t2 + t)P3 + (-2 t3 + 3 t2)P3
|
||||||
float b4 = s * (t3 - t2); // s(t3 - t2)P4
|
float b4 = s * (t3 - t2); // s(t3 - t2)P4
|
||||||
|
|
||||||
float x = (p0.mX*b1 + p1.mX*b2 + p2.mX*b3 + p3.mX*b4);
|
float x = (p0.x*b1 + p1.x*b2 + p2.x*b3 + p3.x*b4);
|
||||||
float y = (p0.mY*b1 + p1.mY*b2 + p2.mY*b3 + p3.mY*b4);
|
float y = (p0.y*b1 + p1.y*b2 + p2.y*b3 + p3.y*b4);
|
||||||
|
|
||||||
return Point2D(x,y);
|
return PointF(x,y);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,6 @@
|
||||||
|
|
||||||
NS_BF_BEGIN;
|
NS_BF_BEGIN;
|
||||||
|
|
||||||
Point2D CatmullRomEvaluate(Point2D &p0, Point2D &p1, Point2D &p2, Point2D &p3, float tension, float t);
|
PointF CatmullRomEvaluate(PointF &p0, PointF &p1, PointF &p2, PointF &p3, float tension, float t);
|
||||||
|
|
||||||
NS_BF_END;
|
NS_BF_END;
|
||||||
|
|
|
@ -25,7 +25,7 @@ void CubicFuncSpline::AddPt(float x, float y)
|
||||||
intpoly = NULL;
|
intpoly = NULL;
|
||||||
slopes = NULL;
|
slopes = NULL;
|
||||||
|
|
||||||
mInputPoints.push_back(Point2D(x, y));
|
mInputPoints.push_back(PointF(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
int CubicFuncSpline::GetLength()
|
int CubicFuncSpline::GetLength()
|
||||||
|
@ -42,7 +42,7 @@ void CubicFuncSpline::Lagrange()
|
||||||
for( i = 0; i < nPts; i++ )
|
for( i = 0; i < nPts; i++ )
|
||||||
{
|
{
|
||||||
lagpoly[i+0*nPts] = 1.0;
|
lagpoly[i+0*nPts] = 1.0;
|
||||||
float fac = mInputPoints[i].mY;
|
float fac = mInputPoints[i].y;
|
||||||
j = 0;
|
j = 0;
|
||||||
for( k = 0; k < nPts; k++ )
|
for( k = 0; k < nPts; k++ )
|
||||||
{
|
{
|
||||||
|
@ -50,10 +50,10 @@ void CubicFuncSpline::Lagrange()
|
||||||
continue;
|
continue;
|
||||||
lagpoly[i+(j+1)*nPts] = lagpoly[i+j*nPts];
|
lagpoly[i+(j+1)*nPts] = lagpoly[i+j*nPts];
|
||||||
for( jj = j; jj > 0; jj-- )
|
for( jj = j; jj > 0; jj-- )
|
||||||
lagpoly[i+jj*nPts] = lagpoly[i+(jj-1)*nPts] - lagpoly[i+jj*nPts]*mInputPoints[k].mX;
|
lagpoly[i+jj*nPts] = lagpoly[i+(jj-1)*nPts] - lagpoly[i+jj*nPts]*mInputPoints[k].x;
|
||||||
lagpoly[i+0*nPts] *= -mInputPoints[k].mX;
|
lagpoly[i+0*nPts] *= -mInputPoints[k].x;
|
||||||
j++;
|
j++;
|
||||||
fac /= ( mInputPoints[i].mX - mInputPoints[k].mX );
|
fac /= ( mInputPoints[i].x - mInputPoints[k].x );
|
||||||
}
|
}
|
||||||
for( j = 0; j < nPts; j++ )
|
for( j = 0; j < nPts; j++ )
|
||||||
lagpoly[i+j*nPts] *= fac;
|
lagpoly[i+j*nPts] *= fac;
|
||||||
|
@ -75,9 +75,9 @@ void CubicFuncSpline::ComputeSplineSlopes()
|
||||||
|
|
||||||
for( i = 0; i < n; i++ )
|
for( i = 0; i < n; i++ )
|
||||||
{
|
{
|
||||||
h[i] = mInputPoints[i+1].mX - mInputPoints[i].mX;
|
h[i] = mInputPoints[i+1].x - mInputPoints[i].x;
|
||||||
hinv[i] = 1.0f / h[i];
|
hinv[i] = 1.0f / h[i];
|
||||||
g[i] = 3 * ( mInputPoints[i+1].mY-mInputPoints[i].mY ) * hinv[i] * hinv[i];
|
g[i] = 3 * ( mInputPoints[i+1].y-mInputPoints[i].y ) * hinv[i] * hinv[i];
|
||||||
}
|
}
|
||||||
a[0] = 2 * hinv[0];
|
a[0] = 2 * hinv[0];
|
||||||
b[0] = g[0];
|
b[0] = g[0];
|
||||||
|
@ -119,7 +119,7 @@ float CubicFuncSpline::Evaluate(float x)
|
||||||
Calculate();
|
Calculate();
|
||||||
|
|
||||||
int idx = (int) 0;
|
int idx = (int) 0;
|
||||||
while ((idx < (int) mInputPoints.size()) && (x > mInputPoints[idx].mX))
|
while ((idx < (int) mInputPoints.size()) && (x > mInputPoints[idx].x))
|
||||||
idx++;
|
idx++;
|
||||||
|
|
||||||
if ((idx == mInputPoints.size()) || (idx == 0))
|
if ((idx == mInputPoints.size()) || (idx == 0))
|
||||||
|
@ -128,13 +128,13 @@ float CubicFuncSpline::Evaluate(float x)
|
||||||
if (idx == mInputPoints.size())
|
if (idx == mInputPoints.size())
|
||||||
idx--;
|
idx--;
|
||||||
float s1 = slopes[idx];
|
float s1 = slopes[idx];
|
||||||
return mInputPoints[idx].mY + (x - mInputPoints[idx].mX) * s1;
|
return mInputPoints[idx].y + (x - mInputPoints[idx].x) * s1;
|
||||||
}
|
}
|
||||||
|
|
||||||
float x0 = mInputPoints[idx-1].mX;
|
float x0 = mInputPoints[idx-1].x;
|
||||||
float x1 = mInputPoints[idx].mX;
|
float x1 = mInputPoints[idx].x;
|
||||||
float y0 = mInputPoints[idx-1].mY;
|
float y0 = mInputPoints[idx-1].y;
|
||||||
float y1 = mInputPoints[idx].mY;
|
float y1 = mInputPoints[idx].y;
|
||||||
float s0 = slopes[idx-1];
|
float s0 = slopes[idx-1];
|
||||||
float s1 = slopes[idx];
|
float s1 = slopes[idx];
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ NS_BF_BEGIN;
|
||||||
class CubicFuncSpline
|
class CubicFuncSpline
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
std::vector<Point2D> mInputPoints;
|
std::vector<PointF> mInputPoints;
|
||||||
float* lagpoly;
|
float* lagpoly;
|
||||||
float* intpoly;
|
float* intpoly;
|
||||||
float* slopes;
|
float* slopes;
|
||||||
|
|
|
@ -72,7 +72,7 @@ void CubicSpline2D::AddPt(float x, float y)
|
||||||
delete mYCubicArray;
|
delete mYCubicArray;
|
||||||
mYCubicArray = NULL;
|
mYCubicArray = NULL;
|
||||||
|
|
||||||
mInputPoints.push_back(Point2D(x, y));
|
mInputPoints.push_back(PointF(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
int CubicSpline2D::GetLength()
|
int CubicSpline2D::GetLength()
|
||||||
|
@ -86,15 +86,15 @@ void CubicSpline2D::Calculate()
|
||||||
std::vector<float> yVals;
|
std::vector<float> yVals;
|
||||||
for (int i = 0; i < (int) mInputPoints.size(); i++)
|
for (int i = 0; i < (int) mInputPoints.size(); i++)
|
||||||
{
|
{
|
||||||
xVals.push_back(mInputPoints[i].mX);
|
xVals.push_back(mInputPoints[i].x);
|
||||||
yVals.push_back(mInputPoints[i].mY);
|
yVals.push_back(mInputPoints[i].y);
|
||||||
}
|
}
|
||||||
|
|
||||||
mXCubicArray = SolveCubic(xVals);
|
mXCubicArray = SolveCubic(xVals);
|
||||||
mYCubicArray = SolveCubic(yVals);
|
mYCubicArray = SolveCubic(yVals);
|
||||||
}
|
}
|
||||||
|
|
||||||
Point2D CubicSpline2D::Evaluate(float t)
|
PointF CubicSpline2D::Evaluate(float t)
|
||||||
{
|
{
|
||||||
if (mXCubicArray == NULL)
|
if (mXCubicArray == NULL)
|
||||||
Calculate();
|
Calculate();
|
||||||
|
@ -105,5 +105,5 @@ Point2D CubicSpline2D::Evaluate(float t)
|
||||||
if (idx >= (int) mInputPoints.size() - 1)
|
if (idx >= (int) mInputPoints.size() - 1)
|
||||||
return mInputPoints[mInputPoints.size() - 1];
|
return mInputPoints[mInputPoints.size() - 1];
|
||||||
|
|
||||||
return Point2D(mXCubicArray[idx].Evaluate(frac), mYCubicArray[idx].Evaluate(frac));
|
return PointF(mXCubicArray[idx].Evaluate(frac), mYCubicArray[idx].Evaluate(frac));
|
||||||
}
|
}
|
|
@ -38,7 +38,7 @@ public:
|
||||||
class CubicSpline2D
|
class CubicSpline2D
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
std::vector<Point2D> mInputPoints;
|
std::vector<PointF> mInputPoints;
|
||||||
CubicVal* mXCubicArray;
|
CubicVal* mXCubicArray;
|
||||||
CubicVal* mYCubicArray;
|
CubicVal* mYCubicArray;
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ public:
|
||||||
int GetLength();
|
int GetLength();
|
||||||
|
|
||||||
void Calculate();
|
void Calculate();
|
||||||
Point2D Evaluate(float t);
|
PointF Evaluate(float t);
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_BF_END;
|
NS_BF_END;
|
||||||
|
|
|
@ -4,18 +4,33 @@
|
||||||
|
|
||||||
NS_BF_BEGIN;
|
NS_BF_BEGIN;
|
||||||
|
|
||||||
class Point2D
|
template <typename T>
|
||||||
|
class Point
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
float mX;
|
T x;
|
||||||
float mY;
|
T y;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Point2D(float x = 0, float y = 0)
|
Point(T x = 0, T y = 0)
|
||||||
{
|
{
|
||||||
mX = x;
|
this->x = x;
|
||||||
mY = y;
|
this->y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point operator+(Point rhs)
|
||||||
|
{
|
||||||
|
return Point(x + rhs.x, y + rhs.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point operator-(Point rhs)
|
||||||
|
{
|
||||||
|
return Point(x - rhs.x, y - rhs.y);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef Point<double> PointD;
|
||||||
|
typedef Point<float> PointF;
|
||||||
|
typedef Point<int32> PointI32;
|
||||||
|
|
||||||
NS_BF_END;
|
NS_BF_END;
|
||||||
|
|
|
@ -19,7 +19,7 @@ void PolySpline2D::AddPt(float x, float y)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mInputPoints.push_back(Point2D(x, y));
|
mInputPoints.push_back(PointF(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
int PolySpline2D::GetLength()
|
int PolySpline2D::GetLength()
|
||||||
|
@ -34,11 +34,11 @@ void PolySpline2D::Calculate()
|
||||||
mCoefs = new float[n];
|
mCoefs = new float[n];
|
||||||
|
|
||||||
for (int j=0; j<n; j++)
|
for (int j=0; j<n; j++)
|
||||||
mat[j*n] = mInputPoints[j].mY;
|
mat[j*n] = mInputPoints[j].y;
|
||||||
for (int i=1; i<n; i++)
|
for (int i=1; i<n; i++)
|
||||||
{
|
{
|
||||||
for (int j=0; j<n-i; j++)
|
for (int j=0; j<n-i; j++)
|
||||||
mat[i+j*n]=(mat[(i-1)+j*n]-mat[(i-1)+(j+1)*n])/(mInputPoints[j].mX-mInputPoints[j+i].mX);
|
mat[i+j*n]=(mat[(i-1)+j*n]-mat[(i-1)+(j+1)*n])/(mInputPoints[j].x-mInputPoints[j+i].x);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i=0; i<n; i++)
|
for (int i=0; i<n; i++)
|
||||||
|
@ -58,7 +58,7 @@ float PolySpline2D::Evaluate(float x)
|
||||||
{
|
{
|
||||||
float add = mCoefs[i];
|
float add = mCoefs[i];
|
||||||
for (int j = 0; j < i; j++)
|
for (int j = 0; j < i; j++)
|
||||||
add *= (x - mInputPoints[j].mX);
|
add *= (x - mInputPoints[j].x);
|
||||||
result += add;
|
result += add;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ NS_BF_BEGIN;
|
||||||
class PolySpline2D
|
class PolySpline2D
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
std::vector<Point2D> mInputPoints;
|
std::vector<PointF> mInputPoints;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,37 +1,130 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
|
#include "Point.h"
|
||||||
|
|
||||||
NS_BF_BEGIN;
|
NS_BF_BEGIN;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
class Rect
|
class Rect
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
float mX;
|
T x;
|
||||||
float mY;
|
T y;
|
||||||
float mWidth;
|
T width;
|
||||||
float mHeight;
|
T height;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Rect()
|
Rect()
|
||||||
{
|
{
|
||||||
mX = 0;
|
x = 0;
|
||||||
mY = 0;
|
y = 0;
|
||||||
mWidth = 0;
|
width = 0;
|
||||||
mHeight = 0;
|
height = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect(float x, float y, float width, float height)
|
Rect(T x, T y, T width, T height)
|
||||||
{
|
{
|
||||||
mX = x;
|
this->x = x;
|
||||||
mY = y;
|
this->y = y;
|
||||||
mWidth = width;
|
this->width = width;
|
||||||
mHeight = height;
|
this->height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const Rect& r2)
|
||||||
|
{
|
||||||
|
return (x == r2.x) && (y == r2.y) && (width == r2.width) && (height == r2.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator!=(const Rect& r2)
|
bool operator!=(const Rect& r2)
|
||||||
{
|
{
|
||||||
return (mX != r2.mX) || (mY != r2.mY) || (mWidth != r2.mWidth) || (mHeight != r2.mHeight);
|
return (x != r2.x) || (y != r2.y) || (width != r2.width) || (height != r2.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Contains(T x, T y)
|
||||||
|
{
|
||||||
|
return (x >= this->x) && (y >= this->y) && (x < this->x + width) && (y < this->y + height);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Contains(Point<T> pt)
|
||||||
|
{
|
||||||
|
return (pt.x >= this->x) && (y >= this->y) && (x < this->x + width) && (y < this->y + height);
|
||||||
|
}
|
||||||
|
|
||||||
|
T GetRight()
|
||||||
|
{
|
||||||
|
return x + width;
|
||||||
|
}
|
||||||
|
|
||||||
|
T GetBottom()
|
||||||
|
{
|
||||||
|
return y + height;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rect Intersection(Rect rect)
|
||||||
|
{
|
||||||
|
T x1 = Max(x, rect.x);
|
||||||
|
T x2 = Min(x + width, rect.x + rect.width);
|
||||||
|
T y1 = Max(y, rect.y);
|
||||||
|
T y2 = Min(y + height, rect.y + rect.height);
|
||||||
|
if (((x2 - x1) < 0) || ((y2 - y1) < 0))
|
||||||
|
return Rect();
|
||||||
|
else
|
||||||
|
return Rect(x1, y1, x2 - x1, y2 - y1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Intersects(Rect rect)
|
||||||
|
{
|
||||||
|
T x1 = BF_MAX(x, rect.x);
|
||||||
|
T x2 = BF_MIN(x + width, rect.x + rect.width);
|
||||||
|
T y1 = BF_MAX(y, rect.y);
|
||||||
|
T y2 = BF_MIN(y + height, rect.y + rect.height);
|
||||||
|
if (((x2 - x1) <= 0) || ((y2 - y1) <= 0))
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rect Union(Rect rect)
|
||||||
|
{
|
||||||
|
T x1 = Min(x, rect.x);
|
||||||
|
T x2 = Max(x + width, rect.x + rect.width);
|
||||||
|
T y1 = Min(y, rect.y);
|
||||||
|
T y2 = Max(y + height, rect.y + rect.height);
|
||||||
|
return Rect(x1, y1, x2 - x1, y2 - y1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Include(Point<T> pt)
|
||||||
|
{
|
||||||
|
T left = x;
|
||||||
|
T top = y;
|
||||||
|
T right = x + width;
|
||||||
|
T bottom = y + height;
|
||||||
|
x = BF_MIN(pt.x, left);
|
||||||
|
y = BF_MIN(pt.y, top);
|
||||||
|
width = BF_MAX(pt.x, right) - x;
|
||||||
|
height = BF_MAX(pt.y, bottom) - y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Inflate(T x, T y)
|
||||||
|
{
|
||||||
|
this->x -= x;
|
||||||
|
this->width += x + x;
|
||||||
|
this->y -= y;
|
||||||
|
this->height += y + y;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Rect<double> RectD;
|
||||||
|
typedef Rect<float> RectF;
|
||||||
|
typedef Rect<int32> RectI32;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BeefHash<RectI32>
|
||||||
|
{
|
||||||
|
size_t operator()(RectI32 val)
|
||||||
|
{
|
||||||
|
return (size_t)val.x * 4790557 + (size_t)val.y * 6578863 + (size_t)val.width * 6273881 + (size_t)val.height * 9501077;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue